agents 0.0.0-ccbea72 → 0.0.0-cd8b7fd

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 (67) hide show
  1. package/README.md +5 -3
  2. package/dist/ai-chat-agent.d.ts +95 -13
  3. package/dist/ai-chat-agent.js +354 -74
  4. package/dist/ai-chat-agent.js.map +1 -1
  5. package/dist/{ai-chat-v5-migration-DBHGW4Hv.js → ai-chat-v5-migration-DguhuLKF.js} +1 -1
  6. package/dist/{ai-chat-v5-migration-DBHGW4Hv.js.map → ai-chat-v5-migration-DguhuLKF.js.map} +1 -1
  7. package/dist/ai-chat-v5-migration.js +1 -1
  8. package/dist/ai-react.d.ts +15 -9
  9. package/dist/ai-react.js +179 -29
  10. package/dist/ai-react.js.map +1 -1
  11. package/dist/{ai-types-B3aQaFv3.js → ai-types-CwgHzwUb.js} +5 -1
  12. package/dist/ai-types-CwgHzwUb.js.map +1 -0
  13. package/dist/{ai-types-D5YoPrBZ.d.ts → ai-types-D_hTbf25.d.ts} +15 -7
  14. package/dist/ai-types.d.ts +1 -1
  15. package/dist/ai-types.js +1 -1
  16. package/dist/cli/index.d.ts +1 -0
  17. package/dist/cli/index.js +28 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/{client-BfiZ3HQd.js → client-CcyhkGfN.js} +2 -2
  20. package/dist/{client-BfiZ3HQd.js.map → client-CcyhkGfN.js.map} +1 -1
  21. package/dist/{client-CbWe9FBd.d.ts → client-ClORm6f0.d.ts} +2 -2
  22. package/dist/client-DfIOsabL.d.ts +834 -0
  23. package/dist/client-QZa2Rq0l.js +1105 -0
  24. package/dist/client-QZa2Rq0l.js.map +1 -0
  25. package/dist/client.d.ts +2 -2
  26. package/dist/client.js +2 -2
  27. package/dist/codemode/ai.js +6 -5
  28. package/dist/codemode/ai.js.map +1 -1
  29. package/dist/context-BkKbAa1R.js +8 -0
  30. package/dist/context-BkKbAa1R.js.map +1 -0
  31. package/dist/context-_sPQqJWv.d.ts +24 -0
  32. package/dist/context.d.ts +6 -0
  33. package/dist/context.js +3 -0
  34. package/dist/{do-oauth-client-provider-DGc5pP0l.d.ts → do-oauth-client-provider-B-ryFIPr.d.ts} +20 -5
  35. package/dist/{do-oauth-client-provider-CswoD5Lu.js → do-oauth-client-provider-B1fVIshX.js} +70 -8
  36. package/dist/do-oauth-client-provider-B1fVIshX.js.map +1 -0
  37. package/dist/{index-DhJCaDWd.d.ts → index-CyDpAVHZ.d.ts} +2 -2
  38. package/dist/{index-D6iosdF4.d.ts → index-DPJ32qQn.d.ts} +83 -66
  39. package/dist/index.d.ts +34 -34
  40. package/dist/index.js +6 -5
  41. package/dist/mcp/client.d.ts +4 -4
  42. package/dist/mcp/client.js +2 -1
  43. package/dist/mcp/do-oauth-client-provider.d.ts +1 -1
  44. package/dist/mcp/do-oauth-client-provider.js +1 -1
  45. package/dist/mcp/index.d.ts +89 -24
  46. package/dist/mcp/index.js +294 -81
  47. package/dist/mcp/index.js.map +1 -1
  48. package/dist/mcp/x402.js +10 -6
  49. package/dist/mcp/x402.js.map +1 -1
  50. package/dist/{mcp-Dw5vDrY8.d.ts → mcp-CzbSsLfc.d.ts} +1 -1
  51. package/dist/observability/index.d.ts +2 -2
  52. package/dist/observability/index.js +6 -5
  53. package/dist/{react-YzfC33jB.d.ts → react-MaOSl7Pr.d.ts} +33 -35
  54. package/dist/react.d.ts +10 -9
  55. package/dist/react.js +2 -2
  56. package/dist/react.js.map +1 -1
  57. package/dist/{serializable-CymX8ovI.d.ts → serializable-C4GLimgv.d.ts} +1 -1
  58. package/dist/serializable.d.ts +1 -1
  59. package/dist/{src-Dz0H9hSU.js → src-BmbDclOA.js} +128 -147
  60. package/dist/src-BmbDclOA.js.map +1 -0
  61. package/package.json +53 -38
  62. package/dist/ai-types-B3aQaFv3.js.map +0 -1
  63. package/dist/client-9Ld2_lnt.js +0 -786
  64. package/dist/client-9Ld2_lnt.js.map +0 -1
  65. package/dist/client-BmMRlvlM.d.ts +0 -5313
  66. package/dist/do-oauth-client-provider-CswoD5Lu.js.map +0 -1
  67. package/dist/src-Dz0H9hSU.js.map +0 -1
@@ -1,8 +1,8 @@
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";
5
- import { AsyncLocalStorage } from "node:async_hooks";
1
+ import { t as agentContext } from "./context-BkKbAa1R.js";
2
+ import { t as MessageType } from "./ai-types-CwgHzwUb.js";
3
+ import { r as camelCaseToKebabCase } from "./client-CcyhkGfN.js";
4
+ import { i as DisposableStore, r as MCPConnectionState, t as MCPClientManager } from "./client-QZa2Rq0l.js";
5
+ import { t as DurableObjectOAuthClientProvider } from "./do-oauth-client-provider-B1fVIshX.js";
6
6
  import { parseCronExpression } from "cron-schedule";
7
7
  import { nanoid } from "nanoid";
8
8
  import { EmailMessage } from "cloudflare:email";
@@ -72,7 +72,6 @@ function getNextCronTime(cron) {
72
72
  const STATE_ROW_ID = "cf_state_row_id";
73
73
  const STATE_WAS_CHANGED = "cf_state_was_changed";
74
74
  const DEFAULT_STATE = {};
75
- const agentContext = new AsyncLocalStorage();
76
75
  function getCurrentAgent() {
77
76
  const store = agentContext.getStore();
78
77
  if (!store) return {
@@ -153,9 +152,8 @@ var Agent = class Agent extends Server {
153
152
  super(ctx, env);
154
153
  this._state = DEFAULT_STATE;
155
154
  this._disposables = new DisposableStore();
156
- this._mcpStateRestored = false;
155
+ this._destroyed = false;
157
156
  this._ParentClass = Object.getPrototypeOf(this).constructor;
158
- this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1");
159
157
  this.initialState = DEFAULT_STATE;
160
158
  this.observability = genericObservability;
161
159
  this._flushingQueue = false;
@@ -193,27 +191,37 @@ var Agent = class Agent extends Server {
193
191
  }
194
192
  });
195
193
  if (row.type === "cron") {
194
+ if (this._destroyed) return;
196
195
  const nextExecutionTime = getNextCronTime(row.cron);
197
196
  const nextTimestamp = Math.floor(nextExecutionTime.getTime() / 1e3);
198
197
  this.sql`
199
198
  UPDATE cf_agents_schedules SET time = ${nextTimestamp} WHERE id = ${row.id}
200
199
  `;
201
- } else this.sql`
200
+ } else {
201
+ if (this._destroyed) return;
202
+ this.sql`
202
203
  DELETE FROM cf_agents_schedules WHERE id = ${row.id}
203
204
  `;
205
+ }
204
206
  }
207
+ if (this._destroyed) return;
205
208
  await this._scheduleNextAlarm();
206
209
  };
207
210
  if (!wrappedClasses.has(this.constructor)) {
208
211
  this._autoWrapCustomMethods();
209
212
  wrappedClasses.add(this.constructor);
210
213
  }
211
- this._disposables.add(this.mcp.onConnected(async () => {
212
- this.broadcastMcpServers();
213
- }));
214
- this._disposables.add(this.mcp.onObservabilityEvent((event) => {
215
- this.observability?.emit(event);
216
- }));
214
+ this.sql`
215
+ CREATE TABLE IF NOT EXISTS cf_agents_mcp_servers (
216
+ id TEXT PRIMARY KEY NOT NULL,
217
+ name TEXT NOT NULL,
218
+ server_url TEXT NOT NULL,
219
+ callback_url TEXT NOT NULL,
220
+ client_id TEXT,
221
+ auth_url TEXT,
222
+ server_options TEXT
223
+ )
224
+ `;
217
225
  this.sql`
218
226
  CREATE TABLE IF NOT EXISTS cf_agents_state (
219
227
  id TEXT PRIMARY KEY NOT NULL,
@@ -228,34 +236,25 @@ var Agent = class Agent extends Server {
228
236
  created_at INTEGER DEFAULT (unixepoch())
229
237
  )
230
238
  `;
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
239
  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
240
+ CREATE TABLE IF NOT EXISTS cf_agents_schedules (
241
+ id TEXT PRIMARY KEY NOT NULL DEFAULT (randomblob(9)),
242
+ callback TEXT,
243
+ payload TEXT,
244
+ type TEXT NOT NULL CHECK(type IN ('scheduled', 'delayed', 'cron')),
245
+ time INTEGER,
246
+ delayInSeconds INTEGER,
247
+ cron TEXT,
248
+ created_at INTEGER DEFAULT (unixepoch())
257
249
  )
258
250
  `;
251
+ this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1", { storage: this.ctx.storage });
252
+ this._disposables.add(this.mcp.onServerStateChanged(async () => {
253
+ this.broadcastMcpServers();
254
+ }));
255
+ this._disposables.add(this.mcp.onObservabilityEvent((event) => {
256
+ this.observability?.emit(event);
257
+ }));
259
258
  const _onRequest = this.onRequest.bind(this);
260
259
  this.onRequest = (request) => {
261
260
  return agentContext.run({
@@ -264,17 +263,9 @@ var Agent = class Agent extends Server {
264
263
  request,
265
264
  email: void 0
266
265
  }, 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
- }
266
+ await this.mcp.ensureJsonSchema();
267
+ const oauthResponse = await this.handleMcpOAuthCallback(request);
268
+ if (oauthResponse) return oauthResponse;
278
269
  return this._tryCatch(() => _onRequest(request));
279
270
  });
280
271
  };
@@ -286,6 +277,7 @@ var Agent = class Agent extends Server {
286
277
  request: void 0,
287
278
  email: void 0
288
279
  }, async () => {
280
+ await this.mcp.ensureJsonSchema();
289
281
  if (typeof message !== "string") return this._tryCatch(() => _onMessage(connection, message));
290
282
  let parsed;
291
283
  try {
@@ -350,7 +342,7 @@ var Agent = class Agent extends Server {
350
342
  connection,
351
343
  request: ctx$1.request,
352
344
  email: void 0
353
- }, () => {
345
+ }, async () => {
354
346
  if (this.state) connection.send(JSON.stringify({
355
347
  state: this.state,
356
348
  type: MessageType.CF_AGENT_STATE
@@ -378,7 +370,7 @@ var Agent = class Agent extends Server {
378
370
  email: void 0
379
371
  }, async () => {
380
372
  await this._tryCatch(async () => {
381
- await this._ensureMcpStateRestored();
373
+ await this.mcp.restoreConnectionsFromStorage(this.name);
382
374
  this.broadcastMcpServers();
383
375
  return _onStart(props);
384
376
  });
@@ -724,10 +716,7 @@ var Agent = class Agent extends Server {
724
716
  const result = this.sql`
725
717
  SELECT * FROM cf_agents_schedules WHERE id = ${id}
726
718
  `;
727
- if (!result) {
728
- console.error(`schedule ${id} not found`);
729
- return;
730
- }
719
+ if (!result || result.length === 0) return;
731
720
  return {
732
721
  ...result[0],
733
722
  payload: JSON.parse(result[0].payload)
@@ -764,11 +753,12 @@ var Agent = class Agent extends Server {
764
753
  /**
765
754
  * Cancel a scheduled task
766
755
  * @param id ID of the task to cancel
767
- * @returns true if the task was cancelled, false otherwise
756
+ * @returns true if the task was cancelled, false if the task was not found
768
757
  */
769
758
  async cancelSchedule(id) {
770
759
  const schedule = await this.getSchedule(id);
771
- if (schedule) this.observability?.emit({
760
+ if (!schedule) return false;
761
+ this.observability?.emit({
772
762
  displayMessage: `Schedule ${id} cancelled`,
773
763
  id: nanoid(),
774
764
  payload: {
@@ -785,7 +775,7 @@ var Agent = class Agent extends Server {
785
775
  async _scheduleNextAlarm() {
786
776
  const result = this.sql`
787
777
  SELECT time FROM cf_agents_schedules
788
- WHERE time > ${Math.floor(Date.now() / 1e3)}
778
+ WHERE time >= ${Math.floor(Date.now() / 1e3)}
789
779
  ORDER BY time ASC
790
780
  LIMIT 1
791
781
  `;
@@ -799,15 +789,18 @@ var Agent = class Agent extends Server {
799
789
  * Destroy the Agent, removing all state and scheduled tasks
800
790
  */
801
791
  async destroy() {
792
+ this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
802
793
  this.sql`DROP TABLE IF EXISTS cf_agents_state`;
803
794
  this.sql`DROP TABLE IF EXISTS cf_agents_schedules`;
804
- this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
805
795
  this.sql`DROP TABLE IF EXISTS cf_agents_queues`;
806
796
  await this.ctx.storage.deleteAlarm();
807
797
  await this.ctx.storage.deleteAll();
808
798
  this._disposables.dispose();
809
- await this.mcp.dispose?.();
810
- this.ctx.abort("destroyed");
799
+ await this.mcp.dispose();
800
+ this._destroyed = true;
801
+ setTimeout(() => {
802
+ this.ctx.abort("destroyed");
803
+ }, 0);
811
804
  this.observability?.emit({
812
805
  displayMessage: "Agent destroyed",
813
806
  id: nanoid(),
@@ -823,43 +816,6 @@ var Agent = class Agent extends Server {
823
816
  _isCallable(method) {
824
817
  return callableMetadata.has(this[method]);
825
818
  }
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
819
  /**
864
820
  * Connect to a new MCP Server
865
821
  *
@@ -868,7 +824,8 @@ var Agent = class Agent extends Server {
868
824
  * @param callbackHost Base host for the agent, used for the redirect URI. If not provided, will be derived from the current request.
869
825
  * @param agentsPrefix agents routing prefix if not using `agents`
870
826
  * @param options MCP client and transport options
871
- * @returns authUrl
827
+ * @returns Server id and state - either "authenticating" with authUrl, or "ready"
828
+ * @throws If connection or discovery fails
872
829
  */
873
830
  async addMcpServer(serverName, url, callbackHost, agentsPrefix = "agents", options) {
874
831
  let resolvedCallbackHost = callbackHost;
@@ -879,29 +836,10 @@ var Agent = class Agent extends Server {
879
836
  resolvedCallbackHost = `${requestUrl.protocol}//${requestUrl.host}`;
880
837
  }
881
838
  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) {
839
+ await this.mcp.ensureJsonSchema();
840
+ const id = nanoid(8);
900
841
  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
- }
842
+ authProvider.serverId = id;
905
843
  const transportType = options?.transport?.type ?? "auto";
906
844
  let headerTransportOpts = {};
907
845
  if (options?.transport?.headers) headerTransportOpts = {
@@ -911,28 +849,33 @@ var Agent = class Agent extends Server {
911
849
  }) },
912
850
  requestInit: { headers: options?.transport?.headers }
913
851
  };
914
- const { id, authUrl, clientId } = await this.mcp.connect(url, {
852
+ await this.mcp.registerServer(id, {
853
+ url,
854
+ name: serverName,
855
+ callbackUrl,
915
856
  client: options?.client,
916
- reconnect,
917
857
  transport: {
918
858
  ...headerTransportOpts,
919
859
  authProvider,
920
860
  type: transportType
921
861
  }
922
862
  });
863
+ const result = await this.mcp.connectToServer(id);
864
+ if (result.state === MCPConnectionState.FAILED) throw new Error(`Failed to connect to MCP server at ${url}: ${result.error}`);
865
+ if (result.state === MCPConnectionState.AUTHENTICATING) return {
866
+ id,
867
+ state: result.state,
868
+ authUrl: result.authUrl
869
+ };
870
+ const discoverResult = await this.mcp.discoverIfConnected(id);
871
+ if (discoverResult && !discoverResult.success) throw new Error(`Failed to discover MCP server capabilities: ${discoverResult.error}`);
923
872
  return {
924
- authUrl,
925
- clientId,
926
- id
873
+ id,
874
+ state: MCPConnectionState.READY
927
875
  };
928
876
  }
929
877
  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();
878
+ await this.mcp.removeServer(id);
936
879
  }
937
880
  getMcpServers() {
938
881
  const mcpState = {
@@ -941,18 +884,18 @@ var Agent = class Agent extends Server {
941
884
  servers: {},
942
885
  tools: this.mcp.listTools()
943
886
  };
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
- `;
887
+ const servers = this.mcp.listServers();
947
888
  if (servers && Array.isArray(servers) && servers.length > 0) for (const server of servers) {
948
889
  const serverConn = this.mcp.mcpConnections[server.id];
890
+ let defaultState = "not-connected";
891
+ if (!serverConn && server.auth_url) defaultState = "authenticating";
949
892
  mcpState.servers[server.id] = {
950
893
  auth_url: server.auth_url,
951
894
  capabilities: serverConn?.serverCapabilities ?? null,
952
895
  instructions: serverConn?.instructions ?? null,
953
896
  name: server.name,
954
897
  server_url: server.server_url,
955
- state: serverConn?.connectionState ?? "authenticating"
898
+ state: serverConn?.connectionState ?? defaultState
956
899
  };
957
900
  }
958
901
  return mcpState;
@@ -964,6 +907,28 @@ var Agent = class Agent extends Server {
964
907
  }));
965
908
  }
966
909
  /**
910
+ * Handle MCP OAuth callback request if it's an OAuth callback.
911
+ *
912
+ * This method encapsulates the entire OAuth callback flow:
913
+ * 1. Checks if the request is an MCP OAuth callback
914
+ * 2. Processes the OAuth code exchange
915
+ * 3. Establishes the connection if successful
916
+ * 4. Broadcasts MCP server state updates
917
+ * 5. Returns the appropriate HTTP response
918
+ *
919
+ * @param request The incoming HTTP request
920
+ * @returns Response if this was an OAuth callback, null otherwise
921
+ */
922
+ async handleMcpOAuthCallback(request) {
923
+ if (!this.mcp.isCallbackRequest(request)) return null;
924
+ const result = await this.mcp.handleCallbackRequest(request);
925
+ if (result.authSuccess) this.mcp.establishConnection(result.serverId).catch((error) => {
926
+ console.error("[Agent handleMcpOAuthCallback] Connection establishment failed:", error);
927
+ });
928
+ this.broadcastMcpServers();
929
+ return this.handleOAuthCallbackResponse(result, request);
930
+ }
931
+ /**
967
932
  * Handle OAuth callback response using MCPClientManager configuration
968
933
  * @param result OAuth callback result
969
934
  * @param request The original request (needed for base URL)
@@ -972,10 +937,21 @@ var Agent = class Agent extends Server {
972
937
  handleOAuthCallbackResponse(result, request) {
973
938
  const config = this.mcp.getOAuthCallbackConfig();
974
939
  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);
940
+ const baseOrigin = new URL(request.url).origin;
941
+ if (config?.successRedirect && result.authSuccess) try {
942
+ return Response.redirect(new URL(config.successRedirect, baseOrigin).href);
943
+ } catch (e) {
944
+ console.error("Invalid successRedirect URL:", config.successRedirect, e);
945
+ return Response.redirect(baseOrigin);
946
+ }
947
+ if (config?.errorRedirect && !result.authSuccess) try {
948
+ const errorUrl = `${config.errorRedirect}?error=${encodeURIComponent(result.authError || "Unknown error")}`;
949
+ return Response.redirect(new URL(errorUrl, baseOrigin).href);
950
+ } catch (e) {
951
+ console.error("Invalid errorRedirect URL:", config.errorRedirect, e);
952
+ return Response.redirect(baseOrigin);
953
+ }
954
+ return Response.redirect(baseOrigin);
979
955
  }
980
956
  };
981
957
  const wrappedClasses = /* @__PURE__ */ new Set();
@@ -1001,10 +977,15 @@ async function routeAgentRequest(request, env, options) {
1001
977
  prefix: "agents",
1002
978
  ...options
1003
979
  });
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
- } });
980
+ if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket") {
981
+ const newHeaders = new Headers(response.headers);
982
+ for (const [key, value] of Object.entries(corsHeaders)) newHeaders.set(key, value);
983
+ response = new Response(response.body, {
984
+ status: response.status,
985
+ statusText: response.statusText,
986
+ headers: newHeaders
987
+ });
988
+ }
1008
989
  return response;
1009
990
  }
1010
991
  /**
@@ -1197,4 +1178,4 @@ var StreamingResponse = class {
1197
1178
 
1198
1179
  //#endregion
1199
1180
  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
1181
+ //# sourceMappingURL=src-BmbDclOA.js.map