agents 0.0.0-a215bb2 → 0.0.0-a315e86

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 (55) hide show
  1. package/dist/ai-chat-agent.d.ts +10 -10
  2. package/dist/ai-chat-agent.js +6 -6
  3. package/dist/ai-chat-agent.js.map +1 -1
  4. package/dist/{ai-chat-v5-migration-gdyLiTd8.js → ai-chat-v5-migration-DBHGW4Hv.js} +2 -2
  5. package/dist/{ai-chat-v5-migration-gdyLiTd8.js.map → ai-chat-v5-migration-DBHGW4Hv.js.map} +1 -1
  6. package/dist/ai-chat-v5-migration.js +1 -1
  7. package/dist/ai-react.d.ts +9 -9
  8. package/dist/ai-react.js +9 -4
  9. package/dist/ai-react.js.map +1 -1
  10. package/dist/{ai-types-UZlfLOYP.js → ai-types-B3aQaFv3.js} +2 -2
  11. package/dist/{ai-types-UZlfLOYP.js.map → ai-types-B3aQaFv3.js.map} +1 -1
  12. package/dist/{ai-types-BWW4umHY.d.ts → ai-types-D5YoPrBZ.d.ts} +2 -2
  13. package/dist/ai-types.d.ts +4 -4
  14. package/dist/ai-types.js +1 -1
  15. package/dist/cli.d.ts +8 -0
  16. package/dist/cli.js +27 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/{client-C-nwz-3N.d.ts → client-BaCHMay9.d.ts} +189 -75
  19. package/dist/{client-DjR-lC16.js → client-BfiZ3HQd.js} +3 -3
  20. package/dist/{client-DjR-lC16.js.map → client-BfiZ3HQd.js.map} +1 -1
  21. package/dist/{client-CmMi85Sj.d.ts → client-CbWe9FBd.d.ts} +10 -10
  22. package/dist/{client-CZBVDDoO.js → client-DpkZyXgJ.js} +239 -124
  23. package/dist/client-DpkZyXgJ.js.map +1 -0
  24. package/dist/client.d.ts +8 -8
  25. package/dist/client.js +2 -2
  26. package/dist/codemode/ai.js +5 -5
  27. package/dist/do-oauth-client-provider-CnbnngL2.d.ts +134 -0
  28. package/dist/{do-oauth-client-provider-B2jr6UNq.js → do-oauth-client-provider-D2P1lSft.js} +3 -3
  29. package/dist/do-oauth-client-provider-D2P1lSft.js.map +1 -0
  30. package/dist/{index-CMEWpbHx.d.ts → index-DCRAdW9R.d.ts} +53 -49
  31. package/dist/{index-W4JUkafc.d.ts → index-DhJCaDWd.d.ts} +7 -3
  32. package/dist/index.d.ts +36 -36
  33. package/dist/index.js +5 -5
  34. package/dist/mcp/client.d.ts +4 -4
  35. package/dist/mcp/client.js +2 -1
  36. package/dist/mcp/do-oauth-client-provider.d.ts +1 -1
  37. package/dist/mcp/do-oauth-client-provider.js +1 -1
  38. package/dist/mcp/index.d.ts +127 -9
  39. package/dist/mcp/index.js +619 -26
  40. package/dist/mcp/index.js.map +1 -1
  41. package/dist/{mcp-BEwaCsxO.d.ts → mcp-Dw5vDrY8.d.ts} +2 -2
  42. package/dist/observability/index.d.ts +2 -2
  43. package/dist/observability/index.js +5 -5
  44. package/dist/{react-jvtffQuA.d.ts → react-DM_FD53F.d.ts} +17 -17
  45. package/dist/react.d.ts +9 -9
  46. package/dist/react.js +1 -1
  47. package/dist/{serializable-gtr9YMhp.d.ts → serializable-CymX8ovI.d.ts} +8 -3
  48. package/dist/serializable.d.ts +5 -5
  49. package/dist/{src-L3cHuAag.js → src-Dk8lwxHf.js} +185 -173
  50. package/dist/src-Dk8lwxHf.js.map +1 -0
  51. package/package.json +52 -37
  52. package/dist/client-CZBVDDoO.js.map +0 -1
  53. package/dist/do-oauth-client-provider-B2jr6UNq.js.map +0 -1
  54. package/dist/do-oauth-client-provider-CCwGwnrA.d.ts +0 -55
  55. package/dist/src-L3cHuAag.js.map +0 -1
@@ -1,13 +1,81 @@
1
- import { MessageType } from "./ai-types-UZlfLOYP.js";
2
- import { camelCaseToKebabCase } from "./client-DjR-lC16.js";
3
- import { DisposableStore, MCPClientManager } from "./client-CZBVDDoO.js";
4
- import { DurableObjectOAuthClientProvider } from "./do-oauth-client-provider-B2jr6UNq.js";
1
+ import { t as MessageType } from "./ai-types-B3aQaFv3.js";
2
+ import { r as camelCaseToKebabCase } from "./client-BfiZ3HQd.js";
3
+ import { r as DisposableStore, t as MCPClientManager } from "./client-DpkZyXgJ.js";
4
+ import { t as DurableObjectOAuthClientProvider } from "./do-oauth-client-provider-D2P1lSft.js";
5
5
  import { AsyncLocalStorage } from "node:async_hooks";
6
6
  import { parseCronExpression } from "cron-schedule";
7
7
  import { nanoid } from "nanoid";
8
8
  import { EmailMessage } from "cloudflare:email";
9
9
  import { Server, getServerByName, routePartykitRequest } from "partyserver";
10
10
 
11
+ //#region src/mcp/client-storage.ts
12
+ /**
13
+ * SQL-based storage adapter that wraps SQL operations
14
+ * Used by Agent class to provide SQL access to MCPClientManager
15
+ */
16
+ var AgentMCPClientStorage = class {
17
+ constructor(sql, kv) {
18
+ this.sql = sql;
19
+ this.kv = kv;
20
+ }
21
+ async saveServer(server) {
22
+ this.sql`
23
+ INSERT OR REPLACE INTO cf_agents_mcp_servers (
24
+ id,
25
+ name,
26
+ server_url,
27
+ client_id,
28
+ auth_url,
29
+ callback_url,
30
+ server_options
31
+ )
32
+ VALUES (
33
+ ${server.id},
34
+ ${server.name},
35
+ ${server.server_url},
36
+ ${server.client_id ?? null},
37
+ ${server.auth_url ?? null},
38
+ ${server.callback_url},
39
+ ${server.server_options ?? null}
40
+ )
41
+ `;
42
+ }
43
+ async removeServer(serverId) {
44
+ this.sql`
45
+ DELETE FROM cf_agents_mcp_servers WHERE id = ${serverId}
46
+ `;
47
+ }
48
+ async listServers() {
49
+ return this.sql`
50
+ SELECT id, name, server_url, client_id, auth_url, callback_url, server_options
51
+ FROM cf_agents_mcp_servers
52
+ `;
53
+ }
54
+ async getServerByCallbackUrl(callbackUrl) {
55
+ const results = this.sql`
56
+ SELECT id, name, server_url, client_id, auth_url, callback_url, server_options
57
+ FROM cf_agents_mcp_servers
58
+ WHERE callback_url = ${callbackUrl}
59
+ LIMIT 1
60
+ `;
61
+ return results.length > 0 ? results[0] : null;
62
+ }
63
+ async clearAuthUrl(serverId) {
64
+ this.sql`
65
+ UPDATE cf_agents_mcp_servers
66
+ SET auth_url = NULL
67
+ WHERE id = ${serverId}
68
+ `;
69
+ }
70
+ async get(key) {
71
+ return this.kv.get(key);
72
+ }
73
+ async put(key, value) {
74
+ return this.kv.put(key, value);
75
+ }
76
+ };
77
+
78
+ //#endregion
11
79
  //#region src/observability/index.ts
12
80
  /**
13
81
  * A generic observability implementation that logs events to the console.
@@ -153,8 +221,8 @@ var Agent = class Agent extends Server {
153
221
  super(ctx, env);
154
222
  this._state = DEFAULT_STATE;
155
223
  this._disposables = new DisposableStore();
224
+ this._destroyed = false;
156
225
  this._ParentClass = Object.getPrototypeOf(this).constructor;
157
- this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1");
158
226
  this.initialState = DEFAULT_STATE;
159
227
  this.observability = genericObservability;
160
228
  this._flushingQueue = false;
@@ -192,28 +260,45 @@ var Agent = class Agent extends Server {
192
260
  }
193
261
  });
194
262
  if (row.type === "cron") {
263
+ if (this._destroyed) return;
195
264
  const nextExecutionTime = getNextCronTime(row.cron);
196
265
  const nextTimestamp = Math.floor(nextExecutionTime.getTime() / 1e3);
197
266
  this.sql`
198
267
  UPDATE cf_agents_schedules SET time = ${nextTimestamp} WHERE id = ${row.id}
199
268
  `;
200
- } else this.sql`
269
+ } else {
270
+ if (this._destroyed) return;
271
+ this.sql`
201
272
  DELETE FROM cf_agents_schedules WHERE id = ${row.id}
202
273
  `;
274
+ }
203
275
  }
276
+ if (this._destroyed) return;
204
277
  await this._scheduleNextAlarm();
205
278
  };
279
+ this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1", { storage: new AgentMCPClientStorage(this.sql.bind(this), this.ctx.storage.kv) });
206
280
  if (!wrappedClasses.has(this.constructor)) {
207
281
  this._autoWrapCustomMethods();
208
282
  wrappedClasses.add(this.constructor);
209
283
  }
210
- this._disposables.add(this.mcp.onConnected(async () => {
211
- this.broadcastMcpServers();
284
+ this._disposables.add(this.mcp.onServerStateChanged(async () => {
285
+ await this.broadcastMcpServers();
212
286
  }));
213
287
  this._disposables.add(this.mcp.onObservabilityEvent((event) => {
214
288
  this.observability?.emit(event);
215
289
  }));
216
290
  this.sql`
291
+ CREATE TABLE IF NOT EXISTS cf_agents_mcp_servers (
292
+ id TEXT PRIMARY KEY NOT NULL,
293
+ name TEXT NOT NULL,
294
+ server_url TEXT NOT NULL,
295
+ callback_url TEXT NOT NULL,
296
+ client_id TEXT,
297
+ auth_url TEXT,
298
+ server_options TEXT
299
+ )
300
+ `;
301
+ this.sql`
217
302
  CREATE TABLE IF NOT EXISTS cf_agents_state (
218
303
  id TEXT PRIMARY KEY NOT NULL,
219
304
  state TEXT
@@ -227,32 +312,16 @@ var Agent = class Agent extends Server {
227
312
  created_at INTEGER DEFAULT (unixepoch())
228
313
  )
229
314
  `;
230
- this.ctx.blockConcurrencyWhile(async () => {
231
- return this._tryCatch(async () => {
232
- this.sql`
233
- CREATE TABLE IF NOT EXISTS cf_agents_schedules (
234
- id TEXT PRIMARY KEY NOT NULL DEFAULT (randomblob(9)),
235
- callback TEXT,
236
- payload TEXT,
237
- type TEXT NOT NULL CHECK(type IN ('scheduled', 'delayed', 'cron')),
238
- time INTEGER,
239
- delayInSeconds INTEGER,
240
- cron TEXT,
241
- created_at INTEGER DEFAULT (unixepoch())
242
- )
243
- `;
244
- await this.alarm();
245
- });
246
- });
247
315
  this.sql`
248
- CREATE TABLE IF NOT EXISTS cf_agents_mcp_servers (
249
- id TEXT PRIMARY KEY NOT NULL,
250
- name TEXT NOT NULL,
251
- server_url TEXT NOT NULL,
252
- callback_url TEXT NOT NULL,
253
- client_id TEXT,
254
- auth_url TEXT,
255
- server_options TEXT
316
+ CREATE TABLE IF NOT EXISTS cf_agents_schedules (
317
+ id TEXT PRIMARY KEY NOT NULL DEFAULT (randomblob(9)),
318
+ callback TEXT,
319
+ payload TEXT,
320
+ type TEXT NOT NULL CHECK(type IN ('scheduled', 'delayed', 'cron')),
321
+ time INTEGER,
322
+ delayInSeconds INTEGER,
323
+ cron TEXT,
324
+ created_at INTEGER DEFAULT (unixepoch())
256
325
  )
257
326
  `;
258
327
  const _onRequest = this.onRequest.bind(this);
@@ -263,8 +332,9 @@ var Agent = class Agent extends Server {
263
332
  request,
264
333
  email: void 0
265
334
  }, async () => {
266
- const callbackResult = await this._handlePotentialOAuthCallback(request);
267
- if (callbackResult) return callbackResult;
335
+ await this.mcp.ensureJsonSchema();
336
+ const oauthResponse = await this.handleMcpOAuthCallback(request);
337
+ if (oauthResponse) return oauthResponse;
268
338
  return this._tryCatch(() => _onRequest(request));
269
339
  });
270
340
  };
@@ -276,6 +346,7 @@ var Agent = class Agent extends Server {
276
346
  request: void 0,
277
347
  email: void 0
278
348
  }, async () => {
349
+ await this.mcp.ensureJsonSchema();
279
350
  if (typeof message !== "string") return this._tryCatch(() => _onMessage(connection, message));
280
351
  let parsed;
281
352
  try {
@@ -340,13 +411,13 @@ var Agent = class Agent extends Server {
340
411
  connection,
341
412
  request: ctx$1.request,
342
413
  email: void 0
343
- }, () => {
414
+ }, async () => {
344
415
  if (this.state) connection.send(JSON.stringify({
345
416
  state: this.state,
346
417
  type: MessageType.CF_AGENT_STATE
347
418
  }));
348
419
  connection.send(JSON.stringify({
349
- mcp: this.getMcpServers(),
420
+ mcp: await this.getMcpServers(),
350
421
  type: MessageType.CF_AGENT_MCP_SERVERS
351
422
  }));
352
423
  this.observability?.emit({
@@ -367,27 +438,9 @@ var Agent = class Agent extends Server {
367
438
  request: void 0,
368
439
  email: void 0
369
440
  }, async () => {
370
- await this._tryCatch(() => {
371
- const servers = this.sql`
372
- SELECT id, name, server_url, client_id, auth_url, callback_url, server_options FROM cf_agents_mcp_servers;
373
- `;
374
- this.broadcastMcpServers();
375
- if (servers && Array.isArray(servers) && servers.length > 0) {
376
- servers.forEach((server) => {
377
- if (server.callback_url) this.mcp.registerCallbackUrl(`${server.callback_url}/${server.id}`);
378
- });
379
- servers.forEach((server) => {
380
- this._connectToMcpServerInternal(server.name, server.server_url, server.callback_url, server.server_options ? JSON.parse(server.server_options) : void 0, {
381
- id: server.id,
382
- oauthClientId: server.client_id ?? void 0
383
- }).then(() => {
384
- this.broadcastMcpServers();
385
- }).catch((error) => {
386
- console.error(`Error connecting to MCP server: ${server.name} (${server.server_url})`, error);
387
- this.broadcastMcpServers();
388
- });
389
- });
390
- }
441
+ await this._tryCatch(async () => {
442
+ await this.mcp.restoreConnectionsFromStorage(this.name);
443
+ await this.broadcastMcpServers();
391
444
  return _onStart(props);
392
445
  });
393
446
  });
@@ -793,7 +846,7 @@ var Agent = class Agent extends Server {
793
846
  async _scheduleNextAlarm() {
794
847
  const result = this.sql`
795
848
  SELECT time FROM cf_agents_schedules
796
- WHERE time > ${Math.floor(Date.now() / 1e3)}
849
+ WHERE time >= ${Math.floor(Date.now() / 1e3)}
797
850
  ORDER BY time ASC
798
851
  LIMIT 1
799
852
  `;
@@ -807,15 +860,18 @@ var Agent = class Agent extends Server {
807
860
  * Destroy the Agent, removing all state and scheduled tasks
808
861
  */
809
862
  async destroy() {
863
+ this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
810
864
  this.sql`DROP TABLE IF EXISTS cf_agents_state`;
811
865
  this.sql`DROP TABLE IF EXISTS cf_agents_schedules`;
812
- this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
813
866
  this.sql`DROP TABLE IF EXISTS cf_agents_queues`;
814
867
  await this.ctx.storage.deleteAlarm();
815
868
  await this.ctx.storage.deleteAll();
816
869
  this._disposables.dispose();
817
- await this.mcp.dispose?.();
818
- this.ctx.abort("destroyed");
870
+ await this.mcp.dispose();
871
+ this._destroyed = true;
872
+ setTimeout(() => {
873
+ this.ctx.abort("destroyed");
874
+ }, 0);
819
875
  this.observability?.emit({
820
876
  displayMessage: "Agent destroyed",
821
877
  id: nanoid(),
@@ -850,89 +906,10 @@ var Agent = class Agent extends Server {
850
906
  resolvedCallbackHost = `${requestUrl.protocol}//${requestUrl.host}`;
851
907
  }
852
908
  const callbackUrl = `${resolvedCallbackHost}/${agentsPrefix}/${camelCaseToKebabCase(this._ParentClass.name)}/${this.name}/callback`;
853
- const serverId = nanoid(8);
854
- this.sql`
855
- INSERT OR REPLACE INTO cf_agents_mcp_servers (id, name, server_url, client_id, auth_url, callback_url, server_options)
856
- VALUES (
857
- ${serverId},
858
- ${serverName},
859
- ${url},
860
- ${null},
861
- ${null},
862
- ${callbackUrl},
863
- ${options ? JSON.stringify(options) : null}
864
- );
865
- `;
866
- const result = await this._connectToMcpServerInternal(serverName, url, callbackUrl, options, { id: serverId });
867
- if (result.clientId || result.authUrl) this.sql`
868
- UPDATE cf_agents_mcp_servers
869
- SET client_id = ${result.clientId ?? null}, auth_url = ${result.authUrl ?? null}
870
- WHERE id = ${serverId}
871
- `;
872
- this.broadcastMcpServers();
873
- return result;
874
- }
875
- /**
876
- * Handle potential OAuth callback requests after DO hibernation.
877
- * Detects OAuth callbacks, restores state from database, and processes the callback.
878
- * Returns a Response if this was an OAuth callback, otherwise returns undefined.
879
- */
880
- async _handlePotentialOAuthCallback(request) {
881
- if (request.method !== "GET") return;
882
- const url = new URL(request.url);
883
- if (!(url.pathname.includes("/callback/") && url.searchParams.has("code"))) return;
884
- const pathParts = url.pathname.split("/");
885
- const callbackIndex = pathParts.indexOf("callback");
886
- const serverId = callbackIndex !== -1 ? pathParts[callbackIndex + 1] : null;
887
- if (!serverId) return new Response("Invalid callback URL: missing serverId", { status: 400 });
888
- if (this.mcp.isCallbackRequest(request) && this.mcp.mcpConnections[serverId]) return this._processOAuthCallback(request);
889
- try {
890
- const server = this.sql`
891
- SELECT id, name, server_url, client_id, auth_url, callback_url, server_options
892
- FROM cf_agents_mcp_servers
893
- WHERE id = ${serverId}
894
- `.find((s) => s.id === serverId);
895
- if (!server) return new Response(`OAuth callback failed: Server ${serverId} not found in database`, { status: 404 });
896
- if (!server.callback_url) return new Response(`OAuth callback failed: No callback URL stored for server ${serverId}`, { status: 500 });
897
- this.mcp.registerCallbackUrl(`${server.callback_url}/${server.id}`);
898
- if (!this.mcp.mcpConnections[serverId]) {
899
- let parsedOptions;
900
- try {
901
- parsedOptions = server.server_options ? JSON.parse(server.server_options) : void 0;
902
- } catch {
903
- return new Response(`OAuth callback failed: Invalid server options in database for ${serverId}`, { status: 500 });
904
- }
905
- await this._connectToMcpServerInternal(server.name, server.server_url, server.callback_url, parsedOptions, {
906
- id: server.id,
907
- oauthClientId: server.client_id ?? void 0
908
- });
909
- }
910
- return this._processOAuthCallback(request);
911
- } catch (error) {
912
- const errorMsg = error instanceof Error ? error.message : "Unknown error";
913
- console.error(`Failed to restore MCP state for ${serverId}:`, error);
914
- return new Response(`OAuth callback failed during state restoration: ${errorMsg}`, { status: 500 });
915
- }
916
- }
917
- /**
918
- * Process an OAuth callback request (assumes state is already restored)
919
- */
920
- async _processOAuthCallback(request) {
921
- const result = await this.mcp.handleCallbackRequest(request);
922
- this.broadcastMcpServers();
923
- if (result.authSuccess) this.mcp.establishConnection(result.serverId).catch((error) => {
924
- console.error("Background connection failed:", error);
925
- }).finally(() => {
926
- this.broadcastMcpServers();
927
- });
928
- return this.handleOAuthCallbackResponse(result, request);
929
- }
930
- async _connectToMcpServerInternal(_serverName, url, callbackUrl, options, reconnect) {
931
- const authProvider = new DurableObjectOAuthClientProvider(this.ctx.storage, this.name, callbackUrl);
932
- if (reconnect) {
933
- authProvider.serverId = reconnect.id;
934
- if (reconnect.oauthClientId) authProvider.clientId = reconnect.oauthClientId;
935
- }
909
+ await this.mcp.ensureJsonSchema();
910
+ const id = nanoid(8);
911
+ const authProvider = new DurableObjectOAuthClientProvider(this.ctx.storage.kv, this.name, callbackUrl);
912
+ authProvider.serverId = id;
936
913
  const transportType = options?.transport?.type ?? "auto";
937
914
  let headerTransportOpts = {};
938
915
  if (options?.transport?.headers) headerTransportOpts = {
@@ -942,59 +919,78 @@ var Agent = class Agent extends Server {
942
919
  }) },
943
920
  requestInit: { headers: options?.transport?.headers }
944
921
  };
945
- const { id, authUrl, clientId } = await this.mcp.connect(url, {
922
+ await this.mcp.registerServer(id, {
923
+ url,
924
+ name: serverName,
925
+ callbackUrl,
946
926
  client: options?.client,
947
- reconnect,
948
927
  transport: {
949
928
  ...headerTransportOpts,
950
929
  authProvider,
951
930
  type: transportType
952
931
  }
953
932
  });
933
+ const result = await this.mcp.connectToServer(id);
954
934
  return {
955
- authUrl,
956
- clientId,
957
- id
935
+ id,
936
+ authUrl: result.state === "authenticating" ? result.authUrl : void 0
958
937
  };
959
938
  }
960
939
  async removeMcpServer(id) {
961
- this.mcp.closeConnection(id);
962
- this.mcp.unregisterCallbackUrl(id);
963
- this.sql`
964
- DELETE FROM cf_agents_mcp_servers WHERE id = ${id};
965
- `;
966
- this.broadcastMcpServers();
940
+ if (this.mcp.mcpConnections[id]) await this.mcp.closeConnection(id);
941
+ await this.mcp.removeServer(id);
967
942
  }
968
- getMcpServers() {
943
+ async getMcpServers() {
969
944
  const mcpState = {
970
945
  prompts: this.mcp.listPrompts(),
971
946
  resources: this.mcp.listResources(),
972
947
  servers: {},
973
948
  tools: this.mcp.listTools()
974
949
  };
975
- const servers = this.sql`
976
- SELECT id, name, server_url, client_id, auth_url, callback_url, server_options FROM cf_agents_mcp_servers;
977
- `;
950
+ const servers = await this.mcp.listServers();
978
951
  if (servers && Array.isArray(servers) && servers.length > 0) for (const server of servers) {
979
952
  const serverConn = this.mcp.mcpConnections[server.id];
953
+ let defaultState = "not-connected";
954
+ if (!serverConn && server.auth_url) defaultState = "authenticating";
980
955
  mcpState.servers[server.id] = {
981
956
  auth_url: server.auth_url,
982
957
  capabilities: serverConn?.serverCapabilities ?? null,
983
958
  instructions: serverConn?.instructions ?? null,
984
959
  name: server.name,
985
960
  server_url: server.server_url,
986
- state: serverConn?.connectionState ?? "authenticating"
961
+ state: serverConn?.connectionState ?? defaultState
987
962
  };
988
963
  }
989
964
  return mcpState;
990
965
  }
991
- broadcastMcpServers() {
966
+ async broadcastMcpServers() {
992
967
  this.broadcast(JSON.stringify({
993
- mcp: this.getMcpServers(),
968
+ mcp: await this.getMcpServers(),
994
969
  type: MessageType.CF_AGENT_MCP_SERVERS
995
970
  }));
996
971
  }
997
972
  /**
973
+ * Handle MCP OAuth callback request if it's an OAuth callback.
974
+ *
975
+ * This method encapsulates the entire OAuth callback flow:
976
+ * 1. Checks if the request is an MCP OAuth callback
977
+ * 2. Processes the OAuth code exchange
978
+ * 3. Establishes the connection if successful
979
+ * 4. Broadcasts MCP server state updates
980
+ * 5. Returns the appropriate HTTP response
981
+ *
982
+ * @param request The incoming HTTP request
983
+ * @returns Response if this was an OAuth callback, null otherwise
984
+ */
985
+ async handleMcpOAuthCallback(request) {
986
+ if (!await this.mcp.isCallbackRequest(request)) return null;
987
+ const result = await this.mcp.handleCallbackRequest(request);
988
+ if (result.authSuccess) this.mcp.establishConnection(result.serverId).catch((error) => {
989
+ console.error("[Agent handleMcpOAuthCallback] Background connection failed:", error);
990
+ });
991
+ return this.handleOAuthCallbackResponse(result, request);
992
+ }
993
+ /**
998
994
  * Handle OAuth callback response using MCPClientManager configuration
999
995
  * @param result OAuth callback result
1000
996
  * @param request The original request (needed for base URL)
@@ -1003,10 +999,21 @@ var Agent = class Agent extends Server {
1003
999
  handleOAuthCallbackResponse(result, request) {
1004
1000
  const config = this.mcp.getOAuthCallbackConfig();
1005
1001
  if (config?.customHandler) return config.customHandler(result);
1006
- if (config?.successRedirect && result.authSuccess) return Response.redirect(config.successRedirect);
1007
- if (config?.errorRedirect && !result.authSuccess) return Response.redirect(`${config.errorRedirect}?error=${encodeURIComponent(result.authError || "Unknown error")}`);
1008
- const baseUrl = new URL(request.url).origin;
1009
- return Response.redirect(baseUrl);
1002
+ const baseOrigin = new URL(request.url).origin;
1003
+ if (config?.successRedirect && result.authSuccess) try {
1004
+ return Response.redirect(new URL(config.successRedirect, baseOrigin).href);
1005
+ } catch (e) {
1006
+ console.error("Invalid successRedirect URL:", config.successRedirect, e);
1007
+ return Response.redirect(baseOrigin);
1008
+ }
1009
+ if (config?.errorRedirect && !result.authSuccess) try {
1010
+ const errorUrl = `${config.errorRedirect}?error=${encodeURIComponent(result.authError || "Unknown error")}`;
1011
+ return Response.redirect(new URL(errorUrl, baseOrigin).href);
1012
+ } catch (e) {
1013
+ console.error("Invalid errorRedirect URL:", config.errorRedirect, e);
1014
+ return Response.redirect(baseOrigin);
1015
+ }
1016
+ return Response.redirect(baseOrigin);
1010
1017
  }
1011
1018
  };
1012
1019
  const wrappedClasses = /* @__PURE__ */ new Set();
@@ -1032,10 +1039,15 @@ async function routeAgentRequest(request, env, options) {
1032
1039
  prefix: "agents",
1033
1040
  ...options
1034
1041
  });
1035
- if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket") response = new Response(response.body, { headers: {
1036
- ...response.headers,
1037
- ...corsHeaders
1038
- } });
1042
+ if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket") {
1043
+ const newHeaders = new Headers(response.headers);
1044
+ for (const [key, value] of Object.entries(corsHeaders)) newHeaders.set(key, value);
1045
+ response = new Response(response.body, {
1046
+ status: response.status,
1047
+ statusText: response.statusText,
1048
+ headers: newHeaders
1049
+ });
1050
+ }
1039
1051
  return response;
1040
1052
  }
1041
1053
  /**
@@ -1227,5 +1239,5 @@ var StreamingResponse = class {
1227
1239
  };
1228
1240
 
1229
1241
  //#endregion
1230
- export { Agent, StreamingResponse, callable, createAddressBasedEmailResolver, createCatchAllEmailResolver, createHeaderBasedEmailResolver, genericObservability, getAgentByName, getCurrentAgent, routeAgentEmail, routeAgentRequest, unstable_callable };
1231
- //# sourceMappingURL=src-L3cHuAag.js.map
1242
+ export { createCatchAllEmailResolver as a, getCurrentAgent as c, unstable_callable as d, genericObservability as f, createAddressBasedEmailResolver as i, routeAgentEmail as l, StreamingResponse as n, createHeaderBasedEmailResolver as o, callable as r, getAgentByName as s, Agent as t, routeAgentRequest as u };
1243
+ //# sourceMappingURL=src-Dk8lwxHf.js.map