agents 0.0.0-4dafe91 → 0.0.0-4ebd6e4

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 (36) hide show
  1. package/dist/ai-chat-agent.d.ts +3 -3
  2. package/dist/ai-chat-agent.js +3 -3
  3. package/dist/ai-chat-agent.js.map +1 -1
  4. package/dist/ai-react.d.ts +4 -4
  5. package/dist/ai-react.js +8 -3
  6. package/dist/ai-react.js.map +1 -1
  7. package/dist/cli.d.ts +8 -0
  8. package/dist/cli.js +27 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/{client-Csp_m13H.d.ts → client-D4R9pcB-.d.ts} +191 -79
  11. package/dist/{client-9Ld2_lnt.js → client-DvK0u9vD.js} +236 -124
  12. package/dist/client-DvK0u9vD.js.map +1 -0
  13. package/dist/codemode/ai.js +3 -3
  14. package/dist/do-oauth-client-provider-CcTno-25.d.ts +142 -0
  15. package/dist/{do-oauth-client-provider-CswoD5Lu.js → do-oauth-client-provider-D2P1lSft.js} +2 -2
  16. package/dist/do-oauth-client-provider-D2P1lSft.js.map +1 -0
  17. package/dist/{index-DFqsR7mb.d.ts → index-D76wnQcf.d.ts} +30 -18
  18. package/dist/index.d.ts +3 -3
  19. package/dist/index.js +3 -3
  20. package/dist/mcp/client.d.ts +3 -3
  21. package/dist/mcp/client.js +2 -1
  22. package/dist/mcp/do-oauth-client-provider.d.ts +1 -1
  23. package/dist/mcp/do-oauth-client-provider.js +1 -1
  24. package/dist/mcp/index.d.ts +68 -29
  25. package/dist/mcp/index.js +81 -10
  26. package/dist/mcp/index.js.map +1 -1
  27. package/dist/observability/index.js +3 -3
  28. package/dist/{react-NCPvtyCY.d.ts → react-DiQhRddQ.d.ts} +31 -33
  29. package/dist/react.d.ts +4 -4
  30. package/dist/{src-Dz0H9hSU.js → src-C1WWpbRo.js} +185 -138
  31. package/dist/src-C1WWpbRo.js.map +1 -0
  32. package/package.json +52 -37
  33. package/dist/client-9Ld2_lnt.js.map +0 -1
  34. package/dist/do-oauth-client-provider-CswoD5Lu.js.map +0 -1
  35. package/dist/do-oauth-client-provider-DGc5pP0l.d.ts +0 -55
  36. package/dist/src-Dz0H9hSU.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { m as MCPServersState, t as Agent } from "./index-DFqsR7mb.js";
1
+ import { m as MCPServersState, t as Agent } from "./index-D76wnQcf.js";
2
2
  import { n as RPCMethod, t as Method } from "./serializable-CymX8ovI.js";
3
3
  import { i as StreamOptions } from "./client-CbWe9FBd.js";
4
4
  import { PartySocket } from "partysocket";
@@ -29,48 +29,46 @@ type UseAgentOptions<State = unknown> = Omit<
29
29
  /** Called when MCP server state is updated */
30
30
  onMcpUpdate?: (mcpServers: MCPServersState) => void;
31
31
  };
32
- type AllOptional<T$1> = T$1 extends [infer A, ...infer R]
32
+ type AllOptional<T> = T extends [infer A, ...infer R]
33
33
  ? undefined extends A
34
34
  ? AllOptional<R>
35
35
  : false
36
36
  : true;
37
- type RPCMethods<T$1> = {
38
- [K in keyof T$1 as T$1[K] extends RPCMethod<T$1[K]> ? K : never]: RPCMethod<
39
- T$1[K]
40
- >;
37
+ type RPCMethods<T> = {
38
+ [K in keyof T as T[K] extends RPCMethod<T[K]> ? K : never]: RPCMethod<T[K]>;
41
39
  };
42
- type OptionalParametersMethod<T$1 extends RPCMethod> =
43
- AllOptional<Parameters<T$1>> extends true ? T$1 : never;
44
- type AgentMethods<T$1> = Omit<RPCMethods<T$1>, keyof Agent<any, any>>;
45
- type OptionalAgentMethods<T$1> = {
46
- [K in keyof AgentMethods<T$1> as AgentMethods<T$1>[K] extends OptionalParametersMethod<
47
- AgentMethods<T$1>[K]
40
+ type OptionalParametersMethod<T extends RPCMethod> =
41
+ AllOptional<Parameters<T>> extends true ? T : never;
42
+ type AgentMethods<T> = Omit<RPCMethods<T>, keyof Agent<any, any>>;
43
+ type OptionalAgentMethods<T> = {
44
+ [K in keyof AgentMethods<T> as AgentMethods<T>[K] extends OptionalParametersMethod<
45
+ AgentMethods<T>[K]
48
46
  >
49
47
  ? K
50
- : never]: OptionalParametersMethod<AgentMethods<T$1>[K]>;
48
+ : never]: OptionalParametersMethod<AgentMethods<T>[K]>;
51
49
  };
52
- type RequiredAgentMethods<T$1> = Omit<
53
- AgentMethods<T$1>,
54
- keyof OptionalAgentMethods<T$1>
50
+ type RequiredAgentMethods<T> = Omit<
51
+ AgentMethods<T>,
52
+ keyof OptionalAgentMethods<T>
55
53
  >;
56
- type AgentPromiseReturnType<T$1, K$1 extends keyof AgentMethods<T$1>> =
57
- ReturnType<AgentMethods<T$1>[K$1]> extends Promise<any>
58
- ? ReturnType<AgentMethods<T$1>[K$1]>
59
- : Promise<ReturnType<AgentMethods<T$1>[K$1]>>;
54
+ type AgentPromiseReturnType<T, K$1 extends keyof AgentMethods<T>> =
55
+ ReturnType<AgentMethods<T>[K$1]> extends Promise<any>
56
+ ? ReturnType<AgentMethods<T>[K$1]>
57
+ : Promise<ReturnType<AgentMethods<T>[K$1]>>;
60
58
  type OptionalArgsAgentMethodCall<AgentT> = <
61
- K extends keyof OptionalAgentMethods<AgentT>
59
+ K$1 extends keyof OptionalAgentMethods<AgentT>
62
60
  >(
63
- method: K,
64
- args?: Parameters<OptionalAgentMethods<AgentT>[K]>,
61
+ method: K$1,
62
+ args?: Parameters<OptionalAgentMethods<AgentT>[K$1]>,
65
63
  streamOptions?: StreamOptions
66
- ) => AgentPromiseReturnType<AgentT, K>;
64
+ ) => AgentPromiseReturnType<AgentT, K$1>;
67
65
  type RequiredArgsAgentMethodCall<AgentT> = <
68
- K extends keyof RequiredAgentMethods<AgentT>
66
+ K$1 extends keyof RequiredAgentMethods<AgentT>
69
67
  >(
70
- method: K,
71
- args: Parameters<RequiredAgentMethods<AgentT>[K]>,
68
+ method: K$1,
69
+ args: Parameters<RequiredAgentMethods<AgentT>[K$1]>,
72
70
  streamOptions?: StreamOptions
73
- ) => AgentPromiseReturnType<AgentT, K>;
71
+ ) => AgentPromiseReturnType<AgentT, K$1>;
74
72
  type AgentMethodCall<AgentT> = OptionalArgsAgentMethodCall<AgentT> &
75
73
  RequiredArgsAgentMethodCall<AgentT>;
76
74
  type UntypedAgentMethodCall = <T = unknown>(
@@ -78,10 +76,10 @@ type UntypedAgentMethodCall = <T = unknown>(
78
76
  args?: unknown[],
79
77
  streamOptions?: StreamOptions
80
78
  ) => Promise<T>;
81
- type AgentStub<T$1> = {
82
- [K in keyof AgentMethods<T$1>]: (
83
- ...args: Parameters<AgentMethods<T$1>[K]>
84
- ) => AgentPromiseReturnType<AgentMethods<T$1>, K>;
79
+ type AgentStub<T> = {
80
+ [K in keyof AgentMethods<T>]: (
81
+ ...args: Parameters<AgentMethods<T>[K]>
82
+ ) => AgentPromiseReturnType<AgentMethods<T>, K>;
85
83
  };
86
84
  type UntypedAgentStub = Record<string, Method>;
87
85
  /**
@@ -112,4 +110,4 @@ declare function useAgent<
112
110
  };
113
111
  //#endregion
114
112
  export { useAgent as n, UseAgentOptions as t };
115
- //# sourceMappingURL=react-NCPvtyCY.d.ts.map
113
+ //# sourceMappingURL=react-DiQhRddQ.d.ts.map
package/dist/react.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- import "./client-Csp_m13H.js";
1
+ import "./client-D4R9pcB-.js";
2
2
  import "./mcp-Dw5vDrY8.js";
3
- import "./do-oauth-client-provider-DGc5pP0l.js";
3
+ import "./do-oauth-client-provider-CcTno-25.js";
4
4
  import "./index-DhJCaDWd.js";
5
5
  import "./ai-types-D5YoPrBZ.js";
6
- import "./index-DFqsR7mb.js";
6
+ import "./index-D76wnQcf.js";
7
7
  import "./serializable-CymX8ovI.js";
8
8
  import "./client-CbWe9FBd.js";
9
- import { n as useAgent, t as UseAgentOptions } from "./react-NCPvtyCY.js";
9
+ import { n as useAgent, t as UseAgentOptions } from "./react-DiQhRddQ.js";
10
10
  export { UseAgentOptions, useAgent };
@@ -1,13 +1,97 @@
1
1
  import { t as MessageType } from "./ai-types-B3aQaFv3.js";
2
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";
3
+ import { r as DisposableStore, t as MCPClientManager } from "./client-DvK0u9vD.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 create() {
22
+ this.sql`
23
+ CREATE TABLE IF NOT EXISTS cf_agents_mcp_servers (
24
+ id TEXT PRIMARY KEY NOT NULL,
25
+ name TEXT NOT NULL,
26
+ server_url TEXT NOT NULL,
27
+ callback_url TEXT NOT NULL,
28
+ client_id TEXT,
29
+ auth_url TEXT,
30
+ server_options TEXT
31
+ )
32
+ `;
33
+ }
34
+ async destroy() {
35
+ this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
36
+ }
37
+ async saveServer(server) {
38
+ this.sql`
39
+ INSERT OR REPLACE INTO cf_agents_mcp_servers (
40
+ id,
41
+ name,
42
+ server_url,
43
+ client_id,
44
+ auth_url,
45
+ callback_url,
46
+ server_options
47
+ )
48
+ VALUES (
49
+ ${server.id},
50
+ ${server.name},
51
+ ${server.server_url},
52
+ ${server.client_id ?? null},
53
+ ${server.auth_url ?? null},
54
+ ${server.callback_url},
55
+ ${server.server_options ?? null}
56
+ )
57
+ `;
58
+ }
59
+ async removeServer(serverId) {
60
+ this.sql`
61
+ DELETE FROM cf_agents_mcp_servers WHERE id = ${serverId}
62
+ `;
63
+ }
64
+ async listServers() {
65
+ return this.sql`
66
+ SELECT id, name, server_url, client_id, auth_url, callback_url, server_options
67
+ FROM cf_agents_mcp_servers
68
+ `;
69
+ }
70
+ async getServerByCallbackUrl(callbackUrl) {
71
+ const results = this.sql`
72
+ SELECT id, name, server_url, client_id, auth_url, callback_url, server_options
73
+ FROM cf_agents_mcp_servers
74
+ WHERE callback_url = ${callbackUrl}
75
+ LIMIT 1
76
+ `;
77
+ return results.length > 0 ? results[0] : null;
78
+ }
79
+ async clearAuthUrl(serverId) {
80
+ this.sql`
81
+ UPDATE cf_agents_mcp_servers
82
+ SET auth_url = NULL
83
+ WHERE id = ${serverId}
84
+ `;
85
+ }
86
+ async get(key) {
87
+ return this.kv.get(key);
88
+ }
89
+ async put(key, value) {
90
+ return this.kv.put(key, value);
91
+ }
92
+ };
93
+
94
+ //#endregion
11
95
  //#region src/observability/index.ts
12
96
  /**
13
97
  * A generic observability implementation that logs events to the console.
@@ -153,9 +237,8 @@ var Agent = class Agent extends Server {
153
237
  super(ctx, env);
154
238
  this._state = DEFAULT_STATE;
155
239
  this._disposables = new DisposableStore();
156
- this._mcpStateRestored = false;
240
+ this._destroyed = false;
157
241
  this._ParentClass = Object.getPrototypeOf(this).constructor;
158
- this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1");
159
242
  this.initialState = DEFAULT_STATE;
160
243
  this.observability = genericObservability;
161
244
  this._flushingQueue = false;
@@ -193,23 +276,29 @@ var Agent = class Agent extends Server {
193
276
  }
194
277
  });
195
278
  if (row.type === "cron") {
279
+ if (this._destroyed) return;
196
280
  const nextExecutionTime = getNextCronTime(row.cron);
197
281
  const nextTimestamp = Math.floor(nextExecutionTime.getTime() / 1e3);
198
282
  this.sql`
199
283
  UPDATE cf_agents_schedules SET time = ${nextTimestamp} WHERE id = ${row.id}
200
284
  `;
201
- } else this.sql`
285
+ } else {
286
+ if (this._destroyed) return;
287
+ this.sql`
202
288
  DELETE FROM cf_agents_schedules WHERE id = ${row.id}
203
289
  `;
290
+ }
204
291
  }
292
+ if (this._destroyed) return;
205
293
  await this._scheduleNextAlarm();
206
294
  };
295
+ this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1", { storage: new AgentMCPClientStorage(this.sql.bind(this), this.ctx.storage.kv) });
207
296
  if (!wrappedClasses.has(this.constructor)) {
208
297
  this._autoWrapCustomMethods();
209
298
  wrappedClasses.add(this.constructor);
210
299
  }
211
- this._disposables.add(this.mcp.onConnected(async () => {
212
- this.broadcastMcpServers();
300
+ this._disposables.add(this.mcp.onServerStateChanged(async () => {
301
+ await this.broadcastMcpServers();
213
302
  }));
214
303
  this._disposables.add(this.mcp.onObservabilityEvent((event) => {
215
304
  this.observability?.emit(event);
@@ -228,32 +317,16 @@ var Agent = class Agent extends Server {
228
317
  created_at INTEGER DEFAULT (unixepoch())
229
318
  )
230
319
  `;
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
320
  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
321
+ CREATE TABLE IF NOT EXISTS cf_agents_schedules (
322
+ id TEXT PRIMARY KEY NOT NULL DEFAULT (randomblob(9)),
323
+ callback TEXT,
324
+ payload TEXT,
325
+ type TEXT NOT NULL CHECK(type IN ('scheduled', 'delayed', 'cron')),
326
+ time INTEGER,
327
+ delayInSeconds INTEGER,
328
+ cron TEXT,
329
+ created_at INTEGER DEFAULT (unixepoch())
257
330
  )
258
331
  `;
259
332
  const _onRequest = this.onRequest.bind(this);
@@ -264,17 +337,9 @@ var Agent = class Agent extends Server {
264
337
  request,
265
338
  email: void 0
266
339
  }, 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
- }
340
+ await this.mcp.ensureJsonSchema();
341
+ const oauthResponse = await this.handleMcpOAuthCallback(request);
342
+ if (oauthResponse) return oauthResponse;
278
343
  return this._tryCatch(() => _onRequest(request));
279
344
  });
280
345
  };
@@ -286,6 +351,7 @@ var Agent = class Agent extends Server {
286
351
  request: void 0,
287
352
  email: void 0
288
353
  }, async () => {
354
+ await this.mcp.ensureJsonSchema();
289
355
  if (typeof message !== "string") return this._tryCatch(() => _onMessage(connection, message));
290
356
  let parsed;
291
357
  try {
@@ -350,13 +416,13 @@ var Agent = class Agent extends Server {
350
416
  connection,
351
417
  request: ctx$1.request,
352
418
  email: void 0
353
- }, () => {
419
+ }, async () => {
354
420
  if (this.state) connection.send(JSON.stringify({
355
421
  state: this.state,
356
422
  type: MessageType.CF_AGENT_STATE
357
423
  }));
358
424
  connection.send(JSON.stringify({
359
- mcp: this.getMcpServers(),
425
+ mcp: await this.getMcpServers(),
360
426
  type: MessageType.CF_AGENT_MCP_SERVERS
361
427
  }));
362
428
  this.observability?.emit({
@@ -378,8 +444,8 @@ var Agent = class Agent extends Server {
378
444
  email: void 0
379
445
  }, async () => {
380
446
  await this._tryCatch(async () => {
381
- await this._ensureMcpStateRestored();
382
- this.broadcastMcpServers();
447
+ await this.mcp.restoreConnectionsFromStorage(this.name);
448
+ await this.broadcastMcpServers();
383
449
  return _onStart(props);
384
450
  });
385
451
  });
@@ -785,7 +851,7 @@ var Agent = class Agent extends Server {
785
851
  async _scheduleNextAlarm() {
786
852
  const result = this.sql`
787
853
  SELECT time FROM cf_agents_schedules
788
- WHERE time > ${Math.floor(Date.now() / 1e3)}
854
+ WHERE time >= ${Math.floor(Date.now() / 1e3)}
789
855
  ORDER BY time ASC
790
856
  LIMIT 1
791
857
  `;
@@ -801,13 +867,15 @@ var Agent = class Agent extends Server {
801
867
  async destroy() {
802
868
  this.sql`DROP TABLE IF EXISTS cf_agents_state`;
803
869
  this.sql`DROP TABLE IF EXISTS cf_agents_schedules`;
804
- this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
805
870
  this.sql`DROP TABLE IF EXISTS cf_agents_queues`;
806
871
  await this.ctx.storage.deleteAlarm();
807
872
  await this.ctx.storage.deleteAll();
808
873
  this._disposables.dispose();
809
- await this.mcp.dispose?.();
810
- this.ctx.abort("destroyed");
874
+ await this.mcp.dispose();
875
+ this._destroyed = true;
876
+ setTimeout(() => {
877
+ this.ctx.abort("destroyed");
878
+ }, 0);
811
879
  this.observability?.emit({
812
880
  displayMessage: "Agent destroyed",
813
881
  id: nanoid(),
@@ -823,43 +891,6 @@ var Agent = class Agent extends Server {
823
891
  _isCallable(method) {
824
892
  return callableMetadata.has(this[method]);
825
893
  }
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
894
  /**
864
895
  * Connect to a new MCP Server
865
896
  *
@@ -879,29 +910,10 @@ var Agent = class Agent extends Server {
879
910
  resolvedCallbackHost = `${requestUrl.protocol}//${requestUrl.host}`;
880
911
  }
881
912
  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
- }
913
+ await this.mcp.ensureJsonSchema();
914
+ const id = nanoid(8);
915
+ const authProvider = new DurableObjectOAuthClientProvider(this.ctx.storage.kv, this.name, callbackUrl);
916
+ authProvider.serverId = id;
905
917
  const transportType = options?.transport?.type ?? "auto";
906
918
  let headerTransportOpts = {};
907
919
  if (options?.transport?.headers) headerTransportOpts = {
@@ -911,59 +923,78 @@ var Agent = class Agent extends Server {
911
923
  }) },
912
924
  requestInit: { headers: options?.transport?.headers }
913
925
  };
914
- const { id, authUrl, clientId } = await this.mcp.connect(url, {
926
+ await this.mcp.registerServer(id, {
927
+ url,
928
+ name: serverName,
929
+ callbackUrl,
915
930
  client: options?.client,
916
- reconnect,
917
931
  transport: {
918
932
  ...headerTransportOpts,
919
933
  authProvider,
920
934
  type: transportType
921
935
  }
922
936
  });
937
+ const result = await this.mcp.connectToServer(id);
923
938
  return {
924
- authUrl,
925
- clientId,
926
- id
939
+ id,
940
+ authUrl: result.state === "authenticating" ? result.authUrl : void 0
927
941
  };
928
942
  }
929
943
  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();
944
+ if (this.mcp.mcpConnections[id]) await this.mcp.closeConnection(id);
945
+ await this.mcp.removeServer(id);
936
946
  }
937
- getMcpServers() {
947
+ async getMcpServers() {
938
948
  const mcpState = {
939
949
  prompts: this.mcp.listPrompts(),
940
950
  resources: this.mcp.listResources(),
941
951
  servers: {},
942
952
  tools: this.mcp.listTools()
943
953
  };
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
- `;
954
+ const servers = await this.mcp.listServers();
947
955
  if (servers && Array.isArray(servers) && servers.length > 0) for (const server of servers) {
948
956
  const serverConn = this.mcp.mcpConnections[server.id];
957
+ let defaultState = "not-connected";
958
+ if (!serverConn && server.auth_url) defaultState = "authenticating";
949
959
  mcpState.servers[server.id] = {
950
960
  auth_url: server.auth_url,
951
961
  capabilities: serverConn?.serverCapabilities ?? null,
952
962
  instructions: serverConn?.instructions ?? null,
953
963
  name: server.name,
954
964
  server_url: server.server_url,
955
- state: serverConn?.connectionState ?? "authenticating"
965
+ state: serverConn?.connectionState ?? defaultState
956
966
  };
957
967
  }
958
968
  return mcpState;
959
969
  }
960
- broadcastMcpServers() {
970
+ async broadcastMcpServers() {
961
971
  this.broadcast(JSON.stringify({
962
- mcp: this.getMcpServers(),
972
+ mcp: await this.getMcpServers(),
963
973
  type: MessageType.CF_AGENT_MCP_SERVERS
964
974
  }));
965
975
  }
966
976
  /**
977
+ * Handle MCP OAuth callback request if it's an OAuth callback.
978
+ *
979
+ * This method encapsulates the entire OAuth callback flow:
980
+ * 1. Checks if the request is an MCP OAuth callback
981
+ * 2. Processes the OAuth code exchange
982
+ * 3. Establishes the connection if successful
983
+ * 4. Broadcasts MCP server state updates
984
+ * 5. Returns the appropriate HTTP response
985
+ *
986
+ * @param request The incoming HTTP request
987
+ * @returns Response if this was an OAuth callback, null otherwise
988
+ */
989
+ async handleMcpOAuthCallback(request) {
990
+ if (!await this.mcp.isCallbackRequest(request)) return null;
991
+ const result = await this.mcp.handleCallbackRequest(request);
992
+ if (result.authSuccess) this.mcp.establishConnection(result.serverId).catch((error) => {
993
+ console.error("[Agent handleMcpOAuthCallback] Background connection failed:", error);
994
+ });
995
+ return this.handleOAuthCallbackResponse(result, request);
996
+ }
997
+ /**
967
998
  * Handle OAuth callback response using MCPClientManager configuration
968
999
  * @param result OAuth callback result
969
1000
  * @param request The original request (needed for base URL)
@@ -972,10 +1003,21 @@ var Agent = class Agent extends Server {
972
1003
  handleOAuthCallbackResponse(result, request) {
973
1004
  const config = this.mcp.getOAuthCallbackConfig();
974
1005
  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);
1006
+ const baseOrigin = new URL(request.url).origin;
1007
+ if (config?.successRedirect && result.authSuccess) try {
1008
+ return Response.redirect(new URL(config.successRedirect, baseOrigin).href);
1009
+ } catch (e) {
1010
+ console.error("Invalid successRedirect URL:", config.successRedirect, e);
1011
+ return Response.redirect(baseOrigin);
1012
+ }
1013
+ if (config?.errorRedirect && !result.authSuccess) try {
1014
+ const errorUrl = `${config.errorRedirect}?error=${encodeURIComponent(result.authError || "Unknown error")}`;
1015
+ return Response.redirect(new URL(errorUrl, baseOrigin).href);
1016
+ } catch (e) {
1017
+ console.error("Invalid errorRedirect URL:", config.errorRedirect, e);
1018
+ return Response.redirect(baseOrigin);
1019
+ }
1020
+ return Response.redirect(baseOrigin);
979
1021
  }
980
1022
  };
981
1023
  const wrappedClasses = /* @__PURE__ */ new Set();
@@ -1001,10 +1043,15 @@ async function routeAgentRequest(request, env, options) {
1001
1043
  prefix: "agents",
1002
1044
  ...options
1003
1045
  });
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
- } });
1046
+ if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket") {
1047
+ const newHeaders = new Headers(response.headers);
1048
+ for (const [key, value] of Object.entries(corsHeaders)) newHeaders.set(key, value);
1049
+ response = new Response(response.body, {
1050
+ status: response.status,
1051
+ statusText: response.statusText,
1052
+ headers: newHeaders
1053
+ });
1054
+ }
1008
1055
  return response;
1009
1056
  }
1010
1057
  /**
@@ -1197,4 +1244,4 @@ var StreamingResponse = class {
1197
1244
 
1198
1245
  //#endregion
1199
1246
  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
1247
+ //# sourceMappingURL=src-C1WWpbRo.js.map