agents 0.0.0-ccbea72 → 0.0.0-cd8b7fd
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-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-DfIOsabL.d.ts +834 -0
- 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-D6iosdF4.d.ts → index-DPJ32qQn.d.ts} +83 -66
- 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 +89 -24
- package/dist/mcp/index.js +294 -81
- 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-YzfC33jB.d.ts → react-MaOSl7Pr.d.ts} +33 -35
- package/dist/react.d.ts +10 -9
- package/dist/react.js +2 -2
- 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-Dz0H9hSU.js → src-BmbDclOA.js} +128 -147
- 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-9Ld2_lnt.js +0 -786
- package/dist/client-9Ld2_lnt.js.map +0 -1
- package/dist/client-BmMRlvlM.d.ts +0 -5313
- package/dist/do-oauth-client-provider-CswoD5Lu.js.map +0 -1
- package/dist/src-Dz0H9hSU.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,9 +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();
|
|
156
|
-
this.
|
|
155
|
+
this._destroyed = false;
|
|
157
156
|
this._ParentClass = Object.getPrototypeOf(this).constructor;
|
|
158
|
-
this.mcp = new MCPClientManager(this._ParentClass.name, "0.0.1");
|
|
159
157
|
this.initialState = DEFAULT_STATE;
|
|
160
158
|
this.observability = genericObservability;
|
|
161
159
|
this._flushingQueue = false;
|
|
@@ -193,27 +191,37 @@ var Agent = class Agent extends Server {
|
|
|
193
191
|
}
|
|
194
192
|
});
|
|
195
193
|
if (row.type === "cron") {
|
|
194
|
+
if (this._destroyed) return;
|
|
196
195
|
const nextExecutionTime = getNextCronTime(row.cron);
|
|
197
196
|
const nextTimestamp = Math.floor(nextExecutionTime.getTime() / 1e3);
|
|
198
197
|
this.sql`
|
|
199
198
|
UPDATE cf_agents_schedules SET time = ${nextTimestamp} WHERE id = ${row.id}
|
|
200
199
|
`;
|
|
201
|
-
} else
|
|
200
|
+
} else {
|
|
201
|
+
if (this._destroyed) return;
|
|
202
|
+
this.sql`
|
|
202
203
|
DELETE FROM cf_agents_schedules WHERE id = ${row.id}
|
|
203
204
|
`;
|
|
205
|
+
}
|
|
204
206
|
}
|
|
207
|
+
if (this._destroyed) return;
|
|
205
208
|
await this._scheduleNextAlarm();
|
|
206
209
|
};
|
|
207
210
|
if (!wrappedClasses.has(this.constructor)) {
|
|
208
211
|
this._autoWrapCustomMethods();
|
|
209
212
|
wrappedClasses.add(this.constructor);
|
|
210
213
|
}
|
|
211
|
-
this.
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|
+
`;
|
|
217
225
|
this.sql`
|
|
218
226
|
CREATE TABLE IF NOT EXISTS cf_agents_state (
|
|
219
227
|
id TEXT PRIMARY KEY NOT NULL,
|
|
@@ -228,34 +236,25 @@ var Agent = class Agent extends Server {
|
|
|
228
236
|
created_at INTEGER DEFAULT (unixepoch())
|
|
229
237
|
)
|
|
230
238
|
`;
|
|
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
239
|
this.sql`
|
|
249
|
-
CREATE TABLE IF NOT EXISTS
|
|
250
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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())
|
|
257
249
|
)
|
|
258
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
|
+
}));
|
|
259
258
|
const _onRequest = this.onRequest.bind(this);
|
|
260
259
|
this.onRequest = (request) => {
|
|
261
260
|
return agentContext.run({
|
|
@@ -264,17 +263,9 @@ var Agent = class Agent extends Server {
|
|
|
264
263
|
request,
|
|
265
264
|
email: void 0
|
|
266
265
|
}, 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
|
-
}
|
|
266
|
+
await this.mcp.ensureJsonSchema();
|
|
267
|
+
const oauthResponse = await this.handleMcpOAuthCallback(request);
|
|
268
|
+
if (oauthResponse) return oauthResponse;
|
|
278
269
|
return this._tryCatch(() => _onRequest(request));
|
|
279
270
|
});
|
|
280
271
|
};
|
|
@@ -286,6 +277,7 @@ var Agent = class Agent extends Server {
|
|
|
286
277
|
request: void 0,
|
|
287
278
|
email: void 0
|
|
288
279
|
}, async () => {
|
|
280
|
+
await this.mcp.ensureJsonSchema();
|
|
289
281
|
if (typeof message !== "string") return this._tryCatch(() => _onMessage(connection, message));
|
|
290
282
|
let parsed;
|
|
291
283
|
try {
|
|
@@ -350,7 +342,7 @@ var Agent = class Agent extends Server {
|
|
|
350
342
|
connection,
|
|
351
343
|
request: ctx$1.request,
|
|
352
344
|
email: void 0
|
|
353
|
-
}, () => {
|
|
345
|
+
}, async () => {
|
|
354
346
|
if (this.state) connection.send(JSON.stringify({
|
|
355
347
|
state: this.state,
|
|
356
348
|
type: MessageType.CF_AGENT_STATE
|
|
@@ -378,7 +370,7 @@ var Agent = class Agent extends Server {
|
|
|
378
370
|
email: void 0
|
|
379
371
|
}, async () => {
|
|
380
372
|
await this._tryCatch(async () => {
|
|
381
|
-
await this.
|
|
373
|
+
await this.mcp.restoreConnectionsFromStorage(this.name);
|
|
382
374
|
this.broadcastMcpServers();
|
|
383
375
|
return _onStart(props);
|
|
384
376
|
});
|
|
@@ -724,10 +716,7 @@ var Agent = class Agent extends Server {
|
|
|
724
716
|
const result = this.sql`
|
|
725
717
|
SELECT * FROM cf_agents_schedules WHERE id = ${id}
|
|
726
718
|
`;
|
|
727
|
-
if (!result)
|
|
728
|
-
console.error(`schedule ${id} not found`);
|
|
729
|
-
return;
|
|
730
|
-
}
|
|
719
|
+
if (!result || result.length === 0) return;
|
|
731
720
|
return {
|
|
732
721
|
...result[0],
|
|
733
722
|
payload: JSON.parse(result[0].payload)
|
|
@@ -764,11 +753,12 @@ var Agent = class Agent extends Server {
|
|
|
764
753
|
/**
|
|
765
754
|
* Cancel a scheduled task
|
|
766
755
|
* @param id ID of the task to cancel
|
|
767
|
-
* @returns true if the task was cancelled, false
|
|
756
|
+
* @returns true if the task was cancelled, false if the task was not found
|
|
768
757
|
*/
|
|
769
758
|
async cancelSchedule(id) {
|
|
770
759
|
const schedule = await this.getSchedule(id);
|
|
771
|
-
if (schedule)
|
|
760
|
+
if (!schedule) return false;
|
|
761
|
+
this.observability?.emit({
|
|
772
762
|
displayMessage: `Schedule ${id} cancelled`,
|
|
773
763
|
id: nanoid(),
|
|
774
764
|
payload: {
|
|
@@ -785,7 +775,7 @@ var Agent = class Agent extends Server {
|
|
|
785
775
|
async _scheduleNextAlarm() {
|
|
786
776
|
const result = this.sql`
|
|
787
777
|
SELECT time FROM cf_agents_schedules
|
|
788
|
-
WHERE time
|
|
778
|
+
WHERE time >= ${Math.floor(Date.now() / 1e3)}
|
|
789
779
|
ORDER BY time ASC
|
|
790
780
|
LIMIT 1
|
|
791
781
|
`;
|
|
@@ -799,15 +789,18 @@ var Agent = class Agent extends Server {
|
|
|
799
789
|
* Destroy the Agent, removing all state and scheduled tasks
|
|
800
790
|
*/
|
|
801
791
|
async destroy() {
|
|
792
|
+
this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
|
|
802
793
|
this.sql`DROP TABLE IF EXISTS cf_agents_state`;
|
|
803
794
|
this.sql`DROP TABLE IF EXISTS cf_agents_schedules`;
|
|
804
|
-
this.sql`DROP TABLE IF EXISTS cf_agents_mcp_servers`;
|
|
805
795
|
this.sql`DROP TABLE IF EXISTS cf_agents_queues`;
|
|
806
796
|
await this.ctx.storage.deleteAlarm();
|
|
807
797
|
await this.ctx.storage.deleteAll();
|
|
808
798
|
this._disposables.dispose();
|
|
809
|
-
await this.mcp.dispose
|
|
810
|
-
this.
|
|
799
|
+
await this.mcp.dispose();
|
|
800
|
+
this._destroyed = true;
|
|
801
|
+
setTimeout(() => {
|
|
802
|
+
this.ctx.abort("destroyed");
|
|
803
|
+
}, 0);
|
|
811
804
|
this.observability?.emit({
|
|
812
805
|
displayMessage: "Agent destroyed",
|
|
813
806
|
id: nanoid(),
|
|
@@ -823,43 +816,6 @@ var Agent = class Agent extends Server {
|
|
|
823
816
|
_isCallable(method) {
|
|
824
817
|
return callableMetadata.has(this[method]);
|
|
825
818
|
}
|
|
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
819
|
/**
|
|
864
820
|
* Connect to a new MCP Server
|
|
865
821
|
*
|
|
@@ -868,7 +824,8 @@ var Agent = class Agent extends Server {
|
|
|
868
824
|
* @param callbackHost Base host for the agent, used for the redirect URI. If not provided, will be derived from the current request.
|
|
869
825
|
* @param agentsPrefix agents routing prefix if not using `agents`
|
|
870
826
|
* @param options MCP client and transport options
|
|
871
|
-
* @returns authUrl
|
|
827
|
+
* @returns Server id and state - either "authenticating" with authUrl, or "ready"
|
|
828
|
+
* @throws If connection or discovery fails
|
|
872
829
|
*/
|
|
873
830
|
async addMcpServer(serverName, url, callbackHost, agentsPrefix = "agents", options) {
|
|
874
831
|
let resolvedCallbackHost = callbackHost;
|
|
@@ -879,29 +836,10 @@ var Agent = class Agent extends Server {
|
|
|
879
836
|
resolvedCallbackHost = `${requestUrl.protocol}//${requestUrl.host}`;
|
|
880
837
|
}
|
|
881
838
|
const callbackUrl = `${resolvedCallbackHost}/${agentsPrefix}/${camelCaseToKebabCase(this._ParentClass.name)}/${this.name}/callback`;
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
INSERT
|
|
885
|
-
OR REPLACE INTO cf_agents_mcp_servers (id, name, server_url, client_id, auth_url, callback_url, server_options)
|
|
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) {
|
|
839
|
+
await this.mcp.ensureJsonSchema();
|
|
840
|
+
const id = nanoid(8);
|
|
900
841
|
const authProvider = new DurableObjectOAuthClientProvider(this.ctx.storage, this.name, callbackUrl);
|
|
901
|
-
|
|
902
|
-
authProvider.serverId = reconnect.id;
|
|
903
|
-
if (reconnect.oauthClientId) authProvider.clientId = reconnect.oauthClientId;
|
|
904
|
-
}
|
|
842
|
+
authProvider.serverId = id;
|
|
905
843
|
const transportType = options?.transport?.type ?? "auto";
|
|
906
844
|
let headerTransportOpts = {};
|
|
907
845
|
if (options?.transport?.headers) headerTransportOpts = {
|
|
@@ -911,28 +849,33 @@ var Agent = class Agent extends Server {
|
|
|
911
849
|
}) },
|
|
912
850
|
requestInit: { headers: options?.transport?.headers }
|
|
913
851
|
};
|
|
914
|
-
|
|
852
|
+
await this.mcp.registerServer(id, {
|
|
853
|
+
url,
|
|
854
|
+
name: serverName,
|
|
855
|
+
callbackUrl,
|
|
915
856
|
client: options?.client,
|
|
916
|
-
reconnect,
|
|
917
857
|
transport: {
|
|
918
858
|
...headerTransportOpts,
|
|
919
859
|
authProvider,
|
|
920
860
|
type: transportType
|
|
921
861
|
}
|
|
922
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}`);
|
|
923
872
|
return {
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
id
|
|
873
|
+
id,
|
|
874
|
+
state: MCPConnectionState.READY
|
|
927
875
|
};
|
|
928
876
|
}
|
|
929
877
|
async removeMcpServer(id) {
|
|
930
|
-
this.mcp.
|
|
931
|
-
this.mcp.unregisterCallbackUrl(id);
|
|
932
|
-
this.sql`
|
|
933
|
-
DELETE FROM cf_agents_mcp_servers WHERE id = ${id};
|
|
934
|
-
`;
|
|
935
|
-
this.broadcastMcpServers();
|
|
878
|
+
await this.mcp.removeServer(id);
|
|
936
879
|
}
|
|
937
880
|
getMcpServers() {
|
|
938
881
|
const mcpState = {
|
|
@@ -941,18 +884,18 @@ var Agent = class Agent extends Server {
|
|
|
941
884
|
servers: {},
|
|
942
885
|
tools: this.mcp.listTools()
|
|
943
886
|
};
|
|
944
|
-
const servers = this.
|
|
945
|
-
SELECT id, name, server_url, client_id, auth_url, callback_url, server_options FROM cf_agents_mcp_servers;
|
|
946
|
-
`;
|
|
887
|
+
const servers = this.mcp.listServers();
|
|
947
888
|
if (servers && Array.isArray(servers) && servers.length > 0) for (const server of servers) {
|
|
948
889
|
const serverConn = this.mcp.mcpConnections[server.id];
|
|
890
|
+
let defaultState = "not-connected";
|
|
891
|
+
if (!serverConn && server.auth_url) defaultState = "authenticating";
|
|
949
892
|
mcpState.servers[server.id] = {
|
|
950
893
|
auth_url: server.auth_url,
|
|
951
894
|
capabilities: serverConn?.serverCapabilities ?? null,
|
|
952
895
|
instructions: serverConn?.instructions ?? null,
|
|
953
896
|
name: server.name,
|
|
954
897
|
server_url: server.server_url,
|
|
955
|
-
state: serverConn?.connectionState ??
|
|
898
|
+
state: serverConn?.connectionState ?? defaultState
|
|
956
899
|
};
|
|
957
900
|
}
|
|
958
901
|
return mcpState;
|
|
@@ -964,6 +907,28 @@ var Agent = class Agent extends Server {
|
|
|
964
907
|
}));
|
|
965
908
|
}
|
|
966
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
|
+
/**
|
|
967
932
|
* Handle OAuth callback response using MCPClientManager configuration
|
|
968
933
|
* @param result OAuth callback result
|
|
969
934
|
* @param request The original request (needed for base URL)
|
|
@@ -972,10 +937,21 @@ var Agent = class Agent extends Server {
|
|
|
972
937
|
handleOAuthCallbackResponse(result, request) {
|
|
973
938
|
const config = this.mcp.getOAuthCallbackConfig();
|
|
974
939
|
if (config?.customHandler) return config.customHandler(result);
|
|
975
|
-
|
|
976
|
-
if (config?.
|
|
977
|
-
|
|
978
|
-
|
|
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);
|
|
979
955
|
}
|
|
980
956
|
};
|
|
981
957
|
const wrappedClasses = /* @__PURE__ */ new Set();
|
|
@@ -1001,10 +977,15 @@ async function routeAgentRequest(request, env, options) {
|
|
|
1001
977
|
prefix: "agents",
|
|
1002
978
|
...options
|
|
1003
979
|
});
|
|
1004
|
-
if (response && corsHeaders && request.headers.get("upgrade")?.toLowerCase() !== "websocket" && request.headers.get("Upgrade")?.toLowerCase() !== "websocket")
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
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
|
+
}
|
|
1008
989
|
return response;
|
|
1009
990
|
}
|
|
1010
991
|
/**
|
|
@@ -1197,4 +1178,4 @@ var StreamingResponse = class {
|
|
|
1197
1178
|
|
|
1198
1179
|
//#endregion
|
|
1199
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 };
|
|
1200
|
-
//# sourceMappingURL=src-
|
|
1181
|
+
//# sourceMappingURL=src-BmbDclOA.js.map
|