@fractaal/pi-codemode 0.86.8 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +196 -12
  2. package/dist/cloudflare.d.ts +53 -0
  3. package/dist/cloudflare.d.ts.map +1 -0
  4. package/dist/cloudflare.js +64 -0
  5. package/dist/cloudflare.js.map +1 -0
  6. package/dist/declarations.d.ts +6 -21
  7. package/dist/declarations.d.ts.map +1 -1
  8. package/dist/declarations.js +113 -127
  9. package/dist/declarations.js.map +1 -1
  10. package/dist/index.d.ts +5 -2
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +4 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/portable.d.ts +15 -0
  15. package/dist/portable.d.ts.map +1 -0
  16. package/dist/portable.js +12 -0
  17. package/dist/portable.js.map +1 -0
  18. package/dist/runtime/execution.d.ts +66 -0
  19. package/dist/runtime/execution.d.ts.map +1 -0
  20. package/dist/runtime/execution.js +494 -0
  21. package/dist/runtime/execution.js.map +1 -0
  22. package/dist/runtime/host.d.ts +8 -30
  23. package/dist/runtime/host.d.ts.map +1 -1
  24. package/dist/runtime/host.js +50 -332
  25. package/dist/runtime/host.js.map +1 -1
  26. package/dist/runtime/inline.d.ts +63 -0
  27. package/dist/runtime/inline.d.ts.map +1 -0
  28. package/dist/runtime/inline.js +80 -0
  29. package/dist/runtime/inline.js.map +1 -0
  30. package/dist/runtime/prelude-source.d.ts +5 -3
  31. package/dist/runtime/prelude-source.d.ts.map +1 -1
  32. package/dist/runtime/prelude-source.js +19 -9
  33. package/dist/runtime/prelude-source.js.map +1 -1
  34. package/dist/runtime/protocol.d.ts +47 -6
  35. package/dist/runtime/protocol.d.ts.map +1 -1
  36. package/dist/runtime/protocol.js +6 -1
  37. package/dist/runtime/protocol.js.map +1 -1
  38. package/dist/runtime/remote.d.ts +102 -0
  39. package/dist/runtime/remote.d.ts.map +1 -0
  40. package/dist/runtime/remote.js +175 -0
  41. package/dist/runtime/remote.js.map +1 -0
  42. package/dist/runtime/vm.d.ts +24 -0
  43. package/dist/runtime/vm.d.ts.map +1 -0
  44. package/dist/runtime/vm.js +293 -0
  45. package/dist/runtime/vm.js.map +1 -0
  46. package/dist/runtime/worker.js +11 -110
  47. package/dist/runtime/worker.js.map +1 -1
  48. package/dist/source.d.ts +2 -1
  49. package/dist/source.d.ts.map +1 -1
  50. package/dist/source.js +8 -2
  51. package/dist/source.js.map +1 -1
  52. package/dist/types.d.ts +115 -6
  53. package/dist/types.d.ts.map +1 -1
  54. package/dist/types.js.map +1 -1
  55. package/package.json +16 -4
@@ -6,86 +6,27 @@ const INDENT = " ";
6
6
  export const DEFAULT_INPUT_SCHEMA_MAX_CHARS = 16_000;
7
7
  /** Local `$ref` expansions per rendered schema, so shared definitions cannot blow up the output. */
8
8
  const MAX_REF_EXPANSIONS = 32;
9
- /**
10
- * TypeScript types for MCP results, from the MCP `CallToolResult` schema, so `CallToolResult<T>`
11
- * declarations can refer to them.
12
- */
13
- export const MCP_TYPESCRIPT_PREAMBLE = `type Role = "user" | "assistant";
14
- type MetaObject = Record<string, unknown>;
15
- type Annotations = {
16
- audience?: Role[];
17
- priority?: number;
18
- lastModified?: string;
19
- };
20
- type Icon = {
21
- src: string;
22
- mimeType?: string;
23
- sizes?: string[];
24
- theme?: "light" | "dark";
25
- };
26
- type TextResourceContents = {
27
- uri: string;
28
- mimeType?: string;
29
- _meta?: MetaObject;
30
- text: string;
31
- };
32
- type BlobResourceContents = {
33
- uri: string;
34
- mimeType?: string;
35
- _meta?: MetaObject;
36
- blob: string;
37
- };
38
- type TextContent = {
39
- type: "text";
40
- text: string;
41
- annotations?: Annotations;
42
- _meta?: MetaObject;
43
- };
44
- type ImageContent = {
45
- type: "image";
46
- data: string;
47
- mimeType: string;
48
- annotations?: Annotations;
49
- _meta?: MetaObject;
50
- };
51
- type AudioContent = {
52
- type: "audio";
53
- data: string;
54
- mimeType: string;
55
- annotations?: Annotations;
56
- _meta?: MetaObject;
57
- };
58
- type ResourceLink = {
59
- icons?: Icon[];
60
- name: string;
61
- title?: string;
62
- uri: string;
63
- description?: string;
64
- mimeType?: string;
65
- annotations?: Annotations;
66
- size?: number;
67
- _meta?: MetaObject;
68
- type: "resource_link";
69
- };
70
- type EmbeddedResource = {
71
- type: "resource";
72
- resource: TextResourceContents | BlobResourceContents;
73
- annotations?: Annotations;
74
- _meta?: MetaObject;
75
- };
76
- type ContentBlock =
77
- | TextContent
78
- | ImageContent
79
- | AudioContent
80
- | ResourceLink
81
- | EmbeddedResource;
82
- type CallToolResult<TStructured = { [key: string]: unknown }> = {
83
- _meta?: MetaObject;
84
- content: ContentBlock[];
85
- isError?: boolean;
86
- structuredContent?: TStructured;
87
- [key: string]: unknown;
88
- };`;
9
+ /** JSON Schema keywords with a number or string value shown as `@keyword value` property tags. */
10
+ const TAG_KEYWORDS = [
11
+ "minimum",
12
+ "exclusiveMinimum",
13
+ "maximum",
14
+ "exclusiveMaximum",
15
+ "multipleOf",
16
+ "minLength",
17
+ "maxLength",
18
+ "pattern",
19
+ "format",
20
+ "minItems",
21
+ "maxItems",
22
+ ];
23
+ /** Tag keywords whose values all hold at once, so only the largest (lower) or smallest (upper) matters. */
24
+ const LOWER_BOUNDS = new Set(["minimum", "exclusiveMinimum", "minLength", "minItems"]);
25
+ const UPPER_BOUNDS = new Set(["maximum", "exclusiveMaximum", "maxLength", "maxItems"]);
26
+ /** Longest property tag; longer ones (large defaults, long patterns) are left out. */
27
+ const MAX_TAG_CHARS = 80;
28
+ /** Characters that end a `//` comment. */
29
+ const LINE_TERMINATORS = /[\r\n\u2028\u2029]/g;
89
30
  /**
90
31
  * Render TypeScript declarations for the script-visible API. Tools become members of
91
32
  * `declare const tools`, globals become `declare function` statements, and `ns.member` globals
@@ -119,8 +60,6 @@ export function renderDeclarations(options) {
119
60
  /**
120
61
  * One tool as a member of the `tools` object: `name(args: T): Promise<R>;` with the
121
62
  * name as the identifier scripts use. Input types longer than `inputMaxChars` render as `unknown`.
122
- * Tools whose output schema is an MCP `CallToolResult` render as `Promise<CallToolResult<T>>`,
123
- * which needs {@link MCP_TYPESCRIPT_PREAMBLE}.
124
63
  */
125
64
  export function renderToolSignature(tool, options = {}) {
126
65
  const input = tool.inputSchema === undefined
@@ -136,32 +75,8 @@ export function renderToolSample(tool, options = {}) {
136
75
  const declaration = `declare const tools: { ${renderToolSignature(tool, options)} };`;
137
76
  return `${tool.description?.trim() ?? ""}\n\ncodemode tool declaration:\n\`\`\`ts\n${declaration}\n\`\`\``;
138
77
  }
139
- /**
140
- * The `structuredContent` schema of an MCP `CallToolResult` output schema (detected by a
141
- * `content` array of objects, boolean `isError`, and object `_meta`), `true` when it declares none, or
142
- * `undefined` when the schema is not a `CallToolResult`.
143
- */
144
- export function mcpStructuredContentSchema(schema) {
145
- if (!isObject(schema) || !isObject(schema.properties))
146
- return undefined;
147
- const { content, isError, _meta, structuredContent } = schema.properties;
148
- if (!isObject(content) || content.type !== "array" || !isObject(content.items) || content.items.type !== "object") {
149
- return undefined;
150
- }
151
- if (!isObject(isError) || isError.type !== "boolean" || !isObject(_meta) || _meta.type !== "object")
152
- return undefined;
153
- return isObject(structuredContent) || typeof structuredContent === "boolean" ? structuredContent : true;
154
- }
155
- /**
156
- * The type a tool call resolves to: `CallToolResult<T>` for MCP output schemas (needs
157
- * {@link MCP_TYPESCRIPT_PREAMBLE}), the schema's type otherwise, and `unknown` without a schema.
158
- */
78
+ /** The type a tool call resolves to: the output schema's type, and `unknown` without a schema. */
159
79
  export function renderToolOutputType(schema) {
160
- const structured = mcpStructuredContentSchema(schema);
161
- if (structured !== undefined) {
162
- const type = schemaToType(structured);
163
- return type === "unknown" ? "CallToolResult" : `CallToolResult<${type}>`;
164
- }
165
80
  return schema === undefined ? "unknown" : schemaToType(schema);
166
81
  }
167
82
  function renderGlobal(head, global, indent) {
@@ -184,9 +99,6 @@ function docComment(description, indent) {
184
99
  function propertyKey(name) {
185
100
  return IDENTIFIER.test(name) ? name : JSON.stringify(name);
186
101
  }
187
- function isObject(value) {
188
- return typeof value === "object" && value !== null && !Array.isArray(value);
189
- }
190
102
  function union(types) {
191
103
  const unique = [...new Set(types)];
192
104
  if (unique.includes("unknown"))
@@ -195,14 +107,19 @@ function union(types) {
195
107
  }
196
108
  /**
197
109
  * Convert a JSON Schema to a TypeScript type expression: objects on one line (`{ a: string; b?: number; }`) with properties sorted by name,
198
- * or one property per line with `//` comments when a property has a description; `Array<T>` for
199
- * arrays. Local references (`#/$defs/...`, `#/definitions/...`) resolve against `schema`;
200
- * recursive and remote references render as `unknown`. A result longer than `maxChars` renders as
201
- * `unknown`.
110
+ * or one property per line with `//` comments when a property has a description or constraints the
111
+ * type cannot express (`// @integer @minimum 1 @default 20`); `Array<T>` for arrays. Local references
112
+ * (`#/$defs/...`, `#/definitions/...`) resolve against `schema`; recursive and remote references
113
+ * render as `unknown`. A result longer than `maxChars` is rendered again without the constraint tags,
114
+ * and renders as `unknown` if it is still too long.
202
115
  */
203
116
  export function schemaToType(schema, options = {}) {
204
- const type = toType(schema, { root: schema, resolving: new Set(), expansions: 0 });
205
- return options.maxChars !== undefined && type.length > options.maxChars ? "unknown" : type;
117
+ const render = (tags) => toType(schema, { root: schema, resolving: new Set(), expansions: 0, tags });
118
+ const type = render(true);
119
+ if (options.maxChars === undefined || type.length <= options.maxChars)
120
+ return type;
121
+ const untagged = render(false);
122
+ return untagged.length <= options.maxChars ? untagged : "unknown";
206
123
  }
207
124
  function resolveRef(ref, root) {
208
125
  if (ref !== "#" && !ref.startsWith("#/"))
@@ -210,18 +127,23 @@ function resolveRef(ref, root) {
210
127
  let current = root;
211
128
  for (const segment of ref.slice(2).split("/").filter(Boolean)) {
212
129
  const key = decodeURIComponent(segment).replaceAll("~1", "/").replaceAll("~0", "~");
213
- if (!isObject(current) || !(key in current))
130
+ if (typeof current !== "object" || current === null || Array.isArray(current) || !(key in current)) {
214
131
  return undefined;
132
+ }
215
133
  current = current[key];
216
134
  }
217
- return typeof current === "boolean" || isObject(current) ? current : undefined;
135
+ if (typeof current === "boolean")
136
+ return current;
137
+ return typeof current === "object" && current !== null && !Array.isArray(current)
138
+ ? current
139
+ : undefined;
218
140
  }
219
141
  function toType(schema, context) {
220
142
  if (schema === true)
221
143
  return "unknown";
222
144
  if (schema === false)
223
145
  return "never";
224
- if (!isObject(schema))
146
+ if (typeof schema !== "object" || schema === null || Array.isArray(schema))
225
147
  return "unknown";
226
148
  if (typeof schema.$ref === "string") {
227
149
  const ref = schema.$ref;
@@ -296,10 +218,68 @@ function arrayType(schema, context) {
296
218
  return "unknown[]";
297
219
  }
298
220
  function descriptionOf(property) {
299
- return isObject(property) && typeof property.description === "string" ? property.description.trim() : "";
221
+ const description = property?.description;
222
+ return typeof description === "string" ? description.trim() : "";
223
+ }
224
+ /**
225
+ * Constraints of a property that its TypeScript type cannot express, as JSDoc-style tags:
226
+ * `@integer @minimum 1 @maximum 100 @default 20`. Empty when there are none.
227
+ */
228
+ function constraintTags(schema) {
229
+ if (typeof schema !== "object" || schema === null || Array.isArray(schema))
230
+ return "";
231
+ const property = schema;
232
+ // Optional fields such as Pydantic's `int | None` keep their constraints in the non-null branch.
233
+ // The branch's constraints apply together with the property's, so both are read.
234
+ const variants = Array.isArray(property.anyOf) ? property.anyOf : property.oneOf;
235
+ const nonNull = Array.isArray(variants)
236
+ ? variants.filter((variant) => variant?.type !== "null")
237
+ : [];
238
+ const branch = nonNull.length === 1 ? nonNull[0] : undefined;
239
+ const branches = typeof branch === "object" && branch !== null && !Array.isArray(branch)
240
+ ? [property, branch]
241
+ : [property];
242
+ // Draft-04 and OpenAPI 3.0 make `minimum`/`maximum` exclusive with a boolean `exclusiveMinimum`/`exclusiveMaximum`.
243
+ const schemas = branches.map((schema) => ({
244
+ ...schema,
245
+ ...(schema.exclusiveMinimum === true ? { minimum: undefined, exclusiveMinimum: schema.minimum } : {}),
246
+ ...(schema.exclusiveMaximum === true ? { maximum: undefined, exclusiveMaximum: schema.maximum } : {}),
247
+ }));
248
+ const tags = [];
249
+ const isInteger = (type) => type === "integer" || (Array.isArray(type) && type.includes("integer"));
250
+ if (schemas.some((schema) => isInteger(schema.type)))
251
+ tags.push("@integer");
252
+ for (const keyword of TAG_KEYWORDS) {
253
+ const values = schemas.map((schema) => schema[keyword]);
254
+ if (LOWER_BOUNDS.has(keyword) || UPPER_BOUNDS.has(keyword)) {
255
+ const numbers = values.filter((value) => typeof value === "number");
256
+ if (numbers.length === 0)
257
+ continue;
258
+ tags.push(`@${keyword} ${LOWER_BOUNDS.has(keyword) ? Math.max(...numbers) : Math.min(...numbers)}`);
259
+ continue;
260
+ }
261
+ for (const value of new Set(values)) {
262
+ if (typeof value === "number" || typeof value === "string")
263
+ tags.push(`@${keyword} ${value}`);
264
+ }
265
+ }
266
+ if (schemas.some((schema) => schema.uniqueItems === true))
267
+ tags.push("@uniqueItems");
268
+ // Annotations, unlike constraints, come from the property itself.
269
+ if (property.default !== undefined && property.default !== null) {
270
+ tags.push(`@default ${JSON.stringify(property.default)}`);
271
+ }
272
+ if (property.deprecated === true)
273
+ tags.push("@deprecated");
274
+ return tags
275
+ .filter((tag) => tag.length <= MAX_TAG_CHARS)
276
+ .map((tag) => tag.replace(LINE_TERMINATORS, (char) => `\\u${char.charCodeAt(0).toString(16).padStart(4, "0")}`))
277
+ .join(" ");
300
278
  }
301
279
  function objectType(schema, context) {
302
- const properties = isObject(schema.properties) ? schema.properties : {};
280
+ const properties = typeof schema.properties === "object" && schema.properties !== null && !Array.isArray(schema.properties)
281
+ ? schema.properties
282
+ : {};
303
283
  const required = new Set(Array.isArray(schema.required) ? schema.required : []);
304
284
  const names = Object.keys(properties).sort();
305
285
  const members = names.map((name) => {
@@ -316,14 +296,20 @@ function objectType(schema, context) {
316
296
  }
317
297
  if (members.length === 0)
318
298
  return "{}";
319
- if (!names.some((name) => descriptionOf(properties[name])))
299
+ const comments = names.map((name) => {
300
+ const lines = descriptionOf(properties[name])
301
+ .split(LINE_TERMINATORS)
302
+ .map((line) => line.trim())
303
+ .filter(Boolean);
304
+ const tags = context.tags ? constraintTags(properties[name]) : "";
305
+ return tags ? [...lines, tags] : lines;
306
+ });
307
+ if (!comments.some((comment) => comment.length > 0))
320
308
  return `{ ${members.join(" ")} }`;
321
309
  const lines = ["{"];
322
- names.forEach((name, index) => {
323
- for (const line of descriptionOf(properties[name]).split(/\r?\n/)) {
324
- if (line.trim())
325
- lines.push(`${INDENT}// ${line.trim()}`);
326
- }
310
+ comments.forEach((comment, index) => {
311
+ for (const line of comment)
312
+ lines.push(`${INDENT}// ${line}`);
327
313
  lines.push(`${INDENT}${members[index].replaceAll("\n", `\n${INDENT}`)}`);
328
314
  });
329
315
  for (const member of members.slice(names.length))
@@ -1 +1 @@
1
- {"version":3,"file":"declarations.js","sourceRoot":"","sources":["../src/declarations.ts"],"names":[],"mappings":"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","sourcesContent":["import { toCodemodeIdentifier } from \"./identifier.ts\";\n\nexport { toCodemodeIdentifier };\n\nimport type { CodemodeJsonSchema, CodemodeTool } from \"./types.ts\";\n\nconst IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\nconst INDENT = \" \";\n/** Largest rendered input type, in characters, before it becomes `unknown`. */\nexport const DEFAULT_INPUT_SCHEMA_MAX_CHARS = 16_000;\n/** Local `$ref` expansions per rendered schema, so shared definitions cannot blow up the output. */\nconst MAX_REF_EXPANSIONS = 32;\n\n/**\n * TypeScript types for MCP results, from the MCP `CallToolResult` schema, so `CallToolResult<T>`\n * declarations can refer to them.\n */\nexport const MCP_TYPESCRIPT_PREAMBLE = `type Role = \"user\" | \"assistant\";\ntype MetaObject = Record<string, unknown>;\ntype Annotations = {\n audience?: Role[];\n priority?: number;\n lastModified?: string;\n};\ntype Icon = {\n src: string;\n mimeType?: string;\n sizes?: string[];\n theme?: \"light\" | \"dark\";\n};\ntype TextResourceContents = {\n uri: string;\n mimeType?: string;\n _meta?: MetaObject;\n text: string;\n};\ntype BlobResourceContents = {\n uri: string;\n mimeType?: string;\n _meta?: MetaObject;\n blob: string;\n};\ntype TextContent = {\n type: \"text\";\n text: string;\n annotations?: Annotations;\n _meta?: MetaObject;\n};\ntype ImageContent = {\n type: \"image\";\n data: string;\n mimeType: string;\n annotations?: Annotations;\n _meta?: MetaObject;\n};\ntype AudioContent = {\n type: \"audio\";\n data: string;\n mimeType: string;\n annotations?: Annotations;\n _meta?: MetaObject;\n};\ntype ResourceLink = {\n icons?: Icon[];\n name: string;\n title?: string;\n uri: string;\n description?: string;\n mimeType?: string;\n annotations?: Annotations;\n size?: number;\n _meta?: MetaObject;\n type: \"resource_link\";\n};\ntype EmbeddedResource = {\n type: \"resource\";\n resource: TextResourceContents | BlobResourceContents;\n annotations?: Annotations;\n _meta?: MetaObject;\n};\ntype ContentBlock =\n | TextContent\n | ImageContent\n | AudioContent\n | ResourceLink\n | EmbeddedResource;\ntype CallToolResult<TStructured = { [key: string]: unknown }> = {\n _meta?: MetaObject;\n content: ContentBlock[];\n isError?: boolean;\n structuredContent?: TStructured;\n [key: string]: unknown;\n};`;\n\nexport interface RenderDeclarationsOptions {\n\ttools?: readonly CodemodeTool[];\n\tglobals?: readonly CodemodeTool[];\n}\n\n/**\n * Render TypeScript declarations for the script-visible API. Tools become members of\n * `declare const tools`, globals become `declare function` statements, and `ns.member` globals\n * members of `declare const ns`. Descriptions become doc comments; schemas become types.\n */\nexport function renderDeclarations(options: RenderDeclarationsOptions): string {\n\tconst sections: string[] = [];\n\tconst tools = options.tools ?? [];\n\tif (tools.length > 0) {\n\t\tconst members = tools.map(\n\t\t\t(tool) => `${docComment(tool.description, INDENT)}${INDENT}${renderToolSignature(tool)}`,\n\t\t);\n\t\tsections.push(`declare const tools: {\\n${members.join(\"\\n\")}\\n};`);\n\t}\n\tconst namespaces = new Map<string, string[]>();\n\tfor (const global of options.globals ?? []) {\n\t\tconst dot = global.name.indexOf(\".\");\n\t\tif (dot === -1) {\n\t\t\tsections.push(renderGlobal(`declare function ${global.name}`, global, \"\"));\n\t\t\tcontinue;\n\t\t}\n\t\tconst namespace = global.name.slice(0, dot);\n\t\tconst members = namespaces.get(namespace) ?? [];\n\t\tif (members.length === 0) namespaces.set(namespace, members);\n\t\tmembers.push(renderGlobal(global.name.slice(dot + 1), global, INDENT));\n\t}\n\tfor (const [namespace, members] of namespaces) {\n\t\tsections.push(`declare const ${namespace}: {\\n${members.join(\"\\n\")}\\n};`);\n\t}\n\treturn sections.join(\"\\n\\n\");\n}\n\n/**\n * One tool as a member of the `tools` object: `name(args: T): Promise<R>;` with the\n * name as the identifier scripts use. Input types longer than `inputMaxChars` render as `unknown`.\n * Tools whose output schema is an MCP `CallToolResult` render as `Promise<CallToolResult<T>>`,\n * which needs {@link MCP_TYPESCRIPT_PREAMBLE}.\n */\nexport function renderToolSignature(\n\ttool: Pick<CodemodeTool, \"name\" | \"inputSchema\" | \"outputSchema\">,\n\toptions: { inputMaxChars?: number } = {},\n): string {\n\tconst input =\n\t\ttool.inputSchema === undefined\n\t\t\t? \"unknown\"\n\t\t\t: schemaToType(tool.inputSchema, { maxChars: options.inputMaxChars ?? DEFAULT_INPUT_SCHEMA_MAX_CHARS });\n\treturn `${toCodemodeIdentifier(tool.name)}(args: ${input}): Promise<${renderToolOutputType(tool.outputSchema)}>;`;\n}\n\n/**\n * A tool's sample: the description followed by the tool's declaration. Used for tool\n * listings and `ALL_TOOLS` entries.\n */\nexport function renderToolSample(\n\ttool: Pick<CodemodeTool, \"name\" | \"description\" | \"inputSchema\" | \"outputSchema\">,\n\toptions: { inputMaxChars?: number } = {},\n): string {\n\tconst declaration = `declare const tools: { ${renderToolSignature(tool, options)} };`;\n\treturn `${tool.description?.trim() ?? \"\"}\\n\\ncodemode tool declaration:\\n\\`\\`\\`ts\\n${declaration}\\n\\`\\`\\``;\n}\n\n/**\n * The `structuredContent` schema of an MCP `CallToolResult` output schema (detected by a\n * `content` array of objects, boolean `isError`, and object `_meta`), `true` when it declares none, or\n * `undefined` when the schema is not a `CallToolResult`.\n */\nexport function mcpStructuredContentSchema(schema: CodemodeJsonSchema | undefined): CodemodeJsonSchema | undefined {\n\tif (!isObject(schema) || !isObject(schema.properties)) return undefined;\n\tconst { content, isError, _meta, structuredContent } = schema.properties;\n\tif (!isObject(content) || content.type !== \"array\" || !isObject(content.items) || content.items.type !== \"object\") {\n\t\treturn undefined;\n\t}\n\tif (!isObject(isError) || isError.type !== \"boolean\" || !isObject(_meta) || _meta.type !== \"object\")\n\t\treturn undefined;\n\treturn isObject(structuredContent) || typeof structuredContent === \"boolean\" ? structuredContent : true;\n}\n\n/**\n * The type a tool call resolves to: `CallToolResult<T>` for MCP output schemas (needs\n * {@link MCP_TYPESCRIPT_PREAMBLE}), the schema's type otherwise, and `unknown` without a schema.\n */\nexport function renderToolOutputType(schema: CodemodeJsonSchema | undefined): string {\n\tconst structured = mcpStructuredContentSchema(schema);\n\tif (structured !== undefined) {\n\t\tconst type = schemaToType(structured);\n\t\treturn type === \"unknown\" ? \"CallToolResult\" : `CallToolResult<${type}>`;\n\t}\n\treturn schema === undefined ? \"unknown\" : schemaToType(schema);\n}\n\nfunction renderGlobal(head: string, global: CodemodeTool, indent: string): string {\n\tif (global.signature !== undefined) {\n\t\treturn `${docComment(global.description, indent)}${indent}${head}${global.signature};`;\n\t}\n\tconst input = global.inputSchema === undefined ? \"unknown\" : schemaToType(global.inputSchema);\n\tconst output = global.outputSchema === undefined ? \"unknown\" : schemaToType(global.outputSchema);\n\treturn `${docComment(global.description, indent)}${indent}${head}(args: ${input}): Promise<${output}>;`;\n}\n\nfunction docComment(description: string | undefined, indent: string): string {\n\tconst text = description?.trim();\n\tif (!text) return \"\";\n\tconst lines = text.replaceAll(\"*/\", \"*\\\\/\").split(/\\r?\\n/);\n\tif (lines.length === 1) return `${indent}/** ${lines[0]} */\\n`;\n\treturn `${indent}/**\\n${lines.map((line) => `${indent} *${line ? ` ${line}` : \"\"}`).join(\"\\n\")}\\n${indent} */\\n`;\n}\n\nfunction propertyKey(name: string): string {\n\treturn IDENTIFIER.test(name) ? name : JSON.stringify(name);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction union(types: string[]): string {\n\tconst unique = [...new Set(types)];\n\tif (unique.includes(\"unknown\")) return \"unknown\";\n\treturn unique.length === 0 ? \"never\" : unique.join(\" | \");\n}\n\n/**\n * Convert a JSON Schema to a TypeScript type expression: objects on one line (`{ a: string; b?: number; }`) with properties sorted by name,\n * or one property per line with `//` comments when a property has a description; `Array<T>` for\n * arrays. Local references (`#/$defs/...`, `#/definitions/...`) resolve against `schema`;\n * recursive and remote references render as `unknown`. A result longer than `maxChars` renders as\n * `unknown`.\n */\nexport function schemaToType(schema: CodemodeJsonSchema, options: { maxChars?: number } = {}): string {\n\tconst type = toType(schema, { root: schema, resolving: new Set(), expansions: 0 });\n\treturn options.maxChars !== undefined && type.length > options.maxChars ? \"unknown\" : type;\n}\n\ninterface SchemaContext {\n\troot: CodemodeJsonSchema;\n\t/** References being expanded on the current path, to stop at recursive types. */\n\tresolving: Set<string>;\n\texpansions: number;\n}\n\nfunction resolveRef(ref: string, root: CodemodeJsonSchema): CodemodeJsonSchema | undefined {\n\tif (ref !== \"#\" && !ref.startsWith(\"#/\")) return undefined;\n\tlet current: unknown = root;\n\tfor (const segment of ref.slice(2).split(\"/\").filter(Boolean)) {\n\t\tconst key = decodeURIComponent(segment).replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n\t\tif (!isObject(current) || !(key in current)) return undefined;\n\t\tcurrent = current[key];\n\t}\n\treturn typeof current === \"boolean\" || isObject(current) ? current : undefined;\n}\n\nfunction toType(schema: CodemodeJsonSchema, context: SchemaContext): string {\n\tif (schema === true) return \"unknown\";\n\tif (schema === false) return \"never\";\n\tif (!isObject(schema)) return \"unknown\";\n\tif (typeof schema.$ref === \"string\") {\n\t\tconst ref = schema.$ref;\n\t\tif (context.resolving.has(ref) || context.expansions >= MAX_REF_EXPANSIONS) return \"unknown\";\n\t\tconst target = resolveRef(ref, context.root);\n\t\tif (target === undefined) return \"unknown\";\n\t\tcontext.expansions++;\n\t\tcontext.resolving.add(ref);\n\t\ttry {\n\t\t\treturn toType(target, context);\n\t\t} finally {\n\t\t\tcontext.resolving.delete(ref);\n\t\t}\n\t}\n\n\tif (\"const\" in schema) return JSON.stringify(schema.const) ?? \"unknown\";\n\tif (Array.isArray(schema.enum)) return union(schema.enum.map((value) => JSON.stringify(value) ?? \"unknown\"));\n\n\tconst variants = Array.isArray(schema.anyOf) ? schema.anyOf : Array.isArray(schema.oneOf) ? schema.oneOf : undefined;\n\tif (variants) return union(variants.map((variant) => toType(variant as CodemodeJsonSchema, context)));\n\tif (Array.isArray(schema.allOf)) {\n\t\tconst parts = schema.allOf\n\t\t\t.map((part) => toType(part as CodemodeJsonSchema, context))\n\t\t\t.filter((part) => part !== \"unknown\");\n\t\treturn parts.length === 0\n\t\t\t? \"unknown\"\n\t\t\t: parts.map((part) => (part.includes(\" | \") ? `(${part})` : part)).join(\" & \");\n\t}\n\n\tconst type = schema.type;\n\tif (Array.isArray(type)) return union(type.map((entry) => toType({ ...schema, type: entry }, context)));\n\tswitch (type) {\n\t\tcase \"string\":\n\t\t\treturn \"string\";\n\t\tcase \"number\":\n\t\tcase \"integer\":\n\t\t\treturn \"number\";\n\t\tcase \"boolean\":\n\t\t\treturn \"boolean\";\n\t\tcase \"null\":\n\t\t\treturn \"null\";\n\t\tcase \"array\":\n\t\t\treturn arrayType(schema, context);\n\t\tcase \"object\":\n\t\t\treturn objectType(schema, context);\n\t\tcase undefined:\n\t\t\tif (\"properties\" in schema || \"additionalProperties\" in schema || \"required\" in schema) {\n\t\t\t\treturn objectType(schema, context);\n\t\t\t}\n\t\t\tif (\"items\" in schema || \"prefixItems\" in schema) return arrayType(schema, context);\n\t\t\treturn \"unknown\";\n\t\tdefault:\n\t\t\treturn \"unknown\";\n\t}\n}\n\nfunction arrayType(schema: Record<string, unknown>, context: SchemaContext): string {\n\tif (schema.items !== undefined && !Array.isArray(schema.items)) {\n\t\treturn `Array<${toType(schema.items as CodemodeJsonSchema, context)}>`;\n\t}\n\tconst tuple = Array.isArray(schema.prefixItems)\n\t\t? schema.prefixItems\n\t\t: Array.isArray(schema.items)\n\t\t\t? schema.items\n\t\t\t: [];\n\tif (tuple.length > 0) return `[${tuple.map((item) => toType(item as CodemodeJsonSchema, context)).join(\", \")}]`;\n\treturn \"unknown[]\";\n}\n\nfunction descriptionOf(property: unknown): string {\n\treturn isObject(property) && typeof property.description === \"string\" ? property.description.trim() : \"\";\n}\n\nfunction objectType(schema: Record<string, unknown>, context: SchemaContext): string {\n\tconst properties = isObject(schema.properties) ? schema.properties : {};\n\tconst required = new Set(Array.isArray(schema.required) ? schema.required : []);\n\tconst names = Object.keys(properties).sort();\n\tconst members = names.map((name) => {\n\t\tconst optional = required.has(name) ? \"\" : \"?\";\n\t\treturn `${propertyKey(name)}${optional}: ${toType(properties[name] as CodemodeJsonSchema, context)};`;\n\t});\n\tconst additional = schema.additionalProperties;\n\tif (additional !== undefined && additional !== false) {\n\t\tconst type = additional === true ? \"unknown\" : toType(additional as CodemodeJsonSchema, context);\n\t\tmembers.push(`[key: string]: ${type};`);\n\t} else if (additional === undefined && names.length === 0) {\n\t\tmembers.push(\"[key: string]: unknown;\");\n\t}\n\tif (members.length === 0) return \"{}\";\n\tif (!names.some((name) => descriptionOf(properties[name]))) return `{ ${members.join(\" \")} }`;\n\n\tconst lines = [\"{\"];\n\tnames.forEach((name, index) => {\n\t\tfor (const line of descriptionOf(properties[name]).split(/\\r?\\n/)) {\n\t\t\tif (line.trim()) lines.push(`${INDENT}// ${line.trim()}`);\n\t\t}\n\t\tlines.push(`${INDENT}${members[index].replaceAll(\"\\n\", `\\n${INDENT}`)}`);\n\t});\n\tfor (const member of members.slice(names.length)) lines.push(`${INDENT}${member}`);\n\tlines.push(\"}\");\n\treturn lines.join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"declarations.js","sourceRoot":"","sources":["../src/declarations.ts"],"names":[],"mappings":"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","sourcesContent":["import { toCodemodeIdentifier } from \"./identifier.ts\";\n\nexport { toCodemodeIdentifier };\n\nimport type { CodemodeJsonSchema, CodemodeTool } from \"./types.ts\";\n\nconst IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\nconst INDENT = \" \";\n/** Largest rendered input type, in characters, before it becomes `unknown`. */\nexport const DEFAULT_INPUT_SCHEMA_MAX_CHARS = 16_000;\n/** Local `$ref` expansions per rendered schema, so shared definitions cannot blow up the output. */\nconst MAX_REF_EXPANSIONS = 32;\n/** JSON Schema keywords with a number or string value shown as `@keyword value` property tags. */\nconst TAG_KEYWORDS = [\n\t\"minimum\",\n\t\"exclusiveMinimum\",\n\t\"maximum\",\n\t\"exclusiveMaximum\",\n\t\"multipleOf\",\n\t\"minLength\",\n\t\"maxLength\",\n\t\"pattern\",\n\t\"format\",\n\t\"minItems\",\n\t\"maxItems\",\n];\n/** Tag keywords whose values all hold at once, so only the largest (lower) or smallest (upper) matters. */\nconst LOWER_BOUNDS = new Set([\"minimum\", \"exclusiveMinimum\", \"minLength\", \"minItems\"]);\nconst UPPER_BOUNDS = new Set([\"maximum\", \"exclusiveMaximum\", \"maxLength\", \"maxItems\"]);\n/** Longest property tag; longer ones (large defaults, long patterns) are left out. */\nconst MAX_TAG_CHARS = 80;\n/** Characters that end a `//` comment. */\nconst LINE_TERMINATORS = /[\\r\\n\\u2028\\u2029]/g;\n\nexport interface RenderDeclarationsOptions {\n\ttools?: readonly CodemodeTool[];\n\tglobals?: readonly CodemodeTool[];\n}\n\n/**\n * Render TypeScript declarations for the script-visible API. Tools become members of\n * `declare const tools`, globals become `declare function` statements, and `ns.member` globals\n * members of `declare const ns`. Descriptions become doc comments; schemas become types.\n */\nexport function renderDeclarations(options: RenderDeclarationsOptions): string {\n\tconst sections: string[] = [];\n\tconst tools = options.tools ?? [];\n\tif (tools.length > 0) {\n\t\tconst members = tools.map(\n\t\t\t(tool) => `${docComment(tool.description, INDENT)}${INDENT}${renderToolSignature(tool)}`,\n\t\t);\n\t\tsections.push(`declare const tools: {\\n${members.join(\"\\n\")}\\n};`);\n\t}\n\tconst namespaces = new Map<string, string[]>();\n\tfor (const global of options.globals ?? []) {\n\t\tconst dot = global.name.indexOf(\".\");\n\t\tif (dot === -1) {\n\t\t\tsections.push(renderGlobal(`declare function ${global.name}`, global, \"\"));\n\t\t\tcontinue;\n\t\t}\n\t\tconst namespace = global.name.slice(0, dot);\n\t\tconst members = namespaces.get(namespace) ?? [];\n\t\tif (members.length === 0) namespaces.set(namespace, members);\n\t\tmembers.push(renderGlobal(global.name.slice(dot + 1), global, INDENT));\n\t}\n\tfor (const [namespace, members] of namespaces) {\n\t\tsections.push(`declare const ${namespace}: {\\n${members.join(\"\\n\")}\\n};`);\n\t}\n\treturn sections.join(\"\\n\\n\");\n}\n\n/**\n * One tool as a member of the `tools` object: `name(args: T): Promise<R>;` with the\n * name as the identifier scripts use. Input types longer than `inputMaxChars` render as `unknown`.\n */\nexport function renderToolSignature(\n\ttool: Pick<CodemodeTool, \"name\" | \"inputSchema\" | \"outputSchema\">,\n\toptions: { inputMaxChars?: number } = {},\n): string {\n\tconst input =\n\t\ttool.inputSchema === undefined\n\t\t\t? \"unknown\"\n\t\t\t: schemaToType(tool.inputSchema, { maxChars: options.inputMaxChars ?? DEFAULT_INPUT_SCHEMA_MAX_CHARS });\n\treturn `${toCodemodeIdentifier(tool.name)}(args: ${input}): Promise<${renderToolOutputType(tool.outputSchema)}>;`;\n}\n\n/**\n * A tool's sample: the description followed by the tool's declaration. Used for tool\n * listings and `ALL_TOOLS` entries.\n */\nexport function renderToolSample(\n\ttool: Pick<CodemodeTool, \"name\" | \"description\" | \"inputSchema\" | \"outputSchema\">,\n\toptions: { inputMaxChars?: number } = {},\n): string {\n\tconst declaration = `declare const tools: { ${renderToolSignature(tool, options)} };`;\n\treturn `${tool.description?.trim() ?? \"\"}\\n\\ncodemode tool declaration:\\n\\`\\`\\`ts\\n${declaration}\\n\\`\\`\\``;\n}\n\n/** The type a tool call resolves to: the output schema's type, and `unknown` without a schema. */\nexport function renderToolOutputType(schema: CodemodeJsonSchema | undefined): string {\n\treturn schema === undefined ? \"unknown\" : schemaToType(schema);\n}\n\nfunction renderGlobal(head: string, global: CodemodeTool, indent: string): string {\n\tif (global.signature !== undefined) {\n\t\treturn `${docComment(global.description, indent)}${indent}${head}${global.signature};`;\n\t}\n\tconst input = global.inputSchema === undefined ? \"unknown\" : schemaToType(global.inputSchema);\n\tconst output = global.outputSchema === undefined ? \"unknown\" : schemaToType(global.outputSchema);\n\treturn `${docComment(global.description, indent)}${indent}${head}(args: ${input}): Promise<${output}>;`;\n}\n\nfunction docComment(description: string | undefined, indent: string): string {\n\tconst text = description?.trim();\n\tif (!text) return \"\";\n\tconst lines = text.replaceAll(\"*/\", \"*\\\\/\").split(/\\r?\\n/);\n\tif (lines.length === 1) return `${indent}/** ${lines[0]} */\\n`;\n\treturn `${indent}/**\\n${lines.map((line) => `${indent} *${line ? ` ${line}` : \"\"}`).join(\"\\n\")}\\n${indent} */\\n`;\n}\n\nfunction propertyKey(name: string): string {\n\treturn IDENTIFIER.test(name) ? name : JSON.stringify(name);\n}\n\nfunction union(types: string[]): string {\n\tconst unique = [...new Set(types)];\n\tif (unique.includes(\"unknown\")) return \"unknown\";\n\treturn unique.length === 0 ? \"never\" : unique.join(\" | \");\n}\n\n/**\n * Convert a JSON Schema to a TypeScript type expression: objects on one line (`{ a: string; b?: number; }`) with properties sorted by name,\n * or one property per line with `//` comments when a property has a description or constraints the\n * type cannot express (`// @integer @minimum 1 @default 20`); `Array<T>` for arrays. Local references\n * (`#/$defs/...`, `#/definitions/...`) resolve against `schema`; recursive and remote references\n * render as `unknown`. A result longer than `maxChars` is rendered again without the constraint tags,\n * and renders as `unknown` if it is still too long.\n */\nexport function schemaToType(schema: CodemodeJsonSchema, options: { maxChars?: number } = {}): string {\n\tconst render = (tags: boolean) => toType(schema, { root: schema, resolving: new Set(), expansions: 0, tags });\n\tconst type = render(true);\n\tif (options.maxChars === undefined || type.length <= options.maxChars) return type;\n\tconst untagged = render(false);\n\treturn untagged.length <= options.maxChars ? untagged : \"unknown\";\n}\n\ninterface SchemaContext {\n\troot: CodemodeJsonSchema;\n\t/** References being expanded on the current path, to stop at recursive types. */\n\tresolving: Set<string>;\n\texpansions: number;\n\t/** Whether property comments include constraint tags. */\n\ttags: boolean;\n}\n\nfunction resolveRef(ref: string, root: CodemodeJsonSchema): CodemodeJsonSchema | undefined {\n\tif (ref !== \"#\" && !ref.startsWith(\"#/\")) return undefined;\n\tlet current: unknown = root;\n\tfor (const segment of ref.slice(2).split(\"/\").filter(Boolean)) {\n\t\tconst key = decodeURIComponent(segment).replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n\t\tif (typeof current !== \"object\" || current === null || Array.isArray(current) || !(key in current)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tcurrent = (current as Record<string, unknown>)[key];\n\t}\n\tif (typeof current === \"boolean\") return current;\n\treturn typeof current === \"object\" && current !== null && !Array.isArray(current)\n\t\t? (current as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction toType(schema: CodemodeJsonSchema, context: SchemaContext): string {\n\tif (schema === true) return \"unknown\";\n\tif (schema === false) return \"never\";\n\tif (typeof schema !== \"object\" || schema === null || Array.isArray(schema)) return \"unknown\";\n\tif (typeof schema.$ref === \"string\") {\n\t\tconst ref = schema.$ref;\n\t\tif (context.resolving.has(ref) || context.expansions >= MAX_REF_EXPANSIONS) return \"unknown\";\n\t\tconst target = resolveRef(ref, context.root);\n\t\tif (target === undefined) return \"unknown\";\n\t\tcontext.expansions++;\n\t\tcontext.resolving.add(ref);\n\t\ttry {\n\t\t\treturn toType(target, context);\n\t\t} finally {\n\t\t\tcontext.resolving.delete(ref);\n\t\t}\n\t}\n\n\tif (\"const\" in schema) return JSON.stringify(schema.const) ?? \"unknown\";\n\tif (Array.isArray(schema.enum)) return union(schema.enum.map((value) => JSON.stringify(value) ?? \"unknown\"));\n\n\tconst variants = Array.isArray(schema.anyOf) ? schema.anyOf : Array.isArray(schema.oneOf) ? schema.oneOf : undefined;\n\tif (variants) return union(variants.map((variant) => toType(variant as CodemodeJsonSchema, context)));\n\tif (Array.isArray(schema.allOf)) {\n\t\tconst parts = schema.allOf\n\t\t\t.map((part) => toType(part as CodemodeJsonSchema, context))\n\t\t\t.filter((part) => part !== \"unknown\");\n\t\treturn parts.length === 0\n\t\t\t? \"unknown\"\n\t\t\t: parts.map((part) => (part.includes(\" | \") ? `(${part})` : part)).join(\" & \");\n\t}\n\n\tconst type = schema.type;\n\tif (Array.isArray(type)) return union(type.map((entry) => toType({ ...schema, type: entry }, context)));\n\tswitch (type) {\n\t\tcase \"string\":\n\t\t\treturn \"string\";\n\t\tcase \"number\":\n\t\tcase \"integer\":\n\t\t\treturn \"number\";\n\t\tcase \"boolean\":\n\t\t\treturn \"boolean\";\n\t\tcase \"null\":\n\t\t\treturn \"null\";\n\t\tcase \"array\":\n\t\t\treturn arrayType(schema, context);\n\t\tcase \"object\":\n\t\t\treturn objectType(schema, context);\n\t\tcase undefined:\n\t\t\tif (\"properties\" in schema || \"additionalProperties\" in schema || \"required\" in schema) {\n\t\t\t\treturn objectType(schema, context);\n\t\t\t}\n\t\t\tif (\"items\" in schema || \"prefixItems\" in schema) return arrayType(schema, context);\n\t\t\treturn \"unknown\";\n\t\tdefault:\n\t\t\treturn \"unknown\";\n\t}\n}\n\nfunction arrayType(schema: Record<string, unknown>, context: SchemaContext): string {\n\tif (schema.items !== undefined && !Array.isArray(schema.items)) {\n\t\treturn `Array<${toType(schema.items as CodemodeJsonSchema, context)}>`;\n\t}\n\tconst tuple = Array.isArray(schema.prefixItems)\n\t\t? schema.prefixItems\n\t\t: Array.isArray(schema.items)\n\t\t\t? schema.items\n\t\t\t: [];\n\tif (tuple.length > 0) return `[${tuple.map((item) => toType(item as CodemodeJsonSchema, context)).join(\", \")}]`;\n\treturn \"unknown[]\";\n}\n\nfunction descriptionOf(property: unknown): string {\n\tconst description = (property as { description?: unknown } | null | undefined)?.description;\n\treturn typeof description === \"string\" ? description.trim() : \"\";\n}\n\n/**\n * Constraints of a property that its TypeScript type cannot express, as JSDoc-style tags:\n * `@integer @minimum 1 @maximum 100 @default 20`. Empty when there are none.\n */\nfunction constraintTags(schema: unknown): string {\n\tif (typeof schema !== \"object\" || schema === null || Array.isArray(schema)) return \"\";\n\tconst property = schema as Record<string, unknown>;\n\t// Optional fields such as Pydantic's `int | None` keep their constraints in the non-null branch.\n\t// The branch's constraints apply together with the property's, so both are read.\n\tconst variants = Array.isArray(property.anyOf) ? property.anyOf : property.oneOf;\n\tconst nonNull: unknown[] = Array.isArray(variants)\n\t\t? variants.filter((variant) => (variant as { type?: unknown } | null)?.type !== \"null\")\n\t\t: [];\n\tconst branch = nonNull.length === 1 ? nonNull[0] : undefined;\n\tconst branches =\n\t\ttypeof branch === \"object\" && branch !== null && !Array.isArray(branch)\n\t\t\t? [property, branch as Record<string, unknown>]\n\t\t\t: [property];\n\t// Draft-04 and OpenAPI 3.0 make `minimum`/`maximum` exclusive with a boolean `exclusiveMinimum`/`exclusiveMaximum`.\n\tconst schemas = branches.map(\n\t\t(schema): Record<string, unknown> => ({\n\t\t\t...schema,\n\t\t\t...(schema.exclusiveMinimum === true ? { minimum: undefined, exclusiveMinimum: schema.minimum } : {}),\n\t\t\t...(schema.exclusiveMaximum === true ? { maximum: undefined, exclusiveMaximum: schema.maximum } : {}),\n\t\t}),\n\t);\n\n\tconst tags: string[] = [];\n\tconst isInteger = (type: unknown) => type === \"integer\" || (Array.isArray(type) && type.includes(\"integer\"));\n\tif (schemas.some((schema) => isInteger(schema.type))) tags.push(\"@integer\");\n\tfor (const keyword of TAG_KEYWORDS) {\n\t\tconst values = schemas.map((schema) => schema[keyword]);\n\t\tif (LOWER_BOUNDS.has(keyword) || UPPER_BOUNDS.has(keyword)) {\n\t\t\tconst numbers = values.filter((value) => typeof value === \"number\");\n\t\t\tif (numbers.length === 0) continue;\n\t\t\ttags.push(`@${keyword} ${LOWER_BOUNDS.has(keyword) ? Math.max(...numbers) : Math.min(...numbers)}`);\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const value of new Set(values)) {\n\t\t\tif (typeof value === \"number\" || typeof value === \"string\") tags.push(`@${keyword} ${value}`);\n\t\t}\n\t}\n\tif (schemas.some((schema) => schema.uniqueItems === true)) tags.push(\"@uniqueItems\");\n\t// Annotations, unlike constraints, come from the property itself.\n\tif (property.default !== undefined && property.default !== null) {\n\t\ttags.push(`@default ${JSON.stringify(property.default)}`);\n\t}\n\tif (property.deprecated === true) tags.push(\"@deprecated\");\n\treturn tags\n\t\t.filter((tag) => tag.length <= MAX_TAG_CHARS)\n\t\t.map((tag) => tag.replace(LINE_TERMINATORS, (char) => `\\\\u${char.charCodeAt(0).toString(16).padStart(4, \"0\")}`))\n\t\t.join(\" \");\n}\n\nfunction objectType(schema: Record<string, unknown>, context: SchemaContext): string {\n\tconst properties =\n\t\ttypeof schema.properties === \"object\" && schema.properties !== null && !Array.isArray(schema.properties)\n\t\t\t? (schema.properties as Record<string, unknown>)\n\t\t\t: {};\n\tconst required = new Set(Array.isArray(schema.required) ? schema.required : []);\n\tconst names = Object.keys(properties).sort();\n\tconst members = names.map((name) => {\n\t\tconst optional = required.has(name) ? \"\" : \"?\";\n\t\treturn `${propertyKey(name)}${optional}: ${toType(properties[name] as CodemodeJsonSchema, context)};`;\n\t});\n\tconst additional = schema.additionalProperties;\n\tif (additional !== undefined && additional !== false) {\n\t\tconst type = additional === true ? \"unknown\" : toType(additional as CodemodeJsonSchema, context);\n\t\tmembers.push(`[key: string]: ${type};`);\n\t} else if (additional === undefined && names.length === 0) {\n\t\tmembers.push(\"[key: string]: unknown;\");\n\t}\n\tif (members.length === 0) return \"{}\";\n\tconst comments = names.map((name) => {\n\t\tconst lines = descriptionOf(properties[name])\n\t\t\t.split(LINE_TERMINATORS)\n\t\t\t.map((line) => line.trim())\n\t\t\t.filter(Boolean);\n\t\tconst tags = context.tags ? constraintTags(properties[name]) : \"\";\n\t\treturn tags ? [...lines, tags] : lines;\n\t});\n\tif (!comments.some((comment) => comment.length > 0)) return `{ ${members.join(\" \")} }`;\n\n\tconst lines = [\"{\"];\n\tcomments.forEach((comment, index) => {\n\t\tfor (const line of comment) lines.push(`${INDENT}// ${line}`);\n\t\tlines.push(`${INDENT}${members[index].replaceAll(\"\\n\", `\\n${INDENT}`)}`);\n\t});\n\tfor (const member of members.slice(names.length)) lines.push(`${INDENT}${member}`);\n\tlines.push(\"}\");\n\treturn lines.join(\"\\n\");\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
- export { DEFAULT_INPUT_SCHEMA_MAX_CHARS, MCP_TYPESCRIPT_PREAMBLE, mcpStructuredContentSchema, type RenderDeclarationsOptions, renderDeclarations, renderToolOutputType, renderToolSample, renderToolSignature, schemaToType, } from "./declarations.ts";
1
+ export { DEFAULT_INPUT_SCHEMA_MAX_CHARS, type RenderDeclarationsOptions, renderDeclarations, renderToolOutputType, renderToolSample, renderToolSignature, schemaToType, } from "./declarations.ts";
2
2
  export { toCodemodeIdentifier } from "./identifier.ts";
3
+ export { CodemodeSandboxBase } from "./runtime/execution.ts";
3
4
  export { CodemodeSandbox } from "./runtime/host.ts";
5
+ export { DEFAULT_INTERRUPT_BUDGET, InlineCodemodeSandbox, type InlineCodemodeSandboxOptions, } from "./runtime/inline.ts";
4
6
  export { MAX_OUTPUT_CHARS, MAX_OUTPUT_ITEMS, MAX_STORE_TOTAL_CHARS, MAX_STORE_VALUE_CHARS, } from "./runtime/prelude-source.ts";
7
+ export { type CodemodeRemote, type CodemodeRemoteExchange, type CodemodeRemoteMessage, type CodemodeRemoteReply, type CodemodeRemoteRequest, type CodemodeServeOptions, RemoteCodemodeSandbox, type RemoteCodemodeSandboxOptions, serveCodemodeRemote, } from "./runtime/remote.ts";
5
8
  export { CODEMODE_OPTIONS_PREFIX, CODEMODE_SOURCE_GRAMMAR, CodemodeSourceError, type CodemodeSourceOptions, type ParsedCodemodeSource, parseCodemodeSource, } from "./source.ts";
6
- export type { CodemodeCall, CodemodeCallStatus, CodemodeError, CodemodeErrorKind, CodemodeExecuteOptions, CodemodeJsonSchema, CodemodeOutputItem, CodemodeResult, CodemodeSandboxOptions, CodemodeStoreWrites, CodemodeTool, CodemodeToolContext, } from "./types.ts";
9
+ export type { CodemodeCall, CodemodeCallStatus, CodemodeDeclaredGlobal, CodemodeDeclaredTool, CodemodeDuring, CodemodeError, CodemodeErrorKind, CodemodeExecuteOptions, CodemodeHostCall, CodemodeJsonSchema, CodemodeOutcome, CodemodeOutputItem, CodemodeResult, CodemodeRun, CodemodeRunOptions, CodemodeSandboxBaseOptions, CodemodeSandboxOptions, CodemodeStoreWrites, CodemodeTool, CodemodeToolContext, } from "./types.ts";
7
10
  export { type CodemodeWasmModule, loadQuickJSWasm } from "./wasm.ts";
8
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,EAC9B,uBAAuB,EACvB,0BAA0B,EAC1B,KAAK,yBAAyB,EAC9B,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,mBAAmB,GACnB,MAAM,aAAa,CAAC;AACrB,YAAY,EACX,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,kBAAkB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,EAC9B,KAAK,yBAAyB,EAC9B,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACN,wBAAwB,EACxB,qBAAqB,EACrB,KAAK,4BAA4B,GACjC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,KAAK,4BAA4B,EACjC,mBAAmB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,mBAAmB,GACnB,MAAM,aAAa,CAAC;AACrB,YAAY,EACX,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,kBAAkB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,10 @@
1
- export { DEFAULT_INPUT_SCHEMA_MAX_CHARS, MCP_TYPESCRIPT_PREAMBLE, mcpStructuredContentSchema, renderDeclarations, renderToolOutputType, renderToolSample, renderToolSignature, schemaToType, } from "./declarations.js";
1
+ export { DEFAULT_INPUT_SCHEMA_MAX_CHARS, renderDeclarations, renderToolOutputType, renderToolSample, renderToolSignature, schemaToType, } from "./declarations.js";
2
2
  export { toCodemodeIdentifier } from "./identifier.js";
3
+ export { CodemodeSandboxBase } from "./runtime/execution.js";
3
4
  export { CodemodeSandbox } from "./runtime/host.js";
5
+ export { DEFAULT_INTERRUPT_BUDGET, InlineCodemodeSandbox, } from "./runtime/inline.js";
4
6
  export { MAX_OUTPUT_CHARS, MAX_OUTPUT_ITEMS, MAX_STORE_TOTAL_CHARS, MAX_STORE_VALUE_CHARS, } from "./runtime/prelude-source.js";
7
+ export { RemoteCodemodeSandbox, serveCodemodeRemote, } from "./runtime/remote.js";
5
8
  export { CODEMODE_OPTIONS_PREFIX, CODEMODE_SOURCE_GRAMMAR, CodemodeSourceError, parseCodemodeSource, } from "./source.js";
6
9
  export { loadQuickJSWasm } from "./wasm.js";
7
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,EAC9B,uBAAuB,EACvB,0BAA0B,EAE1B,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EAGnB,mBAAmB,GACnB,MAAM,aAAa,CAAC;AAerB,OAAO,EAA2B,eAAe,EAAE,MAAM,WAAW,CAAC","sourcesContent":["export {\n\tDEFAULT_INPUT_SCHEMA_MAX_CHARS,\n\tMCP_TYPESCRIPT_PREAMBLE,\n\tmcpStructuredContentSchema,\n\ttype RenderDeclarationsOptions,\n\trenderDeclarations,\n\trenderToolOutputType,\n\trenderToolSample,\n\trenderToolSignature,\n\tschemaToType,\n} from \"./declarations.ts\";\nexport { toCodemodeIdentifier } from \"./identifier.ts\";\nexport { CodemodeSandbox } from \"./runtime/host.ts\";\nexport {\n\tMAX_OUTPUT_CHARS,\n\tMAX_OUTPUT_ITEMS,\n\tMAX_STORE_TOTAL_CHARS,\n\tMAX_STORE_VALUE_CHARS,\n} from \"./runtime/prelude-source.ts\";\nexport {\n\tCODEMODE_OPTIONS_PREFIX,\n\tCODEMODE_SOURCE_GRAMMAR,\n\tCodemodeSourceError,\n\ttype CodemodeSourceOptions,\n\ttype ParsedCodemodeSource,\n\tparseCodemodeSource,\n} from \"./source.ts\";\nexport type {\n\tCodemodeCall,\n\tCodemodeCallStatus,\n\tCodemodeError,\n\tCodemodeErrorKind,\n\tCodemodeExecuteOptions,\n\tCodemodeJsonSchema,\n\tCodemodeOutputItem,\n\tCodemodeResult,\n\tCodemodeSandboxOptions,\n\tCodemodeStoreWrites,\n\tCodemodeTool,\n\tCodemodeToolContext,\n} from \"./types.ts\";\nexport { type CodemodeWasmModule, loadQuickJSWasm } from \"./wasm.ts\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,EAE9B,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACN,wBAAwB,EACxB,qBAAqB,GAErB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAON,qBAAqB,EAErB,mBAAmB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EAGnB,mBAAmB,GACnB,MAAM,aAAa,CAAC;AAuBrB,OAAO,EAA2B,eAAe,EAAE,MAAM,WAAW,CAAC","sourcesContent":["export {\n\tDEFAULT_INPUT_SCHEMA_MAX_CHARS,\n\ttype RenderDeclarationsOptions,\n\trenderDeclarations,\n\trenderToolOutputType,\n\trenderToolSample,\n\trenderToolSignature,\n\tschemaToType,\n} from \"./declarations.ts\";\nexport { toCodemodeIdentifier } from \"./identifier.ts\";\nexport { CodemodeSandboxBase } from \"./runtime/execution.ts\";\nexport { CodemodeSandbox } from \"./runtime/host.ts\";\nexport {\n\tDEFAULT_INTERRUPT_BUDGET,\n\tInlineCodemodeSandbox,\n\ttype InlineCodemodeSandboxOptions,\n} from \"./runtime/inline.ts\";\nexport {\n\tMAX_OUTPUT_CHARS,\n\tMAX_OUTPUT_ITEMS,\n\tMAX_STORE_TOTAL_CHARS,\n\tMAX_STORE_VALUE_CHARS,\n} from \"./runtime/prelude-source.ts\";\nexport {\n\ttype CodemodeRemote,\n\ttype CodemodeRemoteExchange,\n\ttype CodemodeRemoteMessage,\n\ttype CodemodeRemoteReply,\n\ttype CodemodeRemoteRequest,\n\ttype CodemodeServeOptions,\n\tRemoteCodemodeSandbox,\n\ttype RemoteCodemodeSandboxOptions,\n\tserveCodemodeRemote,\n} from \"./runtime/remote.ts\";\nexport {\n\tCODEMODE_OPTIONS_PREFIX,\n\tCODEMODE_SOURCE_GRAMMAR,\n\tCodemodeSourceError,\n\ttype CodemodeSourceOptions,\n\ttype ParsedCodemodeSource,\n\tparseCodemodeSource,\n} from \"./source.ts\";\nexport type {\n\tCodemodeCall,\n\tCodemodeCallStatus,\n\tCodemodeDeclaredGlobal,\n\tCodemodeDeclaredTool,\n\tCodemodeDuring,\n\tCodemodeError,\n\tCodemodeErrorKind,\n\tCodemodeExecuteOptions,\n\tCodemodeHostCall,\n\tCodemodeJsonSchema,\n\tCodemodeOutcome,\n\tCodemodeOutputItem,\n\tCodemodeResult,\n\tCodemodeRun,\n\tCodemodeRunOptions,\n\tCodemodeSandboxBaseOptions,\n\tCodemodeSandboxOptions,\n\tCodemodeStoreWrites,\n\tCodemodeTool,\n\tCodemodeToolContext,\n} from \"./types.ts\";\nexport { type CodemodeWasmModule, loadQuickJSWasm } from \"./wasm.ts\";\n"]}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Sandboxes that need no Node built-ins: `InlineCodemodeSandbox` runs the VM on the calling thread
3
+ * and `RemoteCodemodeSandbox` runs it in another isolate. Neither imports `node:*` modules, so this
4
+ * entry works in Cloudflare Workers, Durable Objects, and browsers. `CodemodeSandbox`, which uses
5
+ * worker threads, stays in the main entry.
6
+ */
7
+ export { toCodemodeIdentifier } from "./identifier.ts";
8
+ export { CodemodeSandboxBase } from "./runtime/execution.ts";
9
+ export { DEFAULT_INTERRUPT_BUDGET, InlineCodemodeSandbox, type InlineCodemodeSandboxOptions, } from "./runtime/inline.ts";
10
+ export { MAX_OUTPUT_CHARS, MAX_OUTPUT_ITEMS, MAX_STORE_TOTAL_CHARS, MAX_STORE_VALUE_CHARS, } from "./runtime/prelude-source.ts";
11
+ export type { HostToWorkerMessage, VmStartData, WorkerToHostMessage } from "./runtime/protocol.ts";
12
+ export { type CodemodeRemote, type CodemodeRemoteExchange, type CodemodeRemoteMessage, type CodemodeRemoteReply, type CodemodeRemoteRequest, type CodemodeServeOptions, RemoteCodemodeSandbox, type RemoteCodemodeSandboxOptions, serveCodemodeRemote, } from "./runtime/remote.ts";
13
+ export type { CodemodeCall, CodemodeCallStatus, CodemodeDeclaredGlobal, CodemodeDeclaredTool, CodemodeDuring, CodemodeError, CodemodeErrorKind, CodemodeExecuteOptions, CodemodeHostCall, CodemodeJsonSchema, CodemodeOutcome, CodemodeOutputItem, CodemodeResult, CodemodeRun, CodemodeRunOptions, CodemodeSandboxBaseOptions, CodemodeStoreWrites, CodemodeTool, CodemodeToolContext, } from "./types.ts";
14
+ export type { CodemodeWasmModule } from "./wasm.ts";
15
+ //# sourceMappingURL=portable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable.d.ts","sourceRoot":"","sources":["../src/portable.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACN,wBAAwB,EACxB,qBAAqB,EACrB,KAAK,4BAA4B,GACjC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,GACrB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACnG,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,KAAK,4BAA4B,EACjC,mBAAmB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACX,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,0BAA0B,EAC1B,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,GACnB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Sandboxes that need no Node built-ins: `InlineCodemodeSandbox` runs the VM on the calling thread
3
+ * and `RemoteCodemodeSandbox` runs it in another isolate. Neither imports `node:*` modules, so this
4
+ * entry works in Cloudflare Workers, Durable Objects, and browsers. `CodemodeSandbox`, which uses
5
+ * worker threads, stays in the main entry.
6
+ */
7
+ export { toCodemodeIdentifier } from "./identifier.js";
8
+ export { CodemodeSandboxBase } from "./runtime/execution.js";
9
+ export { DEFAULT_INTERRUPT_BUDGET, InlineCodemodeSandbox, } from "./runtime/inline.js";
10
+ export { MAX_OUTPUT_CHARS, MAX_OUTPUT_ITEMS, MAX_STORE_TOTAL_CHARS, MAX_STORE_VALUE_CHARS, } from "./runtime/prelude-source.js";
11
+ export { RemoteCodemodeSandbox, serveCodemodeRemote, } from "./runtime/remote.js";
12
+ //# sourceMappingURL=portable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable.js","sourceRoot":"","sources":["../src/portable.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACN,wBAAwB,EACxB,qBAAqB,GAErB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,GACrB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAON,qBAAqB,EAErB,mBAAmB,GACnB,MAAM,qBAAqB,CAAC","sourcesContent":["/**\n * Sandboxes that need no Node built-ins: `InlineCodemodeSandbox` runs the VM on the calling thread\n * and `RemoteCodemodeSandbox` runs it in another isolate. Neither imports `node:*` modules, so this\n * entry works in Cloudflare Workers, Durable Objects, and browsers. `CodemodeSandbox`, which uses\n * worker threads, stays in the main entry.\n */\nexport { toCodemodeIdentifier } from \"./identifier.ts\";\nexport { CodemodeSandboxBase } from \"./runtime/execution.ts\";\nexport {\n\tDEFAULT_INTERRUPT_BUDGET,\n\tInlineCodemodeSandbox,\n\ttype InlineCodemodeSandboxOptions,\n} from \"./runtime/inline.ts\";\nexport {\n\tMAX_OUTPUT_CHARS,\n\tMAX_OUTPUT_ITEMS,\n\tMAX_STORE_TOTAL_CHARS,\n\tMAX_STORE_VALUE_CHARS,\n} from \"./runtime/prelude-source.ts\";\nexport type { HostToWorkerMessage, VmStartData, WorkerToHostMessage } from \"./runtime/protocol.ts\";\nexport {\n\ttype CodemodeRemote,\n\ttype CodemodeRemoteExchange,\n\ttype CodemodeRemoteMessage,\n\ttype CodemodeRemoteReply,\n\ttype CodemodeRemoteRequest,\n\ttype CodemodeServeOptions,\n\tRemoteCodemodeSandbox,\n\ttype RemoteCodemodeSandboxOptions,\n\tserveCodemodeRemote,\n} from \"./runtime/remote.ts\";\nexport type {\n\tCodemodeCall,\n\tCodemodeCallStatus,\n\tCodemodeDeclaredGlobal,\n\tCodemodeDeclaredTool,\n\tCodemodeDuring,\n\tCodemodeError,\n\tCodemodeErrorKind,\n\tCodemodeExecuteOptions,\n\tCodemodeHostCall,\n\tCodemodeJsonSchema,\n\tCodemodeOutcome,\n\tCodemodeOutputItem,\n\tCodemodeResult,\n\tCodemodeRun,\n\tCodemodeRunOptions,\n\tCodemodeSandboxBaseOptions,\n\tCodemodeStoreWrites,\n\tCodemodeTool,\n\tCodemodeToolContext,\n} from \"./types.ts\";\nexport type { CodemodeWasmModule } from \"./wasm.ts\";\n"]}
@@ -0,0 +1,66 @@
1
+ import type { CodemodeError, CodemodeExecuteOptions, CodemodeResult, CodemodeRun, CodemodeRunOptions, CodemodeSandboxBaseOptions, CodemodeTool } from "../types.ts";
2
+ import { type HostToWorkerMessage, type VmStartData } from "./protocol.ts";
3
+ /** Callbacks a launcher uses to report what its VM does. */
4
+ export interface VmEvents {
5
+ /** A message from the VM. Validated here, so launchers can pass through anything they receive. */
6
+ message(message: unknown): void;
7
+ /** The VM failed or stopped outside the bridge, for example a worker exit or a remote error. */
8
+ failure(error: CodemodeError): void;
9
+ }
10
+ /** The host's handle on a running VM. */
11
+ export interface VmChannel {
12
+ post(message: HostToWorkerMessage): void;
13
+ /** Requests VM shutdown. Called once; may resolve before a worker or remote VM actually exits. */
14
+ stop(): Promise<void>;
15
+ }
16
+ /**
17
+ * Starts a VM for one execution. Rejections become `sandbox` errors with the rejection's message.
18
+ * The VM may start reporting messages before the returned promise settles.
19
+ */
20
+ export type VmLauncher = (data: VmStartData, events: VmEvents) => VmChannel | Promise<VmChannel>;
21
+ export declare function errorMessage(error: unknown): string;
22
+ /**
23
+ * Tool table, defaults, and in-flight executions; the behavior every sandbox shares. Subclasses
24
+ * only choose where the VM runs by passing a {@link VmLauncher}.
25
+ *
26
+ * The script sees `tools.<name>(args)` for every registered tool, `ALL_TOOLS`, the output helpers
27
+ * `text`, `image`, `exit`, and `console.*`, `store`/`load`, and the configured globals; nothing
28
+ * else (no timers, `fetch`, `process`, `require`, modules). Each `execute()` gets its own VM; the
29
+ * sandbox only holds the tool table and defaults. `close()` aborts in-flight executions.
30
+ */
31
+ export declare class CodemodeSandboxBase {
32
+ private readonly toolsByName;
33
+ private readonly globalsByName;
34
+ private readonly timeoutMs;
35
+ private readonly memoryLimitBytes;
36
+ private readonly launch;
37
+ private readonly running;
38
+ private closed;
39
+ constructor(options: CodemodeSandboxBaseOptions, launch: VmLauncher);
40
+ /** Throws if a tool with the same name is already registered. */
41
+ registerTool(tool: CodemodeTool): void;
42
+ unregisterTool(name: string): boolean;
43
+ get tools(): CodemodeTool[];
44
+ get globals(): CodemodeTool[];
45
+ /**
46
+ * `code` is an async function body: `return` and top-level `await` work.
47
+ * Never rejects for script failures; those come back as `{ ok: false }`.
48
+ * The script can use `store(key, value)` and `load(key)` on `options.store`.
49
+ */
50
+ execute(code: string, options?: CodemodeExecuteOptions): Promise<CodemodeResult>;
51
+ /**
52
+ * Run `code` deterministically, with the caller answering its calls: the same script, start time, seed, tools,
53
+ * globals, and store, answered with the same results in the same `seq` order, makes the same calls with the same
54
+ * arguments and produces the same output, on any VM with the same fingerprint. A host can therefore replay it
55
+ * after a restart. The VM runs in UTC, its clock reads `startedAt` and then the `now` of the result being
56
+ * processed, its randomness comes from `seed`, and `WeakRef` and `FinalizationRegistry` do not exist.
57
+ *
58
+ * The sandbox's own tools and globals are not used: the run declares its own, and every call goes to
59
+ * `options.onCall`. Never rejects for script failures; abort through `options.signal` to end the run with an
60
+ * error the script cannot catch.
61
+ */
62
+ start(code: string, options: CodemodeRunOptions): CodemodeRun;
63
+ /** Aborts in-flight executions (they resolve with `kind: "aborted"`) and rejects new ones. */
64
+ close(): Promise<void>;
65
+ }
66
+ //# sourceMappingURL=execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/runtime/execution.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAMX,aAAa,EACb,sBAAsB,EAGtB,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,0BAA0B,EAE1B,YAAY,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,KAAK,mBAAmB,EAExB,KAAK,WAAW,EAEhB,MAAM,eAAe,CAAC;AAgBvB,4DAA4D;AAC5D,MAAM,WAAW,QAAQ;IACxB,kGAAkG;IAClG,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,gGAAgG;IAChG,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;CACpC;AAED,yCAAyC;AACzC,MAAM,WAAW,SAAS;IACzB,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACzC,kGAAkG;IAClG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAEjG,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD;AA6WD;;;;;;;;GAQG;AACH,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmC;IAC/D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,MAAM,CAAS;IAEvB,YAAY,OAAO,EAAE,0BAA0B,EAAE,MAAM,EAAE,UAAU,EAOlE;IAED,iEAAiE;IACjE,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAGrC;IAED,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpC;IAED,IAAI,KAAK,IAAI,YAAY,EAAE,CAE1B;IAED,IAAI,OAAO,IAAI,YAAY,EAAE,CAE5B;IAED;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,cAAc,CAAC,CAgBnF;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAoC5D;IAED,8FAA8F;IACxF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAG3B;CACD"}