agents 0.0.0-d127c8f → 0.0.0-d23a20c

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 (79) hide show
  1. package/README.md +378 -27
  2. package/dist/ai-chat-agent.d.ts +270 -12
  3. package/dist/ai-chat-agent.js +1118 -159
  4. package/dist/ai-chat-agent.js.map +1 -1
  5. package/dist/ai-chat-v5-migration-DguhuLKF.js +155 -0
  6. package/dist/ai-chat-v5-migration-DguhuLKF.js.map +1 -0
  7. package/dist/ai-chat-v5-migration.d.ts +155 -0
  8. package/dist/ai-chat-v5-migration.js +3 -0
  9. package/dist/ai-react.d.ts +202 -72
  10. package/dist/ai-react.js +574 -185
  11. package/dist/ai-react.js.map +1 -1
  12. package/dist/ai-types-DEtF_8Km.js +28 -0
  13. package/dist/ai-types-DEtF_8Km.js.map +1 -0
  14. package/dist/ai-types-U8lYA0o8.d.ts +127 -0
  15. package/dist/ai-types.d.ts +6 -69
  16. package/dist/ai-types.js +3 -1
  17. package/dist/cli/index.d.ts +1 -0
  18. package/dist/cli/index.js +28 -0
  19. package/dist/cli/index.js.map +1 -0
  20. package/dist/client-Cfw92Wb_.d.ts +834 -0
  21. package/dist/client-ClORm6f0.d.ts +104 -0
  22. package/dist/client-DjTPRM8-.js +117 -0
  23. package/dist/client-DjTPRM8-.js.map +1 -0
  24. package/dist/client-QZa2Rq0l.js +1105 -0
  25. package/dist/client-QZa2Rq0l.js.map +1 -0
  26. package/dist/client.d.ts +12 -79
  27. package/dist/client.js +3 -137
  28. package/dist/codemode/ai.d.ts +27 -0
  29. package/dist/codemode/ai.js +152 -0
  30. package/dist/codemode/ai.js.map +1 -0
  31. package/dist/context-BkKbAa1R.js +8 -0
  32. package/dist/context-BkKbAa1R.js.map +1 -0
  33. package/dist/context-_sPQqJWv.d.ts +24 -0
  34. package/dist/context.d.ts +6 -0
  35. package/dist/context.js +3 -0
  36. package/dist/do-oauth-client-provider-B-ryFIPr.d.ts +70 -0
  37. package/dist/do-oauth-client-provider-B1fVIshX.js +155 -0
  38. package/dist/do-oauth-client-provider-B1fVIshX.js.map +1 -0
  39. package/dist/index-CyDpAVHZ.d.ts +58 -0
  40. package/dist/index-DAogLZyb.d.ts +577 -0
  41. package/dist/index.d.ts +63 -295
  42. package/dist/index.js +8 -20
  43. package/dist/mcp/client.d.ts +4 -0
  44. package/dist/mcp/client.js +4 -0
  45. package/dist/mcp/do-oauth-client-provider.d.ts +2 -0
  46. package/dist/mcp/do-oauth-client-provider.js +3 -0
  47. package/dist/mcp/index.d.ts +203 -0
  48. package/dist/mcp/index.js +1442 -0
  49. package/dist/mcp/index.js.map +1 -0
  50. package/dist/mcp/x402.d.ts +34 -0
  51. package/dist/mcp/x402.js +198 -0
  52. package/dist/mcp/x402.js.map +1 -0
  53. package/dist/mcp-CzbSsLfc.d.ts +61 -0
  54. package/dist/observability/index.d.ts +3 -0
  55. package/dist/observability/index.js +8 -0
  56. package/dist/react-6RGGGKJb.d.ts +131 -0
  57. package/dist/react.d.ts +15 -39
  58. package/dist/react.js +185 -93
  59. package/dist/react.js.map +1 -1
  60. package/dist/schedule.d.ts +89 -12
  61. package/dist/schedule.js +46 -23
  62. package/dist/schedule.js.map +1 -1
  63. package/dist/serializable-C4GLimgv.d.ts +39 -0
  64. package/dist/serializable.d.ts +7 -0
  65. package/dist/serializable.js +1 -0
  66. package/dist/src-BZDh910Z.js +1181 -0
  67. package/dist/src-BZDh910Z.js.map +1 -0
  68. package/package.json +133 -51
  69. package/dist/ai-types.js.map +0 -1
  70. package/dist/chunk-HMLY7DHA.js +0 -16
  71. package/dist/chunk-HMLY7DHA.js.map +0 -1
  72. package/dist/chunk-X6BBKLSC.js +0 -568
  73. package/dist/chunk-X6BBKLSC.js.map +0 -1
  74. package/dist/client.js.map +0 -1
  75. package/dist/index.js.map +0 -1
  76. package/dist/mcp.d.ts +0 -58
  77. package/dist/mcp.js +0 -945
  78. package/dist/mcp.js.map +0 -1
  79. package/src/index.ts +0 -888
@@ -0,0 +1,131 @@
1
+ import { p as MCPServersState, t as Agent } from "./index-DAogLZyb.js";
2
+ import { n as RPCMethod, t as Method } from "./serializable-C4GLimgv.js";
3
+ import { i as StreamOptions } from "./client-ClORm6f0.js";
4
+ import { PartySocket } from "partysocket";
5
+ import { usePartySocket } from "partysocket/react";
6
+
7
+ //#region src/react.d.ts
8
+ type QueryObject = Record<string, string | null>;
9
+ interface CacheEntry {
10
+ promise: Promise<QueryObject>;
11
+ expiresAt: number;
12
+ }
13
+ declare function getCacheEntry(key: string): CacheEntry | undefined;
14
+ declare function setCacheEntry(
15
+ key: string,
16
+ promise: Promise<QueryObject>,
17
+ cacheTtl: number
18
+ ): CacheEntry;
19
+ declare function deleteCacheEntry(key: string): void;
20
+ declare const _testUtils: {
21
+ queryCache: Map<string, CacheEntry>;
22
+ setCacheEntry: typeof setCacheEntry;
23
+ getCacheEntry: typeof getCacheEntry;
24
+ deleteCacheEntry: typeof deleteCacheEntry;
25
+ clearCache: () => void;
26
+ };
27
+ /**
28
+ * Options for the useAgent hook
29
+ * @template State Type of the Agent's state
30
+ */
31
+ type UseAgentOptions<State = unknown> = Omit<
32
+ Parameters<typeof usePartySocket>[0],
33
+ "party" | "room" | "query"
34
+ > & {
35
+ /** Name of the agent to connect to */
36
+ agent: string;
37
+ /** Name of the specific Agent instance */
38
+ name?: string;
39
+ /** Query parameters - can be static object or async function */
40
+ query?: QueryObject | (() => Promise<QueryObject>);
41
+ /** Dependencies for async query caching */
42
+ queryDeps?: unknown[];
43
+ /** Cache TTL in milliseconds for auth tokens/time-sensitive data */
44
+ cacheTtl?: number;
45
+ /** Called when the Agent's state is updated */
46
+ onStateUpdate?: (state: State, source: "server" | "client") => void;
47
+ /** Called when MCP server state is updated */
48
+ onMcpUpdate?: (mcpServers: MCPServersState) => void;
49
+ };
50
+ type AllOptional<T> = T extends [infer A, ...infer R]
51
+ ? undefined extends A
52
+ ? AllOptional<R>
53
+ : false
54
+ : true;
55
+ type RPCMethods<T> = {
56
+ [K in keyof T as T[K] extends RPCMethod<T[K]> ? K : never]: RPCMethod<T[K]>;
57
+ };
58
+ type OptionalParametersMethod<T extends RPCMethod> =
59
+ AllOptional<Parameters<T>> extends true ? T : never;
60
+ type AgentMethods<T> = Omit<RPCMethods<T>, keyof Agent<any, any>>;
61
+ type OptionalAgentMethods<T> = {
62
+ [K in keyof AgentMethods<T> as AgentMethods<T>[K] extends OptionalParametersMethod<
63
+ AgentMethods<T>[K]
64
+ >
65
+ ? K
66
+ : never]: OptionalParametersMethod<AgentMethods<T>[K]>;
67
+ };
68
+ type RequiredAgentMethods<T> = Omit<
69
+ AgentMethods<T>,
70
+ keyof OptionalAgentMethods<T>
71
+ >;
72
+ type AgentPromiseReturnType<T, K$1 extends keyof AgentMethods<T>> =
73
+ ReturnType<AgentMethods<T>[K$1]> extends Promise<any>
74
+ ? ReturnType<AgentMethods<T>[K$1]>
75
+ : Promise<ReturnType<AgentMethods<T>[K$1]>>;
76
+ type OptionalArgsAgentMethodCall<AgentT> = <
77
+ K$1 extends keyof OptionalAgentMethods<AgentT>
78
+ >(
79
+ method: K$1,
80
+ args?: Parameters<OptionalAgentMethods<AgentT>[K$1]>,
81
+ streamOptions?: StreamOptions
82
+ ) => AgentPromiseReturnType<AgentT, K$1>;
83
+ type RequiredArgsAgentMethodCall<AgentT> = <
84
+ K$1 extends keyof RequiredAgentMethods<AgentT>
85
+ >(
86
+ method: K$1,
87
+ args: Parameters<RequiredAgentMethods<AgentT>[K$1]>,
88
+ streamOptions?: StreamOptions
89
+ ) => AgentPromiseReturnType<AgentT, K$1>;
90
+ type AgentMethodCall<AgentT> = OptionalArgsAgentMethodCall<AgentT> &
91
+ RequiredArgsAgentMethodCall<AgentT>;
92
+ type UntypedAgentMethodCall = <T = unknown>(
93
+ method: string,
94
+ args?: unknown[],
95
+ streamOptions?: StreamOptions
96
+ ) => Promise<T>;
97
+ type AgentStub<T> = {
98
+ [K in keyof AgentMethods<T>]: (
99
+ ...args: Parameters<AgentMethods<T>[K]>
100
+ ) => AgentPromiseReturnType<AgentMethods<T>, K>;
101
+ };
102
+ type UntypedAgentStub = Record<string, Method>;
103
+ /**
104
+ * React hook for connecting to an Agent
105
+ */
106
+ declare function useAgent<State = unknown>(
107
+ options: UseAgentOptions<State>
108
+ ): PartySocket & {
109
+ agent: string;
110
+ name: string;
111
+ setState: (state: State) => void;
112
+ call: UntypedAgentMethodCall;
113
+ stub: UntypedAgentStub;
114
+ };
115
+ declare function useAgent<
116
+ AgentT extends {
117
+ get state(): State;
118
+ },
119
+ State
120
+ >(
121
+ options: UseAgentOptions<State>
122
+ ): PartySocket & {
123
+ agent: string;
124
+ name: string;
125
+ setState: (state: State) => void;
126
+ call: AgentMethodCall<AgentT>;
127
+ stub: AgentStub<AgentT>;
128
+ };
129
+ //#endregion
130
+ export { _testUtils as n, useAgent as r, UseAgentOptions as t };
131
+ //# sourceMappingURL=react-6RGGGKJb.d.ts.map
package/dist/react.d.ts CHANGED
@@ -1,39 +1,15 @@
1
- import { PartySocket } from "partysocket";
2
- import { usePartySocket } from "partysocket/react";
3
- import { StreamOptions } from "./client.js";
4
-
5
- /**
6
- * Options for the useAgent hook
7
- * @template State Type of the Agent's state
8
- */
9
- type UseAgentOptions<State = unknown> = Omit<
10
- Parameters<typeof usePartySocket>[0],
11
- "party" | "room"
12
- > & {
13
- /** Name of the agent to connect to */
14
- agent: string;
15
- /** Name of the specific Agent instance */
16
- name?: string;
17
- /** Called when the Agent's state is updated */
18
- onStateUpdate?: (state: State, source: "server" | "client") => void;
19
- };
20
- /**
21
- * 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
- */
26
- declare function useAgent<State = unknown>(
27
- options: UseAgentOptions<State>
28
- ): PartySocket & {
29
- agent: string;
30
- name: string;
31
- setState: (state: State) => void;
32
- call: <T = unknown>(
33
- method: string,
34
- args?: unknown[],
35
- streamOptions?: StreamOptions
36
- ) => Promise<T>;
37
- };
38
-
39
- export { type UseAgentOptions, useAgent };
1
+ import "./context-_sPQqJWv.js";
2
+ import "./client-Cfw92Wb_.js";
3
+ import "./mcp-CzbSsLfc.js";
4
+ import "./do-oauth-client-provider-B-ryFIPr.js";
5
+ import "./index-CyDpAVHZ.js";
6
+ import "./ai-types-U8lYA0o8.js";
7
+ import "./index-DAogLZyb.js";
8
+ import "./serializable-C4GLimgv.js";
9
+ import "./client-ClORm6f0.js";
10
+ import {
11
+ n as _testUtils,
12
+ r as useAgent,
13
+ t as UseAgentOptions
14
+ } from "./react-6RGGGKJb.js";
15
+ export { UseAgentOptions, _testUtils, useAgent };
package/dist/react.js CHANGED
@@ -1,97 +1,189 @@
1
- import "./chunk-HMLY7DHA.js";
2
-
3
- // src/react.tsx
1
+ import { t as MessageType } from "./ai-types-DEtF_8Km.js";
2
+ import { use, useCallback, useEffect, useMemo, useRef, useState } from "react";
4
3
  import { usePartySocket } from "partysocket/react";
5
- import { useCallback, useRef } from "react";
6
- function useAgent(options) {
7
- const pendingCallsRef = useRef(
8
- /* @__PURE__ */ new Map()
9
- );
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
- );
30
- const agent = usePartySocket({
31
- prefix: "agents",
32
- party: options.agent,
33
- room: options.name || "default",
34
- ...options,
35
- onMessage: (message) => {
36
- if (typeof message.data === "string") {
37
- let parsedMessage;
38
- try {
39
- parsedMessage = JSON.parse(message.data);
40
- } catch (error) {
41
- return options.onMessage?.(message);
42
- }
43
- if (parsedMessage.type === "cf_agent_state") {
44
- options.onStateUpdate?.(parsedMessage.state, "server");
45
- return;
46
- }
47
- if (parsedMessage.type === "rpc") {
48
- const response = parsedMessage;
49
- const pending = pendingCallsRef.current.get(response.id);
50
- if (!pending) return;
51
- if (!response.success) {
52
- pending.reject(new Error(response.error));
53
- pendingCallsRef.current.delete(response.id);
54
- pending.stream?.onError?.(response.error);
55
- return;
56
- }
57
- if ("done" in response) {
58
- if (response.done) {
59
- pending.resolve(response.result);
60
- pendingCallsRef.current.delete(response.id);
61
- pending.stream?.onDone?.(response.result);
62
- } else {
63
- pending.stream?.onChunk?.(response.result);
64
- }
65
- } else {
66
- pending.resolve(response.result);
67
- pendingCallsRef.current.delete(response.id);
68
- }
69
- return;
70
- }
71
- }
72
- options.onMessage?.(message);
73
- }
74
- });
75
- agent.setState = (state) => {
76
- agent.send(JSON.stringify({ type: "cf_agent_state", state }));
77
- options.onStateUpdate?.(state, "client");
78
- };
79
- agent.call = call;
80
- agent.agent = options.agent;
81
- agent.name = options.name || "default";
82
- if (agent.agent !== agent.agent.toLowerCase()) {
83
- console.warn(
84
- `Agent name: ${agent.agent} should probably be in lowercase. Received: ${agent.agent}`
85
- );
86
- }
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
- return agent;
4
+
5
+ //#region src/react.tsx
6
+ /**
7
+ * Convert a camelCase string to a kebab-case string
8
+ * @param str The string to convert
9
+ * @returns The kebab-case string
10
+ */
11
+ function camelCaseToKebabCase(str) {
12
+ if (str === str.toUpperCase() && str !== str.toLowerCase()) return str.toLowerCase().replace(/_/g, "-");
13
+ let kebabified = str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
14
+ kebabified = kebabified.startsWith("-") ? kebabified.slice(1) : kebabified;
15
+ return kebabified.replace(/_/g, "-").replace(/-$/, "");
16
+ }
17
+ const queryCache = /* @__PURE__ */ new Map();
18
+ function createCacheKey(agentNamespace, name, deps) {
19
+ return JSON.stringify([
20
+ agentNamespace,
21
+ name || "default",
22
+ ...deps
23
+ ]);
24
+ }
25
+ function getCacheEntry(key) {
26
+ const entry = queryCache.get(key);
27
+ if (!entry) return void 0;
28
+ if (Date.now() >= entry.expiresAt) {
29
+ queryCache.delete(key);
30
+ return;
31
+ }
32
+ return entry;
93
33
  }
94
- export {
95
- useAgent
34
+ function setCacheEntry(key, promise, cacheTtl) {
35
+ const entry = {
36
+ promise,
37
+ expiresAt: Date.now() + cacheTtl
38
+ };
39
+ queryCache.set(key, entry);
40
+ return entry;
41
+ }
42
+ function deleteCacheEntry(key) {
43
+ queryCache.delete(key);
44
+ }
45
+ const _testUtils = {
46
+ queryCache,
47
+ setCacheEntry,
48
+ getCacheEntry,
49
+ deleteCacheEntry,
50
+ clearCache: () => queryCache.clear()
96
51
  };
52
+ function useAgent(options) {
53
+ const agentNamespace = camelCaseToKebabCase(options.agent);
54
+ const { query, queryDeps, cacheTtl, ...restOptions } = options;
55
+ const pendingCallsRef = useRef(/* @__PURE__ */ new Map());
56
+ const cacheKey = useMemo(() => createCacheKey(agentNamespace, options.name, queryDeps || []), [
57
+ agentNamespace,
58
+ options.name,
59
+ queryDeps
60
+ ]);
61
+ const ttl = cacheTtl ?? 300 * 1e3;
62
+ const [cacheInvalidatedAt, setCacheInvalidatedAt] = useState(0);
63
+ const queryPromise = useMemo(() => {
64
+ if (!query || typeof query !== "function") return null;
65
+ const cached = getCacheEntry(cacheKey);
66
+ if (cached) return cached.promise;
67
+ const promise = query().catch((error) => {
68
+ console.error(`[useAgent] Query failed for agent "${options.agent}":`, error);
69
+ deleteCacheEntry(cacheKey);
70
+ throw error;
71
+ });
72
+ setCacheEntry(cacheKey, promise, ttl);
73
+ return promise;
74
+ }, [
75
+ cacheKey,
76
+ query,
77
+ options.agent,
78
+ ttl,
79
+ cacheInvalidatedAt
80
+ ]);
81
+ useEffect(() => {
82
+ if (!queryPromise || ttl <= 0) return;
83
+ const entry = getCacheEntry(cacheKey);
84
+ if (!entry) return;
85
+ const timeUntilExpiry = entry.expiresAt - Date.now();
86
+ const timer = setTimeout(() => {
87
+ deleteCacheEntry(cacheKey);
88
+ setCacheInvalidatedAt(Date.now());
89
+ }, Math.max(0, timeUntilExpiry));
90
+ return () => clearTimeout(timer);
91
+ }, [
92
+ cacheKey,
93
+ queryPromise,
94
+ ttl
95
+ ]);
96
+ let resolvedQuery;
97
+ if (query) if (typeof query === "function") {
98
+ const queryResult = use(queryPromise);
99
+ if (queryResult) {
100
+ for (const [key, value] of Object.entries(queryResult)) if (value !== null && value !== void 0 && typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") console.warn(`[useAgent] Query parameter "${key}" is an object and will be converted to "[object Object]". Query parameters should be string, number, boolean, or null.`);
101
+ resolvedQuery = queryResult;
102
+ }
103
+ } else resolvedQuery = query;
104
+ const agent = usePartySocket({
105
+ party: agentNamespace,
106
+ prefix: "agents",
107
+ room: options.name || "default",
108
+ query: resolvedQuery,
109
+ ...restOptions,
110
+ onMessage: (message) => {
111
+ if (typeof message.data === "string") {
112
+ let parsedMessage;
113
+ try {
114
+ parsedMessage = JSON.parse(message.data);
115
+ } catch (_error) {
116
+ return options.onMessage?.(message);
117
+ }
118
+ if (parsedMessage.type === MessageType.CF_AGENT_STATE) {
119
+ options.onStateUpdate?.(parsedMessage.state, "server");
120
+ return;
121
+ }
122
+ if (parsedMessage.type === MessageType.CF_AGENT_MCP_SERVERS) {
123
+ options.onMcpUpdate?.(parsedMessage.mcp);
124
+ return;
125
+ }
126
+ if (parsedMessage.type === MessageType.RPC) {
127
+ const response = parsedMessage;
128
+ const pending = pendingCallsRef.current.get(response.id);
129
+ if (!pending) return;
130
+ if (!response.success) {
131
+ pending.reject(new Error(response.error));
132
+ pendingCallsRef.current.delete(response.id);
133
+ pending.stream?.onError?.(response.error);
134
+ return;
135
+ }
136
+ if ("done" in response) if (response.done) {
137
+ pending.resolve(response.result);
138
+ pendingCallsRef.current.delete(response.id);
139
+ pending.stream?.onDone?.(response.result);
140
+ } else pending.stream?.onChunk?.(response.result);
141
+ else {
142
+ pending.resolve(response.result);
143
+ pendingCallsRef.current.delete(response.id);
144
+ }
145
+ return;
146
+ }
147
+ }
148
+ options.onMessage?.(message);
149
+ }
150
+ });
151
+ const call = useCallback((method, args = [], streamOptions) => {
152
+ return new Promise((resolve, reject) => {
153
+ const id = Math.random().toString(36).slice(2);
154
+ pendingCallsRef.current.set(id, {
155
+ reject,
156
+ resolve,
157
+ stream: streamOptions
158
+ });
159
+ const request = {
160
+ args,
161
+ id,
162
+ method,
163
+ type: MessageType.RPC
164
+ };
165
+ agent.send(JSON.stringify(request));
166
+ });
167
+ }, [agent]);
168
+ agent.setState = (state) => {
169
+ agent.send(JSON.stringify({
170
+ state,
171
+ type: MessageType.CF_AGENT_STATE
172
+ }));
173
+ options.onStateUpdate?.(state, "client");
174
+ };
175
+ agent.call = call;
176
+ agent.agent = agentNamespace;
177
+ agent.name = options.name || "default";
178
+ agent.stub = new Proxy({}, { get: (_target, method) => {
179
+ return (...args) => {
180
+ return call(method, args);
181
+ };
182
+ } });
183
+ if (agent.agent !== agent.agent.toLowerCase()) console.warn(`Agent name: ${agent.agent} should probably be in lowercase. Received: ${agent.agent}`);
184
+ return agent;
185
+ }
186
+
187
+ //#endregion
188
+ export { _testUtils, useAgent };
97
189
  //# sourceMappingURL=react.js.map
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,"file":"react.js","names":["entry: CacheEntry","resolvedQuery: QueryObject | undefined","parsedMessage: Record<string, unknown>","request: RPCRequest"],"sources":["../src/react.tsx"],"sourcesContent":["import type { PartySocket } from \"partysocket\";\nimport { usePartySocket } from \"partysocket/react\";\nimport { useCallback, useRef, use, useMemo, useState, 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\ninterface CacheEntry {\n promise: Promise<QueryObject>;\n expiresAt: number;\n}\n\nconst queryCache = new Map<string, CacheEntry>();\n\nfunction createCacheKey(\n agentNamespace: string,\n name: string | undefined,\n deps: unknown[]\n): string {\n return JSON.stringify([agentNamespace, name || \"default\", ...deps]);\n}\n\nfunction getCacheEntry(key: string): CacheEntry | undefined {\n const entry = queryCache.get(key);\n if (!entry) return undefined;\n\n if (Date.now() >= entry.expiresAt) {\n queryCache.delete(key);\n return undefined;\n }\n\n return entry;\n}\n\nfunction setCacheEntry(\n key: string,\n promise: Promise<QueryObject>,\n cacheTtl: number\n): CacheEntry {\n const entry: CacheEntry = {\n promise,\n expiresAt: Date.now() + cacheTtl\n };\n queryCache.set(key, entry);\n return entry;\n}\n\nfunction deleteCacheEntry(key: string): void {\n queryCache.delete(key);\n}\n\n// Export for testing purposes\nexport const _testUtils = {\n queryCache,\n setCacheEntry,\n getCacheEntry,\n deleteCacheEntry,\n clearCache: () => queryCache.clear()\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 const cacheKey = useMemo(\n () => createCacheKey(agentNamespace, options.name, queryDeps || []),\n [agentNamespace, options.name, queryDeps]\n );\n\n const ttl = cacheTtl ?? 5 * 60 * 1000;\n\n // Track cache invalidation to force re-render when TTL expires\n const [cacheInvalidatedAt, setCacheInvalidatedAt] = useState<number>(0);\n\n // Get or create the query promise\n // biome-ignore lint/correctness/useExhaustiveDependencies: cacheInvalidatedAt intentionally forces re-evaluation when TTL expires\n const queryPromise = useMemo(() => {\n if (!query || typeof query !== \"function\") {\n return null;\n }\n\n // Always check cache first to deduplicate concurrent requests\n const cached = getCacheEntry(cacheKey);\n if (cached) {\n return cached.promise;\n }\n\n // Create new promise\n const promise = query().catch((error) => {\n console.error(\n `[useAgent] Query failed for agent \"${options.agent}\":`,\n error\n );\n deleteCacheEntry(cacheKey);\n throw error;\n });\n\n // Always cache to deduplicate concurrent requests\n setCacheEntry(cacheKey, promise, ttl);\n\n return promise;\n }, [cacheKey, query, options.agent, ttl, cacheInvalidatedAt]);\n\n // Schedule cache invalidation when TTL expires\n useEffect(() => {\n if (!queryPromise || ttl <= 0) return;\n\n const entry = getCacheEntry(cacheKey);\n if (!entry) return;\n\n const timeUntilExpiry = entry.expiresAt - Date.now();\n\n // Always set a timer (with min 0ms) to ensure cleanup function is returned\n const timer = setTimeout(\n () => {\n deleteCacheEntry(cacheKey);\n setCacheInvalidatedAt(Date.now());\n },\n Math.max(0, timeUntilExpiry)\n );\n\n return () => clearTimeout(timer);\n }, [cacheKey, queryPromise, ttl]);\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 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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"}
@@ -1,30 +1,45 @@
1
1
  import { z } from "zod";
2
2
 
3
- type Schedule = z.infer<typeof unstable_scheduleSchema>;
3
+ //#region src/schedule.d.ts
4
+
5
+ /**
6
+ * Get the schedule prompt for a given event
7
+ * @param event - The event to get the schedule prompt for
8
+ * @returns The schedule prompt
9
+ */
10
+ declare function getSchedulePrompt(event: { date: Date }): string;
11
+ /**
12
+ * @deprecated this has been renamed to getSchedulePrompt, and unstable_getSchedulePrompt will be removed in the next major version
13
+ * @param event - The event to get the schedule prompt for
14
+ * @returns The schedule prompt
15
+ */
4
16
  declare function unstable_getSchedulePrompt(event: { date: Date }): string;
5
- declare const unstable_scheduleSchema: z.ZodObject<
17
+ /**
18
+ * The schema for the schedule prompt
19
+ */
20
+ declare const scheduleSchema: z.ZodObject<
6
21
  {
7
22
  description: z.ZodString;
8
23
  when: z.ZodObject<
9
24
  {
10
- type: z.ZodEnum<["scheduled", "delayed", "cron", "no-schedule"]>;
25
+ cron: z.ZodOptional<z.ZodString>;
11
26
  date: z.ZodOptional<z.ZodDate>;
12
27
  delayInSeconds: z.ZodOptional<z.ZodNumber>;
13
- cron: z.ZodOptional<z.ZodString>;
28
+ type: z.ZodEnum<["scheduled", "delayed", "cron", "no-schedule"]>;
14
29
  },
15
30
  "strip",
16
31
  z.ZodTypeAny,
17
32
  {
18
- type: "scheduled" | "delayed" | "cron" | "no-schedule";
33
+ type: "cron" | "scheduled" | "delayed" | "no-schedule";
34
+ date?: Date | undefined;
19
35
  cron?: string | undefined;
20
36
  delayInSeconds?: number | undefined;
21
- date?: Date | undefined;
22
37
  },
23
38
  {
24
- type: "scheduled" | "delayed" | "cron" | "no-schedule";
39
+ type: "cron" | "scheduled" | "delayed" | "no-schedule";
40
+ date?: Date | undefined;
25
41
  cron?: string | undefined;
26
42
  delayInSeconds?: number | undefined;
27
- date?: Date | undefined;
28
43
  }
29
44
  >;
30
45
  },
@@ -33,21 +48,83 @@ declare const unstable_scheduleSchema: z.ZodObject<
33
48
  {
34
49
  description: string;
35
50
  when: {
36
- type: "scheduled" | "delayed" | "cron" | "no-schedule";
51
+ type: "cron" | "scheduled" | "delayed" | "no-schedule";
52
+ date?: Date | undefined;
37
53
  cron?: string | undefined;
38
54
  delayInSeconds?: number | undefined;
55
+ };
56
+ },
57
+ {
58
+ description: string;
59
+ when: {
60
+ type: "cron" | "scheduled" | "delayed" | "no-schedule";
39
61
  date?: Date | undefined;
62
+ cron?: string | undefined;
63
+ delayInSeconds?: number | undefined;
40
64
  };
65
+ }
66
+ >;
67
+ /**
68
+ * The type for the schedule prompt
69
+ */
70
+ type Schedule = z.infer<typeof scheduleSchema>;
71
+ /**
72
+ * @deprecated this has been renamed to scheduleSchema, and unstable_scheduleSchema will be removed in the next major version
73
+ * @returns The schedule schema
74
+ */
75
+ declare const unstable_scheduleSchema: z.ZodObject<
76
+ {
77
+ description: z.ZodString;
78
+ when: z.ZodObject<
79
+ {
80
+ cron: z.ZodOptional<z.ZodString>;
81
+ date: z.ZodOptional<z.ZodDate>;
82
+ delayInSeconds: z.ZodOptional<z.ZodNumber>;
83
+ type: z.ZodEnum<["scheduled", "delayed", "cron", "no-schedule"]>;
84
+ },
85
+ "strip",
86
+ z.ZodTypeAny,
87
+ {
88
+ type: "cron" | "scheduled" | "delayed" | "no-schedule";
89
+ date?: Date | undefined;
90
+ cron?: string | undefined;
91
+ delayInSeconds?: number | undefined;
92
+ },
93
+ {
94
+ type: "cron" | "scheduled" | "delayed" | "no-schedule";
95
+ date?: Date | undefined;
96
+ cron?: string | undefined;
97
+ delayInSeconds?: number | undefined;
98
+ }
99
+ >;
41
100
  },
101
+ "strip",
102
+ z.ZodTypeAny,
42
103
  {
43
104
  description: string;
44
105
  when: {
45
- type: "scheduled" | "delayed" | "cron" | "no-schedule";
106
+ type: "cron" | "scheduled" | "delayed" | "no-schedule";
107
+ date?: Date | undefined;
46
108
  cron?: string | undefined;
47
109
  delayInSeconds?: number | undefined;
110
+ };
111
+ },
112
+ {
113
+ description: string;
114
+ when: {
115
+ type: "cron" | "scheduled" | "delayed" | "no-schedule";
48
116
  date?: Date | undefined;
117
+ cron?: string | undefined;
118
+ delayInSeconds?: number | undefined;
49
119
  };
50
120
  }
51
121
  >;
52
-
53
- export { type Schedule, unstable_getSchedulePrompt, unstable_scheduleSchema };
122
+ //#endregion
123
+ export {
124
+ Schedule,
125
+ getSchedulePrompt,
126
+ scheduleSchema,
127
+ unstable_getSchedulePrompt,
128
+ unstable_scheduleSchema
129
+ };
130
+ //# sourceMappingURL=schedule.d.ts.map