agents 0.0.0-5908188 → 0.0.0-59ac254
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/README.md +5 -3
- package/dist/ai-chat-agent.d.ts +95 -13
- package/dist/ai-chat-agent.js +354 -74
- package/dist/ai-chat-agent.js.map +1 -1
- package/dist/{ai-chat-v5-migration-DBHGW4Hv.js → ai-chat-v5-migration-DguhuLKF.js} +1 -1
- package/dist/{ai-chat-v5-migration-DBHGW4Hv.js.map → ai-chat-v5-migration-DguhuLKF.js.map} +1 -1
- package/dist/ai-chat-v5-migration.js +1 -1
- package/dist/ai-react.d.ts +15 -9
- package/dist/ai-react.js +179 -29
- package/dist/ai-react.js.map +1 -1
- package/dist/{ai-types-B3aQaFv3.js → ai-types-CwgHzwUb.js} +5 -1
- package/dist/ai-types-CwgHzwUb.js.map +1 -0
- package/dist/{ai-types-D5YoPrBZ.d.ts → ai-types-D_hTbf25.d.ts} +15 -7
- package/dist/ai-types.d.ts +1 -1
- package/dist/ai-types.js +1 -1
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +28 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client-C_M5uPrn.d.ts +834 -0
- package/dist/{client-BfiZ3HQd.js → client-CcyhkGfN.js} +2 -2
- package/dist/{client-BfiZ3HQd.js.map → client-CcyhkGfN.js.map} +1 -1
- package/dist/{client-CbWe9FBd.d.ts → client-ClORm6f0.d.ts} +2 -2
- package/dist/client-QZa2Rq0l.js +1105 -0
- package/dist/client-QZa2Rq0l.js.map +1 -0
- package/dist/client.d.ts +2 -2
- package/dist/client.js +2 -2
- package/dist/codemode/ai.js +6 -5
- package/dist/codemode/ai.js.map +1 -1
- package/dist/context-BkKbAa1R.js +8 -0
- package/dist/context-BkKbAa1R.js.map +1 -0
- package/dist/context-_sPQqJWv.d.ts +24 -0
- package/dist/context.d.ts +6 -0
- package/dist/context.js +3 -0
- package/dist/{do-oauth-client-provider-DGc5pP0l.d.ts → do-oauth-client-provider-B-ryFIPr.d.ts} +20 -5
- package/dist/{do-oauth-client-provider-CswoD5Lu.js → do-oauth-client-provider-B1fVIshX.js} +70 -8
- package/dist/do-oauth-client-provider-B1fVIshX.js.map +1 -0
- package/dist/{index-DhJCaDWd.d.ts → index-CyDpAVHZ.d.ts} +2 -2
- package/dist/{index-BJOkI2Mo.d.ts → index-DUnsVDnf.d.ts} +83 -74
- package/dist/index.d.ts +34 -34
- package/dist/index.js +6 -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 +98 -24
- package/dist/mcp/index.js +298 -91
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/x402.js +10 -6
- package/dist/mcp/x402.js.map +1 -1
- package/dist/{mcp-Dw5vDrY8.d.ts → mcp-CzbSsLfc.d.ts} +1 -1
- package/dist/observability/index.d.ts +2 -2
- package/dist/observability/index.js +6 -5
- package/dist/react-DbzUBop3.d.ts +131 -0
- package/dist/react.d.ts +15 -10
- package/dist/react.js +57 -57
- package/dist/react.js.map +1 -1
- package/dist/{serializable-CymX8ovI.d.ts → serializable-C4GLimgv.d.ts} +1 -1
- package/dist/serializable.d.ts +1 -1
- package/dist/{src-CTtjSFyX.js → src-BmbDclOA.js} +129 -179
- package/dist/src-BmbDclOA.js.map +1 -0
- package/package.json +53 -38
- package/dist/ai-types-B3aQaFv3.js.map +0 -1
- package/dist/client-BmMRlvlM.d.ts +0 -5313
- package/dist/client-CIvp_OWw.js +0 -786
- package/dist/client-CIvp_OWw.js.map +0 -1
- package/dist/do-oauth-client-provider-CswoD5Lu.js.map +0 -1
- package/dist/react-7YOau7tS.d.ts +0 -115
- package/dist/src-CTtjSFyX.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { t as
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { t as
|
|
5
|
-
import {
|
|
1
|
+
import { t as agentContext } from "./context-BkKbAa1R.js";
|
|
2
|
+
import { t as MessageType } from "./ai-types-CwgHzwUb.js";
|
|
3
|
+
import { r as camelCaseToKebabCase } from "./client-CcyhkGfN.js";
|
|
4
|
+
import { i as DisposableStore, r as MCPConnectionState, t as MCPClientManager } from "./client-QZa2Rq0l.js";
|
|
5
|
+
import { t as DurableObjectOAuthClientProvider } from "./do-oauth-client-provider-B1fVIshX.js";
|
|
6
6
|
import { parseCronExpression } from "cron-schedule";
|
|
7
7
|
import { nanoid } from "nanoid";
|
|
8
8
|
import { EmailMessage } from "cloudflare:email";
|
|
@@ -72,7 +72,6 @@ function getNextCronTime(cron) {
|
|
|
72
72
|
const STATE_ROW_ID = "cf_state_row_id";
|
|
73
73
|
const STATE_WAS_CHANGED = "cf_state_was_changed";
|
|
74
74
|
const DEFAULT_STATE = {};
|
|
75
|
-
const agentContext = new AsyncLocalStorage();
|
|
76
75
|
function getCurrentAgent() {
|
|
77
76
|
const store = agentContext.getStore();
|
|
78
77
|
if (!store) return {
|
|
@@ -153,8 +152,8 @@ var Agent = class Agent extends Server {
|
|
|
153
152
|
super(ctx, env);
|
|
154
153
|
this._state = DEFAULT_STATE;
|
|
155
154
|
this._disposables = new DisposableStore();
|
|
155
|
+
this._destroyed = false;
|
|
156
156
|
this._ParentClass = Object.getPrototypeOf(this).constructor;
|
|
157
|
-
this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1");
|
|
158
157
|
this.initialState = DEFAULT_STATE;
|
|
159
158
|
this.observability = genericObservability;
|
|
160
159
|
this._flushingQueue = false;
|
|
@@ -192,27 +191,37 @@ var Agent = class Agent extends Server {
|
|
|
192
191
|
}
|
|
193
192
|
});
|
|
194
193
|
if (row.type === "cron") {
|
|
194
|
+
if (this._destroyed) return;
|
|
195
195
|
const nextExecutionTime = getNextCronTime(row.cron);
|
|
196
196
|
const nextTimestamp = Math.floor(nextExecutionTime.getTime() / 1e3);
|
|
197
197
|
this.sql`
|
|
198
198
|
UPDATE cf_agents_schedules SET time = ${nextTimestamp} WHERE id = ${row.id}
|
|
199
199
|
`;
|
|
200
|
-
} else
|
|
200
|
+
} else {
|
|
201
|
+
if (this._destroyed) return;
|
|
202
|
+
this.sql`
|
|
201
203
|
DELETE FROM cf_agents_schedules WHERE id = ${row.id}
|
|
202
204
|
`;
|
|
205
|
+
}
|
|
203
206
|
}
|
|
207
|
+
if (this._destroyed) return;
|
|
204
208
|
await this._scheduleNextAlarm();
|
|
205
209
|
};
|
|
206
210
|
if (!wrappedClasses.has(this.constructor)) {
|
|
207
211
|
this._autoWrapCustomMethods();
|
|
208
212
|
wrappedClasses.add(this.constructor);
|
|
209
213
|
}
|
|
210
|
-
this.
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
214
|
+
this.sql`
|
|
215
|
+
CREATE TABLE IF NOT EXISTS cf_agents_mcp_servers (
|
|
216
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
217
|
+
name TEXT NOT NULL,
|
|
218
|
+
server_url TEXT NOT NULL,
|
|
219
|
+
callback_url TEXT NOT NULL,
|
|
220
|
+
client_id TEXT,
|
|
221
|
+
auth_url TEXT,
|
|
222
|
+
server_options TEXT
|
|
223
|
+
)
|
|
224
|
+
`;
|
|
216
225
|
this.sql`
|
|
217
226
|
CREATE TABLE IF NOT EXISTS cf_agents_state (
|
|
218
227
|
id TEXT PRIMARY KEY NOT NULL,
|
|
@@ -227,34 +236,25 @@ var Agent = class Agent extends Server {
|
|
|
227
236
|
created_at INTEGER DEFAULT (unixepoch())
|
|
228
237
|
)
|
|
229
238
|
`;
|
|
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
239
|
this.sql`
|
|
248
|
-
CREATE TABLE IF NOT EXISTS
|
|
249
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
240
|
+
CREATE TABLE IF NOT EXISTS cf_agents_schedules (
|
|
241
|
+
id TEXT PRIMARY KEY NOT NULL DEFAULT (randomblob(9)),
|
|
242
|
+
callback TEXT,
|
|
243
|
+
payload TEXT,
|
|
244
|
+
type TEXT NOT NULL CHECK(type IN ('scheduled', 'delayed', 'cron')),
|
|
245
|
+
time INTEGER,
|
|
246
|
+
delayInSeconds INTEGER,
|
|
247
|
+
cron TEXT,
|
|
248
|
+
created_at INTEGER DEFAULT (unixepoch())
|
|
256
249
|
)
|
|
257
250
|
`;
|
|
251
|
+
this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1", { storage: this.ctx.storage });
|
|
252
|
+
this._disposables.add(this.mcp.onServerStateChanged(async () => {
|
|
253
|
+
this.broadcastMcpServers();
|
|
254
|
+
}));
|
|
255
|
+
this._disposables.add(this.mcp.onObservabilityEvent((event) => {
|
|
256
|
+
this.observability?.emit(event);
|
|
257
|
+
}));
|
|
258
258
|
const _onRequest = this.onRequest.bind(this);
|
|
259
259
|
this.onRequest = (request) => {
|
|
260
260
|
return agentContext.run({
|
|
@@ -263,8 +263,9 @@ var Agent = class Agent extends Server {
|
|
|
263
263
|
request,
|
|
264
264
|
email: void 0
|
|
265
265
|
}, async () => {
|
|
266
|
-
|
|
267
|
-
|
|
266
|
+
await this.mcp.ensureJsonSchema();
|
|
267
|
+
const oauthResponse = await this.handleMcpOAuthCallback(request);
|
|
268
|
+
if (oauthResponse) return oauthResponse;
|
|
268
269
|
return this._tryCatch(() => _onRequest(request));
|
|
269
270
|
});
|
|
270
271
|
};
|
|
@@ -276,6 +277,7 @@ var Agent = class Agent extends Server {
|
|
|
276
277
|
request: void 0,
|
|
277
278
|
email: void 0
|
|
278
279
|
}, async () => {
|
|
280
|
+
await this.mcp.ensureJsonSchema();
|
|
279
281
|
if (typeof message !== "string") return this._tryCatch(() => _onMessage(connection, message));
|
|
280
282
|
let parsed;
|
|
281
283
|
try {
|
|
@@ -340,7 +342,7 @@ var Agent = class Agent extends Server {
|
|
|
340
342
|
connection,
|
|
341
343
|
request: ctx$1.request,
|
|
342
344
|
email: void 0
|
|
343
|
-
}, () => {
|
|
345
|
+
}, async () => {
|
|
344
346
|
if (this.state) connection.send(JSON.stringify({
|
|
345
347
|
state: this.state,
|
|
346
348
|
type: MessageType.CF_AGENT_STATE
|
|
@@ -367,27 +369,9 @@ var Agent = class Agent extends Server {
|
|
|
367
369
|
request: void 0,
|
|
368
370
|
email: void 0
|
|
369
371
|
}, async () => {
|
|
370
|
-
await this._tryCatch(() => {
|
|
371
|
-
|
|
372
|
-
SELECT id, name, server_url, client_id, auth_url, callback_url, server_options FROM cf_agents_mcp_servers;
|
|
373
|
-
`;
|
|
372
|
+
await this._tryCatch(async () => {
|
|
373
|
+
await this.mcp.restoreConnectionsFromStorage(this.name);
|
|
374
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
|
-
}
|
|
391
375
|
return _onStart(props);
|
|
392
376
|
});
|
|
393
377
|
});
|
|
@@ -732,10 +716,7 @@ var Agent = class Agent extends Server {
|
|
|
732
716
|
const result = this.sql`
|
|
733
717
|
SELECT * FROM cf_agents_schedules WHERE id = ${id}
|
|
734
718
|
`;
|
|
735
|
-
if (!result)
|
|
736
|
-
console.error(`schedule ${id} not found`);
|
|
737
|
-
return;
|
|
738
|
-
}
|
|
719
|
+
if (!result || result.length === 0) return;
|
|
739
720
|
return {
|
|
740
721
|
...result[0],
|
|
741
722
|
payload: JSON.parse(result[0].payload)
|
|
@@ -772,11 +753,12 @@ var Agent = class Agent extends Server {
|
|
|
772
753
|
/**
|
|
773
754
|
* Cancel a scheduled task
|
|
774
755
|
* @param id ID of the task to cancel
|
|
775
|
-
* @returns true if the task was cancelled, false
|
|
756
|
+
* @returns true if the task was cancelled, false if the task was not found
|
|
776
757
|
*/
|
|
777
758
|
async cancelSchedule(id) {
|
|
778
759
|
const schedule = await this.getSchedule(id);
|
|
779
|
-
if (schedule)
|
|
760
|
+
if (!schedule) return false;
|
|
761
|
+
this.observability?.emit({
|
|
780
762
|
displayMessage: `Schedule ${id} cancelled`,
|
|
781
763
|
id: nanoid(),
|
|
782
764
|
payload: {
|
|
@@ -793,7 +775,7 @@ var Agent = class Agent extends Server {
|
|
|
793
775
|
async _scheduleNextAlarm() {
|
|
794
776
|
const result = this.sql`
|
|
795
777
|
SELECT time FROM cf_agents_schedules
|
|
796
|
-
WHERE time
|
|
778
|
+
WHERE time >= ${Math.floor(Date.now() / 1e3)}
|
|
797
779
|
ORDER BY time ASC
|
|
798
780
|
LIMIT 1
|
|
799
781
|
`;
|
|
@@ -807,15 +789,18 @@ var Agent = class Agent extends Server {
|
|
|
807
789
|
* Destroy the Agent, removing all state and scheduled tasks
|
|
808
790
|
*/
|
|
809
791
|
async destroy() {
|
|
792
|
+
this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
|
|
810
793
|
this.sql`DROP TABLE IF EXISTS cf_agents_state`;
|
|
811
794
|
this.sql`DROP TABLE IF EXISTS cf_agents_schedules`;
|
|
812
|
-
this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
|
|
813
795
|
this.sql`DROP TABLE IF EXISTS cf_agents_queues`;
|
|
814
796
|
await this.ctx.storage.deleteAlarm();
|
|
815
797
|
await this.ctx.storage.deleteAll();
|
|
816
798
|
this._disposables.dispose();
|
|
817
|
-
await this.mcp.dispose
|
|
818
|
-
this.
|
|
799
|
+
await this.mcp.dispose();
|
|
800
|
+
this._destroyed = true;
|
|
801
|
+
setTimeout(() => {
|
|
802
|
+
this.ctx.abort("destroyed");
|
|
803
|
+
}, 0);
|
|
819
804
|
this.observability?.emit({
|
|
820
805
|
displayMessage: "Agent destroyed",
|
|
821
806
|
id: nanoid(),
|
|
@@ -839,7 +824,8 @@ var Agent = class Agent extends Server {
|
|
|
839
824
|
* @param callbackHost Base host for the agent, used for the redirect URI. If not provided, will be derived from the current request.
|
|
840
825
|
* @param agentsPrefix agents routing prefix if not using `agents`
|
|
841
826
|
* @param options MCP client and transport options
|
|
842
|
-
* @returns authUrl
|
|
827
|
+
* @returns Server id and state - either "authenticating" with authUrl, or "ready"
|
|
828
|
+
* @throws If connection or discovery fails
|
|
843
829
|
*/
|
|
844
830
|
async addMcpServer(serverName, url, callbackHost, agentsPrefix = "agents", options) {
|
|
845
831
|
let resolvedCallbackHost = callbackHost;
|
|
@@ -850,89 +836,10 @@ var Agent = class Agent extends Server {
|
|
|
850
836
|
resolvedCallbackHost = `${requestUrl.protocol}//${requestUrl.host}`;
|
|
851
837
|
}
|
|
852
838
|
const callbackUrl = `${resolvedCallbackHost}/${agentsPrefix}/${camelCaseToKebabCase(this._ParentClass.name)}/${this.name}/callback`;
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
INSERT OR REPLACE INTO cf_agents_mcp_servers (id, name, server_url, client_id, auth_url, callback_url, server_options)
|
|
856
|
-
VALUES (
|
|
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) {
|
|
839
|
+
await this.mcp.ensureJsonSchema();
|
|
840
|
+
const id = nanoid(8);
|
|
931
841
|
const authProvider = new DurableObjectOAuthClientProvider(this.ctx.storage, this.name, callbackUrl);
|
|
932
|
-
|
|
933
|
-
authProvider.serverId = reconnect.id;
|
|
934
|
-
if (reconnect.oauthClientId) authProvider.clientId = reconnect.oauthClientId;
|
|
935
|
-
}
|
|
842
|
+
authProvider.serverId = id;
|
|
936
843
|
const transportType = options?.transport?.type ?? "auto";
|
|
937
844
|
let headerTransportOpts = {};
|
|
938
845
|
if (options?.transport?.headers) headerTransportOpts = {
|
|
@@ -942,28 +849,33 @@ var Agent = class Agent extends Server {
|
|
|
942
849
|
}) },
|
|
943
850
|
requestInit: { headers: options?.transport?.headers }
|
|
944
851
|
};
|
|
945
|
-
|
|
852
|
+
await this.mcp.registerServer(id, {
|
|
853
|
+
url,
|
|
854
|
+
name: serverName,
|
|
855
|
+
callbackUrl,
|
|
946
856
|
client: options?.client,
|
|
947
|
-
reconnect,
|
|
948
857
|
transport: {
|
|
949
858
|
...headerTransportOpts,
|
|
950
859
|
authProvider,
|
|
951
860
|
type: transportType
|
|
952
861
|
}
|
|
953
862
|
});
|
|
863
|
+
const result = await this.mcp.connectToServer(id);
|
|
864
|
+
if (result.state === MCPConnectionState.FAILED) throw new Error(`Failed to connect to MCP server at ${url}: ${result.error}`);
|
|
865
|
+
if (result.state === MCPConnectionState.AUTHENTICATING) return {
|
|
866
|
+
id,
|
|
867
|
+
state: result.state,
|
|
868
|
+
authUrl: result.authUrl
|
|
869
|
+
};
|
|
870
|
+
const discoverResult = await this.mcp.discoverIfConnected(id);
|
|
871
|
+
if (discoverResult && !discoverResult.success) throw new Error(`Failed to discover MCP server capabilities: ${discoverResult.error}`);
|
|
954
872
|
return {
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
id
|
|
873
|
+
id,
|
|
874
|
+
state: MCPConnectionState.READY
|
|
958
875
|
};
|
|
959
876
|
}
|
|
960
877
|
async removeMcpServer(id) {
|
|
961
|
-
this.mcp.
|
|
962
|
-
this.mcp.unregisterCallbackUrl(id);
|
|
963
|
-
this.sql`
|
|
964
|
-
DELETE FROM cf_agents_mcp_servers WHERE id = ${id};
|
|
965
|
-
`;
|
|
966
|
-
this.broadcastMcpServers();
|
|
878
|
+
await this.mcp.removeServer(id);
|
|
967
879
|
}
|
|
968
880
|
getMcpServers() {
|
|
969
881
|
const mcpState = {
|
|
@@ -972,18 +884,18 @@ var Agent = class Agent extends Server {
|
|
|
972
884
|
servers: {},
|
|
973
885
|
tools: this.mcp.listTools()
|
|
974
886
|
};
|
|
975
|
-
const servers = this.
|
|
976
|
-
SELECT id, name, server_url, client_id, auth_url, callback_url, server_options FROM cf_agents_mcp_servers;
|
|
977
|
-
`;
|
|
887
|
+
const servers = this.mcp.listServers();
|
|
978
888
|
if (servers && Array.isArray(servers) && servers.length > 0) for (const server of servers) {
|
|
979
889
|
const serverConn = this.mcp.mcpConnections[server.id];
|
|
890
|
+
let defaultState = "not-connected";
|
|
891
|
+
if (!serverConn && server.auth_url) defaultState = "authenticating";
|
|
980
892
|
mcpState.servers[server.id] = {
|
|
981
893
|
auth_url: server.auth_url,
|
|
982
894
|
capabilities: serverConn?.serverCapabilities ?? null,
|
|
983
895
|
instructions: serverConn?.instructions ?? null,
|
|
984
896
|
name: server.name,
|
|
985
897
|
server_url: server.server_url,
|
|
986
|
-
state: serverConn?.connectionState ??
|
|
898
|
+
state: serverConn?.connectionState ?? defaultState
|
|
987
899
|
};
|
|
988
900
|
}
|
|
989
901
|
return mcpState;
|
|
@@ -995,6 +907,28 @@ var Agent = class Agent extends Server {
|
|
|
995
907
|
}));
|
|
996
908
|
}
|
|
997
909
|
/**
|
|
910
|
+
* Handle MCP OAuth callback request if it's an OAuth callback.
|
|
911
|
+
*
|
|
912
|
+
* This method encapsulates the entire OAuth callback flow:
|
|
913
|
+
* 1. Checks if the request is an MCP OAuth callback
|
|
914
|
+
* 2. Processes the OAuth code exchange
|
|
915
|
+
* 3. Establishes the connection if successful
|
|
916
|
+
* 4. Broadcasts MCP server state updates
|
|
917
|
+
* 5. Returns the appropriate HTTP response
|
|
918
|
+
*
|
|
919
|
+
* @param request The incoming HTTP request
|
|
920
|
+
* @returns Response if this was an OAuth callback, null otherwise
|
|
921
|
+
*/
|
|
922
|
+
async handleMcpOAuthCallback(request) {
|
|
923
|
+
if (!this.mcp.isCallbackRequest(request)) return null;
|
|
924
|
+
const result = await this.mcp.handleCallbackRequest(request);
|
|
925
|
+
if (result.authSuccess) this.mcp.establishConnection(result.serverId).catch((error) => {
|
|
926
|
+
console.error("[Agent handleMcpOAuthCallback] Connection establishment failed:", error);
|
|
927
|
+
});
|
|
928
|
+
this.broadcastMcpServers();
|
|
929
|
+
return this.handleOAuthCallbackResponse(result, request);
|
|
930
|
+
}
|
|
931
|
+
/**
|
|
998
932
|
* Handle OAuth callback response using MCPClientManager configuration
|
|
999
933
|
* @param result OAuth callback result
|
|
1000
934
|
* @param request The original request (needed for base URL)
|
|
@@ -1003,10 +937,21 @@ var Agent = class Agent extends Server {
|
|
|
1003
937
|
handleOAuthCallbackResponse(result, request) {
|
|
1004
938
|
const config = this.mcp.getOAuthCallbackConfig();
|
|
1005
939
|
if (config?.customHandler) return config.customHandler(result);
|
|
1006
|
-
|
|
1007
|
-
if (config?.
|
|
1008
|
-
|
|
1009
|
-
|
|
940
|
+
const baseOrigin = new URL(request.url).origin;
|
|
941
|
+
if (config?.successRedirect && result.authSuccess) try {
|
|
942
|
+
return Response.redirect(new URL(config.successRedirect, baseOrigin).href);
|
|
943
|
+
} catch (e) {
|
|
944
|
+
console.error("Invalid successRedirect URL:", config.successRedirect, e);
|
|
945
|
+
return Response.redirect(baseOrigin);
|
|
946
|
+
}
|
|
947
|
+
if (config?.errorRedirect && !result.authSuccess) try {
|
|
948
|
+
const errorUrl = `${config.errorRedirect}?error=${encodeURIComponent(result.authError || "Unknown error")}`;
|
|
949
|
+
return Response.redirect(new URL(errorUrl, baseOrigin).href);
|
|
950
|
+
} catch (e) {
|
|
951
|
+
console.error("Invalid errorRedirect URL:", config.errorRedirect, e);
|
|
952
|
+
return Response.redirect(baseOrigin);
|
|
953
|
+
}
|
|
954
|
+
return Response.redirect(baseOrigin);
|
|
1010
955
|
}
|
|
1011
956
|
};
|
|
1012
957
|
const wrappedClasses = /* @__PURE__ */ new Set();
|
|
@@ -1032,10 +977,15 @@ async function routeAgentRequest(request, env, options) {
|
|
|
1032
977
|
prefix: "agents",
|
|
1033
978
|
...options
|
|
1034
979
|
});
|
|
1035
|
-
if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket")
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
980
|
+
if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket") {
|
|
981
|
+
const newHeaders = new Headers(response.headers);
|
|
982
|
+
for (const [key, value] of Object.entries(corsHeaders)) newHeaders.set(key, value);
|
|
983
|
+
response = new Response(response.body, {
|
|
984
|
+
status: response.status,
|
|
985
|
+
statusText: response.statusText,
|
|
986
|
+
headers: newHeaders
|
|
987
|
+
});
|
|
988
|
+
}
|
|
1039
989
|
return response;
|
|
1040
990
|
}
|
|
1041
991
|
/**
|
|
@@ -1228,4 +1178,4 @@ var StreamingResponse = class {
|
|
|
1228
1178
|
|
|
1229
1179
|
//#endregion
|
|
1230
1180
|
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 };
|
|
1231
|
-
//# sourceMappingURL=src-
|
|
1181
|
+
//# sourceMappingURL=src-BmbDclOA.js.map
|