agents 0.0.0-a215bb2 → 0.0.0-a315e86
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 +9 -4
- 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-DpkZyXgJ.js} +239 -124
- package/dist/client-DpkZyXgJ.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-CMEWpbHx.d.ts → index-DCRAdW9R.d.ts} +53 -49
- 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-jvtffQuA.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-L3cHuAag.js → src-Dk8lwxHf.js} +185 -173
- package/dist/src-Dk8lwxHf.js.map +1 -0
- package/package.json +52 -37
- 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-L3cHuAag.js.map +0 -1
|
@@ -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-DpkZyXgJ.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,8 +332,9 @@ var Agent = class Agent extends Server {
|
|
|
263
332
|
request,
|
|
264
333
|
email: void 0
|
|
265
334
|
}, async () => {
|
|
266
|
-
|
|
267
|
-
|
|
335
|
+
await this.mcp.ensureJsonSchema();
|
|
336
|
+
const oauthResponse = await this.handleMcpOAuthCallback(request);
|
|
337
|
+
if (oauthResponse) return oauthResponse;
|
|
268
338
|
return this._tryCatch(() => _onRequest(request));
|
|
269
339
|
});
|
|
270
340
|
};
|
|
@@ -276,6 +346,7 @@ var Agent = class Agent extends Server {
|
|
|
276
346
|
request: void 0,
|
|
277
347
|
email: void 0
|
|
278
348
|
}, async () => {
|
|
349
|
+
await this.mcp.ensureJsonSchema();
|
|
279
350
|
if (typeof message !== "string") return this._tryCatch(() => _onMessage(connection, message));
|
|
280
351
|
let parsed;
|
|
281
352
|
try {
|
|
@@ -340,13 +411,13 @@ var Agent = class Agent extends Server {
|
|
|
340
411
|
connection,
|
|
341
412
|
request: ctx$1.request,
|
|
342
413
|
email: void 0
|
|
343
|
-
}, () => {
|
|
414
|
+
}, async () => {
|
|
344
415
|
if (this.state) connection.send(JSON.stringify({
|
|
345
416
|
state: this.state,
|
|
346
417
|
type: MessageType.CF_AGENT_STATE
|
|
347
418
|
}));
|
|
348
419
|
connection.send(JSON.stringify({
|
|
349
|
-
mcp: this.getMcpServers(),
|
|
420
|
+
mcp: await this.getMcpServers(),
|
|
350
421
|
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
351
422
|
}));
|
|
352
423
|
this.observability?.emit({
|
|
@@ -367,27 +438,9 @@ var Agent = class Agent extends Server {
|
|
|
367
438
|
request: void 0,
|
|
368
439
|
email: void 0
|
|
369
440
|
}, async () => {
|
|
370
|
-
await this._tryCatch(() => {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
`;
|
|
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
|
-
}
|
|
441
|
+
await this._tryCatch(async () => {
|
|
442
|
+
await this.mcp.restoreConnectionsFromStorage(this.name);
|
|
443
|
+
await this.broadcastMcpServers();
|
|
391
444
|
return _onStart(props);
|
|
392
445
|
});
|
|
393
446
|
});
|
|
@@ -793,7 +846,7 @@ var Agent = class Agent extends Server {
|
|
|
793
846
|
async _scheduleNextAlarm() {
|
|
794
847
|
const result = this.sql`
|
|
795
848
|
SELECT time FROM cf_agents_schedules
|
|
796
|
-
WHERE time
|
|
849
|
+
WHERE time >= ${Math.floor(Date.now() / 1e3)}
|
|
797
850
|
ORDER BY time ASC
|
|
798
851
|
LIMIT 1
|
|
799
852
|
`;
|
|
@@ -807,15 +860,18 @@ var Agent = class Agent extends Server {
|
|
|
807
860
|
* Destroy the Agent, removing all state and scheduled tasks
|
|
808
861
|
*/
|
|
809
862
|
async destroy() {
|
|
863
|
+
this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
|
|
810
864
|
this.sql`DROP TABLE IF EXISTS cf_agents_state`;
|
|
811
865
|
this.sql`DROP TABLE IF EXISTS cf_agents_schedules`;
|
|
812
|
-
this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
|
|
813
866
|
this.sql`DROP TABLE IF EXISTS cf_agents_queues`;
|
|
814
867
|
await this.ctx.storage.deleteAlarm();
|
|
815
868
|
await this.ctx.storage.deleteAll();
|
|
816
869
|
this._disposables.dispose();
|
|
817
|
-
await this.mcp.dispose
|
|
818
|
-
this.
|
|
870
|
+
await this.mcp.dispose();
|
|
871
|
+
this._destroyed = true;
|
|
872
|
+
setTimeout(() => {
|
|
873
|
+
this.ctx.abort("destroyed");
|
|
874
|
+
}, 0);
|
|
819
875
|
this.observability?.emit({
|
|
820
876
|
displayMessage: "Agent destroyed",
|
|
821
877
|
id: nanoid(),
|
|
@@ -850,89 +906,10 @@ var Agent = class Agent extends Server {
|
|
|
850
906
|
resolvedCallbackHost = `${requestUrl.protocol}//${requestUrl.host}`;
|
|
851
907
|
}
|
|
852
908
|
const callbackUrl = `${resolvedCallbackHost}/${agentsPrefix}/${camelCaseToKebabCase(this._ParentClass.name)}/${this.name}/callback`;
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
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) {
|
|
931
|
-
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
|
-
}
|
|
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;
|
|
936
913
|
const transportType = options?.transport?.type ?? "auto";
|
|
937
914
|
let headerTransportOpts = {};
|
|
938
915
|
if (options?.transport?.headers) headerTransportOpts = {
|
|
@@ -942,59 +919,78 @@ var Agent = class Agent extends Server {
|
|
|
942
919
|
}) },
|
|
943
920
|
requestInit: { headers: options?.transport?.headers }
|
|
944
921
|
};
|
|
945
|
-
|
|
922
|
+
await this.mcp.registerServer(id, {
|
|
923
|
+
url,
|
|
924
|
+
name: serverName,
|
|
925
|
+
callbackUrl,
|
|
946
926
|
client: options?.client,
|
|
947
|
-
reconnect,
|
|
948
927
|
transport: {
|
|
949
928
|
...headerTransportOpts,
|
|
950
929
|
authProvider,
|
|
951
930
|
type: transportType
|
|
952
931
|
}
|
|
953
932
|
});
|
|
933
|
+
const result = await this.mcp.connectToServer(id);
|
|
954
934
|
return {
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
id
|
|
935
|
+
id,
|
|
936
|
+
authUrl: result.state === "authenticating" ? result.authUrl : void 0
|
|
958
937
|
};
|
|
959
938
|
}
|
|
960
939
|
async removeMcpServer(id) {
|
|
961
|
-
this.mcp.closeConnection(id);
|
|
962
|
-
this.mcp.
|
|
963
|
-
this.sql`
|
|
964
|
-
DELETE FROM cf_agents_mcp_servers WHERE id = ${id};
|
|
965
|
-
`;
|
|
966
|
-
this.broadcastMcpServers();
|
|
940
|
+
if (this.mcp.mcpConnections[id]) await this.mcp.closeConnection(id);
|
|
941
|
+
await this.mcp.removeServer(id);
|
|
967
942
|
}
|
|
968
|
-
getMcpServers() {
|
|
943
|
+
async getMcpServers() {
|
|
969
944
|
const mcpState = {
|
|
970
945
|
prompts: this.mcp.listPrompts(),
|
|
971
946
|
resources: this.mcp.listResources(),
|
|
972
947
|
servers: {},
|
|
973
948
|
tools: this.mcp.listTools()
|
|
974
949
|
};
|
|
975
|
-
const servers = this.
|
|
976
|
-
SELECT id, name, server_url, client_id, auth_url, callback_url, server_options FROM cf_agents_mcp_servers;
|
|
977
|
-
`;
|
|
950
|
+
const servers = await this.mcp.listServers();
|
|
978
951
|
if (servers && Array.isArray(servers) && servers.length > 0) for (const server of servers) {
|
|
979
952
|
const serverConn = this.mcp.mcpConnections[server.id];
|
|
953
|
+
let defaultState = "not-connected";
|
|
954
|
+
if (!serverConn && server.auth_url) defaultState = "authenticating";
|
|
980
955
|
mcpState.servers[server.id] = {
|
|
981
956
|
auth_url: server.auth_url,
|
|
982
957
|
capabilities: serverConn?.serverCapabilities ?? null,
|
|
983
958
|
instructions: serverConn?.instructions ?? null,
|
|
984
959
|
name: server.name,
|
|
985
960
|
server_url: server.server_url,
|
|
986
|
-
state: serverConn?.connectionState ??
|
|
961
|
+
state: serverConn?.connectionState ?? defaultState
|
|
987
962
|
};
|
|
988
963
|
}
|
|
989
964
|
return mcpState;
|
|
990
965
|
}
|
|
991
|
-
broadcastMcpServers() {
|
|
966
|
+
async broadcastMcpServers() {
|
|
992
967
|
this.broadcast(JSON.stringify({
|
|
993
|
-
mcp: this.getMcpServers(),
|
|
968
|
+
mcp: await this.getMcpServers(),
|
|
994
969
|
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
995
970
|
}));
|
|
996
971
|
}
|
|
997
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
|
+
/**
|
|
998
994
|
* Handle OAuth callback response using MCPClientManager configuration
|
|
999
995
|
* @param result OAuth callback result
|
|
1000
996
|
* @param request The original request (needed for base URL)
|
|
@@ -1003,10 +999,21 @@ var Agent = class Agent extends Server {
|
|
|
1003
999
|
handleOAuthCallbackResponse(result, request) {
|
|
1004
1000
|
const config = this.mcp.getOAuthCallbackConfig();
|
|
1005
1001
|
if (config?.customHandler) return config.customHandler(result);
|
|
1006
|
-
|
|
1007
|
-
if (config?.
|
|
1008
|
-
|
|
1009
|
-
|
|
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);
|
|
1010
1017
|
}
|
|
1011
1018
|
};
|
|
1012
1019
|
const wrappedClasses = /* @__PURE__ */ new Set();
|
|
@@ -1032,10 +1039,15 @@ async function routeAgentRequest(request, env, options) {
|
|
|
1032
1039
|
prefix: "agents",
|
|
1033
1040
|
...options
|
|
1034
1041
|
});
|
|
1035
|
-
if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket")
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
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
|
+
}
|
|
1039
1051
|
return response;
|
|
1040
1052
|
}
|
|
1041
1053
|
/**
|
|
@@ -1227,5 +1239,5 @@ var StreamingResponse = class {
|
|
|
1227
1239
|
};
|
|
1228
1240
|
|
|
1229
1241
|
//#endregion
|
|
1230
|
-
export {
|
|
1231
|
-
//# 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-Dk8lwxHf.js.map
|