agents 0.0.0-3667584 → 0.0.0-36d03e6
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-C-nwz-3N.d.ts → client-BaCHMay9.d.ts} +189 -75
- 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-CmMi85Sj.d.ts → client-CbWe9FBd.d.ts} +10 -10
- package/dist/{client-CZBVDDoO.js → client-Cbx4ee6L.js} +234 -124
- package/dist/client-Cbx4ee6L.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-CnbnngL2.d.ts +134 -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-DCRAdW9R.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-DM_FD53F.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-2Qso7XUx.js} +185 -121
- package/dist/src-2Qso7XUx.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,81 @@
|
|
|
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-Cbx4ee6L.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 saveServer(server) {
|
|
22
|
+
this.sql`
|
|
23
|
+
INSERT OR REPLACE INTO cf_agents_mcp_servers (
|
|
24
|
+
id,
|
|
25
|
+
name,
|
|
26
|
+
server_url,
|
|
27
|
+
client_id,
|
|
28
|
+
auth_url,
|
|
29
|
+
callback_url,
|
|
30
|
+
server_options
|
|
31
|
+
)
|
|
32
|
+
VALUES (
|
|
33
|
+
${server.id},
|
|
34
|
+
${server.name},
|
|
35
|
+
${server.server_url},
|
|
36
|
+
${server.client_id ?? null},
|
|
37
|
+
${server.auth_url ?? null},
|
|
38
|
+
${server.callback_url},
|
|
39
|
+
${server.server_options ?? null}
|
|
40
|
+
)
|
|
41
|
+
`;
|
|
42
|
+
}
|
|
43
|
+
async removeServer(serverId) {
|
|
44
|
+
this.sql`
|
|
45
|
+
DELETE FROM cf_agents_mcp_servers WHERE id = ${serverId}
|
|
46
|
+
`;
|
|
47
|
+
}
|
|
48
|
+
async listServers() {
|
|
49
|
+
return this.sql`
|
|
50
|
+
SELECT id, name, server_url, client_id, auth_url, callback_url, server_options
|
|
51
|
+
FROM cf_agents_mcp_servers
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
async getServerByCallbackUrl(callbackUrl) {
|
|
55
|
+
const results = this.sql`
|
|
56
|
+
SELECT id, name, server_url, client_id, auth_url, callback_url, server_options
|
|
57
|
+
FROM cf_agents_mcp_servers
|
|
58
|
+
WHERE callback_url = ${callbackUrl}
|
|
59
|
+
LIMIT 1
|
|
60
|
+
`;
|
|
61
|
+
return results.length > 0 ? results[0] : null;
|
|
62
|
+
}
|
|
63
|
+
async clearAuthUrl(serverId) {
|
|
64
|
+
this.sql`
|
|
65
|
+
UPDATE cf_agents_mcp_servers
|
|
66
|
+
SET auth_url = NULL
|
|
67
|
+
WHERE id = ${serverId}
|
|
68
|
+
`;
|
|
69
|
+
}
|
|
70
|
+
async get(key) {
|
|
71
|
+
return this.kv.get(key);
|
|
72
|
+
}
|
|
73
|
+
async put(key, value) {
|
|
74
|
+
return this.kv.put(key, value);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
//#endregion
|
|
11
79
|
//#region src/observability/index.ts
|
|
12
80
|
/**
|
|
13
81
|
* A generic observability implementation that logs events to the console.
|
|
@@ -153,8 +221,8 @@ var Agent = class Agent extends Server {
|
|
|
153
221
|
super(ctx, env);
|
|
154
222
|
this._state = DEFAULT_STATE;
|
|
155
223
|
this._disposables = new DisposableStore();
|
|
224
|
+
this._destroyed = false;
|
|
156
225
|
this._ParentClass = Object.getPrototypeOf(this).constructor;
|
|
157
|
-
this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1");
|
|
158
226
|
this.initialState = DEFAULT_STATE;
|
|
159
227
|
this.observability = genericObservability;
|
|
160
228
|
this._flushingQueue = false;
|
|
@@ -192,28 +260,45 @@ var Agent = class Agent extends Server {
|
|
|
192
260
|
}
|
|
193
261
|
});
|
|
194
262
|
if (row.type === "cron") {
|
|
263
|
+
if (this._destroyed) return;
|
|
195
264
|
const nextExecutionTime = getNextCronTime(row.cron);
|
|
196
265
|
const nextTimestamp = Math.floor(nextExecutionTime.getTime() / 1e3);
|
|
197
266
|
this.sql`
|
|
198
267
|
UPDATE cf_agents_schedules SET time = ${nextTimestamp} WHERE id = ${row.id}
|
|
199
268
|
`;
|
|
200
|
-
} else
|
|
269
|
+
} else {
|
|
270
|
+
if (this._destroyed) return;
|
|
271
|
+
this.sql`
|
|
201
272
|
DELETE FROM cf_agents_schedules WHERE id = ${row.id}
|
|
202
273
|
`;
|
|
274
|
+
}
|
|
203
275
|
}
|
|
276
|
+
if (this._destroyed) return;
|
|
204
277
|
await this._scheduleNextAlarm();
|
|
205
278
|
};
|
|
279
|
+
this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1", { storage: new AgentMCPClientStorage(this.sql.bind(this), this.ctx.storage.kv) });
|
|
206
280
|
if (!wrappedClasses.has(this.constructor)) {
|
|
207
281
|
this._autoWrapCustomMethods();
|
|
208
282
|
wrappedClasses.add(this.constructor);
|
|
209
283
|
}
|
|
210
|
-
this._disposables.add(this.mcp.
|
|
211
|
-
this.broadcastMcpServers();
|
|
284
|
+
this._disposables.add(this.mcp.onServerStateChanged(async () => {
|
|
285
|
+
await this.broadcastMcpServers();
|
|
212
286
|
}));
|
|
213
287
|
this._disposables.add(this.mcp.onObservabilityEvent((event) => {
|
|
214
288
|
this.observability?.emit(event);
|
|
215
289
|
}));
|
|
216
290
|
this.sql`
|
|
291
|
+
CREATE TABLE IF NOT EXISTS cf_agents_mcp_servers (
|
|
292
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
293
|
+
name TEXT NOT NULL,
|
|
294
|
+
server_url TEXT NOT NULL,
|
|
295
|
+
callback_url TEXT NOT NULL,
|
|
296
|
+
client_id TEXT,
|
|
297
|
+
auth_url TEXT,
|
|
298
|
+
server_options TEXT
|
|
299
|
+
)
|
|
300
|
+
`;
|
|
301
|
+
this.sql`
|
|
217
302
|
CREATE TABLE IF NOT EXISTS cf_agents_state (
|
|
218
303
|
id TEXT PRIMARY KEY NOT NULL,
|
|
219
304
|
state TEXT
|
|
@@ -227,32 +312,16 @@ var Agent = class Agent extends Server {
|
|
|
227
312
|
created_at INTEGER DEFAULT (unixepoch())
|
|
228
313
|
)
|
|
229
314
|
`;
|
|
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
315
|
this.sql`
|
|
248
|
-
CREATE TABLE IF NOT EXISTS
|
|
249
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
316
|
+
CREATE TABLE IF NOT EXISTS cf_agents_schedules (
|
|
317
|
+
id TEXT PRIMARY KEY NOT NULL DEFAULT (randomblob(9)),
|
|
318
|
+
callback TEXT,
|
|
319
|
+
payload TEXT,
|
|
320
|
+
type TEXT NOT NULL CHECK(type IN ('scheduled', 'delayed', 'cron')),
|
|
321
|
+
time INTEGER,
|
|
322
|
+
delayInSeconds INTEGER,
|
|
323
|
+
cron TEXT,
|
|
324
|
+
created_at INTEGER DEFAULT (unixepoch())
|
|
256
325
|
)
|
|
257
326
|
`;
|
|
258
327
|
const _onRequest = this.onRequest.bind(this);
|
|
@@ -263,16 +332,9 @@ var Agent = class Agent extends Server {
|
|
|
263
332
|
request,
|
|
264
333
|
email: void 0
|
|
265
334
|
}, 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
|
-
}
|
|
335
|
+
await this.mcp.ensureJsonSchema();
|
|
336
|
+
const oauthResponse = await this.handleMcpOAuthCallback(request);
|
|
337
|
+
if (oauthResponse) return oauthResponse;
|
|
276
338
|
return this._tryCatch(() => _onRequest(request));
|
|
277
339
|
});
|
|
278
340
|
};
|
|
@@ -284,6 +346,7 @@ var Agent = class Agent extends Server {
|
|
|
284
346
|
request: void 0,
|
|
285
347
|
email: void 0
|
|
286
348
|
}, async () => {
|
|
349
|
+
await this.mcp.ensureJsonSchema();
|
|
287
350
|
if (typeof message !== "string") return this._tryCatch(() => _onMessage(connection, message));
|
|
288
351
|
let parsed;
|
|
289
352
|
try {
|
|
@@ -348,13 +411,13 @@ var Agent = class Agent extends Server {
|
|
|
348
411
|
connection,
|
|
349
412
|
request: ctx$1.request,
|
|
350
413
|
email: void 0
|
|
351
|
-
}, () => {
|
|
414
|
+
}, async () => {
|
|
352
415
|
if (this.state) connection.send(JSON.stringify({
|
|
353
416
|
state: this.state,
|
|
354
417
|
type: MessageType.CF_AGENT_STATE
|
|
355
418
|
}));
|
|
356
419
|
connection.send(JSON.stringify({
|
|
357
|
-
mcp: this.getMcpServers(),
|
|
420
|
+
mcp: await this.getMcpServers(),
|
|
358
421
|
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
359
422
|
}));
|
|
360
423
|
this.observability?.emit({
|
|
@@ -375,27 +438,9 @@ var Agent = class Agent extends Server {
|
|
|
375
438
|
request: void 0,
|
|
376
439
|
email: void 0
|
|
377
440
|
}, 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
|
-
}
|
|
441
|
+
await this._tryCatch(async () => {
|
|
442
|
+
await this.mcp.restoreConnectionsFromStorage(this.name);
|
|
443
|
+
await this.broadcastMcpServers();
|
|
399
444
|
return _onStart(props);
|
|
400
445
|
});
|
|
401
446
|
});
|
|
@@ -801,7 +846,7 @@ var Agent = class Agent extends Server {
|
|
|
801
846
|
async _scheduleNextAlarm() {
|
|
802
847
|
const result = this.sql`
|
|
803
848
|
SELECT time FROM cf_agents_schedules
|
|
804
|
-
WHERE time
|
|
849
|
+
WHERE time >= ${Math.floor(Date.now() / 1e3)}
|
|
805
850
|
ORDER BY time ASC
|
|
806
851
|
LIMIT 1
|
|
807
852
|
`;
|
|
@@ -815,15 +860,18 @@ var Agent = class Agent extends Server {
|
|
|
815
860
|
* Destroy the Agent, removing all state and scheduled tasks
|
|
816
861
|
*/
|
|
817
862
|
async destroy() {
|
|
863
|
+
this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
|
|
818
864
|
this.sql`DROP TABLE IF EXISTS cf_agents_state`;
|
|
819
865
|
this.sql`DROP TABLE IF EXISTS cf_agents_schedules`;
|
|
820
|
-
this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
|
|
821
866
|
this.sql`DROP TABLE IF EXISTS cf_agents_queues`;
|
|
822
867
|
await this.ctx.storage.deleteAlarm();
|
|
823
868
|
await this.ctx.storage.deleteAll();
|
|
824
869
|
this._disposables.dispose();
|
|
825
|
-
await this.mcp.dispose
|
|
826
|
-
this.
|
|
870
|
+
await this.mcp.dispose();
|
|
871
|
+
this._destroyed = true;
|
|
872
|
+
setTimeout(() => {
|
|
873
|
+
this.ctx.abort("destroyed");
|
|
874
|
+
}, 0);
|
|
827
875
|
this.observability?.emit({
|
|
828
876
|
displayMessage: "Agent destroyed",
|
|
829
877
|
id: nanoid(),
|
|
@@ -858,29 +906,10 @@ var Agent = class Agent extends Server {
|
|
|
858
906
|
resolvedCallbackHost = `${requestUrl.protocol}//${requestUrl.host}`;
|
|
859
907
|
}
|
|
860
908
|
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
|
-
}
|
|
909
|
+
await this.mcp.ensureJsonSchema();
|
|
910
|
+
const id = nanoid(8);
|
|
911
|
+
const authProvider = new DurableObjectOAuthClientProvider(this.ctx.storage.kv, this.name, callbackUrl);
|
|
912
|
+
authProvider.serverId = id;
|
|
884
913
|
const transportType = options?.transport?.type ?? "auto";
|
|
885
914
|
let headerTransportOpts = {};
|
|
886
915
|
if (options?.transport?.headers) headerTransportOpts = {
|
|
@@ -890,59 +919,78 @@ var Agent = class Agent extends Server {
|
|
|
890
919
|
}) },
|
|
891
920
|
requestInit: { headers: options?.transport?.headers }
|
|
892
921
|
};
|
|
893
|
-
|
|
922
|
+
await this.mcp.registerServer(id, {
|
|
923
|
+
url,
|
|
924
|
+
name: serverName,
|
|
925
|
+
callbackUrl,
|
|
894
926
|
client: options?.client,
|
|
895
|
-
reconnect,
|
|
896
927
|
transport: {
|
|
897
928
|
...headerTransportOpts,
|
|
898
929
|
authProvider,
|
|
899
930
|
type: transportType
|
|
900
931
|
}
|
|
901
932
|
});
|
|
933
|
+
const result = await this.mcp.connectToServer(id);
|
|
902
934
|
return {
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
id
|
|
935
|
+
id,
|
|
936
|
+
authUrl: result.state === "authenticating" ? result.authUrl : void 0
|
|
906
937
|
};
|
|
907
938
|
}
|
|
908
939
|
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();
|
|
940
|
+
if (this.mcp.mcpConnections[id]) await this.mcp.closeConnection(id);
|
|
941
|
+
await this.mcp.removeServer(id);
|
|
915
942
|
}
|
|
916
|
-
getMcpServers() {
|
|
943
|
+
async getMcpServers() {
|
|
917
944
|
const mcpState = {
|
|
918
945
|
prompts: this.mcp.listPrompts(),
|
|
919
946
|
resources: this.mcp.listResources(),
|
|
920
947
|
servers: {},
|
|
921
948
|
tools: this.mcp.listTools()
|
|
922
949
|
};
|
|
923
|
-
const servers = this.
|
|
924
|
-
SELECT id, name, server_url, client_id, auth_url, callback_url, server_options FROM cf_agents_mcp_servers;
|
|
925
|
-
`;
|
|
950
|
+
const servers = await this.mcp.listServers();
|
|
926
951
|
if (servers && Array.isArray(servers) && servers.length > 0) for (const server of servers) {
|
|
927
952
|
const serverConn = this.mcp.mcpConnections[server.id];
|
|
953
|
+
let defaultState = "not-connected";
|
|
954
|
+
if (!serverConn && server.auth_url) defaultState = "authenticating";
|
|
928
955
|
mcpState.servers[server.id] = {
|
|
929
956
|
auth_url: server.auth_url,
|
|
930
957
|
capabilities: serverConn?.serverCapabilities ?? null,
|
|
931
958
|
instructions: serverConn?.instructions ?? null,
|
|
932
959
|
name: server.name,
|
|
933
960
|
server_url: server.server_url,
|
|
934
|
-
state: serverConn?.connectionState ??
|
|
961
|
+
state: serverConn?.connectionState ?? defaultState
|
|
935
962
|
};
|
|
936
963
|
}
|
|
937
964
|
return mcpState;
|
|
938
965
|
}
|
|
939
|
-
broadcastMcpServers() {
|
|
966
|
+
async broadcastMcpServers() {
|
|
940
967
|
this.broadcast(JSON.stringify({
|
|
941
|
-
mcp: this.getMcpServers(),
|
|
968
|
+
mcp: await this.getMcpServers(),
|
|
942
969
|
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
943
970
|
}));
|
|
944
971
|
}
|
|
945
972
|
/**
|
|
973
|
+
* Handle MCP OAuth callback request if it's an OAuth callback.
|
|
974
|
+
*
|
|
975
|
+
* This method encapsulates the entire OAuth callback flow:
|
|
976
|
+
* 1. Checks if the request is an MCP OAuth callback
|
|
977
|
+
* 2. Processes the OAuth code exchange
|
|
978
|
+
* 3. Establishes the connection if successful
|
|
979
|
+
* 4. Broadcasts MCP server state updates
|
|
980
|
+
* 5. Returns the appropriate HTTP response
|
|
981
|
+
*
|
|
982
|
+
* @param request The incoming HTTP request
|
|
983
|
+
* @returns Response if this was an OAuth callback, null otherwise
|
|
984
|
+
*/
|
|
985
|
+
async handleMcpOAuthCallback(request) {
|
|
986
|
+
if (!await this.mcp.isCallbackRequest(request)) return null;
|
|
987
|
+
const result = await this.mcp.handleCallbackRequest(request);
|
|
988
|
+
if (result.authSuccess) this.mcp.establishConnection(result.serverId).catch((error) => {
|
|
989
|
+
console.error("[Agent handleMcpOAuthCallback] Background connection failed:", error);
|
|
990
|
+
});
|
|
991
|
+
return this.handleOAuthCallbackResponse(result, request);
|
|
992
|
+
}
|
|
993
|
+
/**
|
|
946
994
|
* Handle OAuth callback response using MCPClientManager configuration
|
|
947
995
|
* @param result OAuth callback result
|
|
948
996
|
* @param request The original request (needed for base URL)
|
|
@@ -951,10 +999,21 @@ var Agent = class Agent extends Server {
|
|
|
951
999
|
handleOAuthCallbackResponse(result, request) {
|
|
952
1000
|
const config = this.mcp.getOAuthCallbackConfig();
|
|
953
1001
|
if (config?.customHandler) return config.customHandler(result);
|
|
954
|
-
|
|
955
|
-
if (config?.
|
|
956
|
-
|
|
957
|
-
|
|
1002
|
+
const baseOrigin = new URL(request.url).origin;
|
|
1003
|
+
if (config?.successRedirect && result.authSuccess) try {
|
|
1004
|
+
return Response.redirect(new URL(config.successRedirect, baseOrigin).href);
|
|
1005
|
+
} catch (e) {
|
|
1006
|
+
console.error("Invalid successRedirect URL:", config.successRedirect, e);
|
|
1007
|
+
return Response.redirect(baseOrigin);
|
|
1008
|
+
}
|
|
1009
|
+
if (config?.errorRedirect && !result.authSuccess) try {
|
|
1010
|
+
const errorUrl = `${config.errorRedirect}?error=${encodeURIComponent(result.authError || "Unknown error")}`;
|
|
1011
|
+
return Response.redirect(new URL(errorUrl, baseOrigin).href);
|
|
1012
|
+
} catch (e) {
|
|
1013
|
+
console.error("Invalid errorRedirect URL:", config.errorRedirect, e);
|
|
1014
|
+
return Response.redirect(baseOrigin);
|
|
1015
|
+
}
|
|
1016
|
+
return Response.redirect(baseOrigin);
|
|
958
1017
|
}
|
|
959
1018
|
};
|
|
960
1019
|
const wrappedClasses = /* @__PURE__ */ new Set();
|
|
@@ -980,10 +1039,15 @@ async function routeAgentRequest(request, env, options) {
|
|
|
980
1039
|
prefix: "agents",
|
|
981
1040
|
...options
|
|
982
1041
|
});
|
|
983
|
-
if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket")
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
1042
|
+
if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket") {
|
|
1043
|
+
const newHeaders = new Headers(response.headers);
|
|
1044
|
+
for (const [key, value] of Object.entries(corsHeaders)) newHeaders.set(key, value);
|
|
1045
|
+
response = new Response(response.body, {
|
|
1046
|
+
status: response.status,
|
|
1047
|
+
statusText: response.statusText,
|
|
1048
|
+
headers: newHeaders
|
|
1049
|
+
});
|
|
1050
|
+
}
|
|
987
1051
|
return response;
|
|
988
1052
|
}
|
|
989
1053
|
/**
|
|
@@ -1175,5 +1239,5 @@ var StreamingResponse = class {
|
|
|
1175
1239
|
};
|
|
1176
1240
|
|
|
1177
1241
|
//#endregion
|
|
1178
|
-
export {
|
|
1179
|
-
//# sourceMappingURL=src-
|
|
1242
|
+
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 };
|
|
1243
|
+
//# sourceMappingURL=src-2Qso7XUx.js.map
|