agents 0.0.0-d4257c1 → 0.0.0-d6d6d60
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.
- package/dist/ai-chat-agent.d.ts +10 -10
- package/dist/ai-chat-agent.js +6 -6
- package/dist/ai-chat-agent.js.map +1 -1
- package/dist/{ai-chat-v5-migration-gdyLiTd8.js → ai-chat-v5-migration-DBHGW4Hv.js} +2 -2
- package/dist/{ai-chat-v5-migration-gdyLiTd8.js.map → ai-chat-v5-migration-DBHGW4Hv.js.map} +1 -1
- package/dist/ai-chat-v5-migration.js +1 -1
- package/dist/ai-react.d.ts +9 -9
- package/dist/ai-react.js +17 -11
- package/dist/ai-react.js.map +1 -1
- package/dist/{ai-types-UZlfLOYP.js → ai-types-B3aQaFv3.js} +2 -2
- package/dist/{ai-types-UZlfLOYP.js.map → ai-types-B3aQaFv3.js.map} +1 -1
- package/dist/{ai-types-BWW4umHY.d.ts → ai-types-D5YoPrBZ.d.ts} +2 -2
- package/dist/ai-types.d.ts +4 -4
- package/dist/ai-types.js +1 -1
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +27 -0
- package/dist/cli.js.map +1 -0
- package/dist/{client-DjR-lC16.js → client-BfiZ3HQd.js} +3 -3
- package/dist/{client-DjR-lC16.js.map → client-BfiZ3HQd.js.map} +1 -1
- package/dist/{client-C-nwz-3N.d.ts → client-Bws9q38u.d.ts} +189 -75
- package/dist/{client-CmMi85Sj.d.ts → client-CbWe9FBd.d.ts} +10 -10
- package/dist/{client-CZBVDDoO.js → client-DvK0u9vD.js} +236 -124
- package/dist/client-DvK0u9vD.js.map +1 -0
- package/dist/client.d.ts +8 -8
- package/dist/client.js +2 -2
- package/dist/codemode/ai.js +5 -5
- package/dist/do-oauth-client-provider-CcTno-25.d.ts +142 -0
- package/dist/{do-oauth-client-provider-B2jr6UNq.js → do-oauth-client-provider-D2P1lSft.js} +3 -3
- package/dist/do-oauth-client-provider-D2P1lSft.js.map +1 -0
- package/dist/{index-CkQU40oY.d.ts → index-Bdzb2feZ.d.ts} +53 -39
- package/dist/{index-W4JUkafc.d.ts → index-DhJCaDWd.d.ts} +7 -3
- package/dist/index.d.ts +36 -36
- package/dist/index.js +5 -5
- package/dist/mcp/client.d.ts +4 -4
- package/dist/mcp/client.js +2 -1
- package/dist/mcp/do-oauth-client-provider.d.ts +1 -1
- package/dist/mcp/do-oauth-client-provider.js +1 -1
- package/dist/mcp/index.d.ts +127 -9
- package/dist/mcp/index.js +619 -26
- package/dist/mcp/index.js.map +1 -1
- package/dist/{mcp-BEwaCsxO.d.ts → mcp-Dw5vDrY8.d.ts} +2 -2
- package/dist/observability/index.d.ts +2 -2
- package/dist/observability/index.js +5 -5
- package/dist/{react-B4e1rDid.d.ts → react-DFNXTQzy.d.ts} +17 -17
- package/dist/react.d.ts +9 -9
- package/dist/react.js +1 -1
- package/dist/{serializable-gtr9YMhp.d.ts → serializable-CymX8ovI.d.ts} +8 -3
- package/dist/serializable.d.ts +5 -5
- package/dist/{src-COfG--3R.js → src-C1WWpbRo.js} +189 -121
- package/dist/src-C1WWpbRo.js.map +1 -0
- package/package.json +54 -39
- package/dist/client-CZBVDDoO.js.map +0 -1
- package/dist/do-oauth-client-provider-B2jr6UNq.js.map +0 -1
- package/dist/do-oauth-client-provider-CCwGwnrA.d.ts +0 -55
- package/dist/src-COfG--3R.js.map +0 -1
- package/src/index.ts +0 -2031
|
@@ -1,13 +1,97 @@
|
|
|
1
|
-
import { MessageType } from "./ai-types-
|
|
2
|
-
import { camelCaseToKebabCase } from "./client-
|
|
3
|
-
import { DisposableStore, MCPClientManager } from "./client-
|
|
4
|
-
import { DurableObjectOAuthClientProvider } from "./do-oauth-client-provider-
|
|
1
|
+
import { t as MessageType } from "./ai-types-B3aQaFv3.js";
|
|
2
|
+
import { r as camelCaseToKebabCase } from "./client-BfiZ3HQd.js";
|
|
3
|
+
import { r as DisposableStore, t as MCPClientManager } from "./client-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,8 +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();
|
|
240
|
+
this._destroyed = false;
|
|
156
241
|
this._ParentClass = Object.getPrototypeOf(this).constructor;
|
|
157
|
-
this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1");
|
|
158
242
|
this.initialState = DEFAULT_STATE;
|
|
159
243
|
this.observability = genericObservability;
|
|
160
244
|
this._flushingQueue = false;
|
|
@@ -192,23 +276,29 @@ var Agent = class Agent extends Server {
|
|
|
192
276
|
}
|
|
193
277
|
});
|
|
194
278
|
if (row.type === "cron") {
|
|
279
|
+
if (this._destroyed) return;
|
|
195
280
|
const nextExecutionTime = getNextCronTime(row.cron);
|
|
196
281
|
const nextTimestamp = Math.floor(nextExecutionTime.getTime() / 1e3);
|
|
197
282
|
this.sql`
|
|
198
283
|
UPDATE cf_agents_schedules SET time = ${nextTimestamp} WHERE id = ${row.id}
|
|
199
284
|
`;
|
|
200
|
-
} else
|
|
285
|
+
} else {
|
|
286
|
+
if (this._destroyed) return;
|
|
287
|
+
this.sql`
|
|
201
288
|
DELETE FROM cf_agents_schedules WHERE id = ${row.id}
|
|
202
289
|
`;
|
|
290
|
+
}
|
|
203
291
|
}
|
|
292
|
+
if (this._destroyed) return;
|
|
204
293
|
await this._scheduleNextAlarm();
|
|
205
294
|
};
|
|
295
|
+
this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1", { storage: new AgentMCPClientStorage(this.sql.bind(this), this.ctx.storage.kv) });
|
|
206
296
|
if (!wrappedClasses.has(this.constructor)) {
|
|
207
297
|
this._autoWrapCustomMethods();
|
|
208
298
|
wrappedClasses.add(this.constructor);
|
|
209
299
|
}
|
|
210
|
-
this._disposables.add(this.mcp.
|
|
211
|
-
this.broadcastMcpServers();
|
|
300
|
+
this._disposables.add(this.mcp.onServerStateChanged(async () => {
|
|
301
|
+
await this.broadcastMcpServers();
|
|
212
302
|
}));
|
|
213
303
|
this._disposables.add(this.mcp.onObservabilityEvent((event) => {
|
|
214
304
|
this.observability?.emit(event);
|
|
@@ -227,32 +317,16 @@ var Agent = class Agent extends Server {
|
|
|
227
317
|
created_at INTEGER DEFAULT (unixepoch())
|
|
228
318
|
)
|
|
229
319
|
`;
|
|
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
320
|
this.sql`
|
|
248
|
-
CREATE TABLE IF NOT EXISTS
|
|
249
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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())
|
|
256
330
|
)
|
|
257
331
|
`;
|
|
258
332
|
const _onRequest = this.onRequest.bind(this);
|
|
@@ -263,16 +337,9 @@ var Agent = class Agent extends Server {
|
|
|
263
337
|
request,
|
|
264
338
|
email: void 0
|
|
265
339
|
}, async () => {
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
if (result.authSuccess) this.mcp.establishConnection(result.serverId).catch((error) => {
|
|
270
|
-
console.error("Background connection failed:", error);
|
|
271
|
-
}).finally(() => {
|
|
272
|
-
this.broadcastMcpServers();
|
|
273
|
-
});
|
|
274
|
-
return this.handleOAuthCallbackResponse(result, request);
|
|
275
|
-
}
|
|
340
|
+
await this.mcp.ensureJsonSchema();
|
|
341
|
+
const oauthResponse = await this.handleMcpOAuthCallback(request);
|
|
342
|
+
if (oauthResponse) return oauthResponse;
|
|
276
343
|
return this._tryCatch(() => _onRequest(request));
|
|
277
344
|
});
|
|
278
345
|
};
|
|
@@ -284,6 +351,7 @@ var Agent = class Agent extends Server {
|
|
|
284
351
|
request: void 0,
|
|
285
352
|
email: void 0
|
|
286
353
|
}, async () => {
|
|
354
|
+
await this.mcp.ensureJsonSchema();
|
|
287
355
|
if (typeof message !== "string") return this._tryCatch(() => _onMessage(connection, message));
|
|
288
356
|
let parsed;
|
|
289
357
|
try {
|
|
@@ -348,13 +416,13 @@ var Agent = class Agent extends Server {
|
|
|
348
416
|
connection,
|
|
349
417
|
request: ctx$1.request,
|
|
350
418
|
email: void 0
|
|
351
|
-
}, () => {
|
|
419
|
+
}, async () => {
|
|
352
420
|
if (this.state) connection.send(JSON.stringify({
|
|
353
421
|
state: this.state,
|
|
354
422
|
type: MessageType.CF_AGENT_STATE
|
|
355
423
|
}));
|
|
356
424
|
connection.send(JSON.stringify({
|
|
357
|
-
mcp: this.getMcpServers(),
|
|
425
|
+
mcp: await this.getMcpServers(),
|
|
358
426
|
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
359
427
|
}));
|
|
360
428
|
this.observability?.emit({
|
|
@@ -375,27 +443,9 @@ var Agent = class Agent extends Server {
|
|
|
375
443
|
request: void 0,
|
|
376
444
|
email: void 0
|
|
377
445
|
}, async () => {
|
|
378
|
-
await this._tryCatch(() => {
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
`;
|
|
382
|
-
this.broadcastMcpServers();
|
|
383
|
-
if (servers && Array.isArray(servers) && servers.length > 0) {
|
|
384
|
-
servers.forEach((server) => {
|
|
385
|
-
if (server.callback_url) this.mcp.registerCallbackUrl(`${server.callback_url}/${server.id}`);
|
|
386
|
-
});
|
|
387
|
-
servers.forEach((server) => {
|
|
388
|
-
this._connectToMcpServerInternal(server.name, server.server_url, server.callback_url, server.server_options ? JSON.parse(server.server_options) : void 0, {
|
|
389
|
-
id: server.id,
|
|
390
|
-
oauthClientId: server.client_id ?? void 0
|
|
391
|
-
}).then(() => {
|
|
392
|
-
this.broadcastMcpServers();
|
|
393
|
-
}).catch((error) => {
|
|
394
|
-
console.error(`Error connecting to MCP server: ${server.name} (${server.server_url})`, error);
|
|
395
|
-
this.broadcastMcpServers();
|
|
396
|
-
});
|
|
397
|
-
});
|
|
398
|
-
}
|
|
446
|
+
await this._tryCatch(async () => {
|
|
447
|
+
await this.mcp.restoreConnectionsFromStorage(this.name);
|
|
448
|
+
await this.broadcastMcpServers();
|
|
399
449
|
return _onStart(props);
|
|
400
450
|
});
|
|
401
451
|
});
|
|
@@ -801,7 +851,7 @@ var Agent = class Agent extends Server {
|
|
|
801
851
|
async _scheduleNextAlarm() {
|
|
802
852
|
const result = this.sql`
|
|
803
853
|
SELECT time FROM cf_agents_schedules
|
|
804
|
-
WHERE time
|
|
854
|
+
WHERE time >= ${Math.floor(Date.now() / 1e3)}
|
|
805
855
|
ORDER BY time ASC
|
|
806
856
|
LIMIT 1
|
|
807
857
|
`;
|
|
@@ -817,13 +867,15 @@ var Agent = class Agent extends Server {
|
|
|
817
867
|
async destroy() {
|
|
818
868
|
this.sql`DROP TABLE IF EXISTS cf_agents_state`;
|
|
819
869
|
this.sql`DROP TABLE IF EXISTS cf_agents_schedules`;
|
|
820
|
-
this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
|
|
821
870
|
this.sql`DROP TABLE IF EXISTS cf_agents_queues`;
|
|
822
871
|
await this.ctx.storage.deleteAlarm();
|
|
823
872
|
await this.ctx.storage.deleteAll();
|
|
824
873
|
this._disposables.dispose();
|
|
825
|
-
await this.mcp.dispose
|
|
826
|
-
this.
|
|
874
|
+
await this.mcp.dispose();
|
|
875
|
+
this._destroyed = true;
|
|
876
|
+
setTimeout(() => {
|
|
877
|
+
this.ctx.abort("destroyed");
|
|
878
|
+
}, 0);
|
|
827
879
|
this.observability?.emit({
|
|
828
880
|
displayMessage: "Agent destroyed",
|
|
829
881
|
id: nanoid(),
|
|
@@ -858,29 +910,10 @@ var Agent = class Agent extends Server {
|
|
|
858
910
|
resolvedCallbackHost = `${requestUrl.protocol}//${requestUrl.host}`;
|
|
859
911
|
}
|
|
860
912
|
const callbackUrl = `${resolvedCallbackHost}/${agentsPrefix}/${camelCaseToKebabCase(this._ParentClass.name)}/${this.name}/callback`;
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
VALUES (
|
|
866
|
-
${result.id},
|
|
867
|
-
${serverName},
|
|
868
|
-
${url},
|
|
869
|
-
${result.clientId ?? null},
|
|
870
|
-
${result.authUrl ?? null},
|
|
871
|
-
${callbackUrl},
|
|
872
|
-
${options ? JSON.stringify(options) : null}
|
|
873
|
-
);
|
|
874
|
-
`;
|
|
875
|
-
this.broadcastMcpServers();
|
|
876
|
-
return result;
|
|
877
|
-
}
|
|
878
|
-
async _connectToMcpServerInternal(_serverName, url, callbackUrl, options, reconnect) {
|
|
879
|
-
const authProvider = new DurableObjectOAuthClientProvider(this.ctx.storage, this.name, callbackUrl);
|
|
880
|
-
if (reconnect) {
|
|
881
|
-
authProvider.serverId = reconnect.id;
|
|
882
|
-
if (reconnect.oauthClientId) authProvider.clientId = reconnect.oauthClientId;
|
|
883
|
-
}
|
|
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;
|
|
884
917
|
const transportType = options?.transport?.type ?? "auto";
|
|
885
918
|
let headerTransportOpts = {};
|
|
886
919
|
if (options?.transport?.headers) headerTransportOpts = {
|
|
@@ -890,59 +923,78 @@ var Agent = class Agent extends Server {
|
|
|
890
923
|
}) },
|
|
891
924
|
requestInit: { headers: options?.transport?.headers }
|
|
892
925
|
};
|
|
893
|
-
|
|
926
|
+
await this.mcp.registerServer(id, {
|
|
927
|
+
url,
|
|
928
|
+
name: serverName,
|
|
929
|
+
callbackUrl,
|
|
894
930
|
client: options?.client,
|
|
895
|
-
reconnect,
|
|
896
931
|
transport: {
|
|
897
932
|
...headerTransportOpts,
|
|
898
933
|
authProvider,
|
|
899
934
|
type: transportType
|
|
900
935
|
}
|
|
901
936
|
});
|
|
937
|
+
const result = await this.mcp.connectToServer(id);
|
|
902
938
|
return {
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
id
|
|
939
|
+
id,
|
|
940
|
+
authUrl: result.state === "authenticating" ? result.authUrl : void 0
|
|
906
941
|
};
|
|
907
942
|
}
|
|
908
943
|
async removeMcpServer(id) {
|
|
909
|
-
this.mcp.closeConnection(id);
|
|
910
|
-
this.mcp.
|
|
911
|
-
this.sql`
|
|
912
|
-
DELETE FROM cf_agents_mcp_servers WHERE id = ${id};
|
|
913
|
-
`;
|
|
914
|
-
this.broadcastMcpServers();
|
|
944
|
+
if (this.mcp.mcpConnections[id]) await this.mcp.closeConnection(id);
|
|
945
|
+
await this.mcp.removeServer(id);
|
|
915
946
|
}
|
|
916
|
-
getMcpServers() {
|
|
947
|
+
async getMcpServers() {
|
|
917
948
|
const mcpState = {
|
|
918
949
|
prompts: this.mcp.listPrompts(),
|
|
919
950
|
resources: this.mcp.listResources(),
|
|
920
951
|
servers: {},
|
|
921
952
|
tools: this.mcp.listTools()
|
|
922
953
|
};
|
|
923
|
-
const servers = this.
|
|
924
|
-
SELECT id, name, server_url, client_id, auth_url, callback_url, server_options FROM cf_agents_mcp_servers;
|
|
925
|
-
`;
|
|
954
|
+
const servers = await this.mcp.listServers();
|
|
926
955
|
if (servers && Array.isArray(servers) && servers.length > 0) for (const server of servers) {
|
|
927
956
|
const serverConn = this.mcp.mcpConnections[server.id];
|
|
957
|
+
let defaultState = "not-connected";
|
|
958
|
+
if (!serverConn && server.auth_url) defaultState = "authenticating";
|
|
928
959
|
mcpState.servers[server.id] = {
|
|
929
960
|
auth_url: server.auth_url,
|
|
930
961
|
capabilities: serverConn?.serverCapabilities ?? null,
|
|
931
962
|
instructions: serverConn?.instructions ?? null,
|
|
932
963
|
name: server.name,
|
|
933
964
|
server_url: server.server_url,
|
|
934
|
-
state: serverConn?.connectionState ??
|
|
965
|
+
state: serverConn?.connectionState ?? defaultState
|
|
935
966
|
};
|
|
936
967
|
}
|
|
937
968
|
return mcpState;
|
|
938
969
|
}
|
|
939
|
-
broadcastMcpServers() {
|
|
970
|
+
async broadcastMcpServers() {
|
|
940
971
|
this.broadcast(JSON.stringify({
|
|
941
|
-
mcp: this.getMcpServers(),
|
|
972
|
+
mcp: await this.getMcpServers(),
|
|
942
973
|
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
943
974
|
}));
|
|
944
975
|
}
|
|
945
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
|
+
/**
|
|
946
998
|
* Handle OAuth callback response using MCPClientManager configuration
|
|
947
999
|
* @param result OAuth callback result
|
|
948
1000
|
* @param request The original request (needed for base URL)
|
|
@@ -951,10 +1003,21 @@ var Agent = class Agent extends Server {
|
|
|
951
1003
|
handleOAuthCallbackResponse(result, request) {
|
|
952
1004
|
const config = this.mcp.getOAuthCallbackConfig();
|
|
953
1005
|
if (config?.customHandler) return config.customHandler(result);
|
|
954
|
-
|
|
955
|
-
if (config?.
|
|
956
|
-
|
|
957
|
-
|
|
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);
|
|
958
1021
|
}
|
|
959
1022
|
};
|
|
960
1023
|
const wrappedClasses = /* @__PURE__ */ new Set();
|
|
@@ -980,10 +1043,15 @@ async function routeAgentRequest(request, env, options) {
|
|
|
980
1043
|
prefix: "agents",
|
|
981
1044
|
...options
|
|
982
1045
|
});
|
|
983
|
-
if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket")
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
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
|
+
}
|
|
987
1055
|
return response;
|
|
988
1056
|
}
|
|
989
1057
|
/**
|
|
@@ -1175,5 +1243,5 @@ var StreamingResponse = class {
|
|
|
1175
1243
|
};
|
|
1176
1244
|
|
|
1177
1245
|
//#endregion
|
|
1178
|
-
export {
|
|
1179
|
-
//# sourceMappingURL=src-
|
|
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 };
|
|
1247
|
+
//# sourceMappingURL=src-C1WWpbRo.js.map
|