@tanstack/ai-code-mode 0.3.8 → 0.3.9
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/dist/esm/agent-store.js +23 -27
- package/dist/esm/agent-store.js.map +1 -1
- package/dist/esm/bindings/tool-to-binding.js +92 -87
- package/dist/esm/bindings/tool-to-binding.js.map +1 -1
- package/dist/esm/code-wrapper.js +14 -5
- package/dist/esm/code-wrapper.js.map +1 -1
- package/dist/esm/create-code-mode-tool.js +155 -153
- package/dist/esm/create-code-mode-tool.js.map +1 -1
- package/dist/esm/create-code-mode.js +36 -14
- package/dist/esm/create-code-mode.js.map +1 -1
- package/dist/esm/create-discovery-tool.js +63 -55
- package/dist/esm/create-discovery-tool.js.map +1 -1
- package/dist/esm/create-system-prompt.js +43 -24
- package/dist/esm/create-system-prompt.js.map +1 -1
- package/dist/esm/index.js +5 -20
- package/dist/esm/strip-typescript.js +64 -46
- package/dist/esm/strip-typescript.js.map +1 -1
- package/dist/esm/type-generator/json-schema-to-ts.js +82 -92
- package/dist/esm/type-generator/json-schema-to-ts.js.map +1 -1
- package/dist/esm/validate-bindings.js +102 -91
- package/dist/esm/validate-bindings.js.map +1 -1
- package/package.json +5 -5
- package/skills/ai-code-mode/SKILL.md +1 -1
- package/dist/esm/index.js.map +0 -1
package/dist/esm/agent-store.js
CHANGED
|
@@ -1,29 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
1
|
+
//#region src/agent-store.ts
|
|
2
|
+
var InMemoryAgentStore = class {
|
|
3
|
+
sessions = /* @__PURE__ */ new Map();
|
|
4
|
+
get(name) {
|
|
5
|
+
return Promise.resolve(this.sessions.get(name) ?? null);
|
|
6
|
+
}
|
|
7
|
+
set(name, session) {
|
|
8
|
+
this.sessions.set(name, session);
|
|
9
|
+
return Promise.resolve();
|
|
10
|
+
}
|
|
11
|
+
delete(name) {
|
|
12
|
+
this.sessions.delete(name);
|
|
13
|
+
return Promise.resolve();
|
|
14
|
+
}
|
|
15
|
+
list() {
|
|
16
|
+
return Promise.resolve(Array.from(this.sessions.keys()));
|
|
17
|
+
}
|
|
18
|
+
};
|
|
18
19
|
function generateAgentName() {
|
|
19
|
-
|
|
20
|
-
{ length: 8 },
|
|
21
|
-
() => Math.floor(Math.random() * 16).toString(16)
|
|
22
|
-
).join("");
|
|
23
|
-
return `agent_${hex}`;
|
|
20
|
+
return `agent_${Array.from({ length: 8 }, () => Math.floor(Math.random() * 16).toString(16)).join("")}`;
|
|
24
21
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
//# sourceMappingURL=agent-store.js.map
|
|
22
|
+
//#endregion
|
|
23
|
+
export { InMemoryAgentStore, generateAgentName };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=agent-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-store.js","sources":["../../src/agent-store.ts"],"sourcesContent":["export interface AgentSession {\n name: string\n systemPrompt: string\n memory: Record<string, unknown>\n createdAt: number\n lastUsedAt: number\n}\n\nexport interface AgentStore {\n get: (name: string) => Promise<AgentSession | null>\n set: (name: string, session: AgentSession) => Promise<void>\n delete: (name: string) => Promise<void>\n list: () => Promise<Array<string>>\n}\n\nexport class InMemoryAgentStore implements AgentStore {\n private readonly sessions = new Map<string, AgentSession>()\n\n get(name: string): Promise<AgentSession | null> {\n return Promise.resolve(this.sessions.get(name) ?? null)\n }\n\n set(name: string, session: AgentSession): Promise<void> {\n this.sessions.set(name, session)\n return Promise.resolve()\n }\n\n delete(name: string): Promise<void> {\n this.sessions.delete(name)\n return Promise.resolve()\n }\n\n list(): Promise<Array<string>> {\n return Promise.resolve(Array.from(this.sessions.keys()))\n }\n}\n\nexport function generateAgentName(): string {\n const hex = Array.from({ length: 8 }, () =>\n Math.floor(Math.random() * 16).toString(16),\n ).join('')\n return `agent_${hex}`\n}\n"],"
|
|
1
|
+
{"version":3,"file":"agent-store.js","names":[],"sources":["../../src/agent-store.ts"],"sourcesContent":["export interface AgentSession {\n name: string\n systemPrompt: string\n memory: Record<string, unknown>\n createdAt: number\n lastUsedAt: number\n}\n\nexport interface AgentStore {\n get: (name: string) => Promise<AgentSession | null>\n set: (name: string, session: AgentSession) => Promise<void>\n delete: (name: string) => Promise<void>\n list: () => Promise<Array<string>>\n}\n\nexport class InMemoryAgentStore implements AgentStore {\n private readonly sessions = new Map<string, AgentSession>()\n\n get(name: string): Promise<AgentSession | null> {\n return Promise.resolve(this.sessions.get(name) ?? null)\n }\n\n set(name: string, session: AgentSession): Promise<void> {\n this.sessions.set(name, session)\n return Promise.resolve()\n }\n\n delete(name: string): Promise<void> {\n this.sessions.delete(name)\n return Promise.resolve()\n }\n\n list(): Promise<Array<string>> {\n return Promise.resolve(Array.from(this.sessions.keys()))\n }\n}\n\nexport function generateAgentName(): string {\n const hex = Array.from({ length: 8 }, () =>\n Math.floor(Math.random() * 16).toString(16),\n ).join('')\n return `agent_${hex}`\n}\n"],"mappings":";AAeA,IAAa,qBAAb,MAAsD;CACpD,2BAA4B,IAAI,IAA0B;CAE1D,IAAI,MAA4C;EAC9C,OAAO,QAAQ,QAAQ,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;CACxD;CAEA,IAAI,MAAc,SAAsC;EACtD,KAAK,SAAS,IAAI,MAAM,OAAO;EAC/B,OAAO,QAAQ,QAAQ;CACzB;CAEA,OAAO,MAA6B;EAClC,KAAK,SAAS,OAAO,IAAI;EACzB,OAAO,QAAQ,QAAQ;CACzB;CAEA,OAA+B;EAC7B,OAAO,QAAQ,QAAQ,MAAM,KAAK,KAAK,SAAS,KAAK,CAAC,CAAC;CACzD;AACF;AAEA,SAAgB,oBAA4B;CAI1C,OAAO,SAHK,MAAM,KAAK,EAAE,QAAQ,EAAE,SACjC,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAC5C,CAAC,CAAC,KAAK,EACS;AAClB"}
|
|
@@ -1,94 +1,99 @@
|
|
|
1
1
|
import { convertSchemaToJsonSchema, isStandardSchema, parseWithStandardSchema } from "@tanstack/ai";
|
|
2
|
+
//#region src/bindings/tool-to-binding.ts
|
|
3
|
+
/**
|
|
4
|
+
* Convert an array of TanStack AI tools to a Record of ToolBindings
|
|
5
|
+
*
|
|
6
|
+
* @param tools - Array of tools to convert
|
|
7
|
+
* @param prefix - Optional prefix to add to binding names (e.g., 'external_')
|
|
8
|
+
*/
|
|
2
9
|
function toolsToBindings(tools, prefix = "") {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
10
|
+
const bindings = {};
|
|
11
|
+
for (const tool of tools) {
|
|
12
|
+
const bindingName = `${prefix}${tool.name}`;
|
|
13
|
+
bindings[bindingName] = toolToBinding(tool, prefix);
|
|
14
|
+
}
|
|
15
|
+
return bindings;
|
|
9
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Convert a single TanStack AI tool to a ToolBinding
|
|
19
|
+
*
|
|
20
|
+
* @param tool - Tool to convert
|
|
21
|
+
* @param prefix - Optional prefix to add to binding name (e.g., 'external_')
|
|
22
|
+
* @throws Error if the tool doesn't have an execute function
|
|
23
|
+
*/
|
|
10
24
|
function toolToBinding(tool, prefix = "") {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return result;
|
|
46
|
-
};
|
|
47
|
-
return {
|
|
48
|
-
name: `${prefix}${tool.name}`,
|
|
49
|
-
description: tool.description,
|
|
50
|
-
inputSchema,
|
|
51
|
-
outputSchema,
|
|
52
|
-
execute
|
|
53
|
-
};
|
|
25
|
+
const inputSchema = convertSchemaToJsonSchema(tool.inputSchema) || {
|
|
26
|
+
type: "object",
|
|
27
|
+
properties: {}
|
|
28
|
+
};
|
|
29
|
+
const outputSchema = tool.outputSchema ? convertSchemaToJsonSchema(tool.outputSchema) : void 0;
|
|
30
|
+
if (typeof tool.execute !== "function") throw new Error(`Tool "${tool.name}" does not have an execute function. Code Mode requires server tools with implementations.`);
|
|
31
|
+
const toolExecute = tool.execute;
|
|
32
|
+
const execute = async (args, context) => {
|
|
33
|
+
let input = args;
|
|
34
|
+
if (tool.inputSchema && isStandardSchema(tool.inputSchema)) try {
|
|
35
|
+
input = parseWithStandardSchema(tool.inputSchema, args);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
const message = error instanceof Error ? error.message : "Validation failed";
|
|
38
|
+
throw new Error(`Input validation failed for tool ${tool.name}: ${message}`);
|
|
39
|
+
}
|
|
40
|
+
let result = await Promise.resolve(toolExecute(input, context));
|
|
41
|
+
if (tool.outputSchema && isStandardSchema(tool.outputSchema)) try {
|
|
42
|
+
result = parseWithStandardSchema(tool.outputSchema, result);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
const message = error instanceof Error ? error.message : "Validation failed";
|
|
45
|
+
throw new Error(`Output validation failed for tool ${tool.name}: ${message}`);
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
return {
|
|
50
|
+
name: `${prefix}${tool.name}`,
|
|
51
|
+
description: tool.description,
|
|
52
|
+
inputSchema,
|
|
53
|
+
outputSchema,
|
|
54
|
+
execute
|
|
55
|
+
};
|
|
54
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Create event-aware bindings that emit custom events for each external function call.
|
|
59
|
+
* Wraps each binding's execute function to emit events before and after execution.
|
|
60
|
+
*
|
|
61
|
+
* @param bindings - Original tool bindings
|
|
62
|
+
* @param emitCustomEvent - Callback to emit custom events to the stream
|
|
63
|
+
*/
|
|
55
64
|
function createEventAwareBindings(bindings, emitCustomEvent) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
return wrapped;
|
|
65
|
+
const wrapped = {};
|
|
66
|
+
for (const [name, binding] of Object.entries(bindings)) wrapped[name] = {
|
|
67
|
+
...binding,
|
|
68
|
+
execute: async (args) => {
|
|
69
|
+
emitCustomEvent("code_mode:external_call", {
|
|
70
|
+
function: name,
|
|
71
|
+
args,
|
|
72
|
+
timestamp: Date.now()
|
|
73
|
+
});
|
|
74
|
+
const startTime = Date.now();
|
|
75
|
+
try {
|
|
76
|
+
const toolContext = { emitCustomEvent };
|
|
77
|
+
const result = await binding.execute(args, toolContext);
|
|
78
|
+
emitCustomEvent("code_mode:external_result", {
|
|
79
|
+
function: name,
|
|
80
|
+
result,
|
|
81
|
+
duration: Date.now() - startTime
|
|
82
|
+
});
|
|
83
|
+
return result;
|
|
84
|
+
} catch (error) {
|
|
85
|
+
emitCustomEvent("code_mode:external_error", {
|
|
86
|
+
function: name,
|
|
87
|
+
error: error instanceof Error ? error.message : String(error),
|
|
88
|
+
duration: Date.now() - startTime
|
|
89
|
+
});
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
return wrapped;
|
|
88
95
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
};
|
|
94
|
-
//# sourceMappingURL=tool-to-binding.js.map
|
|
96
|
+
//#endregion
|
|
97
|
+
export { createEventAwareBindings, toolToBinding, toolsToBindings };
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=tool-to-binding.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-to-binding.js","sources":["../../../src/bindings/tool-to-binding.ts"],"sourcesContent":["import {\n convertSchemaToJsonSchema,\n isStandardSchema,\n parseWithStandardSchema,\n} from '@tanstack/ai'\nimport type { ToolExecutionContext } from '@tanstack/ai'\nimport type { CodeModeTool, ToolBinding } from '../types'\n\n/**\n * Convert an array of TanStack AI tools to a Record of ToolBindings\n *\n * @param tools - Array of tools to convert\n * @param prefix - Optional prefix to add to binding names (e.g., 'external_')\n */\nexport function toolsToBindings(\n tools: Array<CodeModeTool>,\n prefix: string = '',\n): Record<string, ToolBinding> {\n const bindings: Record<string, ToolBinding> = {}\n\n for (const tool of tools) {\n const bindingName = `${prefix}${tool.name}`\n bindings[bindingName] = toolToBinding(tool, prefix)\n }\n\n return bindings\n}\n\n/**\n * Convert a single TanStack AI tool to a ToolBinding\n *\n * @param tool - Tool to convert\n * @param prefix - Optional prefix to add to binding name (e.g., 'external_')\n * @throws Error if the tool doesn't have an execute function\n */\nexport function toolToBinding(\n tool: CodeModeTool,\n prefix: string = '',\n): ToolBinding {\n // Convert schemas (Zod or Standard Schema) to JSON Schema\n const inputSchema = convertSchemaToJsonSchema(tool.inputSchema) || {\n type: 'object',\n properties: {},\n }\n\n const outputSchema = tool.outputSchema\n ? convertSchemaToJsonSchema(tool.outputSchema)\n : undefined\n\n if (typeof tool.execute !== 'function') {\n throw new Error(\n `Tool \"${tool.name}\" does not have an execute function. ` +\n `Code Mode requires server tools with implementations.`,\n )\n }\n\n const toolExecute = tool.execute\n const execute = async (args: unknown, context?: ToolExecutionContext) => {\n let input = args\n if (tool.inputSchema && isStandardSchema(tool.inputSchema)) {\n try {\n input = parseWithStandardSchema(tool.inputSchema, args)\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Validation failed'\n throw new Error(\n `Input validation failed for tool ${tool.name}: ${message}`,\n )\n }\n }\n\n let result = await Promise.resolve(toolExecute(input, context))\n\n if (tool.outputSchema && isStandardSchema(tool.outputSchema)) {\n try {\n result = parseWithStandardSchema(tool.outputSchema, result)\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Validation failed'\n throw new Error(\n `Output validation failed for tool ${tool.name}: ${message}`,\n )\n }\n }\n\n return result\n }\n\n return {\n name: `${prefix}${tool.name}`,\n description: tool.description,\n inputSchema,\n outputSchema,\n execute,\n }\n}\n\n/**\n * Create event-aware bindings that emit custom events for each external function call.\n * Wraps each binding's execute function to emit events before and after execution.\n *\n * @param bindings - Original tool bindings\n * @param emitCustomEvent - Callback to emit custom events to the stream\n */\nexport function createEventAwareBindings(\n bindings: Record<string, ToolBinding>,\n emitCustomEvent: ToolExecutionContext['emitCustomEvent'],\n): Record<string, ToolBinding> {\n const wrapped: Record<string, ToolBinding> = {}\n\n for (const [name, binding] of Object.entries(bindings)) {\n wrapped[name] = {\n ...binding,\n execute: async (args: unknown) => {\n // Emit call event\n emitCustomEvent('code_mode:external_call', {\n function: name,\n args,\n timestamp: Date.now(),\n })\n\n const startTime = Date.now()\n try {\n // Create context for the underlying tool so it can also emit events\n const toolContext: ToolExecutionContext = { emitCustomEvent }\n const result = await binding.execute(args, toolContext)\n\n // Emit result event\n emitCustomEvent('code_mode:external_result', {\n function: name,\n result,\n duration: Date.now() - startTime,\n })\n\n return result\n } catch (error) {\n // Emit error event\n emitCustomEvent('code_mode:external_error', {\n function: name,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n })\n throw error\n }\n },\n }\n }\n\n return wrapped\n}\n"],"
|
|
1
|
+
{"version":3,"file":"tool-to-binding.js","names":[],"sources":["../../../src/bindings/tool-to-binding.ts"],"sourcesContent":["import {\n convertSchemaToJsonSchema,\n isStandardSchema,\n parseWithStandardSchema,\n} from '@tanstack/ai'\nimport type { ToolExecutionContext } from '@tanstack/ai'\nimport type { CodeModeTool, ToolBinding } from '../types'\n\n/**\n * Convert an array of TanStack AI tools to a Record of ToolBindings\n *\n * @param tools - Array of tools to convert\n * @param prefix - Optional prefix to add to binding names (e.g., 'external_')\n */\nexport function toolsToBindings(\n tools: Array<CodeModeTool>,\n prefix: string = '',\n): Record<string, ToolBinding> {\n const bindings: Record<string, ToolBinding> = {}\n\n for (const tool of tools) {\n const bindingName = `${prefix}${tool.name}`\n bindings[bindingName] = toolToBinding(tool, prefix)\n }\n\n return bindings\n}\n\n/**\n * Convert a single TanStack AI tool to a ToolBinding\n *\n * @param tool - Tool to convert\n * @param prefix - Optional prefix to add to binding name (e.g., 'external_')\n * @throws Error if the tool doesn't have an execute function\n */\nexport function toolToBinding(\n tool: CodeModeTool,\n prefix: string = '',\n): ToolBinding {\n // Convert schemas (Zod or Standard Schema) to JSON Schema\n const inputSchema = convertSchemaToJsonSchema(tool.inputSchema) || {\n type: 'object',\n properties: {},\n }\n\n const outputSchema = tool.outputSchema\n ? convertSchemaToJsonSchema(tool.outputSchema)\n : undefined\n\n if (typeof tool.execute !== 'function') {\n throw new Error(\n `Tool \"${tool.name}\" does not have an execute function. ` +\n `Code Mode requires server tools with implementations.`,\n )\n }\n\n const toolExecute = tool.execute\n const execute = async (args: unknown, context?: ToolExecutionContext) => {\n let input = args\n if (tool.inputSchema && isStandardSchema(tool.inputSchema)) {\n try {\n input = parseWithStandardSchema(tool.inputSchema, args)\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Validation failed'\n throw new Error(\n `Input validation failed for tool ${tool.name}: ${message}`,\n )\n }\n }\n\n let result = await Promise.resolve(toolExecute(input, context))\n\n if (tool.outputSchema && isStandardSchema(tool.outputSchema)) {\n try {\n result = parseWithStandardSchema(tool.outputSchema, result)\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Validation failed'\n throw new Error(\n `Output validation failed for tool ${tool.name}: ${message}`,\n )\n }\n }\n\n return result\n }\n\n return {\n name: `${prefix}${tool.name}`,\n description: tool.description,\n inputSchema,\n outputSchema,\n execute,\n }\n}\n\n/**\n * Create event-aware bindings that emit custom events for each external function call.\n * Wraps each binding's execute function to emit events before and after execution.\n *\n * @param bindings - Original tool bindings\n * @param emitCustomEvent - Callback to emit custom events to the stream\n */\nexport function createEventAwareBindings(\n bindings: Record<string, ToolBinding>,\n emitCustomEvent: ToolExecutionContext['emitCustomEvent'],\n): Record<string, ToolBinding> {\n const wrapped: Record<string, ToolBinding> = {}\n\n for (const [name, binding] of Object.entries(bindings)) {\n wrapped[name] = {\n ...binding,\n execute: async (args: unknown) => {\n // Emit call event\n emitCustomEvent('code_mode:external_call', {\n function: name,\n args,\n timestamp: Date.now(),\n })\n\n const startTime = Date.now()\n try {\n // Create context for the underlying tool so it can also emit events\n const toolContext: ToolExecutionContext = { emitCustomEvent }\n const result = await binding.execute(args, toolContext)\n\n // Emit result event\n emitCustomEvent('code_mode:external_result', {\n function: name,\n result,\n duration: Date.now() - startTime,\n })\n\n return result\n } catch (error) {\n // Emit error event\n emitCustomEvent('code_mode:external_error', {\n function: name,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n })\n throw error\n }\n },\n }\n }\n\n return wrapped\n}\n"],"mappings":";;;;;;;;AAcA,SAAgB,gBACd,OACA,SAAiB,IACY;CAC7B,MAAM,WAAwC,CAAC;CAE/C,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,cAAc,GAAG,SAAS,KAAK;EACrC,SAAS,eAAe,cAAc,MAAM,MAAM;CACpD;CAEA,OAAO;AACT;;;;;;;;AASA,SAAgB,cACd,MACA,SAAiB,IACJ;CAEb,MAAM,cAAc,0BAA0B,KAAK,WAAW,KAAK;EACjE,MAAM;EACN,YAAY,CAAC;CACf;CAEA,MAAM,eAAe,KAAK,eACtB,0BAA0B,KAAK,YAAY,IAC3C,KAAA;CAEJ,IAAI,OAAO,KAAK,YAAY,YAC1B,MAAM,IAAI,MACR,SAAS,KAAK,KAAK,2FAErB;CAGF,MAAM,cAAc,KAAK;CACzB,MAAM,UAAU,OAAO,MAAe,YAAmC;EACvE,IAAI,QAAQ;EACZ,IAAI,KAAK,eAAe,iBAAiB,KAAK,WAAW,GACvD,IAAI;GACF,QAAQ,wBAAwB,KAAK,aAAa,IAAI;EACxD,SAAS,OAAO;GACd,MAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;GAC3C,MAAM,IAAI,MACR,oCAAoC,KAAK,KAAK,IAAI,SACpD;EACF;EAGF,IAAI,SAAS,MAAM,QAAQ,QAAQ,YAAY,OAAO,OAAO,CAAC;EAE9D,IAAI,KAAK,gBAAgB,iBAAiB,KAAK,YAAY,GACzD,IAAI;GACF,SAAS,wBAAwB,KAAK,cAAc,MAAM;EAC5D,SAAS,OAAO;GACd,MAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;GAC3C,MAAM,IAAI,MACR,qCAAqC,KAAK,KAAK,IAAI,SACrD;EACF;EAGF,OAAO;CACT;CAEA,OAAO;EACL,MAAM,GAAG,SAAS,KAAK;EACvB,aAAa,KAAK;EAClB;EACA;EACA;CACF;AACF;;;;;;;;AASA,SAAgB,yBACd,UACA,iBAC6B;CAC7B,MAAM,UAAuC,CAAC;CAE9C,KAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,QAAQ,GACnD,QAAQ,QAAQ;EACd,GAAG;EACH,SAAS,OAAO,SAAkB;GAEhC,gBAAgB,2BAA2B;IACzC,UAAU;IACV;IACA,WAAW,KAAK,IAAI;GACtB,CAAC;GAED,MAAM,YAAY,KAAK,IAAI;GAC3B,IAAI;IAEF,MAAM,cAAoC,EAAE,gBAAgB;IAC5D,MAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,WAAW;IAGtD,gBAAgB,6BAA6B;KAC3C,UAAU;KACV;KACA,UAAU,KAAK,IAAI,IAAI;IACzB,CAAC;IAED,OAAO;GACT,SAAS,OAAO;IAEd,gBAAgB,4BAA4B;KAC1C,UAAU;KACV,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;KAC5D,UAAU,KAAK,IAAI,IAAI;IACzB,CAAC;IACD,MAAM;GACR;EACF;CACF;CAGF,OAAO;AACT"}
|
package/dist/esm/code-wrapper.js
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
|
+
//#region src/code-wrapper.ts
|
|
2
|
+
/**
|
|
3
|
+
* Wrap user code in an async IIFE to support top-level await
|
|
4
|
+
*
|
|
5
|
+
* The code is wrapped so that:
|
|
6
|
+
* 1. Top-level await works
|
|
7
|
+
* 2. Return values are captured and serialized (for isolate boundary transfer)
|
|
8
|
+
* 3. Errors propagate correctly
|
|
9
|
+
*/
|
|
1
10
|
function wrapCode(code) {
|
|
2
|
-
|
|
11
|
+
return `
|
|
3
12
|
(async function() {
|
|
4
13
|
try {
|
|
5
14
|
const __userResult = await (async function() {
|
|
@@ -12,7 +21,7 @@ ${code}
|
|
|
12
21
|
})()
|
|
13
22
|
`;
|
|
14
23
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
//# sourceMappingURL=code-wrapper.js.map
|
|
24
|
+
//#endregion
|
|
25
|
+
export { wrapCode };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=code-wrapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-wrapper.js","sources":["../../src/code-wrapper.ts"],"sourcesContent":["/**\n * Wrap user code in an async IIFE to support top-level await\n *\n * The code is wrapped so that:\n * 1. Top-level await works\n * 2. Return values are captured and serialized (for isolate boundary transfer)\n * 3. Errors propagate correctly\n */\nexport function wrapCode(code: string): string {\n // Results must be serialized to JSON because objects can't be transferred\n // directly across the isolate boundary in isolated-vm\n return `\n(async function() {\n try {\n const __userResult = await (async function() {\n${code}\n })();\n return JSON.stringify(__userResult);\n } catch (__error) {\n throw __error;\n }\n})()\n`\n}\n"],"
|
|
1
|
+
{"version":3,"file":"code-wrapper.js","names":[],"sources":["../../src/code-wrapper.ts"],"sourcesContent":["/**\n * Wrap user code in an async IIFE to support top-level await\n *\n * The code is wrapped so that:\n * 1. Top-level await works\n * 2. Return values are captured and serialized (for isolate boundary transfer)\n * 3. Errors propagate correctly\n */\nexport function wrapCode(code: string): string {\n // Results must be serialized to JSON because objects can't be transferred\n // directly across the isolate boundary in isolated-vm\n return `\n(async function() {\n try {\n const __userResult = await (async function() {\n${code}\n })();\n return JSON.stringify(__userResult);\n } catch (__error) {\n throw __error;\n }\n})()\n`\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,SAAS,MAAsB;CAG7C,OAAO;;;;EAIP,KAAK;;;;;;;;AAQP"}
|