agents 0.0.0-33ff003 → 0.0.0-35ccf92

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 (39) hide show
  1. package/dist/ai-chat-agent.d.ts +4 -4
  2. package/dist/ai-chat-agent.js +34 -27
  3. package/dist/ai-chat-agent.js.map +1 -1
  4. package/dist/ai-react.d.ts +8 -7
  5. package/dist/ai-react.js +27 -29
  6. package/dist/ai-react.js.map +1 -1
  7. package/dist/{chunk-BZXOAZUX.js → chunk-767EASBA.js} +5 -5
  8. package/dist/{chunk-BZXOAZUX.js.map → chunk-767EASBA.js.map} +1 -1
  9. package/dist/{chunk-NPGUKHFR.js → chunk-CGWTDCBQ.js} +150 -132
  10. package/dist/chunk-CGWTDCBQ.js.map +1 -0
  11. package/dist/{chunk-Y67CHZBI.js → chunk-E3LCYPCB.js} +23 -18
  12. package/dist/chunk-E3LCYPCB.js.map +1 -0
  13. package/dist/{chunk-QSGN3REV.js → chunk-NKZZ66QY.js} +8 -15
  14. package/dist/chunk-NKZZ66QY.js.map +1 -0
  15. package/dist/client.d.ts +6 -0
  16. package/dist/client.js +1 -2
  17. package/dist/index.d.ts +45 -8
  18. package/dist/index.js +4 -5
  19. package/dist/mcp/client.d.ts +2 -2
  20. package/dist/mcp/client.js +1 -2
  21. package/dist/mcp/do-oauth-client-provider.js +1 -2
  22. package/dist/mcp/index.d.ts +6 -6
  23. package/dist/mcp/index.js +53 -50
  24. package/dist/mcp/index.js.map +1 -1
  25. package/dist/react.d.ts +76 -10
  26. package/dist/react.js +16 -8
  27. package/dist/react.js.map +1 -1
  28. package/dist/schedule.d.ts +2 -2
  29. package/dist/schedule.js +4 -6
  30. package/dist/schedule.js.map +1 -1
  31. package/dist/serializable.d.ts +32 -0
  32. package/dist/serializable.js +1 -0
  33. package/package.json +71 -71
  34. package/src/index.ts +107 -93
  35. package/dist/chunk-NOUFNU2O.js +0 -12
  36. package/dist/chunk-NPGUKHFR.js.map +0 -1
  37. package/dist/chunk-QSGN3REV.js.map +0 -1
  38. package/dist/chunk-Y67CHZBI.js.map +0 -1
  39. /package/dist/{chunk-NOUFNU2O.js.map → serializable.js.map} +0 -0
package/dist/react.d.ts CHANGED
@@ -1,18 +1,19 @@
1
1
  import { PartySocket } from "partysocket";
2
2
  import { usePartySocket } from "partysocket/react";
3
- import { MCPServersState } from "./index.js";
3
+ import { MCPServersState, Agent } from "./index.js";
4
4
  import { StreamOptions } from "./client.js";
5
+ import { Method, RPCMethod } from "./serializable.js";
6
+ import "@modelcontextprotocol/sdk/client/index.js";
7
+ import "@modelcontextprotocol/sdk/types.js";
5
8
  import "partyserver";
6
9
  import "./mcp/client.js";
7
10
  import "zod";
8
- import "@modelcontextprotocol/sdk/types.js";
9
- import "@modelcontextprotocol/sdk/client/index.js";
10
11
  import "@modelcontextprotocol/sdk/client/sse.js";
12
+ import "@modelcontextprotocol/sdk/shared/protocol.js";
13
+ import "ai";
11
14
  import "./mcp/do-oauth-client-provider.js";
12
15
  import "@modelcontextprotocol/sdk/client/auth.js";
13
16
  import "@modelcontextprotocol/sdk/shared/auth.js";
14
- import "@modelcontextprotocol/sdk/shared/protocol.js";
15
- import "ai";
16
17
 
17
18
  /**
18
19
  * Options for the useAgent hook
@@ -31,9 +32,63 @@ type UseAgentOptions<State = unknown> = Omit<
31
32
  /** Called when MCP server state is updated */
32
33
  onMcpUpdate?: (mcpServers: MCPServersState) => void;
33
34
  };
35
+ type AllOptional<T> = T extends [infer A, ...infer R]
36
+ ? undefined extends A
37
+ ? AllOptional<R>
38
+ : false
39
+ : true;
40
+ type RPCMethods<T> = {
41
+ [K in keyof T as T[K] extends RPCMethod<T[K]> ? K : never]: RPCMethod<T[K]>;
42
+ };
43
+ type OptionalParametersMethod<T extends RPCMethod> =
44
+ AllOptional<Parameters<T>> extends true ? T : never;
45
+ type AgentMethods<T> = Omit<RPCMethods<T>, keyof Agent<any, any>>;
46
+ type OptionalAgentMethods<T> = {
47
+ [K in keyof AgentMethods<T> as AgentMethods<T>[K] extends OptionalParametersMethod<
48
+ AgentMethods<T>[K]
49
+ >
50
+ ? K
51
+ : never]: OptionalParametersMethod<AgentMethods<T>[K]>;
52
+ };
53
+ type RequiredAgentMethods<T> = Omit<
54
+ AgentMethods<T>,
55
+ keyof OptionalAgentMethods<T>
56
+ >;
57
+ type AgentPromiseReturnType<T, K extends keyof AgentMethods<T>> =
58
+ ReturnType<AgentMethods<T>[K]> extends Promise<any>
59
+ ? ReturnType<AgentMethods<T>[K]>
60
+ : Promise<ReturnType<AgentMethods<T>[K]>>;
61
+ type OptionalArgsAgentMethodCall<AgentT> = <
62
+ K extends keyof OptionalAgentMethods<AgentT>,
63
+ >(
64
+ method: K,
65
+ args?: Parameters<OptionalAgentMethods<AgentT>[K]>,
66
+ streamOptions?: StreamOptions
67
+ ) => AgentPromiseReturnType<AgentT, K>;
68
+ type RequiredArgsAgentMethodCall<AgentT> = <
69
+ K extends keyof RequiredAgentMethods<AgentT>,
70
+ >(
71
+ method: K,
72
+ args: Parameters<RequiredAgentMethods<AgentT>[K]>,
73
+ streamOptions?: StreamOptions
74
+ ) => AgentPromiseReturnType<AgentT, K>;
75
+ type AgentMethodCall<AgentT> = OptionalArgsAgentMethodCall<AgentT> &
76
+ RequiredArgsAgentMethodCall<AgentT>;
77
+ type UntypedAgentMethodCall = <T = unknown>(
78
+ method: string,
79
+ args?: unknown[],
80
+ streamOptions?: StreamOptions
81
+ ) => Promise<T>;
82
+ type AgentStub<T> = {
83
+ [K in keyof AgentMethods<T>]: (
84
+ ...args: Parameters<AgentMethods<T>[K]>
85
+ ) => AgentPromiseReturnType<AgentMethods<T>, K>;
86
+ };
87
+ type UntypedAgentStub = Record<string, Method>;
34
88
  /**
35
89
  * React hook for connecting to an Agent
36
90
  * @template State Type of the Agent's state
91
+ * @template Agent Type of the Agent
37
92
  * @param options Connection options
38
93
  * @returns WebSocket connection with setState and call methods
39
94
  */
@@ -43,11 +98,22 @@ declare function useAgent<State = unknown>(
43
98
  agent: string;
44
99
  name: string;
45
100
  setState: (state: State) => void;
46
- call: <T = unknown>(
47
- method: string,
48
- args?: unknown[],
49
- streamOptions?: StreamOptions
50
- ) => Promise<T>;
101
+ call: UntypedAgentMethodCall;
102
+ stub: UntypedAgentStub;
103
+ };
104
+ declare function useAgent<
105
+ AgentT extends {
106
+ get state(): State;
107
+ },
108
+ State,
109
+ >(
110
+ options: UseAgentOptions<State>
111
+ ): PartySocket & {
112
+ agent: string;
113
+ name: string;
114
+ setState: (state: State) => void;
115
+ call: AgentMethodCall<AgentT>;
116
+ stub: AgentStub<AgentT>;
51
117
  };
52
118
 
53
119
  export { type UseAgentOptions, useAgent };
package/dist/react.js CHANGED
@@ -1,5 +1,3 @@
1
- import "./chunk-NOUFNU2O.js";
2
-
3
1
  // src/react.tsx
4
2
  import { usePartySocket } from "partysocket/react";
5
3
  import { useCallback, useRef } from "react";
@@ -20,8 +18,8 @@ function useAgent(options) {
20
18
  /* @__PURE__ */ new Map()
21
19
  );
22
20
  const agent = usePartySocket({
23
- prefix: "agents",
24
21
  party: agentNamespace,
22
+ prefix: "agents",
25
23
  room: options.name || "default",
26
24
  ...options,
27
25
  onMessage: (message) => {
@@ -29,7 +27,7 @@ function useAgent(options) {
29
27
  let parsedMessage;
30
28
  try {
31
29
  parsedMessage = JSON.parse(message.data);
32
- } catch (error) {
30
+ } catch (_error) {
33
31
  return options.onMessage?.(message);
34
32
  }
35
33
  if (parsedMessage.type === "cf_agent_state") {
@@ -73,15 +71,15 @@ function useAgent(options) {
73
71
  return new Promise((resolve, reject) => {
74
72
  const id = Math.random().toString(36).slice(2);
75
73
  pendingCallsRef.current.set(id, {
76
- resolve,
77
74
  reject,
75
+ resolve,
78
76
  stream: streamOptions
79
77
  });
80
78
  const request = {
81
- type: "rpc",
79
+ args,
82
80
  id,
83
81
  method,
84
- args
82
+ type: "rpc"
85
83
  };
86
84
  agent.send(JSON.stringify(request));
87
85
  });
@@ -89,12 +87,22 @@ function useAgent(options) {
89
87
  [agent]
90
88
  );
91
89
  agent.setState = (state) => {
92
- agent.send(JSON.stringify({ type: "cf_agent_state", state }));
90
+ agent.send(JSON.stringify({ state, type: "cf_agent_state" }));
93
91
  options.onStateUpdate?.(state, "client");
94
92
  };
95
93
  agent.call = call;
96
94
  agent.agent = agentNamespace;
97
95
  agent.name = options.name || "default";
96
+ agent.stub = new Proxy(
97
+ {},
98
+ {
99
+ get: (_target, method) => {
100
+ return (...args) => {
101
+ return call(method, args);
102
+ };
103
+ }
104
+ }
105
+ );
98
106
  if (agent.agent !== agent.agent.toLowerCase()) {
99
107
  console.warn(
100
108
  `Agent name: ${agent.agent} should probably be in lowercase. Received: ${agent.agent}`
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.tsx"],"sourcesContent":["import type { PartySocket } from \"partysocket\";\nimport { usePartySocket } from \"partysocket/react\";\nimport { useCallback, useRef } from \"react\";\nimport type { MCPServersState, RPCRequest, RPCResponse } from \"./\";\nimport type { StreamOptions } from \"./client\";\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 */\nfunction 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 * Options for the useAgent hook\n * @template State Type of the Agent's state\n */\nexport type UseAgentOptions<State = unknown> = Omit<\n Parameters<typeof usePartySocket>[0],\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 /** Called when MCP server state is updated */\n onMcpUpdate?: (mcpServers: MCPServersState) => void;\n};\n\n/**\n * React hook for connecting to an Agent\n * @template State Type of the Agent's state\n * @param options Connection options\n * @returns WebSocket connection with setState and call methods\n */\nexport function useAgent<State = unknown>(\n options: UseAgentOptions<State>\n): PartySocket & {\n agent: string;\n name: string;\n setState: (state: State) => void;\n call: <T = unknown>(\n method: string,\n args?: unknown[],\n streamOptions?: StreamOptions\n ) => Promise<T>;\n} {\n const agentNamespace = camelCaseToKebabCase(options.agent);\n // Keep track of pending RPC calls\n const pendingCallsRef = useRef(\n new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n stream?: StreamOptions;\n }\n >()\n );\n\n // TODO: if options.query is a function, then use\n // \"use()\" to get the value and pass it\n // as a query parameter to usePartySocket\n const agent = usePartySocket({\n prefix: \"agents\",\n party: agentNamespace,\n room: options.name || \"default\",\n ...options,\n onMessage: (message) => {\n if (typeof message.data === \"string\") {\n let parsedMessage: Record<string, unknown>;\n try {\n parsedMessage = JSON.parse(message.data);\n } catch (error) {\n // silently ignore invalid messages for now\n // TODO: log errors with log levels\n return options.onMessage?.(message);\n }\n if (parsedMessage.type === \"cf_agent_state\") {\n options.onStateUpdate?.(parsedMessage.state as State, \"server\");\n return;\n }\n if (parsedMessage.type === \"cf_agent_mcp_servers\") {\n options.onMcpUpdate?.(parsedMessage.mcp as MCPServersState);\n return;\n }\n if (parsedMessage.type === \"rpc\") {\n const response = parsedMessage as RPCResponse;\n const pending = pendingCallsRef.current.get(response.id);\n if (!pending) return;\n\n if (!response.success) {\n pending.reject(new Error(response.error));\n pendingCallsRef.current.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 pendingCallsRef.current.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 pendingCallsRef.current.delete(response.id);\n }\n return;\n }\n }\n options.onMessage?.(message);\n },\n }) as PartySocket & {\n agent: string;\n name: string;\n setState: (state: State) => void;\n call: <T = unknown>(\n method: string,\n args?: unknown[],\n streamOptions?: StreamOptions\n ) => Promise<T>;\n };\n // Create the call method\n const call = useCallback(\n <T = unknown,>(\n method: string,\n args: unknown[] = [],\n streamOptions?: StreamOptions\n ): Promise<T> => {\n return new Promise((resolve, reject) => {\n const id = Math.random().toString(36).slice(2);\n pendingCallsRef.current.set(id, {\n resolve: resolve as (value: unknown) => void,\n reject,\n stream: streamOptions,\n });\n\n const request: RPCRequest = {\n type: \"rpc\",\n id,\n method,\n args,\n };\n\n agent.send(JSON.stringify(request));\n });\n },\n [agent]\n );\n\n agent.setState = (state: State) => {\n agent.send(JSON.stringify({ type: \"cf_agent_state\", state }));\n options.onStateUpdate?.(state, \"client\");\n };\n\n agent.call = call;\n agent.agent = agentNamespace;\n agent.name = options.name || \"default\";\n\n // warn if agent isn't in lowercase\n if (agent.agent !== agent.agent.toLowerCase()) {\n console.warn(\n `Agent name: ${agent.agent} should probably be in lowercase. Received: ${agent.agent}`\n );\n }\n\n return agent;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/react.tsx"],"sourcesContent":["import type { PartySocket } from \"partysocket\";\nimport { usePartySocket } from \"partysocket/react\";\nimport { useCallback, useRef } from \"react\";\nimport type { Agent, MCPServersState, RPCRequest, RPCResponse } from \"./\";\nimport type { StreamOptions } from \"./client\";\nimport type { Method, RPCMethod } from \"./serializable\";\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 */\nfunction 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 * Options for the useAgent hook\n * @template State Type of the Agent's state\n */\nexport type UseAgentOptions<State = unknown> = Omit<\n Parameters<typeof usePartySocket>[0],\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 /** Called when MCP server state is updated */\n onMcpUpdate?: (mcpServers: MCPServersState) => void;\n};\n\ntype AllOptional<T> = T extends [infer A, ...infer R]\n ? undefined extends A\n ? AllOptional<R>\n : false\n : true; // no params means optional by default\n\ntype RPCMethods<T> = {\n [K in keyof T as T[K] extends RPCMethod<T[K]> ? K : never]: RPCMethod<T[K]>;\n};\n\ntype OptionalParametersMethod<T extends RPCMethod> =\n AllOptional<Parameters<T>> extends true ? T : never;\n\n// all methods of the Agent, excluding the ones that are declared in the base Agent class\n// biome-ignore lint: suppressions/parse\ntype AgentMethods<T> = Omit<RPCMethods<T>, keyof Agent<any, any>>;\n\ntype OptionalAgentMethods<T> = {\n [K in keyof AgentMethods<T> as AgentMethods<T>[K] extends OptionalParametersMethod<\n AgentMethods<T>[K]\n >\n ? K\n : never]: OptionalParametersMethod<AgentMethods<T>[K]>;\n};\n\ntype RequiredAgentMethods<T> = Omit<\n AgentMethods<T>,\n keyof OptionalAgentMethods<T>\n>;\n\ntype AgentPromiseReturnType<T, K extends keyof AgentMethods<T>> =\n // biome-ignore lint: suppressions/parse\n ReturnType<AgentMethods<T>[K]> extends Promise<any>\n ? ReturnType<AgentMethods<T>[K]>\n : Promise<ReturnType<AgentMethods<T>[K]>>;\n\ntype OptionalArgsAgentMethodCall<AgentT> = <\n K extends keyof OptionalAgentMethods<AgentT>,\n>(\n method: K,\n args?: Parameters<OptionalAgentMethods<AgentT>[K]>,\n streamOptions?: StreamOptions\n) => AgentPromiseReturnType<AgentT, K>;\n\ntype RequiredArgsAgentMethodCall<AgentT> = <\n K extends keyof RequiredAgentMethods<AgentT>,\n>(\n method: K,\n args: Parameters<RequiredAgentMethods<AgentT>[K]>,\n streamOptions?: StreamOptions\n) => AgentPromiseReturnType<AgentT, K>;\n\ntype AgentMethodCall<AgentT> = OptionalArgsAgentMethodCall<AgentT> &\n RequiredArgsAgentMethodCall<AgentT>;\n\ntype UntypedAgentMethodCall = <T = unknown>(\n method: string,\n args?: unknown[],\n streamOptions?: StreamOptions\n) => Promise<T>;\n\ntype AgentStub<T> = {\n [K in keyof AgentMethods<T>]: (\n ...args: Parameters<AgentMethods<T>[K]>\n ) => AgentPromiseReturnType<AgentMethods<T>, K>;\n};\n\n// we neet to use Method instead of RPCMethod here for retro-compatibility\ntype UntypedAgentStub = Record<string, Method>;\n\n/**\n * React hook for connecting to an Agent\n * @template State Type of the Agent's state\n * @template Agent Type of the Agent\n * @param options Connection options\n * @returns WebSocket connection with setState and call methods\n */\nexport function useAgent<State = unknown>(\n options: UseAgentOptions<State>\n): PartySocket & {\n agent: string;\n name: string;\n setState: (state: State) => void;\n call: UntypedAgentMethodCall;\n stub: UntypedAgentStub;\n};\nexport function useAgent<\n AgentT extends {\n get state(): State;\n },\n State,\n>(\n options: UseAgentOptions<State>\n): PartySocket & {\n agent: string;\n name: string;\n setState: (state: State) => void;\n call: AgentMethodCall<AgentT>;\n stub: AgentStub<AgentT>;\n};\nexport function useAgent<State>(\n options: UseAgentOptions<unknown>\n): PartySocket & {\n agent: string;\n name: string;\n setState: (state: State) => void;\n call: UntypedAgentMethodCall | AgentMethodCall<unknown>;\n stub: UntypedAgentStub;\n} {\n const agentNamespace = camelCaseToKebabCase(options.agent);\n // Keep track of pending RPC calls\n const pendingCallsRef = useRef(\n new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n stream?: StreamOptions;\n }\n >()\n );\n\n // TODO: if options.query is a function, then use\n // \"use()\" to get the value and pass it\n // as a query parameter to usePartySocket\n const agent = usePartySocket({\n party: agentNamespace,\n prefix: \"agents\",\n room: options.name || \"default\",\n ...options,\n onMessage: (message) => {\n if (typeof message.data === \"string\") {\n let parsedMessage: Record<string, unknown>;\n try {\n parsedMessage = JSON.parse(message.data);\n } catch (_error) {\n // silently ignore invalid messages for now\n // TODO: log errors with log levels\n return options.onMessage?.(message);\n }\n if (parsedMessage.type === \"cf_agent_state\") {\n options.onStateUpdate?.(parsedMessage.state as State, \"server\");\n return;\n }\n if (parsedMessage.type === \"cf_agent_mcp_servers\") {\n options.onMcpUpdate?.(parsedMessage.mcp as MCPServersState);\n return;\n }\n if (parsedMessage.type === \"rpc\") {\n const response = parsedMessage as RPCResponse;\n const pending = pendingCallsRef.current.get(response.id);\n if (!pending) return;\n\n if (!response.success) {\n pending.reject(new Error(response.error));\n pendingCallsRef.current.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 pendingCallsRef.current.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 pendingCallsRef.current.delete(response.id);\n }\n return;\n }\n }\n options.onMessage?.(message);\n },\n }) as PartySocket & {\n agent: string;\n name: string;\n setState: (state: State) => void;\n call: UntypedAgentMethodCall;\n stub: UntypedAgentStub;\n };\n // Create the call method\n const call = useCallback(\n <T = unknown,>(\n method: string,\n args: unknown[] = [],\n streamOptions?: StreamOptions\n ): Promise<T> => {\n return new Promise((resolve, reject) => {\n const id = Math.random().toString(36).slice(2);\n pendingCallsRef.current.set(id, {\n reject,\n resolve: resolve as (value: unknown) => void,\n stream: streamOptions,\n });\n\n const request: RPCRequest = {\n args,\n id,\n method,\n type: \"rpc\",\n };\n\n agent.send(JSON.stringify(request));\n });\n },\n [agent]\n );\n\n agent.setState = (state: State) => {\n agent.send(JSON.stringify({ state, type: \"cf_agent_state\" }));\n options.onStateUpdate?.(state, \"client\");\n };\n\n agent.call = call;\n agent.agent = agentNamespace;\n agent.name = options.name || \"default\";\n // biome-ignore lint: suppressions/parse\n agent.stub = new Proxy<any>(\n {},\n {\n get: (_target, method) => {\n return (...args: unknown[]) => {\n return call(method as string, args);\n };\n },\n }\n );\n\n // warn if agent isn't in lowercase\n if (agent.agent !== agent.agent.toLowerCase()) {\n console.warn(\n `Agent name: ${agent.agent} should probably be in lowercase. Received: ${agent.agent}`\n );\n }\n\n return agent;\n}\n"],"mappings":"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","names":[]}
@@ -7,10 +7,10 @@ declare const unstable_scheduleSchema: z.ZodObject<
7
7
  description: z.ZodString;
8
8
  when: z.ZodObject<
9
9
  {
10
- type: z.ZodEnum<["scheduled", "delayed", "cron", "no-schedule"]>;
10
+ cron: z.ZodOptional<z.ZodString>;
11
11
  date: z.ZodOptional<z.ZodDate>;
12
12
  delayInSeconds: z.ZodOptional<z.ZodNumber>;
13
- cron: z.ZodOptional<z.ZodString>;
13
+ type: z.ZodEnum<["scheduled", "delayed", "cron", "no-schedule"]>;
14
14
  },
15
15
  "strip",
16
16
  z.ZodTypeAny,
package/dist/schedule.js CHANGED
@@ -1,5 +1,3 @@
1
- import "./chunk-NOUFNU2O.js";
2
-
3
1
  // src/schedule.ts
4
2
  import { z } from "zod";
5
3
  function unstable_getSchedulePrompt(event) {
@@ -54,16 +52,16 @@ Example outputs:
54
52
  var unstable_scheduleSchema = z.object({
55
53
  description: z.string().describe("A description of the task"),
56
54
  when: z.object({
57
- type: z.enum(["scheduled", "delayed", "cron", "no-schedule"]).describe("The type of scheduling details"),
55
+ cron: z.string().optional().describe(
56
+ "execute task on a recurring interval specified as cron syntax (only use if the type is cron)"
57
+ ),
58
58
  date: z.coerce.date().optional().describe(
59
59
  "execute task at the specified date and time (only use if the type is scheduled)"
60
60
  ),
61
61
  delayInSeconds: z.number().optional().describe(
62
62
  "execute task after a delay in seconds (only use if the type is delayed)"
63
63
  ),
64
- cron: z.string().optional().describe(
65
- "execute task on a recurring interval specified as cron syntax (only use if the type is cron)"
66
- )
64
+ type: z.enum(["scheduled", "delayed", "cron", "no-schedule"]).describe("The type of scheduling details")
67
65
  })
68
66
  });
69
67
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schedule.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type Schedule = z.infer<typeof unstable_scheduleSchema>;\n\nexport function unstable_getSchedulePrompt(event: { date: Date }) {\n return `\n[Schedule Parser Component]\n\nCurrent time: ${event.date.toUTCString()}\n\nThis component parses natural language scheduling requests into a structured format. It extracts:\n1. A clean task description (without timing information)\n2. Scheduling details in one of these formats:\n - scheduled: Specific date/time events\n - delayed: Relative time delays (in seconds)\n - cron: Recurring patterns\n - no-schedule: Tasks without timing\n\nRules:\n- Task descriptions should be clean and focused on the action\n- Use numbers (0-6) for days in cron patterns (0=Sunday)\n- For recurring tasks, use standard cron syntax\n- For relative times, convert to seconds\n- For specific dates, use the current time as reference\n\nExample outputs:\n{\n \"description\": \"meeting with team\",\n \"when\": {\n \"type\": \"scheduled\",\n \"date\": \"tomorrow at 14:00\"\n }\n}\n\n{\n \"description\": \"backup database\",\n \"when\": {\n \"type\": \"cron\",\n \"cron\": \"0 0 * * *\"\n }\n}\n\n{\n \"description\": \"send report\",\n \"when\": {\n \"type\": \"delayed\",\n \"delayInSeconds\": 1800\n }\n}\n\n[End Schedule Parser Component]\n`;\n}\n\nexport const unstable_scheduleSchema = z.object({\n description: z.string().describe(\"A description of the task\"),\n when: z.object({\n type: z\n .enum([\"scheduled\", \"delayed\", \"cron\", \"no-schedule\"])\n .describe(\"The type of scheduling details\"),\n date: z.coerce\n .date()\n .optional()\n .describe(\n \"execute task at the specified date and time (only use if the type is scheduled)\"\n ),\n delayInSeconds: z\n .number()\n .optional()\n .describe(\n \"execute task after a delay in seconds (only use if the type is delayed)\"\n ),\n cron: z\n .string()\n .optional()\n .describe(\n \"execute task on a recurring interval specified as cron syntax (only use if the type is cron)\"\n ),\n }),\n});\n"],"mappings":";;;AAAA,SAAS,SAAS;AAIX,SAAS,2BAA2B,OAAuB;AAChE,SAAO;AAAA;AAAA;AAAA,gBAGO,MAAM,KAAK,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4CxC;AAEO,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,aAAa,EAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,EAC5D,MAAM,EAAE,OAAO;AAAA,IACb,MAAM,EACH,KAAK,CAAC,aAAa,WAAW,QAAQ,aAAa,CAAC,EACpD,SAAS,gCAAgC;AAAA,IAC5C,MAAM,EAAE,OACL,KAAK,EACL,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,IACF,gBAAgB,EACb,OAAO,EACP,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,IACF,MAAM,EACH,OAAO,EACP,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,EACJ,CAAC;AACH,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/schedule.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type Schedule = z.infer<typeof unstable_scheduleSchema>;\n\nexport function unstable_getSchedulePrompt(event: { date: Date }) {\n return `\n[Schedule Parser Component]\n\nCurrent time: ${event.date.toUTCString()}\n\nThis component parses natural language scheduling requests into a structured format. It extracts:\n1. A clean task description (without timing information)\n2. Scheduling details in one of these formats:\n - scheduled: Specific date/time events\n - delayed: Relative time delays (in seconds)\n - cron: Recurring patterns\n - no-schedule: Tasks without timing\n\nRules:\n- Task descriptions should be clean and focused on the action\n- Use numbers (0-6) for days in cron patterns (0=Sunday)\n- For recurring tasks, use standard cron syntax\n- For relative times, convert to seconds\n- For specific dates, use the current time as reference\n\nExample outputs:\n{\n \"description\": \"meeting with team\",\n \"when\": {\n \"type\": \"scheduled\",\n \"date\": \"tomorrow at 14:00\"\n }\n}\n\n{\n \"description\": \"backup database\",\n \"when\": {\n \"type\": \"cron\",\n \"cron\": \"0 0 * * *\"\n }\n}\n\n{\n \"description\": \"send report\",\n \"when\": {\n \"type\": \"delayed\",\n \"delayInSeconds\": 1800\n }\n}\n\n[End Schedule Parser Component]\n`;\n}\n\nexport const unstable_scheduleSchema = z.object({\n description: z.string().describe(\"A description of the task\"),\n when: z.object({\n cron: z\n .string()\n .optional()\n .describe(\n \"execute task on a recurring interval specified as cron syntax (only use if the type is cron)\"\n ),\n date: z.coerce\n .date()\n .optional()\n .describe(\n \"execute task at the specified date and time (only use if the type is scheduled)\"\n ),\n delayInSeconds: z\n .number()\n .optional()\n .describe(\n \"execute task after a delay in seconds (only use if the type is delayed)\"\n ),\n type: z\n .enum([\"scheduled\", \"delayed\", \"cron\", \"no-schedule\"])\n .describe(\"The type of scheduling details\"),\n }),\n});\n"],"mappings":";AAAA,SAAS,SAAS;AAIX,SAAS,2BAA2B,OAAuB;AAChE,SAAO;AAAA;AAAA;AAAA,gBAGO,MAAM,KAAK,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4CxC;AAEO,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,aAAa,EAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,EAC5D,MAAM,EAAE,OAAO;AAAA,IACb,MAAM,EACH,OAAO,EACP,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,IACF,MAAM,EAAE,OACL,KAAK,EACL,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,IACF,gBAAgB,EACb,OAAO,EACP,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,IACF,MAAM,EACH,KAAK,CAAC,aAAa,WAAW,QAAQ,aAAa,CAAC,EACpD,SAAS,gCAAgC;AAAA,EAC9C,CAAC;AACH,CAAC;","names":[]}
@@ -0,0 +1,32 @@
1
+ type SerializableValue =
2
+ | undefined
3
+ | null
4
+ | string
5
+ | number
6
+ | boolean
7
+ | {
8
+ [key: string]: SerializableValue;
9
+ }
10
+ | SerializableValue[];
11
+ type SerializableReturnValue =
12
+ | SerializableValue
13
+ | void
14
+ | Promise<SerializableValue>
15
+ | Promise<void>;
16
+ type AllSerializableValues<A> = A extends [infer First, ...infer Rest]
17
+ ? First extends SerializableValue
18
+ ? AllSerializableValues<Rest>
19
+ : false
20
+ : true;
21
+ type Method = (...args: any[]) => any;
22
+ type RPCMethod<T = Method> = T extends Method
23
+ ? T extends (...arg: infer A) => infer R
24
+ ? AllSerializableValues<A> extends true
25
+ ? R extends SerializableReturnValue
26
+ ? T
27
+ : never
28
+ : never
29
+ : never
30
+ : never;
31
+
32
+ export type { Method, RPCMethod, SerializableReturnValue, SerializableValue };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=serializable.js.map
package/package.json CHANGED
@@ -1,101 +1,101 @@
1
1
  {
2
- "name": "agents",
3
- "version": "0.0.0-33ff003",
4
- "main": "src/index.ts",
5
- "types": "dist/index.d.ts",
6
- "type": "module",
7
- "scripts": {
8
- "check:test": "npm run check:test:workers && npm run check:test:react",
9
- "check:test:workers": "vitest -r src/tests --watch false",
10
- "check:test:react": "vitest -r src/react-tests --watch false",
11
- "test": "vitest -r src/tests",
12
- "test:react": "vitest -r src/react-tests",
13
- "evals": "(cd evals; evalite)",
14
- "build": "tsx ./scripts/build.ts"
2
+ "author": "Cloudflare Inc.",
3
+ "bugs": {
4
+ "url": "https://github.com/cloudflare/agents/issues"
5
+ },
6
+ "dependencies": {
7
+ "@modelcontextprotocol/sdk": "^1.13.1",
8
+ "ai": "^4.3.16",
9
+ "cron-schedule": "^5.0.4",
10
+ "nanoid": "^5.1.5",
11
+ "partyserver": "^0.0.72",
12
+ "partysocket": "1.1.4",
13
+ "zod": "^3.25.67"
14
+ },
15
+ "description": "A home for your AI agents",
16
+ "devDependencies": {
17
+ "@cloudflare/vitest-pool-workers": "^0.8.46",
18
+ "react": "*",
19
+ "vitest-browser-react": "^1.0.0"
15
20
  },
16
- "files": [
17
- "dist",
18
- "README.md"
19
- ],
20
21
  "exports": {
21
22
  ".": {
22
- "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js",
23
24
  "require": "./dist/index.js",
24
- "import": "./dist/index.js"
25
+ "types": "./dist/index.d.ts"
25
26
  },
26
- "./client": {
27
- "types": "./dist/client.d.ts",
28
- "require": "./dist/client.js",
29
- "import": "./dist/client.js"
30
- },
31
- "./react": {
32
- "types": "./dist/react.d.ts",
33
- "require": "./dist/react.js",
34
- "import": "./dist/react.js"
27
+ "./ai-chat-agent": {
28
+ "import": "./dist/ai-chat-agent.js",
29
+ "require": "./dist/ai-chat-agent.js",
30
+ "types": "./dist/ai-chat-agent.d.ts"
35
31
  },
36
32
  "./ai-react": {
37
- "types": "./dist/ai-react.d.ts",
33
+ "import": "./dist/ai-react.js",
38
34
  "require": "./dist/ai-react.js",
39
- "import": "./dist/ai-react.js"
40
- },
41
- "./ai-chat-agent": {
42
- "types": "./dist/ai-chat-agent.d.ts",
43
- "require": "./dist/ai-chat-agent.js",
44
- "import": "./dist/ai-chat-agent.js"
35
+ "types": "./dist/ai-react.d.ts"
45
36
  },
46
37
  "./ai-types": {
47
- "types": "./dist/ai-types.d.ts",
38
+ "import": "./dist/ai-types.js",
48
39
  "require": "./dist/ai-types.js",
49
- "import": "./dist/ai-types.js"
40
+ "types": "./dist/ai-types.d.ts"
50
41
  },
51
- "./schedule": {
52
- "types": "./dist/schedule.d.ts",
53
- "require": "./dist/schedule.js",
54
- "import": "./dist/schedule.js"
42
+ "./client": {
43
+ "import": "./dist/client.js",
44
+ "require": "./dist/client.js",
45
+ "types": "./dist/client.d.ts"
55
46
  },
56
47
  "./mcp": {
57
- "types": "./dist/mcp/index.d.ts",
48
+ "import": "./dist/mcp/index.js",
58
49
  "require": "./dist/mcp/index.js",
59
- "import": "./dist/mcp/index.js"
50
+ "types": "./dist/mcp/index.d.ts"
60
51
  },
61
52
  "./mcp/client": {
62
- "types": "./dist/mcp/client.d.ts",
53
+ "import": "./dist/mcp/client.js",
63
54
  "require": "./dist/mcp/client.js",
64
- "import": "./dist/mcp/client.js"
55
+ "types": "./dist/mcp/client.d.ts"
65
56
  },
66
57
  "./mcp/do-oauth-client-provider": {
67
- "types": "./dist/mcp/do-oauth-client-provider.d.ts",
58
+ "import": "./dist/mcp/do-oauth-client-provider.js",
68
59
  "require": "./dist/mcp/do-oauth-client-provider.js",
69
- "import": "./dist/mcp/do-oauth-client-provider.js"
60
+ "types": "./dist/mcp/do-oauth-client-provider.d.ts"
61
+ },
62
+ "./react": {
63
+ "import": "./dist/react.js",
64
+ "require": "./dist/react.js",
65
+ "types": "./dist/react.d.ts"
66
+ },
67
+ "./schedule": {
68
+ "import": "./dist/schedule.js",
69
+ "require": "./dist/schedule.js",
70
+ "types": "./dist/schedule.d.ts"
70
71
  }
71
72
  },
73
+ "files": [
74
+ "dist",
75
+ "README.md"
76
+ ],
72
77
  "keywords": [],
73
- "repository": {
74
- "type": "git",
75
- "url": "git+https://github.com/cloudflare/agents.git",
76
- "directory": "packages/agents"
77
- },
78
- "bugs": {
79
- "url": "https://github.com/cloudflare/agents/issues"
80
- },
81
- "author": "Cloudflare Inc.",
82
78
  "license": "MIT",
83
- "description": "A home for your AI agents",
84
- "dependencies": {
85
- "@modelcontextprotocol/sdk": "^1.11.0",
86
- "ai": "^4.3.14",
87
- "cron-schedule": "^5.0.4",
88
- "nanoid": "^5.1.5",
89
- "partyserver": "^0.0.70",
90
- "partysocket": "1.1.3",
91
- "zod": "^3.24.4"
92
- },
79
+ "main": "src/index.ts",
80
+ "name": "agents",
93
81
  "peerDependencies": {
94
82
  "react": "*"
95
83
  },
96
- "devDependencies": {
97
- "@cloudflare/vitest-pool-workers": "^0.8.25",
98
- "react": "*",
99
- "vitest-browser-react": "^0.1.1"
100
- }
84
+ "repository": {
85
+ "directory": "packages/agents",
86
+ "type": "git",
87
+ "url": "git+https://github.com/cloudflare/agents.git"
88
+ },
89
+ "scripts": {
90
+ "build": "tsx ./scripts/build.ts",
91
+ "check:test": "npm run check:test:workers && npm run check:test:react",
92
+ "check:test:react": "vitest -r src/react-tests --watch false",
93
+ "check:test:workers": "vitest -r src/tests --watch false",
94
+ "evals": "(cd evals; evalite)",
95
+ "test": "vitest -r src/tests",
96
+ "test:react": "vitest -r src/react-tests"
97
+ },
98
+ "type": "module",
99
+ "types": "dist/index.d.ts",
100
+ "version": "0.0.0-35ccf92"
101
101
  }