agents 0.0.0-cec3cca → 0.0.0-cf3b3d7
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 +3 -3
- package/dist/ai-chat-agent.js +3 -3
- package/dist/ai-chat-agent.js.map +1 -1
- package/dist/ai-react.d.ts +4 -4
- package/dist/ai-react.js +8 -3
- package/dist/ai-react.js.map +1 -1
- package/dist/{client-Csp_m13H.d.ts → client-BaCHMay9.d.ts} +191 -79
- package/dist/{client-9Ld2_lnt.js → client-DpkZyXgJ.js} +239 -124
- package/dist/client-DpkZyXgJ.js.map +1 -0
- package/dist/codemode/ai.js +3 -3
- package/dist/do-oauth-client-provider-CnbnngL2.d.ts +134 -0
- package/dist/{do-oauth-client-provider-CswoD5Lu.js → do-oauth-client-provider-D2P1lSft.js} +2 -2
- package/dist/do-oauth-client-provider-D2P1lSft.js.map +1 -0
- package/dist/{index-DFqsR7mb.d.ts → index-DCRAdW9R.d.ts} +30 -18
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/mcp/client.d.ts +3 -3
- 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 +68 -29
- package/dist/mcp/index.js +80 -10
- package/dist/mcp/index.js.map +1 -1
- package/dist/observability/index.js +3 -3
- package/dist/{react-NCPvtyCY.d.ts → react-DM_FD53F.d.ts} +31 -33
- package/dist/react.d.ts +4 -4
- package/dist/{src-Dz0H9hSU.js → src-Dk8lwxHf.js} +181 -138
- package/dist/src-Dk8lwxHf.js.map +1 -0
- package/package.json +46 -38
- package/dist/client-9Ld2_lnt.js.map +0 -1
- package/dist/do-oauth-client-provider-CswoD5Lu.js.map +0 -1
- package/dist/do-oauth-client-provider-DGc5pP0l.d.ts +0 -55
- package/dist/src-Dz0H9hSU.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { m as MCPServersState, t as Agent } from "./index-
|
|
1
|
+
import { m as MCPServersState, t as Agent } from "./index-DCRAdW9R.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
|
|
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
|
|
38
|
-
[K in keyof T
|
|
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
|
|
43
|
-
AllOptional<Parameters<T
|
|
44
|
-
type AgentMethods<T
|
|
45
|
-
type OptionalAgentMethods<T
|
|
46
|
-
[K in keyof AgentMethods<T
|
|
47
|
-
AgentMethods<T
|
|
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
|
|
48
|
+
: never]: OptionalParametersMethod<AgentMethods<T>[K]>;
|
|
51
49
|
};
|
|
52
|
-
type RequiredAgentMethods<T
|
|
53
|
-
AgentMethods<T
|
|
54
|
-
keyof OptionalAgentMethods<T
|
|
50
|
+
type RequiredAgentMethods<T> = Omit<
|
|
51
|
+
AgentMethods<T>,
|
|
52
|
+
keyof OptionalAgentMethods<T>
|
|
55
53
|
>;
|
|
56
|
-
type AgentPromiseReturnType<T
|
|
57
|
-
ReturnType<AgentMethods<T
|
|
58
|
-
? ReturnType<AgentMethods<T
|
|
59
|
-
: Promise<ReturnType<AgentMethods<T
|
|
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
|
|
82
|
-
[K in keyof AgentMethods<T
|
|
83
|
-
...args: Parameters<AgentMethods<T
|
|
84
|
-
) => AgentPromiseReturnType<AgentMethods<T
|
|
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-
|
|
113
|
+
//# sourceMappingURL=react-DM_FD53F.d.ts.map
|
package/dist/react.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import "./client-
|
|
1
|
+
import "./client-BaCHMay9.js";
|
|
2
2
|
import "./mcp-Dw5vDrY8.js";
|
|
3
|
-
import "./do-oauth-client-provider-
|
|
3
|
+
import "./do-oauth-client-provider-CnbnngL2.js";
|
|
4
4
|
import "./index-DhJCaDWd.js";
|
|
5
5
|
import "./ai-types-D5YoPrBZ.js";
|
|
6
|
-
import "./index-
|
|
6
|
+
import "./index-DCRAdW9R.js";
|
|
7
7
|
import "./serializable-CymX8ovI.js";
|
|
8
8
|
import "./client-CbWe9FBd.js";
|
|
9
|
-
import { n as useAgent, t as UseAgentOptions } from "./react-
|
|
9
|
+
import { n as useAgent, t as UseAgentOptions } from "./react-DM_FD53F.js";
|
|
10
10
|
export { UseAgentOptions, useAgent };
|
|
@@ -1,13 +1,81 @@
|
|
|
1
1
|
import { t as MessageType } from "./ai-types-B3aQaFv3.js";
|
|
2
2
|
import { r as camelCaseToKebabCase } from "./client-BfiZ3HQd.js";
|
|
3
|
-
import {
|
|
4
|
-
import { t as DurableObjectOAuthClientProvider } from "./do-oauth-client-provider-
|
|
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,9 +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();
|
|
156
|
-
this.
|
|
224
|
+
this._destroyed = false;
|
|
157
225
|
this._ParentClass = Object.getPrototypeOf(this).constructor;
|
|
158
|
-
this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1");
|
|
159
226
|
this.initialState = DEFAULT_STATE;
|
|
160
227
|
this.observability = genericObservability;
|
|
161
228
|
this._flushingQueue = false;
|
|
@@ -193,28 +260,45 @@ var Agent = class Agent extends Server {
|
|
|
193
260
|
}
|
|
194
261
|
});
|
|
195
262
|
if (row.type === "cron") {
|
|
263
|
+
if (this._destroyed) return;
|
|
196
264
|
const nextExecutionTime = getNextCronTime(row.cron);
|
|
197
265
|
const nextTimestamp = Math.floor(nextExecutionTime.getTime() / 1e3);
|
|
198
266
|
this.sql`
|
|
199
267
|
UPDATE cf_agents_schedules SET time = ${nextTimestamp} WHERE id = ${row.id}
|
|
200
268
|
`;
|
|
201
|
-
} else
|
|
269
|
+
} else {
|
|
270
|
+
if (this._destroyed) return;
|
|
271
|
+
this.sql`
|
|
202
272
|
DELETE FROM cf_agents_schedules WHERE id = ${row.id}
|
|
203
273
|
`;
|
|
274
|
+
}
|
|
204
275
|
}
|
|
276
|
+
if (this._destroyed) return;
|
|
205
277
|
await this._scheduleNextAlarm();
|
|
206
278
|
};
|
|
279
|
+
this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1", { storage: new AgentMCPClientStorage(this.sql.bind(this), this.ctx.storage.kv) });
|
|
207
280
|
if (!wrappedClasses.has(this.constructor)) {
|
|
208
281
|
this._autoWrapCustomMethods();
|
|
209
282
|
wrappedClasses.add(this.constructor);
|
|
210
283
|
}
|
|
211
|
-
this._disposables.add(this.mcp.
|
|
212
|
-
this.broadcastMcpServers();
|
|
284
|
+
this._disposables.add(this.mcp.onServerStateChanged(async () => {
|
|
285
|
+
await this.broadcastMcpServers();
|
|
213
286
|
}));
|
|
214
287
|
this._disposables.add(this.mcp.onObservabilityEvent((event) => {
|
|
215
288
|
this.observability?.emit(event);
|
|
216
289
|
}));
|
|
217
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`
|
|
218
302
|
CREATE TABLE IF NOT EXISTS cf_agents_state (
|
|
219
303
|
id TEXT PRIMARY KEY NOT NULL,
|
|
220
304
|
state TEXT
|
|
@@ -228,32 +312,16 @@ var Agent = class Agent extends Server {
|
|
|
228
312
|
created_at INTEGER DEFAULT (unixepoch())
|
|
229
313
|
)
|
|
230
314
|
`;
|
|
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
315
|
this.sql`
|
|
249
|
-
CREATE TABLE IF NOT EXISTS
|
|
250
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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())
|
|
257
325
|
)
|
|
258
326
|
`;
|
|
259
327
|
const _onRequest = this.onRequest.bind(this);
|
|
@@ -264,17 +332,9 @@ var Agent = class Agent extends Server {
|
|
|
264
332
|
request,
|
|
265
333
|
email: void 0
|
|
266
334
|
}, async () => {
|
|
267
|
-
await this.
|
|
268
|
-
|
|
269
|
-
|
|
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
|
-
}
|
|
335
|
+
await this.mcp.ensureJsonSchema();
|
|
336
|
+
const oauthResponse = await this.handleMcpOAuthCallback(request);
|
|
337
|
+
if (oauthResponse) return oauthResponse;
|
|
278
338
|
return this._tryCatch(() => _onRequest(request));
|
|
279
339
|
});
|
|
280
340
|
};
|
|
@@ -286,6 +346,7 @@ var Agent = class Agent extends Server {
|
|
|
286
346
|
request: void 0,
|
|
287
347
|
email: void 0
|
|
288
348
|
}, async () => {
|
|
349
|
+
await this.mcp.ensureJsonSchema();
|
|
289
350
|
if (typeof message !== "string") return this._tryCatch(() => _onMessage(connection, message));
|
|
290
351
|
let parsed;
|
|
291
352
|
try {
|
|
@@ -350,13 +411,13 @@ var Agent = class Agent extends Server {
|
|
|
350
411
|
connection,
|
|
351
412
|
request: ctx$1.request,
|
|
352
413
|
email: void 0
|
|
353
|
-
}, () => {
|
|
414
|
+
}, async () => {
|
|
354
415
|
if (this.state) connection.send(JSON.stringify({
|
|
355
416
|
state: this.state,
|
|
356
417
|
type: MessageType.CF_AGENT_STATE
|
|
357
418
|
}));
|
|
358
419
|
connection.send(JSON.stringify({
|
|
359
|
-
mcp: this.getMcpServers(),
|
|
420
|
+
mcp: await this.getMcpServers(),
|
|
360
421
|
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
361
422
|
}));
|
|
362
423
|
this.observability?.emit({
|
|
@@ -378,8 +439,8 @@ var Agent = class Agent extends Server {
|
|
|
378
439
|
email: void 0
|
|
379
440
|
}, async () => {
|
|
380
441
|
await this._tryCatch(async () => {
|
|
381
|
-
await this.
|
|
382
|
-
this.broadcastMcpServers();
|
|
442
|
+
await this.mcp.restoreConnectionsFromStorage(this.name);
|
|
443
|
+
await this.broadcastMcpServers();
|
|
383
444
|
return _onStart(props);
|
|
384
445
|
});
|
|
385
446
|
});
|
|
@@ -785,7 +846,7 @@ var Agent = class Agent extends Server {
|
|
|
785
846
|
async _scheduleNextAlarm() {
|
|
786
847
|
const result = this.sql`
|
|
787
848
|
SELECT time FROM cf_agents_schedules
|
|
788
|
-
WHERE time
|
|
849
|
+
WHERE time >= ${Math.floor(Date.now() / 1e3)}
|
|
789
850
|
ORDER BY time ASC
|
|
790
851
|
LIMIT 1
|
|
791
852
|
`;
|
|
@@ -799,15 +860,18 @@ var Agent = class Agent extends Server {
|
|
|
799
860
|
* Destroy the Agent, removing all state and scheduled tasks
|
|
800
861
|
*/
|
|
801
862
|
async destroy() {
|
|
863
|
+
this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
|
|
802
864
|
this.sql`DROP TABLE IF EXISTS cf_agents_state`;
|
|
803
865
|
this.sql`DROP TABLE IF EXISTS cf_agents_schedules`;
|
|
804
|
-
this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
|
|
805
866
|
this.sql`DROP TABLE IF EXISTS cf_agents_queues`;
|
|
806
867
|
await this.ctx.storage.deleteAlarm();
|
|
807
868
|
await this.ctx.storage.deleteAll();
|
|
808
869
|
this._disposables.dispose();
|
|
809
|
-
await this.mcp.dispose
|
|
810
|
-
this.
|
|
870
|
+
await this.mcp.dispose();
|
|
871
|
+
this._destroyed = true;
|
|
872
|
+
setTimeout(() => {
|
|
873
|
+
this.ctx.abort("destroyed");
|
|
874
|
+
}, 0);
|
|
811
875
|
this.observability?.emit({
|
|
812
876
|
displayMessage: "Agent destroyed",
|
|
813
877
|
id: nanoid(),
|
|
@@ -823,43 +887,6 @@ var Agent = class Agent extends Server {
|
|
|
823
887
|
_isCallable(method) {
|
|
824
888
|
return callableMetadata.has(this[method]);
|
|
825
889
|
}
|
|
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
890
|
/**
|
|
864
891
|
* Connect to a new MCP Server
|
|
865
892
|
*
|
|
@@ -879,29 +906,10 @@ var Agent = class Agent extends Server {
|
|
|
879
906
|
resolvedCallbackHost = `${requestUrl.protocol}//${requestUrl.host}`;
|
|
880
907
|
}
|
|
881
908
|
const callbackUrl = `${resolvedCallbackHost}/${agentsPrefix}/${camelCaseToKebabCase(this._ParentClass.name)}/${this.name}/callback`;
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
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
|
-
}
|
|
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;
|
|
905
913
|
const transportType = options?.transport?.type ?? "auto";
|
|
906
914
|
let headerTransportOpts = {};
|
|
907
915
|
if (options?.transport?.headers) headerTransportOpts = {
|
|
@@ -911,59 +919,78 @@ var Agent = class Agent extends Server {
|
|
|
911
919
|
}) },
|
|
912
920
|
requestInit: { headers: options?.transport?.headers }
|
|
913
921
|
};
|
|
914
|
-
|
|
922
|
+
await this.mcp.registerServer(id, {
|
|
923
|
+
url,
|
|
924
|
+
name: serverName,
|
|
925
|
+
callbackUrl,
|
|
915
926
|
client: options?.client,
|
|
916
|
-
reconnect,
|
|
917
927
|
transport: {
|
|
918
928
|
...headerTransportOpts,
|
|
919
929
|
authProvider,
|
|
920
930
|
type: transportType
|
|
921
931
|
}
|
|
922
932
|
});
|
|
933
|
+
const result = await this.mcp.connectToServer(id);
|
|
923
934
|
return {
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
id
|
|
935
|
+
id,
|
|
936
|
+
authUrl: result.state === "authenticating" ? result.authUrl : void 0
|
|
927
937
|
};
|
|
928
938
|
}
|
|
929
939
|
async removeMcpServer(id) {
|
|
930
|
-
this.mcp.closeConnection(id);
|
|
931
|
-
this.mcp.
|
|
932
|
-
this.sql`
|
|
933
|
-
DELETE FROM cf_agents_mcp_servers WHERE id = ${id};
|
|
934
|
-
`;
|
|
935
|
-
this.broadcastMcpServers();
|
|
940
|
+
if (this.mcp.mcpConnections[id]) await this.mcp.closeConnection(id);
|
|
941
|
+
await this.mcp.removeServer(id);
|
|
936
942
|
}
|
|
937
|
-
getMcpServers() {
|
|
943
|
+
async getMcpServers() {
|
|
938
944
|
const mcpState = {
|
|
939
945
|
prompts: this.mcp.listPrompts(),
|
|
940
946
|
resources: this.mcp.listResources(),
|
|
941
947
|
servers: {},
|
|
942
948
|
tools: this.mcp.listTools()
|
|
943
949
|
};
|
|
944
|
-
const servers = this.
|
|
945
|
-
SELECT id, name, server_url, client_id, auth_url, callback_url, server_options FROM cf_agents_mcp_servers;
|
|
946
|
-
`;
|
|
950
|
+
const servers = await this.mcp.listServers();
|
|
947
951
|
if (servers && Array.isArray(servers) && servers.length > 0) for (const server of servers) {
|
|
948
952
|
const serverConn = this.mcp.mcpConnections[server.id];
|
|
953
|
+
let defaultState = "not-connected";
|
|
954
|
+
if (!serverConn && server.auth_url) defaultState = "authenticating";
|
|
949
955
|
mcpState.servers[server.id] = {
|
|
950
956
|
auth_url: server.auth_url,
|
|
951
957
|
capabilities: serverConn?.serverCapabilities ?? null,
|
|
952
958
|
instructions: serverConn?.instructions ?? null,
|
|
953
959
|
name: server.name,
|
|
954
960
|
server_url: server.server_url,
|
|
955
|
-
state: serverConn?.connectionState ??
|
|
961
|
+
state: serverConn?.connectionState ?? defaultState
|
|
956
962
|
};
|
|
957
963
|
}
|
|
958
964
|
return mcpState;
|
|
959
965
|
}
|
|
960
|
-
broadcastMcpServers() {
|
|
966
|
+
async broadcastMcpServers() {
|
|
961
967
|
this.broadcast(JSON.stringify({
|
|
962
|
-
mcp: this.getMcpServers(),
|
|
968
|
+
mcp: await this.getMcpServers(),
|
|
963
969
|
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
964
970
|
}));
|
|
965
971
|
}
|
|
966
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
|
+
/**
|
|
967
994
|
* Handle OAuth callback response using MCPClientManager configuration
|
|
968
995
|
* @param result OAuth callback result
|
|
969
996
|
* @param request The original request (needed for base URL)
|
|
@@ -972,10 +999,21 @@ var Agent = class Agent extends Server {
|
|
|
972
999
|
handleOAuthCallbackResponse(result, request) {
|
|
973
1000
|
const config = this.mcp.getOAuthCallbackConfig();
|
|
974
1001
|
if (config?.customHandler) return config.customHandler(result);
|
|
975
|
-
|
|
976
|
-
if (config?.
|
|
977
|
-
|
|
978
|
-
|
|
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);
|
|
979
1017
|
}
|
|
980
1018
|
};
|
|
981
1019
|
const wrappedClasses = /* @__PURE__ */ new Set();
|
|
@@ -1001,10 +1039,15 @@ async function routeAgentRequest(request, env, options) {
|
|
|
1001
1039
|
prefix: "agents",
|
|
1002
1040
|
...options
|
|
1003
1041
|
});
|
|
1004
|
-
if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket")
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
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
|
+
}
|
|
1008
1051
|
return response;
|
|
1009
1052
|
}
|
|
1010
1053
|
/**
|
|
@@ -1197,4 +1240,4 @@ var StreamingResponse = class {
|
|
|
1197
1240
|
|
|
1198
1241
|
//#endregion
|
|
1199
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 };
|
|
1200
|
-
//# sourceMappingURL=src-
|
|
1243
|
+
//# sourceMappingURL=src-Dk8lwxHf.js.map
|