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