agents 0.0.0-dfa677f → 0.0.0-e19fea6

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 (80) hide show
  1. package/README.md +255 -27
  2. package/dist/_esm-LV5FJ3HK.js +3922 -0
  3. package/dist/_esm-LV5FJ3HK.js.map +1 -0
  4. package/dist/ai-chat-agent.d.ts +57 -7
  5. package/dist/ai-chat-agent.js +580 -95
  6. package/dist/ai-chat-agent.js.map +1 -1
  7. package/dist/ai-chat-v5-migration.d.ts +152 -0
  8. package/dist/ai-chat-v5-migration.js +20 -0
  9. package/dist/ai-react.d.ts +78 -67
  10. package/dist/ai-react.js +287 -120
  11. package/dist/ai-react.js.map +1 -1
  12. package/dist/ai-types.d.ts +41 -18
  13. package/dist/ai-types.js +7 -0
  14. package/dist/ccip-CMBYN64O.js +15 -0
  15. package/dist/ccip-CMBYN64O.js.map +1 -0
  16. package/dist/chunk-254F4GDT.js +1343 -0
  17. package/dist/chunk-254F4GDT.js.map +1 -0
  18. package/dist/chunk-3OT2NNEW.js +941 -0
  19. package/dist/chunk-3OT2NNEW.js.map +1 -0
  20. package/dist/chunk-5Y6BEZDY.js +276 -0
  21. package/dist/chunk-5Y6BEZDY.js.map +1 -0
  22. package/dist/chunk-BER7KXUJ.js +18 -0
  23. package/dist/chunk-BER7KXUJ.js.map +1 -0
  24. package/dist/chunk-JJBFIGUC.js +5202 -0
  25. package/dist/chunk-JJBFIGUC.js.map +1 -0
  26. package/dist/chunk-PR4QN5HX.js +43 -0
  27. package/dist/chunk-PR4QN5HX.js.map +1 -0
  28. package/dist/chunk-QEVM4BVL.js +116 -0
  29. package/dist/chunk-QEVM4BVL.js.map +1 -0
  30. package/dist/chunk-TYAY6AU6.js +159 -0
  31. package/dist/chunk-TYAY6AU6.js.map +1 -0
  32. package/dist/chunk-UJVEAURM.js +150 -0
  33. package/dist/chunk-UJVEAURM.js.map +1 -0
  34. package/dist/chunk-Z44WASMA.js +114 -0
  35. package/dist/chunk-Z44WASMA.js.map +1 -0
  36. package/dist/client-DVoPb3-C.d.ts +5120 -0
  37. package/dist/client.d.ts +16 -2
  38. package/dist/client.js +8 -133
  39. package/dist/client.js.map +1 -1
  40. package/dist/codemode/ai.d.ts +25 -0
  41. package/dist/codemode/ai.js +5112 -0
  42. package/dist/codemode/ai.js.map +1 -0
  43. package/dist/index.d.ts +275 -27
  44. package/dist/index.js +18 -8
  45. package/dist/mcp/client.d.ts +12 -0
  46. package/dist/mcp/client.js +10 -0
  47. package/dist/mcp/client.js.map +1 -0
  48. package/dist/mcp/do-oauth-client-provider.d.ts +42 -0
  49. package/dist/mcp/do-oauth-client-provider.js +8 -0
  50. package/dist/mcp/do-oauth-client-provider.js.map +1 -0
  51. package/dist/mcp/index.d.ts +79 -0
  52. package/dist/mcp/index.js +1099 -0
  53. package/dist/mcp/index.js.map +1 -0
  54. package/dist/mcp/x402.d.ts +39 -0
  55. package/dist/mcp/x402.js +3195 -0
  56. package/dist/mcp/x402.js.map +1 -0
  57. package/dist/mcp-BH1fJeiU.d.ts +58 -0
  58. package/dist/observability/index.d.ts +34 -0
  59. package/dist/observability/index.js +12 -0
  60. package/dist/observability/index.js.map +1 -0
  61. package/dist/react.d.ts +97 -9
  62. package/dist/react.js +153 -34
  63. package/dist/react.js.map +1 -1
  64. package/dist/schedule.d.ts +81 -7
  65. package/dist/schedule.js +20 -7
  66. package/dist/schedule.js.map +1 -1
  67. package/dist/secp256k1-M22GZP2U.js +2193 -0
  68. package/dist/secp256k1-M22GZP2U.js.map +1 -0
  69. package/dist/serializable.d.ts +32 -0
  70. package/dist/serializable.js +1 -0
  71. package/dist/serializable.js.map +1 -0
  72. package/package.json +106 -50
  73. package/src/index.ts +1268 -162
  74. package/dist/chunk-HMLY7DHA.js +0 -16
  75. package/dist/chunk-KRBQHBPA.js +0 -599
  76. package/dist/chunk-KRBQHBPA.js.map +0 -1
  77. package/dist/mcp.d.ts +0 -58
  78. package/dist/mcp.js +0 -945
  79. package/dist/mcp.js.map +0 -1
  80. /package/dist/{chunk-HMLY7DHA.js.map → ai-chat-v5-migration.js.map} +0 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Base event structure for all observability events
3
+ */
4
+ type BaseEvent<
5
+ T extends string,
6
+ Payload extends Record<string, unknown> = {}
7
+ > = {
8
+ type: T;
9
+ /**
10
+ * The unique identifier for the event
11
+ */
12
+ id: string;
13
+ /**
14
+ * The message to display in the logs for this event, should the implementation choose to display
15
+ * a human-readable message.
16
+ */
17
+ displayMessage: string;
18
+ /**
19
+ * The payload of the event
20
+ */
21
+ payload: Payload & Record<string, unknown>;
22
+ /**
23
+ * The timestamp of the event in milliseconds since epoch
24
+ */
25
+ timestamp: number;
26
+ };
27
+
28
+ /**
29
+ * MCP-specific observability events
30
+ * These track the lifecycle of MCP connections and operations
31
+ */
32
+ type MCPObservabilityEvent =
33
+ | BaseEvent<
34
+ "mcp:client:preconnect",
35
+ {
36
+ serverId: string;
37
+ }
38
+ >
39
+ | BaseEvent<
40
+ "mcp:client:connect",
41
+ {
42
+ url: string;
43
+ transport: string;
44
+ state: string;
45
+ error?: string;
46
+ }
47
+ >
48
+ | BaseEvent<
49
+ "mcp:client:authorize",
50
+ {
51
+ serverId: string;
52
+ authUrl: string;
53
+ clientId?: string;
54
+ }
55
+ >
56
+ | BaseEvent<"mcp:client:discover", {}>;
57
+
58
+ export type { BaseEvent as B, MCPObservabilityEvent as M };
@@ -0,0 +1,34 @@
1
+ import { B as BaseEvent, M as MCPObservabilityEvent } from '../mcp-BH1fJeiU.js';
2
+
3
+ /**
4
+ * Agent-specific observability events
5
+ * These track the lifecycle and operations of an Agent
6
+ */
7
+ type AgentObservabilityEvent = BaseEvent<"state:update", {}> | BaseEvent<"rpc", {
8
+ method: string;
9
+ streaming?: boolean;
10
+ }> | BaseEvent<"message:request" | "message:response", {}> | BaseEvent<"message:clear"> | BaseEvent<"schedule:create" | "schedule:execute" | "schedule:cancel", {
11
+ callback: string;
12
+ id: string;
13
+ }> | BaseEvent<"destroy"> | BaseEvent<"connect", {
14
+ connectionId: string;
15
+ }>;
16
+
17
+ /**
18
+ * Union of all observability event types from different domains
19
+ */
20
+ type ObservabilityEvent = AgentObservabilityEvent | MCPObservabilityEvent;
21
+ interface Observability {
22
+ /**
23
+ * Emit an event for the Agent's observability implementation to handle.
24
+ * @param event - The event to emit
25
+ * @param ctx - The execution context of the invocation (optional)
26
+ */
27
+ emit(event: ObservabilityEvent, ctx?: DurableObjectState): void;
28
+ }
29
+ /**
30
+ * A generic observability implementation that logs events to the console.
31
+ */
32
+ declare const genericObservability: Observability;
33
+
34
+ export { type Observability, type ObservabilityEvent, genericObservability };
@@ -0,0 +1,12 @@
1
+ import {
2
+ genericObservability
3
+ } from "../chunk-254F4GDT.js";
4
+ import "../chunk-3OT2NNEW.js";
5
+ import "../chunk-Z44WASMA.js";
6
+ import "../chunk-QEVM4BVL.js";
7
+ import "../chunk-BER7KXUJ.js";
8
+ import "../chunk-PR4QN5HX.js";
9
+ export {
10
+ genericObservability
11
+ };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/react.d.ts CHANGED
@@ -1,27 +1,104 @@
1
1
  import { PartySocket } from "partysocket";
2
2
  import { usePartySocket } from "partysocket/react";
3
+ import { MCPServersState, Agent } from "./index.js";
3
4
  import { StreamOptions } from "./client.js";
5
+ import { Method, RPCMethod } from "./serializable.js";
6
+ import "cloudflare:workers";
7
+ import "@modelcontextprotocol/sdk/client/index.js";
8
+ import "@modelcontextprotocol/sdk/types.js";
9
+ import "partyserver";
10
+ import "./client-DVoPb3-C.js";
11
+ import "zod";
12
+ import "@modelcontextprotocol/sdk/shared/protocol.js";
13
+ import "ai";
14
+ import "./mcp-BH1fJeiU.js";
15
+ import "@modelcontextprotocol/sdk/client/sse.js";
16
+ import "@modelcontextprotocol/sdk/client/streamableHttp.js";
17
+ import "./mcp/do-oauth-client-provider.js";
18
+ import "@modelcontextprotocol/sdk/client/auth.js";
19
+ import "@modelcontextprotocol/sdk/shared/auth.js";
20
+ import "./observability/index.js";
21
+ import "./ai-types.js";
4
22
 
23
+ type QueryObject = Record<string, string | null>;
5
24
  /**
6
25
  * Options for the useAgent hook
7
26
  * @template State Type of the Agent's state
8
27
  */
9
28
  type UseAgentOptions<State = unknown> = Omit<
10
29
  Parameters<typeof usePartySocket>[0],
11
- "party" | "room"
30
+ "party" | "room" | "query"
12
31
  > & {
13
32
  /** Name of the agent to connect to */
14
33
  agent: string;
15
34
  /** Name of the specific Agent instance */
16
35
  name?: string;
36
+ /** Query parameters - can be static object or async function */
37
+ query?: QueryObject | (() => Promise<QueryObject>);
38
+ /** Dependencies for async query caching */
39
+ queryDeps?: unknown[];
40
+ /** Cache TTL in milliseconds for auth tokens/time-sensitive data */
41
+ cacheTtl?: number;
17
42
  /** Called when the Agent's state is updated */
18
43
  onStateUpdate?: (state: State, source: "server" | "client") => void;
44
+ /** Called when MCP server state is updated */
45
+ onMcpUpdate?: (mcpServers: MCPServersState) => void;
19
46
  };
47
+ type AllOptional<T> = T extends [infer A, ...infer R]
48
+ ? undefined extends A
49
+ ? AllOptional<R>
50
+ : false
51
+ : true;
52
+ type RPCMethods<T> = {
53
+ [K in keyof T as T[K] extends RPCMethod<T[K]> ? K : never]: RPCMethod<T[K]>;
54
+ };
55
+ type OptionalParametersMethod<T extends RPCMethod> =
56
+ AllOptional<Parameters<T>> extends true ? T : never;
57
+ type AgentMethods<T> = Omit<RPCMethods<T>, keyof Agent<any, any>>;
58
+ type OptionalAgentMethods<T> = {
59
+ [K in keyof AgentMethods<T> as AgentMethods<T>[K] extends OptionalParametersMethod<
60
+ AgentMethods<T>[K]
61
+ >
62
+ ? K
63
+ : never]: OptionalParametersMethod<AgentMethods<T>[K]>;
64
+ };
65
+ type RequiredAgentMethods<T> = Omit<
66
+ AgentMethods<T>,
67
+ keyof OptionalAgentMethods<T>
68
+ >;
69
+ type AgentPromiseReturnType<T, K extends keyof AgentMethods<T>> =
70
+ ReturnType<AgentMethods<T>[K]> extends Promise<any>
71
+ ? ReturnType<AgentMethods<T>[K]>
72
+ : Promise<ReturnType<AgentMethods<T>[K]>>;
73
+ type OptionalArgsAgentMethodCall<AgentT> = <
74
+ K extends keyof OptionalAgentMethods<AgentT>
75
+ >(
76
+ method: K,
77
+ args?: Parameters<OptionalAgentMethods<AgentT>[K]>,
78
+ streamOptions?: StreamOptions
79
+ ) => AgentPromiseReturnType<AgentT, K>;
80
+ type RequiredArgsAgentMethodCall<AgentT> = <
81
+ K extends keyof RequiredAgentMethods<AgentT>
82
+ >(
83
+ method: K,
84
+ args: Parameters<RequiredAgentMethods<AgentT>[K]>,
85
+ streamOptions?: StreamOptions
86
+ ) => AgentPromiseReturnType<AgentT, K>;
87
+ type AgentMethodCall<AgentT> = OptionalArgsAgentMethodCall<AgentT> &
88
+ RequiredArgsAgentMethodCall<AgentT>;
89
+ type UntypedAgentMethodCall = <T = unknown>(
90
+ method: string,
91
+ args?: unknown[],
92
+ streamOptions?: StreamOptions
93
+ ) => Promise<T>;
94
+ type AgentStub<T> = {
95
+ [K in keyof AgentMethods<T>]: (
96
+ ...args: Parameters<AgentMethods<T>[K]>
97
+ ) => AgentPromiseReturnType<AgentMethods<T>, K>;
98
+ };
99
+ type UntypedAgentStub = Record<string, Method>;
20
100
  /**
21
101
  * React hook for connecting to an Agent
22
- * @template State Type of the Agent's state
23
- * @param options Connection options
24
- * @returns WebSocket connection with setState and call methods
25
102
  */
26
103
  declare function useAgent<State = unknown>(
27
104
  options: UseAgentOptions<State>
@@ -29,11 +106,22 @@ declare function useAgent<State = unknown>(
29
106
  agent: string;
30
107
  name: string;
31
108
  setState: (state: State) => void;
32
- call: <T = unknown>(
33
- method: string,
34
- args?: unknown[],
35
- streamOptions?: StreamOptions
36
- ) => Promise<T>;
109
+ call: UntypedAgentMethodCall;
110
+ stub: UntypedAgentStub;
111
+ };
112
+ declare function useAgent<
113
+ AgentT extends {
114
+ get state(): State;
115
+ },
116
+ State
117
+ >(
118
+ options: UseAgentOptions<State>
119
+ ): PartySocket & {
120
+ agent: string;
121
+ name: string;
122
+ setState: (state: State) => void;
123
+ call: AgentMethodCall<AgentT>;
124
+ stub: AgentStub<AgentT>;
37
125
  };
38
126
 
39
127
  export { type UseAgentOptions, useAgent };
package/dist/react.js CHANGED
@@ -1,50 +1,144 @@
1
- import "./chunk-HMLY7DHA.js";
1
+ import "./chunk-BER7KXUJ.js";
2
+ import "./chunk-PR4QN5HX.js";
2
3
 
3
4
  // src/react.tsx
4
5
  import { usePartySocket } from "partysocket/react";
5
- import { useCallback, useRef } from "react";
6
+ import { useCallback, useRef, use, useMemo, useEffect } from "react";
7
+ function camelCaseToKebabCase(str) {
8
+ if (str === str.toUpperCase() && str !== str.toLowerCase()) {
9
+ return str.toLowerCase().replace(/_/g, "-");
10
+ }
11
+ let kebabified = str.replace(
12
+ /[A-Z]/g,
13
+ (letter) => `-${letter.toLowerCase()}`
14
+ );
15
+ kebabified = kebabified.startsWith("-") ? kebabified.slice(1) : kebabified;
16
+ return kebabified.replace(/_/g, "-").replace(/-$/, "");
17
+ }
18
+ var queryCache = /* @__PURE__ */ new Map();
19
+ function arraysEqual(a, b) {
20
+ if (a === b) return true;
21
+ if (a.length !== b.length) return false;
22
+ for (let i = 0; i < a.length; i++) {
23
+ if (!Object.is(a[i], b[i])) return false;
24
+ }
25
+ return true;
26
+ }
27
+ function findCacheEntry(targetKey) {
28
+ for (const [existingKey, entry] of queryCache.entries()) {
29
+ if (arraysEqual(existingKey, targetKey)) {
30
+ if (Date.now() > entry.expiresAt) {
31
+ queryCache.delete(existingKey);
32
+ return void 0;
33
+ }
34
+ entry.refCount++;
35
+ return entry.promise;
36
+ }
37
+ }
38
+ return void 0;
39
+ }
40
+ function setCacheEntry(key, value, cacheTtl) {
41
+ for (const [existingKey] of queryCache.entries()) {
42
+ if (arraysEqual(existingKey, key)) {
43
+ queryCache.delete(existingKey);
44
+ break;
45
+ }
46
+ }
47
+ const expiresAt = cacheTtl ? Date.now() + cacheTtl : Date.now() + 5 * 60 * 1e3;
48
+ queryCache.set(key, { promise: value, refCount: 1, expiresAt, cacheTtl });
49
+ }
50
+ function decrementCacheEntry(targetKey) {
51
+ for (const [existingKey, entry] of queryCache.entries()) {
52
+ if (arraysEqual(existingKey, targetKey)) {
53
+ entry.refCount--;
54
+ if (entry.refCount <= 0) {
55
+ queryCache.delete(existingKey);
56
+ }
57
+ return true;
58
+ }
59
+ }
60
+ return false;
61
+ }
62
+ function createCacheKey(agentNamespace, name, deps) {
63
+ return [agentNamespace, name || "default", ...deps];
64
+ }
6
65
  function useAgent(options) {
66
+ const agentNamespace = camelCaseToKebabCase(options.agent);
67
+ const { query, queryDeps, cacheTtl, ...restOptions } = options;
7
68
  const pendingCallsRef = useRef(
8
69
  /* @__PURE__ */ new Map()
9
70
  );
10
- const call = useCallback(
11
- (method, args = [], streamOptions) => {
12
- return new Promise((resolve, reject) => {
13
- const id = Math.random().toString(36).slice(2);
14
- pendingCallsRef.current.set(id, {
15
- resolve,
16
- reject,
17
- stream: streamOptions
18
- });
19
- const request = {
20
- type: "rpc",
21
- id,
22
- method,
23
- args
24
- };
25
- agent.send(JSON.stringify(request));
26
- });
27
- },
28
- []
29
- );
71
+ const cacheKey = useMemo(() => {
72
+ const deps = queryDeps || [];
73
+ return createCacheKey(agentNamespace, options.name, deps);
74
+ }, [agentNamespace, options.name, queryDeps]);
75
+ const queryPromise = useMemo(() => {
76
+ if (!query || typeof query !== "function") {
77
+ return null;
78
+ }
79
+ const existingPromise = findCacheEntry(cacheKey);
80
+ if (existingPromise) {
81
+ return existingPromise;
82
+ }
83
+ const promise = query().catch((error) => {
84
+ console.error(
85
+ `[useAgent] Query failed for agent "${options.agent}":`,
86
+ error
87
+ );
88
+ decrementCacheEntry(cacheKey);
89
+ throw error;
90
+ });
91
+ setCacheEntry(cacheKey, promise, cacheTtl);
92
+ return promise;
93
+ }, [cacheKey, query, options.agent, cacheTtl]);
94
+ let resolvedQuery;
95
+ if (query) {
96
+ if (typeof query === "function") {
97
+ const queryResult = use(queryPromise);
98
+ if (queryResult) {
99
+ for (const [key, value] of Object.entries(queryResult)) {
100
+ if (value !== null && value !== void 0 && typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
101
+ console.warn(
102
+ `[useAgent] Query parameter "${key}" is an object and will be converted to "[object Object]". Query parameters should be string, number, boolean, or null.`
103
+ );
104
+ }
105
+ }
106
+ resolvedQuery = queryResult;
107
+ }
108
+ } else {
109
+ resolvedQuery = query;
110
+ }
111
+ }
112
+ useEffect(() => {
113
+ return () => {
114
+ if (queryPromise) {
115
+ decrementCacheEntry(cacheKey);
116
+ }
117
+ };
118
+ }, [cacheKey, queryPromise]);
30
119
  const agent = usePartySocket({
120
+ party: agentNamespace,
31
121
  prefix: "agents",
32
- party: options.agent,
33
122
  room: options.name || "default",
34
- ...options,
123
+ query: resolvedQuery,
124
+ ...restOptions,
35
125
  onMessage: (message) => {
36
126
  if (typeof message.data === "string") {
37
127
  let parsedMessage;
38
128
  try {
39
129
  parsedMessage = JSON.parse(message.data);
40
- } catch (error) {
130
+ } catch (_error) {
41
131
  return options.onMessage?.(message);
42
132
  }
43
- if (parsedMessage.type === "cf_agent_state") {
133
+ if (parsedMessage.type === "cf_agent_state" /* CF_AGENT_STATE */) {
44
134
  options.onStateUpdate?.(parsedMessage.state, "server");
45
135
  return;
46
136
  }
47
- if (parsedMessage.type === "rpc") {
137
+ if (parsedMessage.type === "cf_agent_mcp_servers" /* CF_AGENT_MCP_SERVERS */) {
138
+ options.onMcpUpdate?.(parsedMessage.mcp);
139
+ return;
140
+ }
141
+ if (parsedMessage.type === "rpc" /* RPC */) {
48
142
  const response = parsedMessage;
49
143
  const pending = pendingCallsRef.current.get(response.id);
50
144
  if (!pending) return;
@@ -72,23 +166,48 @@ function useAgent(options) {
72
166
  options.onMessage?.(message);
73
167
  }
74
168
  });
169
+ const call = useCallback(
170
+ (method, args = [], streamOptions) => {
171
+ return new Promise((resolve, reject) => {
172
+ const id = Math.random().toString(36).slice(2);
173
+ pendingCallsRef.current.set(id, {
174
+ reject,
175
+ resolve,
176
+ stream: streamOptions
177
+ });
178
+ const request = {
179
+ args,
180
+ id,
181
+ method,
182
+ type: "rpc" /* RPC */
183
+ };
184
+ agent.send(JSON.stringify(request));
185
+ });
186
+ },
187
+ [agent]
188
+ );
75
189
  agent.setState = (state) => {
76
- agent.send(JSON.stringify({ type: "cf_agent_state", state }));
190
+ agent.send(JSON.stringify({ state, type: "cf_agent_state" /* CF_AGENT_STATE */ }));
77
191
  options.onStateUpdate?.(state, "client");
78
192
  };
79
193
  agent.call = call;
80
- agent.agent = options.agent;
194
+ agent.agent = agentNamespace;
81
195
  agent.name = options.name || "default";
196
+ agent.stub = new Proxy(
197
+ {},
198
+ {
199
+ get: (_target, method) => {
200
+ return (...args) => {
201
+ return call(method, args);
202
+ };
203
+ }
204
+ }
205
+ );
82
206
  if (agent.agent !== agent.agent.toLowerCase()) {
83
207
  console.warn(
84
208
  `Agent name: ${agent.agent} should probably be in lowercase. Received: ${agent.agent}`
85
209
  );
86
210
  }
87
- if (agent.name !== agent.name.toLowerCase()) {
88
- console.warn(
89
- `Agent instance name: ${agent.name} should probably be in lowercase. Received: ${agent.name}`
90
- );
91
- }
92
211
  return agent;
93
212
  }
94
213
  export {
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 { RPCRequest, RPCResponse } from \"./\";\nimport type { StreamOptions } from \"./client\";\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};\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 // 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 // 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 []\n );\n\n const agent = usePartySocket({\n prefix: \"agents\",\n party: options.agent,\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 === \"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\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 = options.agent;\n agent.name = options.name || \"default\";\n\n // warn if agent or name 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 if (agent.name !== agent.name.toLowerCase()) {\n console.warn(\n `Agent instance name: ${agent.name} should probably be in lowercase. Received: ${agent.name}`\n );\n }\n\n return agent;\n}\n"],"mappings":";;;AACA,SAAS,sBAAsB;AAC/B,SAAS,aAAa,cAAc;AA0B7B,SAAS,SACd,SAUA;AAEA,QAAM,kBAAkB;AAAA,IACtB,oBAAI,IAOF;AAAA,EACJ;AAGA,QAAM,OAAO;AAAA,IACX,CACE,QACA,OAAkB,CAAC,GACnB,kBACe;AACf,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,cAAM,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAC7C,wBAAgB,QAAQ,IAAI,IAAI;AAAA,UAC9B;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AAED,cAAM,UAAsB;AAAA,UAC1B,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,cAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,eAAe;AAAA,IAC3B,QAAQ;AAAA,IACR,OAAO,QAAQ;AAAA,IACf,MAAM,QAAQ,QAAQ;AAAA,IACtB,GAAG;AAAA,IACH,WAAW,CAAC,YAAY;AACtB,UAAI,OAAO,QAAQ,SAAS,UAAU;AACpC,YAAI;AACJ,YAAI;AACF,0BAAgB,KAAK,MAAM,QAAQ,IAAI;AAAA,QACzC,SAAS,OAAO;AAGd,iBAAO,QAAQ,YAAY,OAAO;AAAA,QACpC;AACA,YAAI,cAAc,SAAS,kBAAkB;AAC3C,kBAAQ,gBAAgB,cAAc,OAAgB,QAAQ;AAC9D;AAAA,QACF;AACA,YAAI,cAAc,SAAS,OAAO;AAChC,gBAAM,WAAW;AACjB,gBAAM,UAAU,gBAAgB,QAAQ,IAAI,SAAS,EAAE;AACvD,cAAI,CAAC,QAAS;AAEd,cAAI,CAAC,SAAS,SAAS;AACrB,oBAAQ,OAAO,IAAI,MAAM,SAAS,KAAK,CAAC;AACxC,4BAAgB,QAAQ,OAAO,SAAS,EAAE;AAC1C,oBAAQ,QAAQ,UAAU,SAAS,KAAK;AACxC;AAAA,UACF;AAGA,cAAI,UAAU,UAAU;AACtB,gBAAI,SAAS,MAAM;AACjB,sBAAQ,QAAQ,SAAS,MAAM;AAC/B,8BAAgB,QAAQ,OAAO,SAAS,EAAE;AAC1C,sBAAQ,QAAQ,SAAS,SAAS,MAAM;AAAA,YAC1C,OAAO;AACL,sBAAQ,QAAQ,UAAU,SAAS,MAAM;AAAA,YAC3C;AAAA,UACF,OAAO;AAEL,oBAAQ,QAAQ,SAAS,MAAM;AAC/B,4BAAgB,QAAQ,OAAO,SAAS,EAAE;AAAA,UAC5C;AACA;AAAA,QACF;AAAA,MACF;AACA,cAAQ,YAAY,OAAO;AAAA,IAC7B;AAAA,EACF,CAAC;AAWD,QAAM,WAAW,CAAC,UAAiB;AACjC,UAAM,KAAK,KAAK,UAAU,EAAE,MAAM,kBAAkB,MAAM,CAAC,CAAC;AAC5D,YAAQ,gBAAgB,OAAO,QAAQ;AAAA,EACzC;AAEA,QAAM,OAAO;AACb,QAAM,QAAQ,QAAQ;AACtB,QAAM,OAAO,QAAQ,QAAQ;AAG7B,MAAI,MAAM,UAAU,MAAM,MAAM,YAAY,GAAG;AAC7C,YAAQ;AAAA,MACN,eAAe,MAAM,KAAK,+CAA+C,MAAM,KAAK;AAAA,IACtF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,MAAM,KAAK,YAAY,GAAG;AAC3C,YAAQ;AAAA,MACN,wBAAwB,MAAM,IAAI,+CAA+C,MAAM,IAAI;AAAA,IAC7F;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/react.tsx"],"sourcesContent":["import type { PartySocket } from \"partysocket\";\nimport { usePartySocket } from \"partysocket/react\";\nimport { useCallback, useRef, use, useMemo, useEffect } from \"react\";\nimport type { Agent, MCPServersState, RPCRequest, RPCResponse } from \"./\";\nimport type { StreamOptions } from \"./client\";\nimport type { Method, RPCMethod } from \"./serializable\";\nimport { MessageType } from \"./ai-types\";\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\ntype QueryObject = Record<string, string | null>;\n\nconst queryCache = new Map<\n unknown[],\n {\n promise: Promise<QueryObject>;\n refCount: number;\n expiresAt: number;\n cacheTtl?: number;\n }\n>();\n\nfunction arraysEqual(a: unknown[], b: unknown[]): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n\n for (let i = 0; i < a.length; i++) {\n if (!Object.is(a[i], b[i])) return false;\n }\n return true;\n}\n\nfunction findCacheEntry(\n targetKey: unknown[]\n): Promise<QueryObject> | undefined {\n for (const [existingKey, entry] of queryCache.entries()) {\n if (arraysEqual(existingKey, targetKey)) {\n // Check if entry has expired\n if (Date.now() > entry.expiresAt) {\n queryCache.delete(existingKey);\n return undefined;\n }\n entry.refCount++;\n return entry.promise;\n }\n }\n return undefined;\n}\n\nfunction setCacheEntry(\n key: unknown[],\n value: Promise<QueryObject>,\n cacheTtl?: number\n): void {\n // Remove any existing entry with matching members\n for (const [existingKey] of queryCache.entries()) {\n if (arraysEqual(existingKey, key)) {\n queryCache.delete(existingKey);\n break;\n }\n }\n\n const expiresAt = cacheTtl\n ? Date.now() + cacheTtl\n : Date.now() + 5 * 60 * 1000; // Default 5 minutes\n queryCache.set(key, { promise: value, refCount: 1, expiresAt, cacheTtl });\n}\n\nfunction decrementCacheEntry(targetKey: unknown[]): boolean {\n for (const [existingKey, entry] of queryCache.entries()) {\n if (arraysEqual(existingKey, targetKey)) {\n entry.refCount--;\n if (entry.refCount <= 0) {\n queryCache.delete(existingKey);\n }\n return true;\n }\n }\n return false;\n}\n\nfunction createCacheKey(\n agentNamespace: string,\n name: string | undefined,\n deps: unknown[]\n): unknown[] {\n return [agentNamespace, name || \"default\", ...deps];\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\" | \"query\"\n> & {\n /** Name of the agent to connect to */\n agent: string;\n /** Name of the specific Agent instance */\n name?: string;\n /** Query parameters - can be static object or async function */\n query?: QueryObject | (() => Promise<QueryObject>);\n /** Dependencies for async query caching */\n queryDeps?: unknown[];\n /** Cache TTL in milliseconds for auth tokens/time-sensitive data */\n cacheTtl?: number;\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 */\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 const { query, queryDeps, cacheTtl, ...restOptions } = options;\n\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 // Handle both sync and async query patterns\n const cacheKey = useMemo(() => {\n const deps = queryDeps || [];\n return createCacheKey(agentNamespace, options.name, deps);\n }, [agentNamespace, options.name, queryDeps]);\n\n const queryPromise = useMemo(() => {\n if (!query || typeof query !== \"function\") {\n return null;\n }\n\n const existingPromise = findCacheEntry(cacheKey);\n if (existingPromise) {\n return existingPromise;\n }\n\n const promise = query().catch((error) => {\n console.error(\n `[useAgent] Query failed for agent \"${options.agent}\":`,\n error\n );\n decrementCacheEntry(cacheKey); // Remove failed promise from cache\n throw error; // Re-throw for Suspense error boundary\n });\n\n setCacheEntry(cacheKey, promise, cacheTtl);\n\n return promise;\n }, [cacheKey, query, options.agent, cacheTtl]);\n\n let resolvedQuery: QueryObject | undefined;\n\n if (query) {\n if (typeof query === \"function\") {\n // Use React's use() to resolve the promise\n const queryResult = use(queryPromise!);\n\n // Check for non-primitive values and warn\n if (queryResult) {\n for (const [key, value] of Object.entries(queryResult)) {\n if (\n value !== null &&\n value !== undefined &&\n typeof value !== \"string\" &&\n typeof value !== \"number\" &&\n typeof value !== \"boolean\"\n ) {\n console.warn(\n `[useAgent] Query parameter \"${key}\" is an object and will be converted to \"[object Object]\". ` +\n \"Query parameters should be string, number, boolean, or null.\"\n );\n }\n }\n resolvedQuery = queryResult;\n }\n } else {\n // Sync query - use directly\n resolvedQuery = query;\n }\n }\n\n // Cleanup cache on unmount\n useEffect(() => {\n return () => {\n if (queryPromise) {\n decrementCacheEntry(cacheKey);\n }\n };\n }, [cacheKey, queryPromise]);\n\n const agent = usePartySocket({\n party: agentNamespace,\n prefix: \"agents\",\n room: options.name || \"default\",\n query: resolvedQuery,\n ...restOptions,\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 === MessageType.CF_AGENT_STATE) {\n options.onStateUpdate?.(parsedMessage.state as State, \"server\");\n return;\n }\n if (parsedMessage.type === MessageType.CF_AGENT_MCP_SERVERS) {\n options.onMcpUpdate?.(parsedMessage.mcp as MCPServersState);\n return;\n }\n if (parsedMessage.type === MessageType.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: MessageType.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: MessageType.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":[]}
@@ -1,30 +1,43 @@
1
1
  import { z } from "zod";
2
2
 
3
- type Schedule = z.infer<typeof unstable_scheduleSchema>;
3
+ /**
4
+ * Get the schedule prompt for a given event
5
+ * @param event - The event to get the schedule prompt for
6
+ * @returns The schedule prompt
7
+ */
8
+ declare function getSchedulePrompt(event: { date: Date }): string;
9
+ /**
10
+ * @deprecated this has been renamed to getSchedulePrompt, and unstable_getSchedulePrompt will be removed in the next major version
11
+ * @param event - The event to get the schedule prompt for
12
+ * @returns The schedule prompt
13
+ */
4
14
  declare function unstable_getSchedulePrompt(event: { date: Date }): string;
5
- declare const unstable_scheduleSchema: z.ZodObject<
15
+ /**
16
+ * The schema for the schedule prompt
17
+ */
18
+ declare const scheduleSchema: z.ZodObject<
6
19
  {
7
20
  description: z.ZodString;
8
21
  when: z.ZodObject<
9
22
  {
10
- type: z.ZodEnum<["scheduled", "delayed", "cron", "no-schedule"]>;
23
+ cron: z.ZodOptional<z.ZodString>;
11
24
  date: z.ZodOptional<z.ZodDate>;
12
25
  delayInSeconds: z.ZodOptional<z.ZodNumber>;
13
- cron: z.ZodOptional<z.ZodString>;
26
+ type: z.ZodEnum<["scheduled", "delayed", "cron", "no-schedule"]>;
14
27
  },
15
28
  "strip",
16
29
  z.ZodTypeAny,
17
30
  {
18
31
  type: "scheduled" | "delayed" | "cron" | "no-schedule";
32
+ date?: Date | undefined;
19
33
  cron?: string | undefined;
20
34
  delayInSeconds?: number | undefined;
21
- date?: Date | undefined;
22
35
  },
23
36
  {
24
37
  type: "scheduled" | "delayed" | "cron" | "no-schedule";
38
+ date?: Date | undefined;
25
39
  cron?: string | undefined;
26
40
  delayInSeconds?: number | undefined;
27
- date?: Date | undefined;
28
41
  }
29
42
  >;
30
43
  },
@@ -34,20 +47,81 @@ declare const unstable_scheduleSchema: z.ZodObject<
34
47
  description: string;
35
48
  when: {
36
49
  type: "scheduled" | "delayed" | "cron" | "no-schedule";
50
+ date?: Date | undefined;
37
51
  cron?: string | undefined;
38
52
  delayInSeconds?: number | undefined;
53
+ };
54
+ },
55
+ {
56
+ description: string;
57
+ when: {
58
+ type: "scheduled" | "delayed" | "cron" | "no-schedule";
39
59
  date?: Date | undefined;
60
+ cron?: string | undefined;
61
+ delayInSeconds?: number | undefined;
40
62
  };
63
+ }
64
+ >;
65
+ /**
66
+ * The type for the schedule prompt
67
+ */
68
+ type Schedule = z.infer<typeof scheduleSchema>;
69
+ /**
70
+ * @deprecated this has been renamed to scheduleSchema, and unstable_scheduleSchema will be removed in the next major version
71
+ * @returns The schedule schema
72
+ */
73
+ declare const unstable_scheduleSchema: z.ZodObject<
74
+ {
75
+ description: z.ZodString;
76
+ when: z.ZodObject<
77
+ {
78
+ cron: z.ZodOptional<z.ZodString>;
79
+ date: z.ZodOptional<z.ZodDate>;
80
+ delayInSeconds: z.ZodOptional<z.ZodNumber>;
81
+ type: z.ZodEnum<["scheduled", "delayed", "cron", "no-schedule"]>;
82
+ },
83
+ "strip",
84
+ z.ZodTypeAny,
85
+ {
86
+ type: "scheduled" | "delayed" | "cron" | "no-schedule";
87
+ date?: Date | undefined;
88
+ cron?: string | undefined;
89
+ delayInSeconds?: number | undefined;
90
+ },
91
+ {
92
+ type: "scheduled" | "delayed" | "cron" | "no-schedule";
93
+ date?: Date | undefined;
94
+ cron?: string | undefined;
95
+ delayInSeconds?: number | undefined;
96
+ }
97
+ >;
41
98
  },
99
+ "strip",
100
+ z.ZodTypeAny,
42
101
  {
43
102
  description: string;
44
103
  when: {
45
104
  type: "scheduled" | "delayed" | "cron" | "no-schedule";
105
+ date?: Date | undefined;
46
106
  cron?: string | undefined;
47
107
  delayInSeconds?: number | undefined;
108
+ };
109
+ },
110
+ {
111
+ description: string;
112
+ when: {
113
+ type: "scheduled" | "delayed" | "cron" | "no-schedule";
48
114
  date?: Date | undefined;
115
+ cron?: string | undefined;
116
+ delayInSeconds?: number | undefined;
49
117
  };
50
118
  }
51
119
  >;
52
120
 
53
- export { type Schedule, unstable_getSchedulePrompt, unstable_scheduleSchema };
121
+ export {
122
+ type Schedule,
123
+ getSchedulePrompt,
124
+ scheduleSchema,
125
+ unstable_getSchedulePrompt,
126
+ unstable_scheduleSchema
127
+ };