@tanstack/ai-code-mode 0.3.8 → 0.3.10

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.
@@ -1,29 +1,25 @@
1
- class InMemoryAgentStore {
2
- sessions = /* @__PURE__ */ new Map();
3
- get(name) {
4
- return Promise.resolve(this.sessions.get(name) ?? null);
5
- }
6
- set(name, session) {
7
- this.sessions.set(name, session);
8
- return Promise.resolve();
9
- }
10
- delete(name) {
11
- this.sessions.delete(name);
12
- return Promise.resolve();
13
- }
14
- list() {
15
- return Promise.resolve(Array.from(this.sessions.keys()));
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
- const hex = Array.from(
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
- export {
26
- InMemoryAgentStore,
27
- generateAgentName
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"],"names":[],"mappings":"AAeO,MAAM,mBAAyC;AAAA,EACnC,+BAAe,IAAA;AAAA,EAEhC,IAAI,MAA4C;AAC9C,WAAO,QAAQ,QAAQ,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;AAAA,EACxD;AAAA,EAEA,IAAI,MAAc,SAAsC;AACtD,SAAK,SAAS,IAAI,MAAM,OAAO;AAC/B,WAAO,QAAQ,QAAA;AAAA,EACjB;AAAA,EAEA,OAAO,MAA6B;AAClC,SAAK,SAAS,OAAO,IAAI;AACzB,WAAO,QAAQ,QAAA;AAAA,EACjB;AAAA,EAEA,OAA+B;AAC7B,WAAO,QAAQ,QAAQ,MAAM,KAAK,KAAK,SAAS,KAAA,CAAM,CAAC;AAAA,EACzD;AACF;AAEO,SAAS,oBAA4B;AAC1C,QAAM,MAAM,MAAM;AAAA,IAAK,EAAE,QAAQ,EAAA;AAAA,IAAK,MACpC,KAAK,MAAM,KAAK,WAAW,EAAE,EAAE,SAAS,EAAE;AAAA,EAAA,EAC1C,KAAK,EAAE;AACT,SAAO,SAAS,GAAG;AACrB;"}
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
- const bindings = {};
4
- for (const tool of tools) {
5
- const bindingName = `${prefix}${tool.name}`;
6
- bindings[bindingName] = toolToBinding(tool, prefix);
7
- }
8
- return bindings;
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
- const inputSchema = convertSchemaToJsonSchema(tool.inputSchema) || {
12
- type: "object",
13
- properties: {}
14
- };
15
- const outputSchema = tool.outputSchema ? convertSchemaToJsonSchema(tool.outputSchema) : void 0;
16
- if (typeof tool.execute !== "function") {
17
- throw new Error(
18
- `Tool "${tool.name}" does not have an execute function. Code Mode requires server tools with implementations.`
19
- );
20
- }
21
- const toolExecute = tool.execute;
22
- const execute = async (args, context) => {
23
- let input = args;
24
- if (tool.inputSchema && isStandardSchema(tool.inputSchema)) {
25
- try {
26
- input = parseWithStandardSchema(tool.inputSchema, args);
27
- } catch (error) {
28
- const message = error instanceof Error ? error.message : "Validation failed";
29
- throw new Error(
30
- `Input validation failed for tool ${tool.name}: ${message}`
31
- );
32
- }
33
- }
34
- let result = await Promise.resolve(toolExecute(input, context));
35
- if (tool.outputSchema && isStandardSchema(tool.outputSchema)) {
36
- try {
37
- result = parseWithStandardSchema(tool.outputSchema, result);
38
- } catch (error) {
39
- const message = error instanceof Error ? error.message : "Validation failed";
40
- throw new Error(
41
- `Output validation failed for tool ${tool.name}: ${message}`
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
- const wrapped = {};
57
- for (const [name, binding] of Object.entries(bindings)) {
58
- wrapped[name] = {
59
- ...binding,
60
- execute: async (args) => {
61
- emitCustomEvent("code_mode:external_call", {
62
- function: name,
63
- args,
64
- timestamp: Date.now()
65
- });
66
- const startTime = Date.now();
67
- try {
68
- const toolContext = { emitCustomEvent };
69
- const result = await binding.execute(args, toolContext);
70
- emitCustomEvent("code_mode:external_result", {
71
- function: name,
72
- result,
73
- duration: Date.now() - startTime
74
- });
75
- return result;
76
- } catch (error) {
77
- emitCustomEvent("code_mode:external_error", {
78
- function: name,
79
- error: error instanceof Error ? error.message : String(error),
80
- duration: Date.now() - startTime
81
- });
82
- throw error;
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
- export {
90
- createEventAwareBindings,
91
- toolToBinding,
92
- toolsToBindings
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"],"names":[],"mappings":";AAcO,SAAS,gBACd,OACA,SAAiB,IACY;AAC7B,QAAM,WAAwC,CAAA;AAE9C,aAAW,QAAQ,OAAO;AACxB,UAAM,cAAc,GAAG,MAAM,GAAG,KAAK,IAAI;AACzC,aAAS,WAAW,IAAI,cAAc,MAAM,MAAM;AAAA,EACpD;AAEA,SAAO;AACT;AASO,SAAS,cACd,MACA,SAAiB,IACJ;AAEb,QAAM,cAAc,0BAA0B,KAAK,WAAW,KAAK;AAAA,IACjE,MAAM;AAAA,IACN,YAAY,CAAA;AAAA,EAAC;AAGf,QAAM,eAAe,KAAK,eACtB,0BAA0B,KAAK,YAAY,IAC3C;AAEJ,MAAI,OAAO,KAAK,YAAY,YAAY;AACtC,UAAM,IAAI;AAAA,MACR,SAAS,KAAK,IAAI;AAAA,IAAA;AAAA,EAGtB;AAEA,QAAM,cAAc,KAAK;AACzB,QAAM,UAAU,OAAO,MAAe,YAAmC;AACvE,QAAI,QAAQ;AACZ,QAAI,KAAK,eAAe,iBAAiB,KAAK,WAAW,GAAG;AAC1D,UAAI;AACF,gBAAQ,wBAAwB,KAAK,aAAa,IAAI;AAAA,MACxD,SAAS,OAAO;AACd,cAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,cAAM,IAAI;AAAA,UACR,oCAAoC,KAAK,IAAI,KAAK,OAAO;AAAA,QAAA;AAAA,MAE7D;AAAA,IACF;AAEA,QAAI,SAAS,MAAM,QAAQ,QAAQ,YAAY,OAAO,OAAO,CAAC;AAE9D,QAAI,KAAK,gBAAgB,iBAAiB,KAAK,YAAY,GAAG;AAC5D,UAAI;AACF,iBAAS,wBAAwB,KAAK,cAAc,MAAM;AAAA,MAC5D,SAAS,OAAO;AACd,cAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,cAAM,IAAI;AAAA,UACR,qCAAqC,KAAK,IAAI,KAAK,OAAO;AAAA,QAAA;AAAA,MAE9D;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM,GAAG,MAAM,GAAG,KAAK,IAAI;AAAA,IAC3B,aAAa,KAAK;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AASO,SAAS,yBACd,UACA,iBAC6B;AAC7B,QAAM,UAAuC,CAAA;AAE7C,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACtD,YAAQ,IAAI,IAAI;AAAA,MACd,GAAG;AAAA,MACH,SAAS,OAAO,SAAkB;AAEhC,wBAAgB,2BAA2B;AAAA,UACzC,UAAU;AAAA,UACV;AAAA,UACA,WAAW,KAAK,IAAA;AAAA,QAAI,CACrB;AAED,cAAM,YAAY,KAAK,IAAA;AACvB,YAAI;AAEF,gBAAM,cAAoC,EAAE,gBAAA;AAC5C,gBAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,WAAW;AAGtD,0BAAgB,6BAA6B;AAAA,YAC3C,UAAU;AAAA,YACV;AAAA,YACA,UAAU,KAAK,QAAQ;AAAA,UAAA,CACxB;AAED,iBAAO;AAAA,QACT,SAAS,OAAO;AAEd,0BAAgB,4BAA4B;AAAA,YAC1C,UAAU;AAAA,YACV,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,YAC5D,UAAU,KAAK,QAAQ;AAAA,UAAA,CACxB;AACD,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAO;AACT;"}
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"}
@@ -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
- return `
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
- export {
16
- wrapCode
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"],"names":[],"mappings":"AAQO,SAAS,SAAS,MAAsB;AAG7C,SAAO;AAAA;AAAA;AAAA;AAAA,EAIP,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQN;"}
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"}