agents 0.0.0-a20932f → 0.0.0-a45f8f3

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 (48) hide show
  1. package/README.md +129 -28
  2. package/dist/ai-chat-agent.d.ts +52 -3
  3. package/dist/ai-chat-agent.js +179 -81
  4. package/dist/ai-chat-agent.js.map +1 -1
  5. package/dist/ai-react.d.ts +25 -8
  6. package/dist/ai-react.js +62 -48
  7. package/dist/ai-react.js.map +1 -1
  8. package/dist/ai-types.d.ts +5 -0
  9. package/dist/chunk-3IQQY2UH.js +1270 -0
  10. package/dist/chunk-3IQQY2UH.js.map +1 -0
  11. package/dist/chunk-KUH345EY.js +116 -0
  12. package/dist/chunk-KUH345EY.js.map +1 -0
  13. package/dist/chunk-PVQZBKN7.js +106 -0
  14. package/dist/chunk-PVQZBKN7.js.map +1 -0
  15. package/dist/chunk-UNG3FXYX.js +525 -0
  16. package/dist/chunk-UNG3FXYX.js.map +1 -0
  17. package/dist/client.d.ts +16 -2
  18. package/dist/client.js +6 -133
  19. package/dist/client.js.map +1 -1
  20. package/dist/index-CLW1aEBr.d.ts +615 -0
  21. package/dist/index.d.ts +39 -300
  22. package/dist/index.js +12 -4
  23. package/dist/mcp/client.d.ts +1054 -0
  24. package/dist/mcp/client.js +9 -0
  25. package/dist/mcp/do-oauth-client-provider.d.ts +41 -0
  26. package/dist/mcp/do-oauth-client-provider.js +7 -0
  27. package/dist/mcp/do-oauth-client-provider.js.map +1 -0
  28. package/dist/mcp/index.d.ts +107 -0
  29. package/dist/mcp/index.js +798 -0
  30. package/dist/mcp/index.js.map +1 -0
  31. package/dist/observability/index.d.ts +14 -0
  32. package/dist/observability/index.js +10 -0
  33. package/dist/observability/index.js.map +1 -0
  34. package/dist/react.d.ts +87 -5
  35. package/dist/react.js +50 -31
  36. package/dist/react.js.map +1 -1
  37. package/dist/schedule.d.ts +6 -6
  38. package/dist/schedule.js +4 -6
  39. package/dist/schedule.js.map +1 -1
  40. package/dist/serializable.d.ts +32 -0
  41. package/dist/serializable.js +1 -0
  42. package/dist/serializable.js.map +1 -0
  43. package/package.json +84 -43
  44. package/src/index.ts +1192 -185
  45. package/dist/chunk-HMLY7DHA.js +0 -16
  46. package/dist/chunk-X6BBKLSC.js +0 -568
  47. package/dist/chunk-X6BBKLSC.js.map +0 -1
  48. /package/dist/{chunk-HMLY7DHA.js.map → mcp/client.js.map} +0 -0
@@ -1,19 +1,16 @@
1
1
  import {
2
2
  Agent
3
- } from "./chunk-X6BBKLSC.js";
4
- import {
5
- __privateAdd,
6
- __privateMethod
7
- } from "./chunk-HMLY7DHA.js";
3
+ } from "./chunk-3IQQY2UH.js";
4
+ import "./chunk-UNG3FXYX.js";
5
+ import "./chunk-PVQZBKN7.js";
6
+ import "./chunk-KUH345EY.js";
8
7
 
9
8
  // src/ai-chat-agent.ts
10
9
  import { appendResponseMessages } from "ai";
11
10
  var decoder = new TextDecoder();
12
- var _AIChatAgent_instances, sendChatMessage_fn, broadcastChatMessage_fn, tryCatch_fn, persistMessages_fn, reply_fn;
13
11
  var AIChatAgent = class extends Agent {
14
12
  constructor(ctx, env) {
15
13
  super(ctx, env);
16
- __privateAdd(this, _AIChatAgent_instances);
17
14
  this.sql`create table if not exists cf_ai_chat_agent_messages (
18
15
  id text primary key,
19
16
  message text not null,
@@ -22,65 +19,119 @@ var AIChatAgent = class extends Agent {
22
19
  this.messages = (this.sql`select * from cf_ai_chat_agent_messages` || []).map((row) => {
23
20
  return JSON.parse(row.message);
24
21
  });
22
+ this._chatMessageAbortControllers = /* @__PURE__ */ new Map();
23
+ }
24
+ _broadcastChatMessage(message, exclude) {
25
+ this.broadcast(JSON.stringify(message), exclude);
25
26
  }
26
27
  async onMessage(connection, message) {
27
28
  if (typeof message === "string") {
28
29
  let data;
29
30
  try {
30
31
  data = JSON.parse(message);
31
- } catch (error) {
32
+ } catch (_error) {
32
33
  return;
33
34
  }
34
35
  if (data.type === "cf_agent_use_chat_request" && data.init.method === "POST") {
35
36
  const {
36
- method,
37
- keepalive,
38
- headers,
39
- body,
37
+ // method,
38
+ // keepalive,
39
+ // headers,
40
+ body
40
41
  // we're reading this
41
- redirect,
42
- integrity,
43
- credentials,
44
- mode,
45
- referrer,
46
- referrerPolicy,
47
- window
42
+ //
43
+ // // these might not exist?
48
44
  // dispatcher,
49
45
  // duplex
50
46
  } = data.init;
51
47
  const { messages } = JSON.parse(body);
52
- __privateMethod(this, _AIChatAgent_instances, broadcastChatMessage_fn).call(this, {
53
- type: "cf_agent_chat_messages",
54
- messages
55
- }, [connection.id]);
56
- await __privateMethod(this, _AIChatAgent_instances, persistMessages_fn).call(this, messages, [connection.id]);
57
- return __privateMethod(this, _AIChatAgent_instances, tryCatch_fn).call(this, async () => {
58
- const response = await this.onChatMessage(async ({ response: response2 }) => {
59
- const finalMessages = appendResponseMessages({
60
- messages,
61
- responseMessages: response2.messages
62
- });
63
- await __privateMethod(this, _AIChatAgent_instances, persistMessages_fn).call(this, finalMessages, [connection.id]);
64
- });
48
+ this._broadcastChatMessage(
49
+ {
50
+ messages,
51
+ type: "cf_agent_chat_messages"
52
+ },
53
+ [connection.id]
54
+ );
55
+ const incomingMessages = this._messagesNotAlreadyInAgent(messages);
56
+ await this.persistMessages(messages, [connection.id]);
57
+ this.observability?.emit(
58
+ {
59
+ displayMessage: "Chat message request",
60
+ id: data.id,
61
+ payload: {
62
+ message: incomingMessages
63
+ },
64
+ timestamp: Date.now(),
65
+ type: "message:request"
66
+ },
67
+ this.ctx
68
+ );
69
+ const chatMessageId = data.id;
70
+ const abortSignal = this._getAbortSignal(chatMessageId);
71
+ return this._tryCatchChat(async () => {
72
+ const response = await this.onChatMessage(
73
+ async ({ response: response2 }) => {
74
+ const finalMessages = appendResponseMessages({
75
+ messages,
76
+ responseMessages: response2.messages
77
+ });
78
+ const outgoingMessages = this._messagesNotAlreadyInAgent(finalMessages);
79
+ await this.persistMessages(finalMessages, [connection.id]);
80
+ this._removeAbortController(chatMessageId);
81
+ this.observability?.emit(
82
+ {
83
+ displayMessage: "Chat message response",
84
+ id: data.id,
85
+ payload: {
86
+ message: outgoingMessages
87
+ },
88
+ timestamp: Date.now(),
89
+ type: "message:response"
90
+ },
91
+ this.ctx
92
+ );
93
+ },
94
+ abortSignal ? { abortSignal } : void 0
95
+ );
65
96
  if (response) {
66
- await __privateMethod(this, _AIChatAgent_instances, reply_fn).call(this, data.id, response);
97
+ await this._reply(data.id, response);
98
+ } else {
99
+ console.warn(
100
+ `[AIChatAgent] onChatMessage returned no response for chatMessageId: ${chatMessageId}`
101
+ );
102
+ this._broadcastChatMessage(
103
+ {
104
+ body: "No response was generated by the agent.",
105
+ done: true,
106
+ id: data.id,
107
+ type: "cf_agent_use_chat_response"
108
+ },
109
+ [connection.id]
110
+ );
67
111
  }
68
112
  });
69
113
  }
70
114
  if (data.type === "cf_agent_chat_clear") {
115
+ this._destroyAbortControllers();
71
116
  this.sql`delete from cf_ai_chat_agent_messages`;
72
117
  this.messages = [];
73
- __privateMethod(this, _AIChatAgent_instances, broadcastChatMessage_fn).call(this, {
74
- type: "cf_agent_chat_clear"
75
- }, [connection.id]);
118
+ this._broadcastChatMessage(
119
+ {
120
+ type: "cf_agent_chat_clear"
121
+ },
122
+ [connection.id]
123
+ );
76
124
  } else if (data.type === "cf_agent_chat_messages") {
77
- await __privateMethod(this, _AIChatAgent_instances, persistMessages_fn).call(this, data.messages, [connection.id]);
125
+ await this.persistMessages(data.messages, [connection.id]);
126
+ } else if (data.type === "cf_agent_chat_request_cancel") {
127
+ this._cancelChatRequest(data.id);
78
128
  }
79
129
  }
80
130
  }
81
131
  async onRequest(request) {
82
- return __privateMethod(this, _AIChatAgent_instances, tryCatch_fn).call(this, () => {
83
- if (request.url.endsWith("/get-messages")) {
132
+ return this._tryCatchChat(() => {
133
+ const url = new URL(request.url);
134
+ if (url.pathname.endsWith("/get-messages")) {
84
135
  const messages = (this.sql`select * from cf_ai_chat_agent_messages` || []).map((row) => {
85
136
  return JSON.parse(row.message);
86
137
  });
@@ -89,12 +140,20 @@ var AIChatAgent = class extends Agent {
89
140
  return super.onRequest(request);
90
141
  });
91
142
  }
143
+ async _tryCatchChat(fn) {
144
+ try {
145
+ return await fn();
146
+ } catch (e) {
147
+ throw this.onError(e);
148
+ }
149
+ }
92
150
  /**
93
151
  * Handle incoming chat messages and generate a response
94
152
  * @param onFinish Callback to be called when the response is finished
153
+ * @param options.signal A signal to pass to any child requests which can be used to cancel them
95
154
  * @returns Response to send to the client or undefined
96
155
  */
97
- async onChatMessage(onFinish) {
156
+ async onChatMessage(onFinish, options) {
98
157
  throw new Error(
99
158
  "recieved a chat message, override onChatMessage and return a Response to send to the client"
100
159
  );
@@ -104,13 +163,13 @@ var AIChatAgent = class extends Agent {
104
163
  * @param messages Chat messages to save
105
164
  */
106
165
  async saveMessages(messages) {
107
- await __privateMethod(this, _AIChatAgent_instances, persistMessages_fn).call(this, messages);
166
+ await this.persistMessages(messages);
108
167
  const response = await this.onChatMessage(async ({ response: response2 }) => {
109
168
  const finalMessages = appendResponseMessages({
110
169
  messages,
111
170
  responseMessages: response2.messages
112
171
  });
113
- await __privateMethod(this, _AIChatAgent_instances, persistMessages_fn).call(this, finalMessages, []);
172
+ await this.persistMessages(finalMessages, []);
114
173
  });
115
174
  if (response) {
116
175
  for await (const chunk of response.body) {
@@ -119,50 +178,89 @@ var AIChatAgent = class extends Agent {
119
178
  response.body?.cancel();
120
179
  }
121
180
  }
122
- };
123
- _AIChatAgent_instances = new WeakSet();
124
- sendChatMessage_fn = function(connection, message) {
125
- connection.send(JSON.stringify(message));
126
- };
127
- broadcastChatMessage_fn = function(message, exclude) {
128
- this.broadcast(JSON.stringify(message), exclude);
129
- };
130
- tryCatch_fn = async function(fn) {
131
- try {
132
- return await fn();
133
- } catch (e) {
134
- throw this.onError(e);
181
+ async persistMessages(messages, excludeBroadcastIds = []) {
182
+ this.sql`delete from cf_ai_chat_agent_messages`;
183
+ for (const message of messages) {
184
+ this.sql`insert into cf_ai_chat_agent_messages (id, message) values (${message.id},${JSON.stringify(message)})`;
185
+ }
186
+ this.messages = messages;
187
+ this._broadcastChatMessage(
188
+ {
189
+ messages,
190
+ type: "cf_agent_chat_messages"
191
+ },
192
+ excludeBroadcastIds
193
+ );
135
194
  }
136
- };
137
- persistMessages_fn = async function(messages, excludeBroadcastIds = []) {
138
- this.sql`delete from cf_ai_chat_agent_messages`;
139
- for (const message of messages) {
140
- this.sql`insert into cf_ai_chat_agent_messages (id, message) values (${message.id},${JSON.stringify(message)})`;
195
+ _messagesNotAlreadyInAgent(messages) {
196
+ const existingIds = new Set(this.messages.map((message) => message.id));
197
+ return messages.filter((message) => !existingIds.has(message.id));
141
198
  }
142
- this.messages = messages;
143
- __privateMethod(this, _AIChatAgent_instances, broadcastChatMessage_fn).call(this, {
144
- type: "cf_agent_chat_messages",
145
- messages
146
- }, excludeBroadcastIds);
147
- };
148
- reply_fn = async function(id, response) {
149
- return __privateMethod(this, _AIChatAgent_instances, tryCatch_fn).call(this, async () => {
150
- for await (const chunk of response.body) {
151
- const body = decoder.decode(chunk);
152
- __privateMethod(this, _AIChatAgent_instances, broadcastChatMessage_fn).call(this, {
199
+ async _reply(id, response) {
200
+ return this._tryCatchChat(async () => {
201
+ for await (const chunk of response.body) {
202
+ const body = decoder.decode(chunk);
203
+ this._broadcastChatMessage({
204
+ body,
205
+ done: false,
206
+ id,
207
+ type: "cf_agent_use_chat_response"
208
+ });
209
+ }
210
+ this._broadcastChatMessage({
211
+ body: "",
212
+ done: true,
153
213
  id,
154
- type: "cf_agent_use_chat_response",
155
- body,
156
- done: false
214
+ type: "cf_agent_use_chat_response"
157
215
  });
158
- }
159
- __privateMethod(this, _AIChatAgent_instances, broadcastChatMessage_fn).call(this, {
160
- id,
161
- type: "cf_agent_use_chat_response",
162
- body: "",
163
- done: true
164
216
  });
165
- });
217
+ }
218
+ /**
219
+ * For the given message id, look up its associated AbortController
220
+ * If the AbortController does not exist, create and store one in memory
221
+ *
222
+ * returns the AbortSignal associated with the AbortController
223
+ */
224
+ _getAbortSignal(id) {
225
+ if (typeof id !== "string") {
226
+ return void 0;
227
+ }
228
+ if (!this._chatMessageAbortControllers.has(id)) {
229
+ this._chatMessageAbortControllers.set(id, new AbortController());
230
+ }
231
+ return this._chatMessageAbortControllers.get(id)?.signal;
232
+ }
233
+ /**
234
+ * Remove an abort controller from the cache of pending message responses
235
+ */
236
+ _removeAbortController(id) {
237
+ this._chatMessageAbortControllers.delete(id);
238
+ }
239
+ /**
240
+ * Propagate an abort signal for any requests associated with the given message id
241
+ */
242
+ _cancelChatRequest(id) {
243
+ if (this._chatMessageAbortControllers.has(id)) {
244
+ const abortController = this._chatMessageAbortControllers.get(id);
245
+ abortController?.abort();
246
+ }
247
+ }
248
+ /**
249
+ * Abort all pending requests and clear the cache of AbortControllers
250
+ */
251
+ _destroyAbortControllers() {
252
+ for (const controller of this._chatMessageAbortControllers.values()) {
253
+ controller?.abort();
254
+ }
255
+ this._chatMessageAbortControllers.clear();
256
+ }
257
+ /**
258
+ * When the DO is destroyed, cancel all pending requests
259
+ */
260
+ async destroy() {
261
+ this._destroyAbortControllers();
262
+ await super.destroy();
263
+ }
166
264
  };
167
265
  export {
168
266
  AIChatAgent
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ai-chat-agent.ts"],"sourcesContent":["import { Agent, type AgentContext, type Connection, type WSMessage } from \"./\";\nimport type {\n Message as ChatMessage,\n StreamTextOnFinishCallback,\n ToolSet,\n} from \"ai\";\nimport { appendResponseMessages } from \"ai\";\nimport type { OutgoingMessage, IncomingMessage } from \"./ai-types\";\nconst decoder = new TextDecoder();\n\n/**\n * Extension of Agent with built-in chat capabilities\n * @template Env Environment type containing bindings\n */\nexport class AIChatAgent<Env = unknown, State = unknown> extends Agent<\n Env,\n State\n> {\n /** Array of chat messages for the current conversation */\n messages: ChatMessage[];\n constructor(ctx: AgentContext, env: Env) {\n super(ctx, env);\n this.sql`create table if not exists cf_ai_chat_agent_messages (\n id text primary key,\n message text not null,\n created_at datetime default current_timestamp\n )`;\n this.messages = (\n this.sql`select * from cf_ai_chat_agent_messages` || []\n ).map((row) => {\n return JSON.parse(row.message as string);\n });\n }\n\n #sendChatMessage(connection: Connection, message: OutgoingMessage) {\n connection.send(JSON.stringify(message));\n }\n\n #broadcastChatMessage(message: OutgoingMessage, exclude?: string[]) {\n this.broadcast(JSON.stringify(message), exclude);\n }\n\n override async onMessage(connection: Connection, message: WSMessage) {\n if (typeof message === \"string\") {\n let data: IncomingMessage;\n try {\n data = JSON.parse(message) as IncomingMessage;\n } catch (error) {\n // silently ignore invalid messages for now\n // TODO: log errors with log levels\n return;\n }\n if (\n data.type === \"cf_agent_use_chat_request\" &&\n data.init.method === \"POST\"\n ) {\n const {\n method,\n keepalive,\n headers,\n body, // we're reading this\n redirect,\n integrity,\n credentials,\n mode,\n referrer,\n referrerPolicy,\n window,\n // dispatcher,\n // duplex\n } = data.init;\n const { messages } = JSON.parse(body as string);\n this.#broadcastChatMessage(\n {\n type: \"cf_agent_chat_messages\",\n messages,\n },\n [connection.id]\n );\n await this.#persistMessages(messages, [connection.id]);\n return this.#tryCatch(async () => {\n const response = await this.onChatMessage(async ({ response }) => {\n const finalMessages = appendResponseMessages({\n messages,\n responseMessages: response.messages,\n });\n\n await this.#persistMessages(finalMessages, [connection.id]);\n });\n if (response) {\n await this.#reply(data.id, response);\n }\n });\n }\n if (data.type === \"cf_agent_chat_clear\") {\n this.sql`delete from cf_ai_chat_agent_messages`;\n this.messages = [];\n this.#broadcastChatMessage(\n {\n type: \"cf_agent_chat_clear\",\n },\n [connection.id]\n );\n } else if (data.type === \"cf_agent_chat_messages\") {\n // replace the messages with the new ones\n await this.#persistMessages(data.messages, [connection.id]);\n }\n }\n }\n\n override async onRequest(request: Request): Promise<Response> {\n return this.#tryCatch(() => {\n if (request.url.endsWith(\"/get-messages\")) {\n const messages = (\n this.sql`select * from cf_ai_chat_agent_messages` || []\n ).map((row) => {\n return JSON.parse(row.message as string);\n });\n return Response.json(messages);\n }\n return super.onRequest(request);\n });\n }\n\n async #tryCatch<T>(fn: () => T | Promise<T>) {\n try {\n return await fn();\n } catch (e) {\n throw this.onError(e);\n }\n }\n\n /**\n * Handle incoming chat messages and generate a response\n * @param onFinish Callback to be called when the response is finished\n * @returns Response to send to the client or undefined\n */\n async onChatMessage(\n onFinish: StreamTextOnFinishCallback<ToolSet>\n ): Promise<Response | undefined> {\n throw new Error(\n \"recieved a chat message, override onChatMessage and return a Response to send to the client\"\n );\n }\n\n /**\n * Save messages on the server side and trigger AI response\n * @param messages Chat messages to save\n */\n async saveMessages(messages: ChatMessage[]) {\n await this.#persistMessages(messages);\n const response = await this.onChatMessage(async ({ response }) => {\n const finalMessages = appendResponseMessages({\n messages,\n responseMessages: response.messages,\n });\n\n await this.#persistMessages(finalMessages, []);\n });\n if (response) {\n // we're just going to drain the body\n // @ts-ignore TODO: fix this type error\n for await (const chunk of response.body!) {\n decoder.decode(chunk);\n }\n response.body?.cancel();\n }\n }\n\n async #persistMessages(\n messages: ChatMessage[],\n excludeBroadcastIds: string[] = []\n ) {\n this.sql`delete from cf_ai_chat_agent_messages`;\n for (const message of messages) {\n this.sql`insert into cf_ai_chat_agent_messages (id, message) values (${\n message.id\n },${JSON.stringify(message)})`;\n }\n this.messages = messages;\n this.#broadcastChatMessage(\n {\n type: \"cf_agent_chat_messages\",\n messages: messages,\n },\n excludeBroadcastIds\n );\n }\n\n async #reply(id: string, response: Response) {\n // now take chunks out from dataStreamResponse and send them to the client\n return this.#tryCatch(async () => {\n // @ts-expect-error TODO: fix this type error\n for await (const chunk of response.body!) {\n const body = decoder.decode(chunk);\n\n this.#broadcastChatMessage({\n id,\n type: \"cf_agent_use_chat_response\",\n body,\n done: false,\n });\n }\n\n this.#broadcastChatMessage({\n id,\n type: \"cf_agent_use_chat_response\",\n body: \"\",\n done: true,\n });\n });\n }\n}\n"],"mappings":"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","names":["response"]}
1
+ {"version":3,"sources":["../src/ai-chat-agent.ts"],"sourcesContent":["import type {\n Message as ChatMessage,\n StreamTextOnFinishCallback,\n ToolSet\n} from \"ai\";\nimport { appendResponseMessages } from \"ai\";\nimport { Agent, type AgentContext, type Connection, type WSMessage } from \"./\";\nimport type { IncomingMessage, OutgoingMessage } from \"./ai-types\";\n\nconst decoder = new TextDecoder();\n\n/**\n * Extension of Agent with built-in chat capabilities\n * @template Env Environment type containing bindings\n */\nexport class AIChatAgent<Env = unknown, State = unknown> extends Agent<\n Env,\n State\n> {\n /**\n * Map of message `id`s to `AbortController`s\n * useful to propagate request cancellation signals for any external calls made by the agent\n */\n private _chatMessageAbortControllers: Map<string, AbortController>;\n /** Array of chat messages for the current conversation */\n messages: ChatMessage[];\n constructor(ctx: AgentContext, env: Env) {\n super(ctx, env);\n this.sql`create table if not exists cf_ai_chat_agent_messages (\n id text primary key,\n message text not null,\n created_at datetime default current_timestamp\n )`;\n this.messages = (\n this.sql`select * from cf_ai_chat_agent_messages` || []\n ).map((row) => {\n return JSON.parse(row.message as string);\n });\n\n this._chatMessageAbortControllers = new Map();\n }\n\n private _broadcastChatMessage(message: OutgoingMessage, exclude?: string[]) {\n this.broadcast(JSON.stringify(message), exclude);\n }\n\n override async onMessage(connection: Connection, message: WSMessage) {\n if (typeof message === \"string\") {\n let data: IncomingMessage;\n try {\n data = JSON.parse(message) as IncomingMessage;\n } catch (_error) {\n // silently ignore invalid messages for now\n // TODO: log errors with log levels\n return;\n }\n if (\n data.type === \"cf_agent_use_chat_request\" &&\n data.init.method === \"POST\"\n ) {\n const {\n // method,\n // keepalive,\n // headers,\n body // we're reading this\n //\n // // these might not exist?\n // dispatcher,\n // duplex\n } = data.init;\n const { messages } = JSON.parse(body as string);\n this._broadcastChatMessage(\n {\n messages,\n type: \"cf_agent_chat_messages\"\n },\n [connection.id]\n );\n\n const incomingMessages = this._messagesNotAlreadyInAgent(messages);\n await this.persistMessages(messages, [connection.id]);\n\n this.observability?.emit(\n {\n displayMessage: \"Chat message request\",\n id: data.id,\n payload: {\n message: incomingMessages\n },\n timestamp: Date.now(),\n type: \"message:request\"\n },\n this.ctx\n );\n\n const chatMessageId = data.id;\n const abortSignal = this._getAbortSignal(chatMessageId);\n\n return this._tryCatchChat(async () => {\n const response = await this.onChatMessage(\n async ({ response }) => {\n const finalMessages = appendResponseMessages({\n messages,\n responseMessages: response.messages\n });\n\n const outgoingMessages =\n this._messagesNotAlreadyInAgent(finalMessages);\n await this.persistMessages(finalMessages, [connection.id]);\n this._removeAbortController(chatMessageId);\n\n this.observability?.emit(\n {\n displayMessage: \"Chat message response\",\n id: data.id,\n payload: {\n message: outgoingMessages\n },\n timestamp: Date.now(),\n type: \"message:response\"\n },\n this.ctx\n );\n },\n abortSignal ? { abortSignal } : undefined\n );\n\n if (response) {\n await this._reply(data.id, response);\n } else {\n // Log a warning for observability\n console.warn(\n `[AIChatAgent] onChatMessage returned no response for chatMessageId: ${chatMessageId}`\n );\n // Send a fallback message to the client\n this._broadcastChatMessage(\n {\n body: \"No response was generated by the agent.\",\n done: true,\n id: data.id,\n type: \"cf_agent_use_chat_response\"\n },\n [connection.id]\n );\n }\n });\n }\n if (data.type === \"cf_agent_chat_clear\") {\n this._destroyAbortControllers();\n this.sql`delete from cf_ai_chat_agent_messages`;\n this.messages = [];\n this._broadcastChatMessage(\n {\n type: \"cf_agent_chat_clear\"\n },\n [connection.id]\n );\n } else if (data.type === \"cf_agent_chat_messages\") {\n // replace the messages with the new ones\n await this.persistMessages(data.messages, [connection.id]);\n } else if (data.type === \"cf_agent_chat_request_cancel\") {\n // propagate an abort signal for the associated request\n this._cancelChatRequest(data.id);\n }\n }\n }\n\n override async onRequest(request: Request): Promise<Response> {\n return this._tryCatchChat(() => {\n const url = new URL(request.url);\n if (url.pathname.endsWith(\"/get-messages\")) {\n const messages = (\n this.sql`select * from cf_ai_chat_agent_messages` || []\n ).map((row) => {\n return JSON.parse(row.message as string);\n });\n return Response.json(messages);\n }\n return super.onRequest(request);\n });\n }\n\n private async _tryCatchChat<T>(fn: () => T | Promise<T>) {\n try {\n return await fn();\n } catch (e) {\n throw this.onError(e);\n }\n }\n\n /**\n * Handle incoming chat messages and generate a response\n * @param onFinish Callback to be called when the response is finished\n * @param options.signal A signal to pass to any child requests which can be used to cancel them\n * @returns Response to send to the client or undefined\n */\n async onChatMessage(\n // biome-ignore lint/correctness/noUnusedFunctionParameters: overridden later\n onFinish: StreamTextOnFinishCallback<ToolSet>,\n // biome-ignore lint/correctness/noUnusedFunctionParameters: overridden later\n options?: { abortSignal: AbortSignal | undefined }\n ): Promise<Response | undefined> {\n throw new Error(\n \"recieved a chat message, override onChatMessage and return a Response to send to the client\"\n );\n }\n\n /**\n * Save messages on the server side and trigger AI response\n * @param messages Chat messages to save\n */\n async saveMessages(messages: ChatMessage[]) {\n await this.persistMessages(messages);\n const response = await this.onChatMessage(async ({ response }) => {\n const finalMessages = appendResponseMessages({\n messages,\n responseMessages: response.messages\n });\n\n await this.persistMessages(finalMessages, []);\n });\n if (response) {\n // we're just going to drain the body\n // @ts-ignore TODO: fix this type error\n for await (const chunk of response.body!) {\n decoder.decode(chunk);\n }\n response.body?.cancel();\n }\n }\n\n async persistMessages(\n messages: ChatMessage[],\n excludeBroadcastIds: string[] = []\n ) {\n this.sql`delete from cf_ai_chat_agent_messages`;\n for (const message of messages) {\n this.sql`insert into cf_ai_chat_agent_messages (id, message) values (${\n message.id\n },${JSON.stringify(message)})`;\n }\n this.messages = messages;\n this._broadcastChatMessage(\n {\n messages: messages,\n type: \"cf_agent_chat_messages\"\n },\n excludeBroadcastIds\n );\n }\n\n private _messagesNotAlreadyInAgent(messages: ChatMessage[]) {\n const existingIds = new Set(this.messages.map((message) => message.id));\n return messages.filter((message) => !existingIds.has(message.id));\n }\n\n private async _reply(id: string, response: Response) {\n // now take chunks out from dataStreamResponse and send them to the client\n return this._tryCatchChat(async () => {\n // @ts-expect-error TODO: fix this type error\n for await (const chunk of response.body!) {\n const body = decoder.decode(chunk);\n\n this._broadcastChatMessage({\n body,\n done: false,\n id,\n type: \"cf_agent_use_chat_response\"\n });\n }\n\n this._broadcastChatMessage({\n body: \"\",\n done: true,\n id,\n type: \"cf_agent_use_chat_response\"\n });\n });\n }\n\n /**\n * For the given message id, look up its associated AbortController\n * If the AbortController does not exist, create and store one in memory\n *\n * returns the AbortSignal associated with the AbortController\n */\n private _getAbortSignal(id: string): AbortSignal | undefined {\n // Defensive check, since we're coercing message types at the moment\n if (typeof id !== \"string\") {\n return undefined;\n }\n\n if (!this._chatMessageAbortControllers.has(id)) {\n this._chatMessageAbortControllers.set(id, new AbortController());\n }\n\n return this._chatMessageAbortControllers.get(id)?.signal;\n }\n\n /**\n * Remove an abort controller from the cache of pending message responses\n */\n private _removeAbortController(id: string) {\n this._chatMessageAbortControllers.delete(id);\n }\n\n /**\n * Propagate an abort signal for any requests associated with the given message id\n */\n private _cancelChatRequest(id: string) {\n if (this._chatMessageAbortControllers.has(id)) {\n const abortController = this._chatMessageAbortControllers.get(id);\n abortController?.abort();\n }\n }\n\n /**\n * Abort all pending requests and clear the cache of AbortControllers\n */\n private _destroyAbortControllers() {\n for (const controller of this._chatMessageAbortControllers.values()) {\n controller?.abort();\n }\n this._chatMessageAbortControllers.clear();\n }\n\n /**\n * When the DO is destroyed, cancel all pending requests\n */\n async destroy() {\n this._destroyAbortControllers();\n await super.destroy();\n }\n}\n"],"mappings":"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","names":["response"]}
@@ -4,7 +4,21 @@ import { useChat } from "@ai-sdk/react";
4
4
  import { useAgent } from "./react.js";
5
5
  import "partysocket";
6
6
  import "partysocket/react";
7
+ import "./index-CLW1aEBr.js";
8
+ import "cloudflare:workers";
9
+ import "@modelcontextprotocol/sdk/client/index.js";
10
+ import "@modelcontextprotocol/sdk/types.js";
11
+ import "partyserver";
12
+ import "./mcp/client.js";
13
+ import "zod";
14
+ import "@modelcontextprotocol/sdk/shared/protocol.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";
7
20
  import "./client.js";
21
+ import "./serializable.js";
8
22
 
9
23
  type GetInitialMessagesOptions = {
10
24
  agent: string;
@@ -14,10 +28,10 @@ type GetInitialMessagesOptions = {
14
28
  /**
15
29
  * Options for the useAgentChat hook
16
30
  */
17
- type UseAgentChatOptions = Omit<
31
+ type UseAgentChatOptions<State> = Omit<
18
32
  Parameters<typeof useChat>[0] & {
19
33
  /** Agent connection from useAgent */
20
- agent: ReturnType<typeof useAgent>;
34
+ agent: ReturnType<typeof useAgent<State>>;
21
35
  getInitialMessages?:
22
36
  | undefined
23
37
  | null
@@ -30,16 +44,18 @@ type UseAgentChatOptions = Omit<
30
44
  * @param options Chat options including the agent connection
31
45
  * @returns Chat interface controls and state with added clearHistory method
32
46
  */
33
- declare function useAgentChat(options: UseAgentChatOptions): {
47
+ declare function useAgentChat<State = unknown>(
48
+ options: UseAgentChatOptions<State>
49
+ ): {
50
+ /**
51
+ * Clear chat history on both client and Agent
52
+ */
53
+ clearHistory: () => void;
34
54
  /**
35
55
  * Set the chat messages and synchronize with the Agent
36
56
  * @param messages New messages to set
37
57
  */
38
58
  setMessages: (messages: Message[]) => void;
39
- /**
40
- * Clear chat history on both client and Agent
41
- */
42
- clearHistory: () => void;
43
59
  messages: ai.UIMessage[];
44
60
  error: undefined | Error;
45
61
  append: (
@@ -50,6 +66,7 @@ declare function useAgentChat(options: UseAgentChatOptions): {
50
66
  chatRequestOptions?: ai.ChatRequestOptions
51
67
  ) => Promise<string | null | undefined>;
52
68
  stop: () => void;
69
+ experimental_resume: () => void;
53
70
  input: string;
54
71
  setInput: React.Dispatch<React.SetStateAction<string>>;
55
72
  handleInputChange: (
@@ -76,7 +93,7 @@ declare function useAgentChat(options: UseAgentChatOptions): {
76
93
  id: string;
77
94
  addToolResult: ({
78
95
  toolCallId,
79
- result,
96
+ result
80
97
  }: {
81
98
  toolCallId: string;
82
99
  result: any;