agents 0.0.0-5908188 → 0.0.0-59ac254

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 (68) 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-C_M5uPrn.d.ts +834 -0
  20. package/dist/{client-BfiZ3HQd.js → client-CcyhkGfN.js} +2 -2
  21. package/dist/{client-BfiZ3HQd.js.map → client-CcyhkGfN.js.map} +1 -1
  22. package/dist/{client-CbWe9FBd.d.ts → client-ClORm6f0.d.ts} +2 -2
  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-BJOkI2Mo.d.ts → index-DUnsVDnf.d.ts} +83 -74
  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 +98 -24
  46. package/dist/mcp/index.js +298 -91
  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-DbzUBop3.d.ts +131 -0
  54. package/dist/react.d.ts +15 -10
  55. package/dist/react.js +57 -57
  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-CTtjSFyX.js → src-BmbDclOA.js} +129 -179
  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-BmMRlvlM.d.ts +0 -5313
  64. package/dist/client-CIvp_OWw.js +0 -786
  65. package/dist/client-CIvp_OWw.js.map +0 -1
  66. package/dist/do-oauth-client-provider-CswoD5Lu.js.map +0 -1
  67. package/dist/react-7YOau7tS.d.ts +0 -115
  68. package/dist/src-CTtjSFyX.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 { a as DisposableStore, t as MCPClientManager } from "./client-CIvp_OWw.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,8 +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();
155
+ this._destroyed = false;
156
156
  this._ParentClass = Object.getPrototypeOf(this).constructor;
157
- this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1");
158
157
  this.initialState = DEFAULT_STATE;
159
158
  this.observability = genericObservability;
160
159
  this._flushingQueue = false;
@@ -192,27 +191,37 @@ var Agent = class Agent extends Server {
192
191
  }
193
192
  });
194
193
  if (row.type === "cron") {
194
+ if (this._destroyed) return;
195
195
  const nextExecutionTime = getNextCronTime(row.cron);
196
196
  const nextTimestamp = Math.floor(nextExecutionTime.getTime() / 1e3);
197
197
  this.sql`
198
198
  UPDATE cf_agents_schedules SET time = ${nextTimestamp} WHERE id = ${row.id}
199
199
  `;
200
- } else this.sql`
200
+ } else {
201
+ if (this._destroyed) return;
202
+ this.sql`
201
203
  DELETE FROM cf_agents_schedules WHERE id = ${row.id}
202
204
  `;
205
+ }
203
206
  }
207
+ if (this._destroyed) return;
204
208
  await this._scheduleNextAlarm();
205
209
  };
206
210
  if (!wrappedClasses.has(this.constructor)) {
207
211
  this._autoWrapCustomMethods();
208
212
  wrappedClasses.add(this.constructor);
209
213
  }
210
- this._disposables.add(this.mcp.onConnected(async () => {
211
- this.broadcastMcpServers();
212
- }));
213
- this._disposables.add(this.mcp.onObservabilityEvent((event) => {
214
- this.observability?.emit(event);
215
- }));
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
+ `;
216
225
  this.sql`
217
226
  CREATE TABLE IF NOT EXISTS cf_agents_state (
218
227
  id TEXT PRIMARY KEY NOT NULL,
@@ -227,34 +236,25 @@ var Agent = class Agent extends Server {
227
236
  created_at INTEGER DEFAULT (unixepoch())
228
237
  )
229
238
  `;
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
239
  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
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())
256
249
  )
257
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
+ }));
258
258
  const _onRequest = this.onRequest.bind(this);
259
259
  this.onRequest = (request) => {
260
260
  return agentContext.run({
@@ -263,8 +263,9 @@ var Agent = class Agent extends Server {
263
263
  request,
264
264
  email: void 0
265
265
  }, async () => {
266
- const callbackResult = await this._handlePotentialOAuthCallback(request);
267
- if (callbackResult) return callbackResult;
266
+ await this.mcp.ensureJsonSchema();
267
+ const oauthResponse = await this.handleMcpOAuthCallback(request);
268
+ if (oauthResponse) return oauthResponse;
268
269
  return this._tryCatch(() => _onRequest(request));
269
270
  });
270
271
  };
@@ -276,6 +277,7 @@ var Agent = class Agent extends Server {
276
277
  request: void 0,
277
278
  email: void 0
278
279
  }, async () => {
280
+ await this.mcp.ensureJsonSchema();
279
281
  if (typeof message !== "string") return this._tryCatch(() => _onMessage(connection, message));
280
282
  let parsed;
281
283
  try {
@@ -340,7 +342,7 @@ var Agent = class Agent extends Server {
340
342
  connection,
341
343
  request: ctx$1.request,
342
344
  email: void 0
343
- }, () => {
345
+ }, async () => {
344
346
  if (this.state) connection.send(JSON.stringify({
345
347
  state: this.state,
346
348
  type: MessageType.CF_AGENT_STATE
@@ -367,27 +369,9 @@ var Agent = class Agent extends Server {
367
369
  request: void 0,
368
370
  email: void 0
369
371
  }, 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
- `;
372
+ await this._tryCatch(async () => {
373
+ await this.mcp.restoreConnectionsFromStorage(this.name);
374
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
- }
391
375
  return _onStart(props);
392
376
  });
393
377
  });
@@ -732,10 +716,7 @@ var Agent = class Agent extends Server {
732
716
  const result = this.sql`
733
717
  SELECT * FROM cf_agents_schedules WHERE id = ${id}
734
718
  `;
735
- if (!result) {
736
- console.error(`schedule ${id} not found`);
737
- return;
738
- }
719
+ if (!result || result.length === 0) return;
739
720
  return {
740
721
  ...result[0],
741
722
  payload: JSON.parse(result[0].payload)
@@ -772,11 +753,12 @@ var Agent = class Agent extends Server {
772
753
  /**
773
754
  * Cancel a scheduled task
774
755
  * @param id ID of the task to cancel
775
- * @returns true if the task was cancelled, false otherwise
756
+ * @returns true if the task was cancelled, false if the task was not found
776
757
  */
777
758
  async cancelSchedule(id) {
778
759
  const schedule = await this.getSchedule(id);
779
- if (schedule) this.observability?.emit({
760
+ if (!schedule) return false;
761
+ this.observability?.emit({
780
762
  displayMessage: `Schedule ${id} cancelled`,
781
763
  id: nanoid(),
782
764
  payload: {
@@ -793,7 +775,7 @@ var Agent = class Agent extends Server {
793
775
  async _scheduleNextAlarm() {
794
776
  const result = this.sql`
795
777
  SELECT time FROM cf_agents_schedules
796
- WHERE time > ${Math.floor(Date.now() / 1e3)}
778
+ WHERE time >= ${Math.floor(Date.now() / 1e3)}
797
779
  ORDER BY time ASC
798
780
  LIMIT 1
799
781
  `;
@@ -807,15 +789,18 @@ var Agent = class Agent extends Server {
807
789
  * Destroy the Agent, removing all state and scheduled tasks
808
790
  */
809
791
  async destroy() {
792
+ this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
810
793
  this.sql`DROP TABLE IF EXISTS cf_agents_state`;
811
794
  this.sql`DROP TABLE IF EXISTS cf_agents_schedules`;
812
- this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
813
795
  this.sql`DROP TABLE IF EXISTS cf_agents_queues`;
814
796
  await this.ctx.storage.deleteAlarm();
815
797
  await this.ctx.storage.deleteAll();
816
798
  this._disposables.dispose();
817
- await this.mcp.dispose?.();
818
- this.ctx.abort("destroyed");
799
+ await this.mcp.dispose();
800
+ this._destroyed = true;
801
+ setTimeout(() => {
802
+ this.ctx.abort("destroyed");
803
+ }, 0);
819
804
  this.observability?.emit({
820
805
  displayMessage: "Agent destroyed",
821
806
  id: nanoid(),
@@ -839,7 +824,8 @@ var Agent = class Agent extends Server {
839
824
  * @param callbackHost Base host for the agent, used for the redirect URI. If not provided, will be derived from the current request.
840
825
  * @param agentsPrefix agents routing prefix if not using `agents`
841
826
  * @param options MCP client and transport options
842
- * @returns authUrl
827
+ * @returns Server id and state - either "authenticating" with authUrl, or "ready"
828
+ * @throws If connection or discovery fails
843
829
  */
844
830
  async addMcpServer(serverName, url, callbackHost, agentsPrefix = "agents", options) {
845
831
  let resolvedCallbackHost = callbackHost;
@@ -850,89 +836,10 @@ var Agent = class Agent extends Server {
850
836
  resolvedCallbackHost = `${requestUrl.protocol}//${requestUrl.host}`;
851
837
  }
852
838
  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) {
839
+ await this.mcp.ensureJsonSchema();
840
+ const id = nanoid(8);
931
841
  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
- }
842
+ authProvider.serverId = id;
936
843
  const transportType = options?.transport?.type ?? "auto";
937
844
  let headerTransportOpts = {};
938
845
  if (options?.transport?.headers) headerTransportOpts = {
@@ -942,28 +849,33 @@ var Agent = class Agent extends Server {
942
849
  }) },
943
850
  requestInit: { headers: options?.transport?.headers }
944
851
  };
945
- const { id, authUrl, clientId } = await this.mcp.connect(url, {
852
+ await this.mcp.registerServer(id, {
853
+ url,
854
+ name: serverName,
855
+ callbackUrl,
946
856
  client: options?.client,
947
- reconnect,
948
857
  transport: {
949
858
  ...headerTransportOpts,
950
859
  authProvider,
951
860
  type: transportType
952
861
  }
953
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}`);
954
872
  return {
955
- authUrl,
956
- clientId,
957
- id
873
+ id,
874
+ state: MCPConnectionState.READY
958
875
  };
959
876
  }
960
877
  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();
878
+ await this.mcp.removeServer(id);
967
879
  }
968
880
  getMcpServers() {
969
881
  const mcpState = {
@@ -972,18 +884,18 @@ var Agent = class Agent extends Server {
972
884
  servers: {},
973
885
  tools: this.mcp.listTools()
974
886
  };
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
- `;
887
+ const servers = this.mcp.listServers();
978
888
  if (servers && Array.isArray(servers) && servers.length > 0) for (const server of servers) {
979
889
  const serverConn = this.mcp.mcpConnections[server.id];
890
+ let defaultState = "not-connected";
891
+ if (!serverConn && server.auth_url) defaultState = "authenticating";
980
892
  mcpState.servers[server.id] = {
981
893
  auth_url: server.auth_url,
982
894
  capabilities: serverConn?.serverCapabilities ?? null,
983
895
  instructions: serverConn?.instructions ?? null,
984
896
  name: server.name,
985
897
  server_url: server.server_url,
986
- state: serverConn?.connectionState ?? "authenticating"
898
+ state: serverConn?.connectionState ?? defaultState
987
899
  };
988
900
  }
989
901
  return mcpState;
@@ -995,6 +907,28 @@ var Agent = class Agent extends Server {
995
907
  }));
996
908
  }
997
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
+ /**
998
932
  * Handle OAuth callback response using MCPClientManager configuration
999
933
  * @param result OAuth callback result
1000
934
  * @param request The original request (needed for base URL)
@@ -1003,10 +937,21 @@ var Agent = class Agent extends Server {
1003
937
  handleOAuthCallbackResponse(result, request) {
1004
938
  const config = this.mcp.getOAuthCallbackConfig();
1005
939
  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);
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);
1010
955
  }
1011
956
  };
1012
957
  const wrappedClasses = /* @__PURE__ */ new Set();
@@ -1032,10 +977,15 @@ async function routeAgentRequest(request, env, options) {
1032
977
  prefix: "agents",
1033
978
  ...options
1034
979
  });
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
- } });
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
+ }
1039
989
  return response;
1040
990
  }
1041
991
  /**
@@ -1228,4 +1178,4 @@ var StreamingResponse = class {
1228
1178
 
1229
1179
  //#endregion
1230
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 };
1231
- //# sourceMappingURL=src-CTtjSFyX.js.map
1181
+ //# sourceMappingURL=src-BmbDclOA.js.map