agents 0.0.0-e03246e → 0.0.0-e1af284
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +255 -27
- package/dist/ai-chat-agent.d.ts +59 -11
- package/dist/ai-chat-agent.js +532 -160
- package/dist/ai-chat-agent.js.map +1 -1
- package/dist/ai-chat-v5-migration-DBHGW4Hv.js +155 -0
- package/dist/ai-chat-v5-migration-DBHGW4Hv.js.map +1 -0
- package/dist/ai-chat-v5-migration.d.ts +155 -0
- package/dist/ai-chat-v5-migration.js +3 -0
- package/dist/ai-react.d.ts +73 -72
- package/dist/ai-react.js +261 -192
- package/dist/ai-react.js.map +1 -1
- package/dist/ai-types-B3aQaFv3.js +20 -0
- package/dist/ai-types-B3aQaFv3.js.map +1 -0
- package/dist/ai-types-D5YoPrBZ.d.ts +95 -0
- package/dist/ai-types.d.ts +6 -69
- package/dist/ai-types.js +3 -1
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +27 -0
- package/dist/cli.js.map +1 -0
- package/dist/client-9Ld2_lnt.js +786 -0
- package/dist/client-9Ld2_lnt.js.map +1 -0
- package/dist/client-BIwY43Ed.d.ts +5315 -0
- package/dist/client-BfiZ3HQd.js +117 -0
- package/dist/client-BfiZ3HQd.js.map +1 -0
- package/dist/client-CbWe9FBd.d.ts +104 -0
- package/dist/client.d.ts +12 -79
- package/dist/client.js +3 -130
- package/dist/codemode/ai.d.ts +27 -0
- package/dist/codemode/ai.js +151 -0
- package/dist/codemode/ai.js.map +1 -0
- package/dist/do-oauth-client-provider-CswoD5Lu.js +93 -0
- package/dist/do-oauth-client-provider-CswoD5Lu.js.map +1 -0
- package/dist/do-oauth-client-provider-DGc5pP0l.d.ts +55 -0
- package/dist/index-Bp6UrXKf.d.ts +560 -0
- package/dist/index-DhJCaDWd.d.ts +58 -0
- package/dist/index.d.ts +63 -301
- package/dist/index.js +7 -22
- package/dist/mcp/client.d.ts +4 -675
- package/dist/mcp/client.js +2 -267
- package/dist/mcp/do-oauth-client-provider.d.ts +2 -0
- package/dist/mcp/do-oauth-client-provider.js +3 -0
- package/dist/mcp/index.d.ts +151 -42
- package/dist/mcp/index.js +1362 -335
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/x402.d.ts +34 -0
- package/dist/mcp/x402.js +194 -0
- package/dist/mcp/x402.js.map +1 -0
- package/dist/mcp-Dw5vDrY8.d.ts +61 -0
- package/dist/observability/index.d.ts +3 -0
- package/dist/observability/index.js +7 -0
- package/dist/react-BRVSan-t.d.ts +115 -0
- package/dist/react.d.ts +10 -39
- package/dist/react.js +183 -98
- package/dist/react.js.map +1 -1
- package/dist/schedule.d.ts +89 -12
- package/dist/schedule.js +46 -23
- package/dist/schedule.js.map +1 -1
- package/dist/serializable-CymX8ovI.d.ts +39 -0
- package/dist/serializable.d.ts +7 -0
- package/dist/serializable.js +1 -0
- package/dist/src-Dz0H9hSU.js +1200 -0
- package/dist/src-Dz0H9hSU.js.map +1 -0
- package/package.json +121 -50
- package/dist/ai-types.js.map +0 -1
- package/dist/chunk-HMLY7DHA.js +0 -16
- package/dist/chunk-HMLY7DHA.js.map +0 -1
- package/dist/chunk-YMUU7QHV.js +0 -595
- package/dist/chunk-YMUU7QHV.js.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/mcp/client.js.map +0 -1
- package/src/index.ts +0 -919
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { t as MessageType } from "./ai-types-B3aQaFv3.js";
|
|
2
|
+
import { PartySocket } from "partysocket";
|
|
3
|
+
|
|
4
|
+
//#region src/client.ts
|
|
5
|
+
/**
|
|
6
|
+
* Convert a camelCase string to a kebab-case string
|
|
7
|
+
* @param str The string to convert
|
|
8
|
+
* @returns The kebab-case string
|
|
9
|
+
*/
|
|
10
|
+
function camelCaseToKebabCase(str) {
|
|
11
|
+
if (str === str.toUpperCase() && str !== str.toLowerCase()) return str.toLowerCase().replace(/_/g, "-");
|
|
12
|
+
let kebabified = str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
|
|
13
|
+
kebabified = kebabified.startsWith("-") ? kebabified.slice(1) : kebabified;
|
|
14
|
+
return kebabified.replace(/_/g, "-").replace(/-$/, "");
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* WebSocket client for connecting to an Agent
|
|
18
|
+
*/
|
|
19
|
+
var AgentClient = class extends PartySocket {
|
|
20
|
+
/**
|
|
21
|
+
* @deprecated Use agentFetch instead
|
|
22
|
+
*/
|
|
23
|
+
static fetch(_opts) {
|
|
24
|
+
throw new Error("AgentClient.fetch is not implemented, use agentFetch instead");
|
|
25
|
+
}
|
|
26
|
+
constructor(options) {
|
|
27
|
+
const agentNamespace = camelCaseToKebabCase(options.agent);
|
|
28
|
+
super({
|
|
29
|
+
party: agentNamespace,
|
|
30
|
+
prefix: "agents",
|
|
31
|
+
room: options.name || "default",
|
|
32
|
+
...options
|
|
33
|
+
});
|
|
34
|
+
this._pendingCalls = /* @__PURE__ */ new Map();
|
|
35
|
+
this.agent = agentNamespace;
|
|
36
|
+
this.name = options.name || "default";
|
|
37
|
+
this.options = options;
|
|
38
|
+
this.addEventListener("message", (event) => {
|
|
39
|
+
if (typeof event.data === "string") {
|
|
40
|
+
let parsedMessage;
|
|
41
|
+
try {
|
|
42
|
+
parsedMessage = JSON.parse(event.data);
|
|
43
|
+
} catch (_error) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (parsedMessage.type === MessageType.CF_AGENT_STATE) {
|
|
47
|
+
this.options.onStateUpdate?.(parsedMessage.state, "server");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (parsedMessage.type === MessageType.RPC) {
|
|
51
|
+
const response = parsedMessage;
|
|
52
|
+
const pending = this._pendingCalls.get(response.id);
|
|
53
|
+
if (!pending) return;
|
|
54
|
+
if (!response.success) {
|
|
55
|
+
pending.reject(new Error(response.error));
|
|
56
|
+
this._pendingCalls.delete(response.id);
|
|
57
|
+
pending.stream?.onError?.(response.error);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if ("done" in response) if (response.done) {
|
|
61
|
+
pending.resolve(response.result);
|
|
62
|
+
this._pendingCalls.delete(response.id);
|
|
63
|
+
pending.stream?.onDone?.(response.result);
|
|
64
|
+
} else pending.stream?.onChunk?.(response.result);
|
|
65
|
+
else {
|
|
66
|
+
pending.resolve(response.result);
|
|
67
|
+
this._pendingCalls.delete(response.id);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
setState(state) {
|
|
74
|
+
this.send(JSON.stringify({
|
|
75
|
+
state,
|
|
76
|
+
type: MessageType.CF_AGENT_STATE
|
|
77
|
+
}));
|
|
78
|
+
this.options.onStateUpdate?.(state, "client");
|
|
79
|
+
}
|
|
80
|
+
async call(method, args = [], streamOptions) {
|
|
81
|
+
return new Promise((resolve, reject) => {
|
|
82
|
+
const id = Math.random().toString(36).slice(2);
|
|
83
|
+
this._pendingCalls.set(id, {
|
|
84
|
+
reject,
|
|
85
|
+
resolve: (value) => resolve(value),
|
|
86
|
+
stream: streamOptions,
|
|
87
|
+
type: null
|
|
88
|
+
});
|
|
89
|
+
const request = {
|
|
90
|
+
args,
|
|
91
|
+
id,
|
|
92
|
+
method,
|
|
93
|
+
type: MessageType.RPC
|
|
94
|
+
};
|
|
95
|
+
this.send(JSON.stringify(request));
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Make an HTTP request to an Agent
|
|
101
|
+
* @param opts Connection options
|
|
102
|
+
* @param init Request initialization options
|
|
103
|
+
* @returns Promise resolving to a Response
|
|
104
|
+
*/
|
|
105
|
+
function agentFetch(opts, init) {
|
|
106
|
+
const agentNamespace = camelCaseToKebabCase(opts.agent);
|
|
107
|
+
return PartySocket.fetch({
|
|
108
|
+
party: agentNamespace,
|
|
109
|
+
prefix: "agents",
|
|
110
|
+
room: opts.name || "default",
|
|
111
|
+
...opts
|
|
112
|
+
}, init);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
//#endregion
|
|
116
|
+
export { agentFetch as n, camelCaseToKebabCase as r, AgentClient as t };
|
|
117
|
+
//# sourceMappingURL=client-BfiZ3HQd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-BfiZ3HQd.js","names":["parsedMessage: Record<string, unknown>","request: RPCRequest"],"sources":["../src/client.ts"],"sourcesContent":["import {\n type PartyFetchOptions,\n PartySocket,\n type PartySocketOptions\n} from \"partysocket\";\nimport type { RPCRequest, RPCResponse } from \"./\";\nimport type {\n SerializableReturnValue,\n SerializableValue\n} from \"./serializable\";\nimport { MessageType } from \"./ai-types\";\n\n/**\n * Options for creating an AgentClient\n */\nexport type AgentClientOptions<State = unknown> = Omit<\n PartySocketOptions,\n \"party\" | \"room\"\n> & {\n /** Name of the agent to connect to */\n agent: string;\n /** Name of the specific Agent instance */\n name?: string;\n /** Called when the Agent's state is updated */\n onStateUpdate?: (state: State, source: \"server\" | \"client\") => void;\n};\n\n/**\n * Options for streaming RPC calls\n */\nexport type StreamOptions = {\n /** Called when a chunk of data is received */\n onChunk?: (chunk: unknown) => void;\n /** Called when the stream ends */\n onDone?: (finalChunk: unknown) => void;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n};\n\n/**\n * Options for the agentFetch function\n */\nexport type AgentClientFetchOptions = Omit<\n PartyFetchOptions,\n \"party\" | \"room\"\n> & {\n /** Name of the agent to connect to */\n agent: string;\n /** Name of the specific Agent instance */\n name?: string;\n};\n\n/**\n * Convert a camelCase string to a kebab-case string\n * @param str The string to convert\n * @returns The kebab-case string\n */\nexport function camelCaseToKebabCase(str: string): string {\n // If string is all uppercase, convert to lowercase\n if (str === str.toUpperCase() && str !== str.toLowerCase()) {\n return str.toLowerCase().replace(/_/g, \"-\");\n }\n\n // Otherwise handle camelCase to kebab-case\n let kebabified = str.replace(\n /[A-Z]/g,\n (letter) => `-${letter.toLowerCase()}`\n );\n kebabified = kebabified.startsWith(\"-\") ? kebabified.slice(1) : kebabified;\n // Convert any remaining underscores to hyphens and remove trailing -'s\n return kebabified.replace(/_/g, \"-\").replace(/-$/, \"\");\n}\n\n/**\n * WebSocket client for connecting to an Agent\n */\nexport class AgentClient<State = unknown> extends PartySocket {\n /**\n * @deprecated Use agentFetch instead\n */\n static fetch(_opts: PartyFetchOptions): Promise<Response> {\n throw new Error(\n \"AgentClient.fetch is not implemented, use agentFetch instead\"\n );\n }\n agent: string;\n name: string;\n private options: AgentClientOptions<State>;\n private _pendingCalls = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n stream?: StreamOptions;\n type?: unknown;\n }\n >();\n\n constructor(options: AgentClientOptions<State>) {\n const agentNamespace = camelCaseToKebabCase(options.agent);\n super({\n party: agentNamespace,\n prefix: \"agents\",\n room: options.name || \"default\",\n ...options\n });\n this.agent = agentNamespace;\n this.name = options.name || \"default\";\n this.options = options;\n\n this.addEventListener(\"message\", (event) => {\n if (typeof event.data === \"string\") {\n let parsedMessage: Record<string, unknown>;\n try {\n parsedMessage = JSON.parse(event.data);\n } catch (_error) {\n // silently ignore invalid messages for now\n // TODO: log errors with log levels\n return;\n }\n if (parsedMessage.type === MessageType.CF_AGENT_STATE) {\n this.options.onStateUpdate?.(parsedMessage.state as State, \"server\");\n return;\n }\n if (parsedMessage.type === MessageType.RPC) {\n const response = parsedMessage as RPCResponse;\n const pending = this._pendingCalls.get(response.id);\n if (!pending) return;\n\n if (!response.success) {\n pending.reject(new Error(response.error));\n this._pendingCalls.delete(response.id);\n pending.stream?.onError?.(response.error);\n return;\n }\n\n // Handle streaming responses\n if (\"done\" in response) {\n if (response.done) {\n pending.resolve(response.result);\n this._pendingCalls.delete(response.id);\n pending.stream?.onDone?.(response.result);\n } else {\n pending.stream?.onChunk?.(response.result);\n }\n } else {\n // Non-streaming response\n pending.resolve(response.result);\n this._pendingCalls.delete(response.id);\n }\n }\n }\n });\n }\n\n setState(state: State) {\n this.send(JSON.stringify({ state, type: MessageType.CF_AGENT_STATE }));\n this.options.onStateUpdate?.(state, \"client\");\n }\n\n /**\n * Call a method on the Agent\n * @param method Name of the method to call\n * @param args Arguments to pass to the method\n * @param streamOptions Options for handling streaming responses\n * @returns Promise that resolves with the method's return value\n */\n call<T extends SerializableReturnValue>(\n method: string,\n args?: SerializableValue[],\n streamOptions?: StreamOptions\n ): Promise<T>;\n call<T = unknown>(\n method: string,\n args?: unknown[],\n streamOptions?: StreamOptions\n ): Promise<T>;\n async call<T>(\n method: string,\n args: unknown[] = [],\n streamOptions?: StreamOptions\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const id = Math.random().toString(36).slice(2);\n this._pendingCalls.set(id, {\n reject,\n resolve: (value: unknown) => resolve(value as T),\n stream: streamOptions,\n type: null as T\n });\n\n const request: RPCRequest = {\n args,\n id,\n method,\n type: MessageType.RPC\n };\n\n this.send(JSON.stringify(request));\n });\n }\n}\n\n/**\n * Make an HTTP request to an Agent\n * @param opts Connection options\n * @param init Request initialization options\n * @returns Promise resolving to a Response\n */\nexport function agentFetch(opts: AgentClientFetchOptions, init?: RequestInit) {\n const agentNamespace = camelCaseToKebabCase(opts.agent);\n\n return PartySocket.fetch(\n {\n party: agentNamespace,\n prefix: \"agents\",\n room: opts.name || \"default\",\n ...opts\n },\n init\n );\n}\n"],"mappings":";;;;;;;;;AAyDA,SAAgB,qBAAqB,KAAqB;AAExD,KAAI,QAAQ,IAAI,aAAa,IAAI,QAAQ,IAAI,aAAa,CACxD,QAAO,IAAI,aAAa,CAAC,QAAQ,MAAM,IAAI;CAI7C,IAAI,aAAa,IAAI,QACnB,WACC,WAAW,IAAI,OAAO,aAAa,GACrC;AACD,cAAa,WAAW,WAAW,IAAI,GAAG,WAAW,MAAM,EAAE,GAAG;AAEhE,QAAO,WAAW,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM,GAAG;;;;;AAMxD,IAAa,cAAb,cAAkD,YAAY;;;;CAI5D,OAAO,MAAM,OAA6C;AACxD,QAAM,IAAI,MACR,+DACD;;CAeH,YAAY,SAAoC;EAC9C,MAAM,iBAAiB,qBAAqB,QAAQ,MAAM;AAC1D,QAAM;GACJ,OAAO;GACP,QAAQ;GACR,MAAM,QAAQ,QAAQ;GACtB,GAAG;GACJ,CAAC;uCAjBoB,IAAI,KAQzB;AAUD,OAAK,QAAQ;AACb,OAAK,OAAO,QAAQ,QAAQ;AAC5B,OAAK,UAAU;AAEf,OAAK,iBAAiB,YAAY,UAAU;AAC1C,OAAI,OAAO,MAAM,SAAS,UAAU;IAClC,IAAIA;AACJ,QAAI;AACF,qBAAgB,KAAK,MAAM,MAAM,KAAK;aAC/B,QAAQ;AAGf;;AAEF,QAAI,cAAc,SAAS,YAAY,gBAAgB;AACrD,UAAK,QAAQ,gBAAgB,cAAc,OAAgB,SAAS;AACpE;;AAEF,QAAI,cAAc,SAAS,YAAY,KAAK;KAC1C,MAAM,WAAW;KACjB,MAAM,UAAU,KAAK,cAAc,IAAI,SAAS,GAAG;AACnD,SAAI,CAAC,QAAS;AAEd,SAAI,CAAC,SAAS,SAAS;AACrB,cAAQ,OAAO,IAAI,MAAM,SAAS,MAAM,CAAC;AACzC,WAAK,cAAc,OAAO,SAAS,GAAG;AACtC,cAAQ,QAAQ,UAAU,SAAS,MAAM;AACzC;;AAIF,SAAI,UAAU,SACZ,KAAI,SAAS,MAAM;AACjB,cAAQ,QAAQ,SAAS,OAAO;AAChC,WAAK,cAAc,OAAO,SAAS,GAAG;AACtC,cAAQ,QAAQ,SAAS,SAAS,OAAO;WAEzC,SAAQ,QAAQ,UAAU,SAAS,OAAO;UAEvC;AAEL,cAAQ,QAAQ,SAAS,OAAO;AAChC,WAAK,cAAc,OAAO,SAAS,GAAG;;;;IAI5C;;CAGJ,SAAS,OAAc;AACrB,OAAK,KAAK,KAAK,UAAU;GAAE;GAAO,MAAM,YAAY;GAAgB,CAAC,CAAC;AACtE,OAAK,QAAQ,gBAAgB,OAAO,SAAS;;CAoB/C,MAAM,KACJ,QACA,OAAkB,EAAE,EACpB,eACY;AACZ,SAAO,IAAI,SAAY,SAAS,WAAW;GACzC,MAAM,KAAK,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE;AAC9C,QAAK,cAAc,IAAI,IAAI;IACzB;IACA,UAAU,UAAmB,QAAQ,MAAW;IAChD,QAAQ;IACR,MAAM;IACP,CAAC;GAEF,MAAMC,UAAsB;IAC1B;IACA;IACA;IACA,MAAM,YAAY;IACnB;AAED,QAAK,KAAK,KAAK,UAAU,QAAQ,CAAC;IAClC;;;;;;;;;AAUN,SAAgB,WAAW,MAA+B,MAAoB;CAC5E,MAAM,iBAAiB,qBAAqB,KAAK,MAAM;AAEvD,QAAO,YAAY,MACjB;EACE,OAAO;EACP,QAAQ;EACR,MAAM,KAAK,QAAQ;EACnB,GAAG;EACJ,EACD,KACD"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import {
|
|
2
|
+
i as SerializableValue,
|
|
3
|
+
r as SerializableReturnValue
|
|
4
|
+
} from "./serializable-CymX8ovI.js";
|
|
5
|
+
import {
|
|
6
|
+
PartyFetchOptions,
|
|
7
|
+
PartySocket,
|
|
8
|
+
PartySocketOptions
|
|
9
|
+
} from "partysocket";
|
|
10
|
+
|
|
11
|
+
//#region src/client.d.ts
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Options for creating an AgentClient
|
|
15
|
+
*/
|
|
16
|
+
type AgentClientOptions<State = unknown> = Omit<
|
|
17
|
+
PartySocketOptions,
|
|
18
|
+
"party" | "room"
|
|
19
|
+
> & {
|
|
20
|
+
/** Name of the agent to connect to */
|
|
21
|
+
agent: string;
|
|
22
|
+
/** Name of the specific Agent instance */
|
|
23
|
+
name?: string;
|
|
24
|
+
/** Called when the Agent's state is updated */
|
|
25
|
+
onStateUpdate?: (state: State, source: "server" | "client") => void;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Options for streaming RPC calls
|
|
29
|
+
*/
|
|
30
|
+
type StreamOptions = {
|
|
31
|
+
/** Called when a chunk of data is received */
|
|
32
|
+
onChunk?: (chunk: unknown) => void;
|
|
33
|
+
/** Called when the stream ends */
|
|
34
|
+
onDone?: (finalChunk: unknown) => void;
|
|
35
|
+
/** Called when an error occurs */
|
|
36
|
+
onError?: (error: string) => void;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Options for the agentFetch function
|
|
40
|
+
*/
|
|
41
|
+
type AgentClientFetchOptions = Omit<PartyFetchOptions, "party" | "room"> & {
|
|
42
|
+
/** Name of the agent to connect to */
|
|
43
|
+
agent: string;
|
|
44
|
+
/** Name of the specific Agent instance */
|
|
45
|
+
name?: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Convert a camelCase string to a kebab-case string
|
|
49
|
+
* @param str The string to convert
|
|
50
|
+
* @returns The kebab-case string
|
|
51
|
+
*/
|
|
52
|
+
declare function camelCaseToKebabCase(str: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* WebSocket client for connecting to an Agent
|
|
55
|
+
*/
|
|
56
|
+
declare class AgentClient<State = unknown> extends PartySocket {
|
|
57
|
+
/**
|
|
58
|
+
* @deprecated Use agentFetch instead
|
|
59
|
+
*/
|
|
60
|
+
static fetch(_opts: PartyFetchOptions): Promise<Response>;
|
|
61
|
+
agent: string;
|
|
62
|
+
name: string;
|
|
63
|
+
private options;
|
|
64
|
+
private _pendingCalls;
|
|
65
|
+
constructor(options: AgentClientOptions<State>);
|
|
66
|
+
setState(state: State): void;
|
|
67
|
+
/**
|
|
68
|
+
* Call a method on the Agent
|
|
69
|
+
* @param method Name of the method to call
|
|
70
|
+
* @param args Arguments to pass to the method
|
|
71
|
+
* @param streamOptions Options for handling streaming responses
|
|
72
|
+
* @returns Promise that resolves with the method's return value
|
|
73
|
+
*/
|
|
74
|
+
call<T extends SerializableReturnValue>(
|
|
75
|
+
method: string,
|
|
76
|
+
args?: SerializableValue[],
|
|
77
|
+
streamOptions?: StreamOptions
|
|
78
|
+
): Promise<T>;
|
|
79
|
+
call<T = unknown>(
|
|
80
|
+
method: string,
|
|
81
|
+
args?: unknown[],
|
|
82
|
+
streamOptions?: StreamOptions
|
|
83
|
+
): Promise<T>;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Make an HTTP request to an Agent
|
|
87
|
+
* @param opts Connection options
|
|
88
|
+
* @param init Request initialization options
|
|
89
|
+
* @returns Promise resolving to a Response
|
|
90
|
+
*/
|
|
91
|
+
declare function agentFetch(
|
|
92
|
+
opts: AgentClientFetchOptions,
|
|
93
|
+
init?: RequestInit
|
|
94
|
+
): Promise<Response>;
|
|
95
|
+
//#endregion
|
|
96
|
+
export {
|
|
97
|
+
agentFetch as a,
|
|
98
|
+
StreamOptions as i,
|
|
99
|
+
AgentClientFetchOptions as n,
|
|
100
|
+
camelCaseToKebabCase as o,
|
|
101
|
+
AgentClientOptions as r,
|
|
102
|
+
AgentClient as t
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=client-CbWe9FBd.d.ts.map
|
package/dist/client.d.ts
CHANGED
|
@@ -1,84 +1,17 @@
|
|
|
1
|
+
import "./serializable-CymX8ovI.js";
|
|
1
2
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*/
|
|
10
|
-
type AgentClientOptions<State = unknown> = Omit<
|
|
11
|
-
PartySocketOptions,
|
|
12
|
-
"party" | "room"
|
|
13
|
-
> & {
|
|
14
|
-
/** Name of the agent to connect to */
|
|
15
|
-
agent: string;
|
|
16
|
-
/** Name of the specific Agent instance */
|
|
17
|
-
name?: string;
|
|
18
|
-
/** Called when the Agent's state is updated */
|
|
19
|
-
onStateUpdate?: (state: State, source: "server" | "client") => void;
|
|
20
|
-
};
|
|
21
|
-
/**
|
|
22
|
-
* Options for streaming RPC calls
|
|
23
|
-
*/
|
|
24
|
-
type StreamOptions = {
|
|
25
|
-
/** Called when a chunk of data is received */
|
|
26
|
-
onChunk?: (chunk: unknown) => void;
|
|
27
|
-
/** Called when the stream ends */
|
|
28
|
-
onDone?: (finalChunk: unknown) => void;
|
|
29
|
-
/** Called when an error occurs */
|
|
30
|
-
onError?: (error: string) => void;
|
|
31
|
-
};
|
|
32
|
-
/**
|
|
33
|
-
* Options for the agentFetch function
|
|
34
|
-
*/
|
|
35
|
-
type AgentClientFetchOptions = Omit<PartyFetchOptions, "party" | "room"> & {
|
|
36
|
-
/** Name of the agent to connect to */
|
|
37
|
-
agent: string;
|
|
38
|
-
/** Name of the specific Agent instance */
|
|
39
|
-
name?: string;
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* WebSocket client for connecting to an Agent
|
|
43
|
-
*/
|
|
44
|
-
declare class AgentClient<State = unknown> extends PartySocket {
|
|
45
|
-
#private;
|
|
46
|
-
/**
|
|
47
|
-
* @deprecated Use agentFetch instead
|
|
48
|
-
*/
|
|
49
|
-
static fetch(_opts: PartyFetchOptions): Promise<Response>;
|
|
50
|
-
agent: string;
|
|
51
|
-
name: string;
|
|
52
|
-
constructor(options: AgentClientOptions<State>);
|
|
53
|
-
setState(state: State): void;
|
|
54
|
-
/**
|
|
55
|
-
* Call a method on the Agent
|
|
56
|
-
* @param method Name of the method to call
|
|
57
|
-
* @param args Arguments to pass to the method
|
|
58
|
-
* @param streamOptions Options for handling streaming responses
|
|
59
|
-
* @returns Promise that resolves with the method's return value
|
|
60
|
-
*/
|
|
61
|
-
call<T = unknown>(
|
|
62
|
-
method: string,
|
|
63
|
-
args?: unknown[],
|
|
64
|
-
streamOptions?: StreamOptions
|
|
65
|
-
): Promise<T>;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Make an HTTP request to an Agent
|
|
69
|
-
* @param opts Connection options
|
|
70
|
-
* @param init Request initialization options
|
|
71
|
-
* @returns Promise resolving to a Response
|
|
72
|
-
*/
|
|
73
|
-
declare function agentFetch(
|
|
74
|
-
opts: AgentClientFetchOptions,
|
|
75
|
-
init?: RequestInit
|
|
76
|
-
): Promise<Response>;
|
|
77
|
-
|
|
3
|
+
a as agentFetch,
|
|
4
|
+
i as StreamOptions,
|
|
5
|
+
n as AgentClientFetchOptions,
|
|
6
|
+
o as camelCaseToKebabCase,
|
|
7
|
+
r as AgentClientOptions,
|
|
8
|
+
t as AgentClient
|
|
9
|
+
} from "./client-CbWe9FBd.js";
|
|
78
10
|
export {
|
|
79
11
|
AgentClient,
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
12
|
+
AgentClientFetchOptions,
|
|
13
|
+
AgentClientOptions,
|
|
14
|
+
StreamOptions,
|
|
83
15
|
agentFetch,
|
|
16
|
+
camelCaseToKebabCase
|
|
84
17
|
};
|
package/dist/client.js
CHANGED
|
@@ -1,131 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
__privateGet,
|
|
4
|
-
__privateSet
|
|
5
|
-
} from "./chunk-HMLY7DHA.js";
|
|
1
|
+
import "./ai-types-B3aQaFv3.js";
|
|
2
|
+
import { n as agentFetch, r as camelCaseToKebabCase, t as AgentClient } from "./client-BfiZ3HQd.js";
|
|
6
3
|
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
PartySocket
|
|
10
|
-
} from "partysocket";
|
|
11
|
-
function camelCaseToKebabCase(str) {
|
|
12
|
-
if (str === str.toUpperCase() && str !== str.toLowerCase()) {
|
|
13
|
-
return str.toLowerCase().replace(/_/g, "-");
|
|
14
|
-
}
|
|
15
|
-
let kebabified = str.replace(
|
|
16
|
-
/[A-Z]/g,
|
|
17
|
-
(letter) => `-${letter.toLowerCase()}`
|
|
18
|
-
);
|
|
19
|
-
kebabified = kebabified.startsWith("-") ? kebabified.slice(1) : kebabified;
|
|
20
|
-
return kebabified.replace(/_/g, "-").replace(/-$/, "");
|
|
21
|
-
}
|
|
22
|
-
var _options, _pendingCalls;
|
|
23
|
-
var AgentClient = class extends PartySocket {
|
|
24
|
-
constructor(options) {
|
|
25
|
-
const agentNamespace = camelCaseToKebabCase(options.agent);
|
|
26
|
-
super({
|
|
27
|
-
prefix: "agents",
|
|
28
|
-
party: agentNamespace,
|
|
29
|
-
room: options.name || "default",
|
|
30
|
-
...options
|
|
31
|
-
});
|
|
32
|
-
__privateAdd(this, _options);
|
|
33
|
-
__privateAdd(this, _pendingCalls, /* @__PURE__ */ new Map());
|
|
34
|
-
this.agent = agentNamespace;
|
|
35
|
-
this.name = options.name || "default";
|
|
36
|
-
__privateSet(this, _options, options);
|
|
37
|
-
this.addEventListener("message", (event) => {
|
|
38
|
-
if (typeof event.data === "string") {
|
|
39
|
-
let parsedMessage;
|
|
40
|
-
try {
|
|
41
|
-
parsedMessage = JSON.parse(event.data);
|
|
42
|
-
} catch (error) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
if (parsedMessage.type === "cf_agent_state") {
|
|
46
|
-
__privateGet(this, _options).onStateUpdate?.(parsedMessage.state, "server");
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
if (parsedMessage.type === "rpc") {
|
|
50
|
-
const response = parsedMessage;
|
|
51
|
-
const pending = __privateGet(this, _pendingCalls).get(response.id);
|
|
52
|
-
if (!pending) return;
|
|
53
|
-
if (!response.success) {
|
|
54
|
-
pending.reject(new Error(response.error));
|
|
55
|
-
__privateGet(this, _pendingCalls).delete(response.id);
|
|
56
|
-
pending.stream?.onError?.(response.error);
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
if ("done" in response) {
|
|
60
|
-
if (response.done) {
|
|
61
|
-
pending.resolve(response.result);
|
|
62
|
-
__privateGet(this, _pendingCalls).delete(response.id);
|
|
63
|
-
pending.stream?.onDone?.(response.result);
|
|
64
|
-
} else {
|
|
65
|
-
pending.stream?.onChunk?.(response.result);
|
|
66
|
-
}
|
|
67
|
-
} else {
|
|
68
|
-
pending.resolve(response.result);
|
|
69
|
-
__privateGet(this, _pendingCalls).delete(response.id);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* @deprecated Use agentFetch instead
|
|
77
|
-
*/
|
|
78
|
-
static fetch(_opts) {
|
|
79
|
-
throw new Error(
|
|
80
|
-
"AgentClient.fetch is not implemented, use agentFetch instead"
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
setState(state) {
|
|
84
|
-
this.send(JSON.stringify({ type: "cf_agent_state", state }));
|
|
85
|
-
__privateGet(this, _options).onStateUpdate?.(state, "client");
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Call a method on the Agent
|
|
89
|
-
* @param method Name of the method to call
|
|
90
|
-
* @param args Arguments to pass to the method
|
|
91
|
-
* @param streamOptions Options for handling streaming responses
|
|
92
|
-
* @returns Promise that resolves with the method's return value
|
|
93
|
-
*/
|
|
94
|
-
async call(method, args = [], streamOptions) {
|
|
95
|
-
return new Promise((resolve, reject) => {
|
|
96
|
-
const id = Math.random().toString(36).slice(2);
|
|
97
|
-
__privateGet(this, _pendingCalls).set(id, {
|
|
98
|
-
resolve: (value) => resolve(value),
|
|
99
|
-
reject,
|
|
100
|
-
stream: streamOptions,
|
|
101
|
-
type: null
|
|
102
|
-
});
|
|
103
|
-
const request = {
|
|
104
|
-
type: "rpc",
|
|
105
|
-
id,
|
|
106
|
-
method,
|
|
107
|
-
args
|
|
108
|
-
};
|
|
109
|
-
this.send(JSON.stringify(request));
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
_options = new WeakMap();
|
|
114
|
-
_pendingCalls = new WeakMap();
|
|
115
|
-
function agentFetch(opts, init) {
|
|
116
|
-
const agentNamespace = camelCaseToKebabCase(opts.agent);
|
|
117
|
-
return PartySocket.fetch(
|
|
118
|
-
{
|
|
119
|
-
prefix: "agents",
|
|
120
|
-
party: agentNamespace,
|
|
121
|
-
room: opts.name || "default",
|
|
122
|
-
...opts
|
|
123
|
-
},
|
|
124
|
-
init
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
export {
|
|
128
|
-
AgentClient,
|
|
129
|
-
agentFetch
|
|
130
|
-
};
|
|
131
|
-
//# sourceMappingURL=client.js.map
|
|
4
|
+
export { AgentClient, agentFetch, camelCaseToKebabCase };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ToolSet } from "ai";
|
|
2
|
+
import { WorkerEntrypoint } from "cloudflare:workers";
|
|
3
|
+
|
|
4
|
+
//#region src/codemode/ai.d.ts
|
|
5
|
+
declare class CodeModeProxy extends WorkerEntrypoint<Cloudflare.Env, {
|
|
6
|
+
binding: string;
|
|
7
|
+
name: string;
|
|
8
|
+
callback: string;
|
|
9
|
+
}> {
|
|
10
|
+
callFunction(options: {
|
|
11
|
+
functionName: string;
|
|
12
|
+
args: unknown[];
|
|
13
|
+
}): Promise<any>;
|
|
14
|
+
}
|
|
15
|
+
declare function experimental_codemode(options: {
|
|
16
|
+
tools: ToolSet;
|
|
17
|
+
prompt: string;
|
|
18
|
+
globalOutbound: Fetcher;
|
|
19
|
+
loader: WorkerLoader;
|
|
20
|
+
proxy: Fetcher<CodeModeProxy>;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
prompt: string;
|
|
23
|
+
tools: ToolSet;
|
|
24
|
+
}>;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { CodeModeProxy, experimental_codemode };
|
|
27
|
+
//# sourceMappingURL=ai.d.ts.map
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import "../ai-types-B3aQaFv3.js";
|
|
2
|
+
import "../client-BfiZ3HQd.js";
|
|
3
|
+
import "../client-9Ld2_lnt.js";
|
|
4
|
+
import "../do-oauth-client-provider-CswoD5Lu.js";
|
|
5
|
+
import { s as getAgentByName } from "../src-Dz0H9hSU.js";
|
|
6
|
+
import { generateObject, tool } from "ai";
|
|
7
|
+
import { openai } from "@ai-sdk/openai";
|
|
8
|
+
import { z } from "zod/v3";
|
|
9
|
+
import { compile } from "json-schema-to-typescript";
|
|
10
|
+
import { createTypeAlias, printNode, zodToTs } from "zod-to-ts";
|
|
11
|
+
import { WorkerEntrypoint, env } from "cloudflare:workers";
|
|
12
|
+
|
|
13
|
+
//#region src/codemode/ai.ts
|
|
14
|
+
function toCamelCase(str) {
|
|
15
|
+
return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase()).replace(/^[a-z]/, (letter) => letter.toUpperCase());
|
|
16
|
+
}
|
|
17
|
+
var CodeModeProxy = class extends WorkerEntrypoint {
|
|
18
|
+
async callFunction(options) {
|
|
19
|
+
return (await getAgentByName(env[this.ctx.props.binding], this.ctx.props.name))[this.ctx.props.callback](options.functionName, options.args);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
async function experimental_codemode(options) {
|
|
23
|
+
const generatedTypes = await generateTypes(options.tools);
|
|
24
|
+
return {
|
|
25
|
+
prompt: `You are a helpful assistant. You have access to the "codemode" tool that can do different things:
|
|
26
|
+
|
|
27
|
+
${getToolDescriptions(options.tools)}
|
|
28
|
+
|
|
29
|
+
If the user asks to do anything that be achieveable by the codemode tool, then simply pass over control to it by giving it a simple function description. Don't be too verbose.
|
|
30
|
+
|
|
31
|
+
`,
|
|
32
|
+
tools: { codemode: tool({
|
|
33
|
+
description: "codemode: a tool that can generate code to achieve a goal",
|
|
34
|
+
inputSchema: z.object({ functionDescription: z.string() }),
|
|
35
|
+
outputSchema: z.object({
|
|
36
|
+
code: z.string(),
|
|
37
|
+
result: z.any()
|
|
38
|
+
}),
|
|
39
|
+
execute: async ({ functionDescription }) => {
|
|
40
|
+
try {
|
|
41
|
+
const response = await generateObject({
|
|
42
|
+
model: openai("gpt-4.1"),
|
|
43
|
+
schema: z.object({ code: z.string() }),
|
|
44
|
+
prompt: `You are a code generating machine.
|
|
45
|
+
|
|
46
|
+
In addition to regular javascript, you can also use the following functions:
|
|
47
|
+
|
|
48
|
+
${generatedTypes}
|
|
49
|
+
|
|
50
|
+
Respond only with the code, nothing else. Output javascript code.
|
|
51
|
+
|
|
52
|
+
Generate an async function that achieves the goal. This async function doesn't accept any arguments.
|
|
53
|
+
|
|
54
|
+
Here is user input: ${functionDescription}`
|
|
55
|
+
});
|
|
56
|
+
const result = await createEvaluator(response.object.code, {
|
|
57
|
+
proxy: options.proxy,
|
|
58
|
+
loader: options.loader
|
|
59
|
+
})();
|
|
60
|
+
return {
|
|
61
|
+
code: response.object.code,
|
|
62
|
+
result
|
|
63
|
+
};
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.error("error", error);
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}) }
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function createEvaluator(code, options) {
|
|
73
|
+
return async () => {
|
|
74
|
+
return await options.loader.get(`code-${Math.random()}`, () => {
|
|
75
|
+
return {
|
|
76
|
+
compatibilityDate: "2025-06-01",
|
|
77
|
+
compatibilityFlags: ["nodejs_compat"],
|
|
78
|
+
mainModule: "foo.js",
|
|
79
|
+
modules: { "foo.js": `
|
|
80
|
+
import { env, WorkerEntrypoint } from "cloudflare:workers";
|
|
81
|
+
|
|
82
|
+
export default class CodeModeWorker extends WorkerEntrypoint {
|
|
83
|
+
async evaluate() {
|
|
84
|
+
try {
|
|
85
|
+
const { CodeModeProxy } = env;
|
|
86
|
+
const codemode = new Proxy(
|
|
87
|
+
{},
|
|
88
|
+
{
|
|
89
|
+
get: (target, prop) => {
|
|
90
|
+
return (args) => {
|
|
91
|
+
return CodeModeProxy.callFunction({
|
|
92
|
+
functionName: prop,
|
|
93
|
+
args: args,
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
return await ${code}();
|
|
101
|
+
} catch (err) {
|
|
102
|
+
return {
|
|
103
|
+
err: err.message,
|
|
104
|
+
stack: err.stack
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
` },
|
|
111
|
+
env: { CodeModeProxy: options.proxy },
|
|
112
|
+
globalOutbound: null
|
|
113
|
+
};
|
|
114
|
+
}).getEntrypoint().evaluate();
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
async function generateTypes(tools) {
|
|
118
|
+
let availableTools = "";
|
|
119
|
+
let availableTypes = "";
|
|
120
|
+
for (const [toolName, tool$1] of Object.entries(tools)) {
|
|
121
|
+
const inputJsonType = tool$1.inputSchema.jsonSchema ? await compile(tool$1.inputSchema.jsonSchema, `${toCamelCase(toolName)}Input`, {
|
|
122
|
+
format: false,
|
|
123
|
+
bannerComment: " "
|
|
124
|
+
}) : printNode(createTypeAlias(zodToTs(tool$1.inputSchema, `${toCamelCase(toolName)}Input`).node, `${toCamelCase(toolName)}Input`));
|
|
125
|
+
const outputJsonType = tool$1.outputSchema?.jsonSchema ? await compile(tool$1.outputSchema?.jsonSchema, `${toCamelCase(toolName)}Output`, {
|
|
126
|
+
format: false,
|
|
127
|
+
bannerComment: " "
|
|
128
|
+
}) : tool$1.outputSchema ? printNode(createTypeAlias(zodToTs(tool$1.outputSchema, `${toCamelCase(toolName)}Output`).node, `${toCamelCase(toolName)}Output`)) : `interface ${toCamelCase(toolName)}Output { [key: string]: any }`;
|
|
129
|
+
const InputType = inputJsonType.trim().replace("export interface", "interface");
|
|
130
|
+
const OutputType = outputJsonType.trim().replace("export interface", "interface");
|
|
131
|
+
availableTypes += `\n${InputType}`;
|
|
132
|
+
availableTypes += `\n${OutputType}`;
|
|
133
|
+
availableTools += `\n\t/*\n\t${tool$1.description?.trim()}\n\t*/`;
|
|
134
|
+
availableTools += `\n\t${toolName}: (input: ${toCamelCase(toolName)}Input) => Promise<${toCamelCase(toolName)}Output>;`;
|
|
135
|
+
availableTools += "\n";
|
|
136
|
+
}
|
|
137
|
+
availableTools = `\ndeclare const codemode: {${availableTools}}`;
|
|
138
|
+
return `
|
|
139
|
+
${availableTypes}
|
|
140
|
+
${availableTools}
|
|
141
|
+
`;
|
|
142
|
+
}
|
|
143
|
+
function getToolDescriptions(tools) {
|
|
144
|
+
return Object.entries(tools).map(([_toolName, tool$1]) => {
|
|
145
|
+
return `\n- ${tool$1.description?.trim()}`;
|
|
146
|
+
}).join("");
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
//#endregion
|
|
150
|
+
export { CodeModeProxy, experimental_codemode };
|
|
151
|
+
//# sourceMappingURL=ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.js","names":["tool","compileJsonSchemaToTs","printNodeZodToTs"],"sources":["../../src/codemode/ai.ts"],"sourcesContent":["import { generateObject, tool, type ToolSet } from \"ai\";\nimport { openai } from \"@ai-sdk/openai\";\nimport { z } from \"zod/v3\";\nimport { compile as compileJsonSchemaToTs } from \"json-schema-to-typescript\";\nimport {\n zodToTs,\n printNode as printNodeZodToTs,\n createTypeAlias\n} from \"zod-to-ts\";\nimport { getAgentByName } from \"..\";\nimport { env, WorkerEntrypoint } from \"cloudflare:workers\";\n\nfunction toCamelCase(str: string) {\n return str\n .replace(/_([a-z])/g, (_, letter) => letter.toUpperCase())\n .replace(/^[a-z]/, (letter) => letter.toUpperCase());\n}\n\nexport class CodeModeProxy extends WorkerEntrypoint<\n Cloudflare.Env,\n {\n binding: string;\n name: string;\n callback: string;\n }\n> {\n async callFunction(options: { functionName: string; args: unknown[] }) {\n const stub = (await getAgentByName(\n // @ts-expect-error\n env[this.ctx.props.binding] as AgentNamespace<T>,\n this.ctx.props.name\n )) as DurableObjectStub;\n // @ts-expect-error\n return stub[this.ctx.props.callback](options.functionName, options.args);\n }\n}\n\nexport async function experimental_codemode(options: {\n tools: ToolSet;\n prompt: string;\n globalOutbound: Fetcher;\n loader: WorkerLoader;\n proxy: Fetcher<CodeModeProxy>;\n}): Promise<{\n prompt: string;\n tools: ToolSet;\n}> {\n const generatedTypes = await generateTypes(options.tools);\n const prompt = `You are a helpful assistant. You have access to the \"codemode\" tool that can do different things: \n \n ${getToolDescriptions(options.tools)} \n \n If the user asks to do anything that be achieveable by the codemode tool, then simply pass over control to it by giving it a simple function description. Don't be too verbose.\n \n `;\n\n const codemodeTool = tool({\n description: \"codemode: a tool that can generate code to achieve a goal\",\n inputSchema: z.object({\n functionDescription: z.string()\n }),\n outputSchema: z.object({\n code: z.string(),\n result: z.any()\n }),\n execute: async ({ functionDescription }) => {\n try {\n const response = await generateObject({\n model: openai(\"gpt-4.1\"),\n schema: z.object({\n code: z.string()\n }),\n prompt: `You are a code generating machine.\n\n In addition to regular javascript, you can also use the following functions:\n\n ${generatedTypes} \n\n Respond only with the code, nothing else. Output javascript code.\n\n Generate an async function that achieves the goal. This async function doesn't accept any arguments.\n\n Here is user input: ${functionDescription}` // insert ts types for the tools here\n });\n\n // console.log(\"args\", response.object.args);\n const evaluator = createEvaluator(response.object.code, {\n proxy: options.proxy,\n loader: options.loader\n });\n const result = await evaluator();\n return { code: response.object.code, result: result };\n } catch (error) {\n console.error(\"error\", error);\n throw error;\n // return { code: \"\", result: error };\n }\n }\n });\n\n return { prompt, tools: { codemode: codemodeTool } };\n}\n\nfunction createEvaluator(\n code: string,\n options: {\n loader: WorkerLoader;\n proxy: Fetcher<CodeModeProxy>;\n }\n) {\n return async () => {\n const worker = options.loader.get(`code-${Math.random()}`, () => {\n return {\n compatibilityDate: \"2025-06-01\",\n compatibilityFlags: [\"nodejs_compat\"],\n mainModule: \"foo.js\",\n modules: {\n \"foo.js\": `\nimport { env, WorkerEntrypoint } from \"cloudflare:workers\";\n\nexport default class CodeModeWorker extends WorkerEntrypoint {\n async evaluate() {\n try {\n const { CodeModeProxy } = env;\n const codemode = new Proxy(\n {},\n {\n get: (target, prop) => {\n return (args) => {\n return CodeModeProxy.callFunction({\n functionName: prop,\n args: args, \n });\n };\n }\n }\n );\n\n return await ${code}();\n } catch (err) {\n return {\n err: err.message,\n stack: err.stack\n };\n }\n }\n}\n \n `\n },\n env: {\n // insert keys and bindings to tools/ts functions here\n CodeModeProxy: options.proxy\n },\n globalOutbound: null\n };\n });\n\n // @ts-expect-error TODO: fix this\n return await worker.getEntrypoint().evaluate();\n };\n}\n\nasync function generateTypes(tools: ToolSet) {\n let availableTools = \"\";\n let availableTypes = \"\";\n\n for (const [toolName, tool] of Object.entries(tools)) {\n // @ts-expect-error TODO: fix this\n const inputJsonType = tool.inputSchema.jsonSchema\n ? await compileJsonSchemaToTs(\n // @ts-expect-error TODO: fix this\n tool.inputSchema.jsonSchema,\n `${toCamelCase(toolName)}Input`,\n {\n format: false,\n bannerComment: \" \"\n }\n )\n : printNodeZodToTs(\n createTypeAlias(\n zodToTs(\n // @ts-expect-error TODO: fix this\n tool.inputSchema,\n `${toCamelCase(toolName)}Input`\n ).node,\n `${toCamelCase(toolName)}Input`\n )\n );\n\n const outputJsonType =\n // @ts-expect-error TODO: fix this\n tool.outputSchema?.jsonSchema\n ? await compileJsonSchemaToTs(\n // @ts-expect-error TODO: fix this\n tool.outputSchema?.jsonSchema,\n `${toCamelCase(toolName)}Output`,\n {\n format: false,\n bannerComment: \" \"\n }\n )\n : tool.outputSchema\n ? printNodeZodToTs(\n createTypeAlias(\n zodToTs(\n // @ts-expect-error TODO: fix this\n tool.outputSchema,\n `${toCamelCase(toolName)}Output`\n ).node,\n `${toCamelCase(toolName)}Output`\n )\n )\n : `interface ${toCamelCase(toolName)}Output { [key: string]: any }`;\n\n const InputType = inputJsonType\n .trim()\n .replace(\"export interface\", \"interface\");\n\n const OutputType = outputJsonType\n .trim()\n .replace(\"export interface\", \"interface\");\n\n availableTypes += `\\n${InputType}`;\n availableTypes += `\\n${OutputType}`;\n availableTools += `\\n\\t/*\\n\\t${tool.description?.trim()}\\n\\t*/`;\n availableTools += `\\n\\t${toolName}: (input: ${toCamelCase(toolName)}Input) => Promise<${toCamelCase(toolName)}Output>;`;\n availableTools += \"\\n\";\n }\n\n availableTools = `\\ndeclare const codemode: {${availableTools}}`;\n\n return `\n${availableTypes}\n${availableTools}\n `;\n}\n\nfunction getToolDescriptions(tools: ToolSet) {\n return Object.entries(tools)\n .map(([_toolName, tool]) => {\n return `\\n- ${tool.description?.trim()}`;\n })\n .join(\"\");\n}\n"],"mappings":"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"}
|