agents 0.0.0-ccbea72 → 0.0.0-cccbd0f

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 (61) hide show
  1. package/README.md +5 -3
  2. package/dist/ai-chat-agent.d.ts +86 -13
  3. package/dist/ai-chat-agent.js +340 -74
  4. package/dist/ai-chat-agent.js.map +1 -1
  5. package/dist/{ai-chat-v5-migration-DBHGW4Hv.js → ai-chat-v5-migration-BSiGZmYU.js} +1 -1
  6. package/dist/{ai-chat-v5-migration-DBHGW4Hv.js.map → ai-chat-v5-migration-BSiGZmYU.js.map} +1 -1
  7. package/dist/ai-chat-v5-migration.js +1 -1
  8. package/dist/ai-react.d.ts +14 -9
  9. package/dist/ai-react.js +164 -29
  10. package/dist/ai-react.js.map +1 -1
  11. package/dist/{ai-types-D5YoPrBZ.d.ts → ai-types-81H_-Uxh.d.ts} +15 -7
  12. package/dist/{ai-types-B3aQaFv3.js → ai-types-CrMqkwc_.js} +5 -1
  13. package/dist/ai-types-CrMqkwc_.js.map +1 -0
  14. package/dist/ai-types.d.ts +1 -1
  15. package/dist/ai-types.js +1 -1
  16. package/dist/cli.d.ts +8 -0
  17. package/dist/cli.js +27 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/{client-BfiZ3HQd.js → client-B3SR12TQ.js} +2 -2
  20. package/dist/{client-BfiZ3HQd.js.map → client-B3SR12TQ.js.map} +1 -1
  21. package/dist/{client-CbWe9FBd.d.ts → client-BAQA84dr.d.ts} +2 -2
  22. package/dist/{client-9Ld2_lnt.js → client-BZ-xTxF5.js} +239 -124
  23. package/dist/client-BZ-xTxF5.js.map +1 -0
  24. package/dist/client-ctTw3KHG.d.ts +1440 -0
  25. package/dist/client.d.ts +2 -2
  26. package/dist/client.js +2 -2
  27. package/dist/codemode/ai.js +5 -5
  28. package/dist/{do-oauth-client-provider-CswoD5Lu.js → do-oauth-client-provider-Cs9QpXYp.js} +2 -2
  29. package/dist/do-oauth-client-provider-Cs9QpXYp.js.map +1 -0
  30. package/dist/do-oauth-client-provider-UhQDpDb8.d.ts +134 -0
  31. package/dist/{index-DhJCaDWd.d.ts → index-BUle9RiP.d.ts} +2 -2
  32. package/dist/{index-D6iosdF4.d.ts → index-D2dnUH0r.d.ts} +40 -22
  33. package/dist/index.d.ts +6 -6
  34. package/dist/index.js +5 -5
  35. package/dist/mcp/client.d.ts +4 -4
  36. package/dist/mcp/client.js +2 -1
  37. package/dist/mcp/do-oauth-client-provider.d.ts +1 -1
  38. package/dist/mcp/do-oauth-client-provider.js +1 -1
  39. package/dist/mcp/index.d.ts +88 -24
  40. package/dist/mcp/index.js +293 -81
  41. package/dist/mcp/index.js.map +1 -1
  42. package/dist/mcp/x402.js +10 -6
  43. package/dist/mcp/x402.js.map +1 -1
  44. package/dist/{mcp-Dw5vDrY8.d.ts → mcp-BwPscEiF.d.ts} +1 -1
  45. package/dist/observability/index.d.ts +2 -2
  46. package/dist/observability/index.js +5 -5
  47. package/dist/{react-YzfC33jB.d.ts → react-B_ENAdCe.d.ts} +33 -35
  48. package/dist/react.d.ts +9 -9
  49. package/dist/react.js +2 -2
  50. package/dist/react.js.map +1 -1
  51. package/dist/{serializable-CymX8ovI.d.ts → serializable-faDkMCai.d.ts} +1 -1
  52. package/dist/serializable.d.ts +1 -1
  53. package/dist/{src-Dz0H9hSU.js → src-C6rC6ZpH.js} +188 -140
  54. package/dist/src-C6rC6ZpH.js.map +1 -0
  55. package/package.json +53 -38
  56. package/dist/ai-types-B3aQaFv3.js.map +0 -1
  57. package/dist/client-9Ld2_lnt.js.map +0 -1
  58. package/dist/client-BmMRlvlM.d.ts +0 -5313
  59. package/dist/do-oauth-client-provider-CswoD5Lu.js.map +0 -1
  60. package/dist/do-oauth-client-provider-DGc5pP0l.d.ts +0 -55
  61. package/dist/src-Dz0H9hSU.js.map +0 -1
@@ -1,13 +1,81 @@
1
- import { t as MessageType } from "./ai-types-B3aQaFv3.js";
2
- import { r as camelCaseToKebabCase } from "./client-BfiZ3HQd.js";
3
- import { o as DisposableStore, r as MCPClientConnection, t as MCPClientManager } from "./client-9Ld2_lnt.js";
4
- import { t as DurableObjectOAuthClientProvider } from "./do-oauth-client-provider-CswoD5Lu.js";
1
+ import { t as MessageType } from "./ai-types-CrMqkwc_.js";
2
+ import { r as camelCaseToKebabCase } from "./client-B3SR12TQ.js";
3
+ import { r as DisposableStore, t as MCPClientManager } from "./client-BZ-xTxF5.js";
4
+ import { t as DurableObjectOAuthClientProvider } from "./do-oauth-client-provider-Cs9QpXYp.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,9 +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();
156
- this._mcpStateRestored = false;
224
+ this._destroyed = false;
157
225
  this._ParentClass = Object.getPrototypeOf(this).constructor;
158
- this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1");
159
226
  this.initialState = DEFAULT_STATE;
160
227
  this.observability = genericObservability;
161
228
  this._flushingQueue = false;
@@ -193,28 +260,45 @@ var Agent = class Agent extends Server {
193
260
  }
194
261
  });
195
262
  if (row.type === "cron") {
263
+ if (this._destroyed) return;
196
264
  const nextExecutionTime = getNextCronTime(row.cron);
197
265
  const nextTimestamp = Math.floor(nextExecutionTime.getTime() / 1e3);
198
266
  this.sql`
199
267
  UPDATE cf_agents_schedules SET time = ${nextTimestamp} WHERE id = ${row.id}
200
268
  `;
201
- } else this.sql`
269
+ } else {
270
+ if (this._destroyed) return;
271
+ this.sql`
202
272
  DELETE FROM cf_agents_schedules WHERE id = ${row.id}
203
273
  `;
274
+ }
204
275
  }
276
+ if (this._destroyed) return;
205
277
  await this._scheduleNextAlarm();
206
278
  };
279
+ this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1", { storage: new AgentMCPClientStorage(this.sql.bind(this), this.ctx.storage.kv) });
207
280
  if (!wrappedClasses.has(this.constructor)) {
208
281
  this._autoWrapCustomMethods();
209
282
  wrappedClasses.add(this.constructor);
210
283
  }
211
- this._disposables.add(this.mcp.onConnected(async () => {
212
- this.broadcastMcpServers();
284
+ this._disposables.add(this.mcp.onServerStateChanged(async () => {
285
+ await this.broadcastMcpServers();
213
286
  }));
214
287
  this._disposables.add(this.mcp.onObservabilityEvent((event) => {
215
288
  this.observability?.emit(event);
216
289
  }));
217
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`
218
302
  CREATE TABLE IF NOT EXISTS cf_agents_state (
219
303
  id TEXT PRIMARY KEY NOT NULL,
220
304
  state TEXT
@@ -228,32 +312,16 @@ var Agent = class Agent extends Server {
228
312
  created_at INTEGER DEFAULT (unixepoch())
229
313
  )
230
314
  `;
231
- this.ctx.blockConcurrencyWhile(async () => {
232
- return this._tryCatch(async () => {
233
- this.sql`
234
- CREATE TABLE IF NOT EXISTS cf_agents_schedules (
235
- id TEXT PRIMARY KEY NOT NULL DEFAULT (randomblob(9)),
236
- callback TEXT,
237
- payload TEXT,
238
- type TEXT NOT NULL CHECK(type IN ('scheduled', 'delayed', 'cron')),
239
- time INTEGER,
240
- delayInSeconds INTEGER,
241
- cron TEXT,
242
- created_at INTEGER DEFAULT (unixepoch())
243
- )
244
- `;
245
- await this.alarm();
246
- });
247
- });
248
315
  this.sql`
249
- CREATE TABLE IF NOT EXISTS cf_agents_mcp_servers (
250
- id TEXT PRIMARY KEY NOT NULL,
251
- name TEXT NOT NULL,
252
- server_url TEXT NOT NULL,
253
- callback_url TEXT NOT NULL,
254
- client_id TEXT,
255
- auth_url TEXT,
256
- 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())
257
325
  )
258
326
  `;
259
327
  const _onRequest = this.onRequest.bind(this);
@@ -264,17 +332,9 @@ var Agent = class Agent extends Server {
264
332
  request,
265
333
  email: void 0
266
334
  }, async () => {
267
- await this._ensureMcpStateRestored();
268
- if (this.mcp.isCallbackRequest(request)) {
269
- const result = await this.mcp.handleCallbackRequest(request);
270
- this.broadcastMcpServers();
271
- if (result.authSuccess) this.mcp.establishConnection(result.serverId).catch((error) => {
272
- console.error("Background connection failed:", error);
273
- }).finally(() => {
274
- this.broadcastMcpServers();
275
- });
276
- return this.handleOAuthCallbackResponse(result, request);
277
- }
335
+ await this.mcp.ensureJsonSchema();
336
+ const oauthResponse = await this.handleMcpOAuthCallback(request);
337
+ if (oauthResponse) return oauthResponse;
278
338
  return this._tryCatch(() => _onRequest(request));
279
339
  });
280
340
  };
@@ -286,6 +346,7 @@ var Agent = class Agent extends Server {
286
346
  request: void 0,
287
347
  email: void 0
288
348
  }, async () => {
349
+ await this.mcp.ensureJsonSchema();
289
350
  if (typeof message !== "string") return this._tryCatch(() => _onMessage(connection, message));
290
351
  let parsed;
291
352
  try {
@@ -350,13 +411,13 @@ var Agent = class Agent extends Server {
350
411
  connection,
351
412
  request: ctx$1.request,
352
413
  email: void 0
353
- }, () => {
414
+ }, async () => {
354
415
  if (this.state) connection.send(JSON.stringify({
355
416
  state: this.state,
356
417
  type: MessageType.CF_AGENT_STATE
357
418
  }));
358
419
  connection.send(JSON.stringify({
359
- mcp: this.getMcpServers(),
420
+ mcp: await this.getMcpServers(),
360
421
  type: MessageType.CF_AGENT_MCP_SERVERS
361
422
  }));
362
423
  this.observability?.emit({
@@ -378,8 +439,8 @@ var Agent = class Agent extends Server {
378
439
  email: void 0
379
440
  }, async () => {
380
441
  await this._tryCatch(async () => {
381
- await this._ensureMcpStateRestored();
382
- this.broadcastMcpServers();
442
+ await this.mcp.restoreConnectionsFromStorage(this.name);
443
+ await this.broadcastMcpServers();
383
444
  return _onStart(props);
384
445
  });
385
446
  });
@@ -785,7 +846,7 @@ var Agent = class Agent extends Server {
785
846
  async _scheduleNextAlarm() {
786
847
  const result = this.sql`
787
848
  SELECT time FROM cf_agents_schedules
788
- WHERE time > ${Math.floor(Date.now() / 1e3)}
849
+ WHERE time >= ${Math.floor(Date.now() / 1e3)}
789
850
  ORDER BY time ASC
790
851
  LIMIT 1
791
852
  `;
@@ -799,15 +860,18 @@ var Agent = class Agent extends Server {
799
860
  * Destroy the Agent, removing all state and scheduled tasks
800
861
  */
801
862
  async destroy() {
863
+ this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
802
864
  this.sql`DROP TABLE IF EXISTS cf_agents_state`;
803
865
  this.sql`DROP TABLE IF EXISTS cf_agents_schedules`;
804
- this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
805
866
  this.sql`DROP TABLE IF EXISTS cf_agents_queues`;
806
867
  await this.ctx.storage.deleteAlarm();
807
868
  await this.ctx.storage.deleteAll();
808
869
  this._disposables.dispose();
809
- await this.mcp.dispose?.();
810
- this.ctx.abort("destroyed");
870
+ await this.mcp.dispose();
871
+ this._destroyed = true;
872
+ setTimeout(() => {
873
+ this.ctx.abort("destroyed");
874
+ }, 0);
811
875
  this.observability?.emit({
812
876
  displayMessage: "Agent destroyed",
813
877
  id: nanoid(),
@@ -823,43 +887,6 @@ var Agent = class Agent extends Server {
823
887
  _isCallable(method) {
824
888
  return callableMetadata.has(this[method]);
825
889
  }
826
- async _ensureMcpStateRestored() {
827
- if (this._mcpStateRestored) return;
828
- this._mcpStateRestored = true;
829
- const servers = this.sql`
830
- SELECT id, name, server_url, client_id, auth_url, callback_url, server_options
831
- FROM cf_agents_mcp_servers
832
- `;
833
- if (!servers || !Array.isArray(servers) || servers.length === 0) return;
834
- for (const server of servers) if (server.callback_url) this.mcp.registerCallbackUrl(`${server.callback_url}/${server.id}`);
835
- for (const server of servers) if (!!server.auth_url) {
836
- const authProvider = new DurableObjectOAuthClientProvider(this.ctx.storage, this.name, server.callback_url);
837
- authProvider.serverId = server.id;
838
- if (server.client_id) authProvider.clientId = server.client_id;
839
- const parsedOptions = server.server_options ? JSON.parse(server.server_options) : void 0;
840
- const conn = new MCPClientConnection(new URL(server.server_url), {
841
- name: this.name,
842
- version: "1.0.0"
843
- }, {
844
- client: parsedOptions?.client ?? {},
845
- transport: {
846
- ...parsedOptions?.transport ?? {},
847
- type: parsedOptions?.transport?.type ?? "auto",
848
- authProvider
849
- }
850
- });
851
- conn.connectionState = "authenticating";
852
- this.mcp.mcpConnections[server.id] = conn;
853
- } else {
854
- const parsedOptions = server.server_options ? JSON.parse(server.server_options) : void 0;
855
- this._connectToMcpServerInternal(server.name, server.server_url, server.callback_url, parsedOptions, {
856
- id: server.id,
857
- oauthClientId: server.client_id ?? void 0
858
- }).catch((error) => {
859
- console.error(`Error restoring ${server.id}:`, error);
860
- });
861
- }
862
- }
863
890
  /**
864
891
  * Connect to a new MCP Server
865
892
  *
@@ -879,29 +906,10 @@ var Agent = class Agent extends Server {
879
906
  resolvedCallbackHost = `${requestUrl.protocol}//${requestUrl.host}`;
880
907
  }
881
908
  const callbackUrl = `${resolvedCallbackHost}/${agentsPrefix}/${camelCaseToKebabCase(this._ParentClass.name)}/${this.name}/callback`;
882
- const result = await this._connectToMcpServerInternal(serverName, url, callbackUrl, options);
883
- this.sql`
884
- INSERT
885
- OR REPLACE INTO cf_agents_mcp_servers (id, name, server_url, client_id, auth_url, callback_url, server_options)
886
- VALUES (
887
- ${result.id},
888
- ${serverName},
889
- ${url},
890
- ${result.clientId ?? null},
891
- ${result.authUrl ?? null},
892
- ${callbackUrl},
893
- ${options ? JSON.stringify(options) : null}
894
- );
895
- `;
896
- this.broadcastMcpServers();
897
- return result;
898
- }
899
- async _connectToMcpServerInternal(_serverName, url, callbackUrl, options, reconnect) {
900
- const authProvider = new DurableObjectOAuthClientProvider(this.ctx.storage, this.name, callbackUrl);
901
- if (reconnect) {
902
- authProvider.serverId = reconnect.id;
903
- if (reconnect.oauthClientId) authProvider.clientId = reconnect.oauthClientId;
904
- }
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;
905
913
  const transportType = options?.transport?.type ?? "auto";
906
914
  let headerTransportOpts = {};
907
915
  if (options?.transport?.headers) headerTransportOpts = {
@@ -911,59 +919,83 @@ var Agent = class Agent extends Server {
911
919
  }) },
912
920
  requestInit: { headers: options?.transport?.headers }
913
921
  };
914
- const { id, authUrl, clientId } = await this.mcp.connect(url, {
922
+ await this.mcp.registerServer(id, {
923
+ url,
924
+ name: serverName,
925
+ callbackUrl,
915
926
  client: options?.client,
916
- reconnect,
917
927
  transport: {
918
928
  ...headerTransportOpts,
919
929
  authProvider,
920
930
  type: transportType
921
931
  }
922
932
  });
933
+ const result = await this.mcp.connectToServer(id);
923
934
  return {
924
- authUrl,
925
- clientId,
926
- id
935
+ id,
936
+ authUrl: result.state === "authenticating" ? result.authUrl : void 0
927
937
  };
928
938
  }
929
939
  async removeMcpServer(id) {
930
- this.mcp.closeConnection(id);
931
- this.mcp.unregisterCallbackUrl(id);
932
- this.sql`
933
- DELETE FROM cf_agents_mcp_servers WHERE id = ${id};
934
- `;
935
- this.broadcastMcpServers();
940
+ if (this.mcp.mcpConnections[id]) await this.mcp.closeConnection(id);
941
+ await this.mcp.removeServer(id);
936
942
  }
937
- getMcpServers() {
943
+ async getMcpServers() {
938
944
  const mcpState = {
939
945
  prompts: this.mcp.listPrompts(),
940
946
  resources: this.mcp.listResources(),
941
947
  servers: {},
942
948
  tools: this.mcp.listTools()
943
949
  };
944
- const servers = this.sql`
945
- SELECT id, name, server_url, client_id, auth_url, callback_url, server_options FROM cf_agents_mcp_servers;
946
- `;
950
+ const servers = await this.mcp.listServers();
947
951
  if (servers && Array.isArray(servers) && servers.length > 0) for (const server of servers) {
948
952
  const serverConn = this.mcp.mcpConnections[server.id];
953
+ let defaultState = "not-connected";
954
+ if (!serverConn && server.auth_url) defaultState = "authenticating";
949
955
  mcpState.servers[server.id] = {
950
956
  auth_url: server.auth_url,
951
957
  capabilities: serverConn?.serverCapabilities ?? null,
952
958
  instructions: serverConn?.instructions ?? null,
953
959
  name: server.name,
954
960
  server_url: server.server_url,
955
- state: serverConn?.connectionState ?? "authenticating"
961
+ state: serverConn?.connectionState ?? defaultState
956
962
  };
957
963
  }
958
964
  return mcpState;
959
965
  }
960
- broadcastMcpServers() {
966
+ async broadcastMcpServers() {
961
967
  this.broadcast(JSON.stringify({
962
- mcp: this.getMcpServers(),
968
+ mcp: await this.getMcpServers(),
963
969
  type: MessageType.CF_AGENT_MCP_SERVERS
964
970
  }));
965
971
  }
966
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) {
989
+ this.broadcastMcpServers();
990
+ this.mcp.establishConnection(result.serverId).catch((error) => {
991
+ console.error("[Agent handleMcpOAuthCallback] Connection establishment failed:", error);
992
+ }).finally(() => {
993
+ this.broadcastMcpServers();
994
+ });
995
+ }
996
+ return this.handleOAuthCallbackResponse(result, request);
997
+ }
998
+ /**
967
999
  * Handle OAuth callback response using MCPClientManager configuration
968
1000
  * @param result OAuth callback result
969
1001
  * @param request The original request (needed for base URL)
@@ -972,10 +1004,21 @@ var Agent = class Agent extends Server {
972
1004
  handleOAuthCallbackResponse(result, request) {
973
1005
  const config = this.mcp.getOAuthCallbackConfig();
974
1006
  if (config?.customHandler) return config.customHandler(result);
975
- if (config?.successRedirect && result.authSuccess) return Response.redirect(config.successRedirect);
976
- if (config?.errorRedirect && !result.authSuccess) return Response.redirect(`${config.errorRedirect}?error=${encodeURIComponent(result.authError || "Unknown error")}`);
977
- const baseUrl = new URL(request.url).origin;
978
- return Response.redirect(baseUrl);
1007
+ const baseOrigin = new URL(request.url).origin;
1008
+ if (config?.successRedirect && result.authSuccess) try {
1009
+ return Response.redirect(new URL(config.successRedirect, baseOrigin).href);
1010
+ } catch (e) {
1011
+ console.error("Invalid successRedirect URL:", config.successRedirect, e);
1012
+ return Response.redirect(baseOrigin);
1013
+ }
1014
+ if (config?.errorRedirect && !result.authSuccess) try {
1015
+ const errorUrl = `${config.errorRedirect}?error=${encodeURIComponent(result.authError || "Unknown error")}`;
1016
+ return Response.redirect(new URL(errorUrl, baseOrigin).href);
1017
+ } catch (e) {
1018
+ console.error("Invalid errorRedirect URL:", config.errorRedirect, e);
1019
+ return Response.redirect(baseOrigin);
1020
+ }
1021
+ return Response.redirect(baseOrigin);
979
1022
  }
980
1023
  };
981
1024
  const wrappedClasses = /* @__PURE__ */ new Set();
@@ -1001,10 +1044,15 @@ async function routeAgentRequest(request, env, options) {
1001
1044
  prefix: "agents",
1002
1045
  ...options
1003
1046
  });
1004
- if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket") response = new Response(response.body, { headers: {
1005
- ...response.headers,
1006
- ...corsHeaders
1007
- } });
1047
+ if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket") {
1048
+ const newHeaders = new Headers(response.headers);
1049
+ for (const [key, value] of Object.entries(corsHeaders)) newHeaders.set(key, value);
1050
+ response = new Response(response.body, {
1051
+ status: response.status,
1052
+ statusText: response.statusText,
1053
+ headers: newHeaders
1054
+ });
1055
+ }
1008
1056
  return response;
1009
1057
  }
1010
1058
  /**
@@ -1197,4 +1245,4 @@ var StreamingResponse = class {
1197
1245
 
1198
1246
  //#endregion
1199
1247
  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 };
1200
- //# sourceMappingURL=src-Dz0H9hSU.js.map
1248
+ //# sourceMappingURL=src-C6rC6ZpH.js.map