@forestadmin/agent 1.111.1 → 1.111.2
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/agent.d.ts +1 -23
- package/dist/agent.js +33 -256
- package/dist/embedded-services.d.ts +48 -0
- package/dist/embedded-services.js +268 -0
- package/package.json +3 -3
package/dist/agent.d.ts
CHANGED
|
@@ -22,18 +22,9 @@ export default class Agent<S extends TSchema = TSchema> extends FrameworkMounter
|
|
|
22
22
|
protected nocodeCustomizer: DataSourceCustomizer<S>;
|
|
23
23
|
protected customizationService: CustomizationService;
|
|
24
24
|
protected schemaGenerator: SchemaGenerator;
|
|
25
|
-
/** Whether MCP server should be mounted */
|
|
26
|
-
private mcpEnabled;
|
|
27
|
-
private mcpEnabledTools?;
|
|
28
|
-
private mcpBasePath?;
|
|
29
|
-
private mcpTokenTtl?;
|
|
30
|
-
private mcpAllowedOAuthClients?;
|
|
31
|
-
private mcpFileUploads?;
|
|
32
25
|
/** In-process workflow executor, created only when addWorkflowExecutor() is called. */
|
|
33
26
|
private embeddedExecutor;
|
|
34
|
-
|
|
35
|
-
private embeddedBff;
|
|
36
|
-
private gateway;
|
|
27
|
+
private readonly embeddedServices;
|
|
37
28
|
private isRestarting;
|
|
38
29
|
private isStopped;
|
|
39
30
|
/**
|
|
@@ -216,25 +207,12 @@ export default class Agent<S extends TSchema = TSchema> extends FrameworkMounter
|
|
|
216
207
|
* .start();
|
|
217
208
|
*/
|
|
218
209
|
addBff(options?: BffEmbedOptions): this;
|
|
219
|
-
private prepareGateway;
|
|
220
|
-
private gatewayApi;
|
|
221
|
-
private rejectGatewayMixing;
|
|
222
|
-
private warnIfMcpAliasUsed;
|
|
223
|
-
private setRootHandlers;
|
|
224
|
-
private logGatewayRoutes;
|
|
225
210
|
protected getRoutes(dataSource: DataSource, services: ForestAdminHttpDriverServices): import("./routes/base-route").default[];
|
|
226
211
|
/**
|
|
227
212
|
* Create an http handler which can respond to all queries which are expected from an agent.
|
|
228
213
|
* Returns the main router and optional MCP HTTP callback.
|
|
229
214
|
*/
|
|
230
215
|
private getRouter;
|
|
231
|
-
private warnIfMcpExemptFromIpWhitelist;
|
|
232
|
-
/**
|
|
233
|
-
* Initialize the MCP server.
|
|
234
|
-
* Uses dynamic import to defer loading until mountAiMcpServer() is actually used.
|
|
235
|
-
* This avoids loading the mcp-server dependency at startup for users who don't use MCP.
|
|
236
|
-
*/
|
|
237
|
-
private initializeMcpServer;
|
|
238
216
|
private buildNoCodeDataSource;
|
|
239
217
|
private buildSchemaMeta;
|
|
240
218
|
private buildRouterAndSendSchema;
|
package/dist/agent.js
CHANGED
|
@@ -1,74 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
4
|
};
|
|
38
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
6
|
const datasource_customizer_1 = require("@forestadmin/datasource-customizer");
|
|
40
|
-
const forestadmin_client_1 = require("@forestadmin/forestadmin-client");
|
|
41
7
|
const bodyparser_1 = __importDefault(require("@koa/bodyparser"));
|
|
42
8
|
const cors_1 = __importDefault(require("@koa/cors"));
|
|
43
9
|
const router_1 = __importDefault(require("@koa/router"));
|
|
44
10
|
const promises_1 = require("fs/promises");
|
|
45
11
|
const json_stringify_pretty_compact_1 = __importDefault(require("json-stringify-pretty-compact"));
|
|
46
12
|
const audit_trail_1 = require("./audit-trail");
|
|
47
|
-
const
|
|
48
|
-
const embedded_bff_1 = __importDefault(require("./embedded-bff"));
|
|
13
|
+
const embedded_services_1 = __importDefault(require("./embedded-services"));
|
|
49
14
|
const embedded_workflow_executor_1 = __importDefault(require("./embedded-workflow-executor"));
|
|
50
15
|
const framework_mounter_1 = __importDefault(require("./framework-mounter"));
|
|
51
|
-
const gateway_1 = require("./gateway");
|
|
52
16
|
const routes_1 = __importDefault(require("./routes"));
|
|
53
17
|
const services_1 = __importDefault(require("./services"));
|
|
54
18
|
const customization_1 = __importDefault(require("./services/model-customizations/customization"));
|
|
55
19
|
const correlation_id_1 = require("./utils/correlation-id");
|
|
56
20
|
const generator_1 = __importDefault(require("./utils/forest-schema/generator"));
|
|
57
21
|
const options_validator_1 = __importDefault(require("./utils/options-validator"));
|
|
58
|
-
// Whichever is registered second raises it. `addBff()` registers at builder time and the MCP
|
|
59
|
-
// server only at start(), and the root middleware answers with the first handler whose matcher
|
|
60
|
-
// claims the url — so the BFF wins and the whole MCP surface would go silently dark.
|
|
61
|
-
const normalizeMcpBasePath = (basePath) => `/${(basePath ?? '').trim()}`.replace(/\/+/g, '/').replace(/\/$/, '');
|
|
62
|
-
const bffMcpCollision = (mcpBasePath) => `Cannot use addBff together with mountAiMcpServer({ basePath: '${mcpBasePath}' }): the MCP ` +
|
|
63
|
-
`server would claim ${bff_routes_1.BFF_PREFIX} paths the embedded BFF answers on (${bff_routes_1.BFF_PREFIX}/oauth, ` +
|
|
64
|
-
`${bff_routes_1.BFF_PREFIX}/mcp). Mount the MCP server elsewhere.`;
|
|
65
|
-
const GATEWAY_DOC = 'https://docs.forest.app/product/embed/gateway';
|
|
66
|
-
const MCP_ALIAS_MIXING = 'mountAiMcpServer() is a deprecated alias of addGateway({ mcp }) and cannot be combined ' +
|
|
67
|
-
'with addGateway(): configure every service through a single addGateway({ mcp, api }) ' +
|
|
68
|
-
`call. See ${GATEWAY_DOC}#the-deprecated-mcp-alias`;
|
|
69
|
-
const API_ALIAS_MIXING = 'addBff() is a deprecated alias of addGateway({ api }) and cannot be combined with ' +
|
|
70
|
-
'addGateway(): configure every service through a single addGateway({ mcp, api }) call. ' +
|
|
71
|
-
`See ${GATEWAY_DOC}#moving-from-addbff-to-addgateway--api-`;
|
|
72
22
|
/**
|
|
73
23
|
* Allow to create a new Forest Admin agent from scratch.
|
|
74
24
|
* Builds the application by composing and configuring all the collection decorators.
|
|
@@ -99,13 +49,8 @@ class Agent extends framework_mounter_1.default {
|
|
|
99
49
|
constructor(options) {
|
|
100
50
|
const allOptions = options_validator_1.default.validate(options_validator_1.default.withDefaults(options));
|
|
101
51
|
super(allOptions.prefix, allOptions.logger);
|
|
102
|
-
/** Whether MCP server should be mounted */
|
|
103
|
-
this.mcpEnabled = false;
|
|
104
52
|
/** In-process workflow executor, created only when addWorkflowExecutor() is called. */
|
|
105
53
|
this.embeddedExecutor = null;
|
|
106
|
-
/** In-process BFF, created only when addBff() is called. */
|
|
107
|
-
this.embeddedBff = null;
|
|
108
|
-
this.gateway = null;
|
|
109
54
|
this.isRestarting = false;
|
|
110
55
|
this.isStopped = false;
|
|
111
56
|
/**
|
|
@@ -120,6 +65,15 @@ class Agent extends framework_mounter_1.default {
|
|
|
120
65
|
});
|
|
121
66
|
this.customizationService = new customization_1.default(allOptions);
|
|
122
67
|
this.schemaGenerator = new generator_1.default(allOptions);
|
|
68
|
+
this.embeddedServices = new embedded_services_1.default(allOptions, {
|
|
69
|
+
setMcpCallback: handler => this.setMcpCallback(handler),
|
|
70
|
+
setGatewayCallback: handler => this.setGatewayCallback(handler),
|
|
71
|
+
setBffCallback: callback => this.setBffCallback(callback),
|
|
72
|
+
getInProcessDispatcher: () => this.getInProcessDispatcher(),
|
|
73
|
+
completeMountPrefix: () => this.completeMountPrefix,
|
|
74
|
+
isStopped: () => this.isStopped,
|
|
75
|
+
startupBegun: () => this.startupBegun,
|
|
76
|
+
});
|
|
123
77
|
}
|
|
124
78
|
/**
|
|
125
79
|
* Start the agent.
|
|
@@ -132,21 +86,21 @@ class Agent extends framework_mounter_1.default {
|
|
|
132
86
|
// First, before anything is mounted or subscribed: everything it validates is what the caller
|
|
133
87
|
// handed to addBff(), so a mistyped key must fail on that line rather than leave the host
|
|
134
88
|
// serving /forest with a permanently bricked /bff.
|
|
135
|
-
await this.prepareGateway();
|
|
136
|
-
await this.
|
|
89
|
+
await this.embeddedServices.prepareGateway();
|
|
90
|
+
await this.embeddedServices.bff?.prepare();
|
|
137
91
|
if (this.isStopped)
|
|
138
|
-
await this.
|
|
139
|
-
if (this.
|
|
140
|
-
this.setRootHandlers();
|
|
92
|
+
await this.embeddedServices.bff?.stop();
|
|
93
|
+
if (this.embeddedServices.hasGateway)
|
|
94
|
+
this.embeddedServices.setRootHandlers();
|
|
141
95
|
if (this.isStopped)
|
|
142
96
|
return;
|
|
143
|
-
this.warnIfMcpAliasUsed();
|
|
97
|
+
this.embeddedServices.warnIfMcpAliasUsed();
|
|
144
98
|
const { router, mcp } = await this.buildRouterAndSendSchema();
|
|
145
99
|
if (this.isStopped)
|
|
146
100
|
return;
|
|
147
101
|
await this.options.forestAdminClient.subscribeToServerEvents();
|
|
148
102
|
this.options.forestAdminClient.onRefreshCustomizations(this.restart.bind(this));
|
|
149
|
-
this.setRootHandlers(mcp);
|
|
103
|
+
this.embeddedServices.setRootHandlers(mcp);
|
|
150
104
|
await this.mount(router);
|
|
151
105
|
mounted = true;
|
|
152
106
|
// Boot after mount(): the embedded executor reaches the agent over HTTP, and the
|
|
@@ -155,12 +109,13 @@ class Agent extends framework_mounter_1.default {
|
|
|
155
109
|
if (this.isStopped)
|
|
156
110
|
return;
|
|
157
111
|
// Same reason, without the socket: the dispatcher injects into the stack mount() just built.
|
|
158
|
-
await this.
|
|
159
|
-
this.logGatewayRoutes();
|
|
112
|
+
await this.embeddedServices.bff?.start(this.getInProcessDispatcher());
|
|
113
|
+
this.embeddedServices.logGatewayRoutes();
|
|
160
114
|
// Here rather than in initializeMcpServer(): that one reruns on every restart() and each run
|
|
161
115
|
// would cost a SaaS round-trip for a warning already given.
|
|
162
|
-
if (this.
|
|
163
|
-
await this.warnIfMcpExemptFromIpWhitelist();
|
|
116
|
+
if (this.embeddedServices.isMcpEnabled) {
|
|
117
|
+
await this.embeddedServices.warnIfMcpExemptFromIpWhitelist();
|
|
118
|
+
}
|
|
164
119
|
}
|
|
165
120
|
catch (error) {
|
|
166
121
|
// Only when nothing was mounted. Past mount() the host framework is already serving this
|
|
@@ -193,11 +148,11 @@ class Agent extends framework_mounter_1.default {
|
|
|
193
148
|
*/
|
|
194
149
|
async stop() {
|
|
195
150
|
this.isStopped = true;
|
|
196
|
-
if (this.
|
|
197
|
-
this.setRootHandlers();
|
|
151
|
+
if (this.embeddedServices.hasGatewayBuild)
|
|
152
|
+
this.embeddedServices.setRootHandlers();
|
|
198
153
|
// Stop answering before the stack it dispatches into goes away: the host application keeps
|
|
199
154
|
// whatever middleware it registered, so a stopped agent would otherwise still serve BFF data.
|
|
200
|
-
await this.
|
|
155
|
+
await this.embeddedServices.bff?.stop();
|
|
201
156
|
// Drain the embedded executor next, while the agent it depends on is still serving.
|
|
202
157
|
await this.embeddedExecutor?.stop();
|
|
203
158
|
// Close anything related to ForestAdmin client
|
|
@@ -231,10 +186,10 @@ class Agent extends framework_mounter_1.default {
|
|
|
231
186
|
const { router, mcp } = await this.buildRouterAndSendSchema();
|
|
232
187
|
if (this.isStopped)
|
|
233
188
|
return;
|
|
234
|
-
this.setRootHandlers(mcp);
|
|
189
|
+
this.embeddedServices.setRootHandlers(mcp);
|
|
235
190
|
await this.remount(router);
|
|
236
191
|
// A restart means the customizations changed, so the schema the BFF read is stale.
|
|
237
|
-
this.
|
|
192
|
+
this.embeddedServices.bff?.invalidate();
|
|
238
193
|
}
|
|
239
194
|
finally {
|
|
240
195
|
this.isRestarting = false;
|
|
@@ -316,30 +271,7 @@ class Agent extends framework_mounter_1.default {
|
|
|
316
271
|
return this;
|
|
317
272
|
}
|
|
318
273
|
addGateway(options) {
|
|
319
|
-
|
|
320
|
-
throw new Error('addGateway can only be called once.');
|
|
321
|
-
if (this.startupBegun) {
|
|
322
|
-
throw new Error('addGateway must be called before start(): the agent is already starting.');
|
|
323
|
-
}
|
|
324
|
-
if (this.mcpEnabled)
|
|
325
|
-
this.rejectGatewayMixing(MCP_ALIAS_MIXING);
|
|
326
|
-
if (this.embeddedBff)
|
|
327
|
-
this.rejectGatewayMixing(API_ALIAS_MIXING);
|
|
328
|
-
const services = (0, gateway_1.resolveGatewayServices)(options);
|
|
329
|
-
this.gateway = {
|
|
330
|
-
basePath: options.basePath ?? '',
|
|
331
|
-
services,
|
|
332
|
-
allowedOAuthClients: options.allowedOAuthClients,
|
|
333
|
-
};
|
|
334
|
-
if (services.mcp) {
|
|
335
|
-
this.mcpEnabled = true;
|
|
336
|
-
this.mcpEnabledTools = services.mcp.enabledTools;
|
|
337
|
-
this.mcpTokenTtl = services.mcp.tokenTtl;
|
|
338
|
-
this.mcpAllowedOAuthClients = options.allowedOAuthClients;
|
|
339
|
-
this.mcpFileUploads = services.mcp.fileUploads;
|
|
340
|
-
}
|
|
341
|
-
if (services.api)
|
|
342
|
-
this.getInProcessDispatcher();
|
|
274
|
+
this.embeddedServices.addGateway(options);
|
|
343
275
|
return this;
|
|
344
276
|
}
|
|
345
277
|
/**
|
|
@@ -375,17 +307,7 @@ class Agent extends framework_mounter_1.default {
|
|
|
375
307
|
* agent.mountAiMcpServer({ fileUploads: false });
|
|
376
308
|
*/
|
|
377
309
|
mountAiMcpServer(options) {
|
|
378
|
-
|
|
379
|
-
this.rejectGatewayMixing(MCP_ALIAS_MIXING);
|
|
380
|
-
if (this.embeddedBff && (0, bff_routes_1.collidesWithBff)(options?.basePath)) {
|
|
381
|
-
throw new Error(bffMcpCollision(options?.basePath));
|
|
382
|
-
}
|
|
383
|
-
this.mcpEnabled = true;
|
|
384
|
-
this.mcpEnabledTools = options?.enabledTools;
|
|
385
|
-
this.mcpBasePath = options?.basePath;
|
|
386
|
-
this.mcpTokenTtl = options?.tokenTtl;
|
|
387
|
-
this.mcpAllowedOAuthClients = options?.allowedOAuthClients;
|
|
388
|
-
this.mcpFileUploads = options?.fileUploads;
|
|
310
|
+
this.embeddedServices.mountAiMcpServer(options);
|
|
389
311
|
return this;
|
|
390
312
|
}
|
|
391
313
|
/**
|
|
@@ -454,95 +376,9 @@ class Agent extends framework_mounter_1.default {
|
|
|
454
376
|
* .start();
|
|
455
377
|
*/
|
|
456
378
|
addBff(options = {}) {
|
|
457
|
-
|
|
458
|
-
this.rejectGatewayMixing(API_ALIAS_MIXING);
|
|
459
|
-
if (this.embeddedBff) {
|
|
460
|
-
throw new Error('addBff can only be called once.');
|
|
461
|
-
}
|
|
462
|
-
// Refused rather than accepted and left dark: once startup has begun the dispatcher hook has no
|
|
463
|
-
// mount left to attach to and nothing calls the BFF's own start(), so `/bff` would answer 503
|
|
464
|
-
// for the rest of the process while every other route works. A throw on the line the developer
|
|
465
|
-
// wrote instead. Refused from the first line of start(), not from its last: `start()` is async,
|
|
466
|
-
// so a call made while it is still in flight is just as late.
|
|
467
|
-
if (this.startupBegun) {
|
|
468
|
-
throw new Error('addBff must be called before start(): the agent is already starting.');
|
|
469
|
-
}
|
|
470
|
-
if ((0, bff_routes_1.collidesWithBff)(this.mcpBasePath)) {
|
|
471
|
-
throw new Error(bffMcpCollision(this.mcpBasePath));
|
|
472
|
-
}
|
|
473
|
-
const bff = new embedded_bff_1.default(this.options, options, { prefix: bff_routes_1.BFF_PREFIX });
|
|
474
|
-
this.embeddedBff = bff;
|
|
475
|
-
// Registered now rather than at start(): getInProcessDispatcher() pushes its hook the first
|
|
476
|
-
// time it is called, and mount() only runs the hooks registered before it — asked for later,
|
|
477
|
-
// the dispatcher would have no handler until the first restart.
|
|
478
|
-
this.getInProcessDispatcher();
|
|
479
|
-
this.setBffCallback((0, bff_routes_1.createBffAliasCallback)(bff.handle, this.options.logger));
|
|
379
|
+
this.embeddedServices.addBff(options);
|
|
480
380
|
return this;
|
|
481
381
|
}
|
|
482
|
-
async prepareGateway() {
|
|
483
|
-
if (!this.gateway)
|
|
484
|
-
return;
|
|
485
|
-
const { services } = this.gateway;
|
|
486
|
-
if (!services.mcp && !services.api) {
|
|
487
|
-
throw new Error('addGateway() enables no service: pass mcp, api, or both, e.g. addGateway({ mcp: true }).');
|
|
488
|
-
}
|
|
489
|
-
(0, forestadmin_client_1.normalizeDomainList)(this.gateway.allowedOAuthClients);
|
|
490
|
-
const { createGatewaySwitch, makeIsMcpRoute, normalizeMountPath } = await Promise.resolve().then(() => __importStar(require('@forestadmin/mcp-server')));
|
|
491
|
-
const basePath = normalizeMountPath(this.gateway.basePath, 'basePath');
|
|
492
|
-
(0, gateway_1.assertNoGatewayOverlap)(basePath, this.completeMountPrefix, services);
|
|
493
|
-
this.gateway.basePath = basePath;
|
|
494
|
-
if (services.mcp)
|
|
495
|
-
this.mcpBasePath = basePath || undefined;
|
|
496
|
-
const bff = services.api ? this.gatewayApi(basePath, services.api) : null;
|
|
497
|
-
const api = bff ? { matches: (path) => bff.claims(path), callback: bff.handle } : null;
|
|
498
|
-
const isMcpRoute = makeIsMcpRoute(basePath);
|
|
499
|
-
const mcpStarting = services.mcp ? (0, gateway_1.mcpUnavailable)(isMcpRoute, 'starting') : null;
|
|
500
|
-
if (services.mcp)
|
|
501
|
-
this.gateway.mcpStopped = (0, gateway_1.mcpUnavailable)(isMcpRoute, 'stopped');
|
|
502
|
-
this.gateway.build = mcp => createGatewaySwitch({
|
|
503
|
-
basePath,
|
|
504
|
-
mcp: mcp ?? mcpStarting ?? undefined,
|
|
505
|
-
api: api ?? undefined,
|
|
506
|
-
});
|
|
507
|
-
}
|
|
508
|
-
gatewayApi(basePath, options) {
|
|
509
|
-
this.embeddedBff ?? (this.embeddedBff = new embedded_bff_1.default(this.options, options, {
|
|
510
|
-
prefix: `${basePath}/api`,
|
|
511
|
-
name: 'The Gateway API',
|
|
512
|
-
requiredVersion: gateway_1.AGENT_BFF_PEER_VERSION,
|
|
513
|
-
skipIpWhitelistWarning: Boolean(this.gateway?.services.mcp),
|
|
514
|
-
allowedOAuthClients: this.gateway?.allowedOAuthClients,
|
|
515
|
-
gateway: true,
|
|
516
|
-
}));
|
|
517
|
-
return this.embeddedBff;
|
|
518
|
-
}
|
|
519
|
-
rejectGatewayMixing(message) {
|
|
520
|
-
this.options.logger('Error', message);
|
|
521
|
-
throw new Error(message);
|
|
522
|
-
}
|
|
523
|
-
warnIfMcpAliasUsed() {
|
|
524
|
-
if (!this.mcpEnabled || this.gateway)
|
|
525
|
-
return;
|
|
526
|
-
this.options.logger('Warn', '[MCP] mountAiMcpServer() is deprecated: use addGateway({ mcp }) instead. ' +
|
|
527
|
-
'It keeps serving on its current paths.');
|
|
528
|
-
}
|
|
529
|
-
setRootHandlers(mcp) {
|
|
530
|
-
if (!this.gateway?.build) {
|
|
531
|
-
this.setMcpCallback(mcp ?? null);
|
|
532
|
-
return;
|
|
533
|
-
}
|
|
534
|
-
const stopped = this.isStopped ? this.gateway.mcpStopped : undefined;
|
|
535
|
-
this.setGatewayCallback(this.gateway.build(stopped ?? mcp));
|
|
536
|
-
}
|
|
537
|
-
logGatewayRoutes() {
|
|
538
|
-
if (!this.gateway)
|
|
539
|
-
return;
|
|
540
|
-
const { basePath, services, allowedOAuthClients } = this.gateway;
|
|
541
|
-
(0, gateway_1.describeGatewayRoutes)(basePath, services).forEach(line => this.options.logger('Info', line));
|
|
542
|
-
if (allowedOAuthClients && !(0, gateway_1.servesOAuth)(services)) {
|
|
543
|
-
this.options.logger('Warn', '[Gateway] allowedOAuthClients is set but no OAuth route is served (MCP off, API OAuth off).');
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
382
|
getRoutes(dataSource, services) {
|
|
547
383
|
return (0, routes_1.default)(dataSource, this.options, services);
|
|
548
384
|
}
|
|
@@ -557,8 +393,8 @@ class Agent extends framework_mounter_1.default {
|
|
|
557
393
|
await Promise.all(routes.map(route => route.bootstrap()));
|
|
558
394
|
// Initialize MCP server if enabled via mountAiMcpServer()
|
|
559
395
|
let mcp;
|
|
560
|
-
if (this.
|
|
561
|
-
mcp = await this.initializeMcpServer();
|
|
396
|
+
if (this.embeddedServices.isMcpEnabled) {
|
|
397
|
+
mcp = await this.embeddedServices.initializeMcpServer();
|
|
562
398
|
}
|
|
563
399
|
// Build main router
|
|
564
400
|
const router = new router_1.default();
|
|
@@ -578,65 +414,6 @@ class Agent extends framework_mounter_1.default {
|
|
|
578
414
|
routes.forEach(route => route.setupRoutes(router));
|
|
579
415
|
return { router, mcp };
|
|
580
416
|
}
|
|
581
|
-
async warnIfMcpExemptFromIpWhitelist() {
|
|
582
|
-
try {
|
|
583
|
-
const { isFeatureEnabled } = await this.options.forestAdminClient.getIpWhitelistConfiguration();
|
|
584
|
-
if (!isFeatureEnabled)
|
|
585
|
-
return;
|
|
586
|
-
const base = normalizeMcpBasePath(this.mcpBasePath);
|
|
587
|
-
const apiNote = this.gateway?.services.api
|
|
588
|
-
? ` The Gateway API on ${base}/api/* escapes it too: it reaches the agent in-process, ` +
|
|
589
|
-
'which the whitelist exempts as a trusted loopback caller. API calls still require an ' +
|
|
590
|
-
'API key or an OAuth session.'
|
|
591
|
-
: '';
|
|
592
|
-
this.options.logger('Warn', '[MCP] The IP whitelist is enabled for this environment, but it filters none of the MCP ' +
|
|
593
|
-
`routes (${base}/mcp, ${base}/mcp/uploads, ${base}/oauth/*, ` +
|
|
594
|
-
`/.well-known/oauth-authorization-server${base}, ` +
|
|
595
|
-
`/.well-known/oauth-protected-resource${base}/mcp): its middleware is mounted on the ` +
|
|
596
|
-
`/forest router only, so these routes escape it for any caller. Tool calls on ${base}/mcp ` +
|
|
597
|
-
`still require a valid MCP OAuth token.${apiNote}`);
|
|
598
|
-
}
|
|
599
|
-
catch (error) {
|
|
600
|
-
this.options.logger('Debug', `[MCP] Could not read the IP whitelist configuration: ${error instanceof Error ? error.message : String(error)}`);
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
/**
|
|
604
|
-
* Initialize the MCP server.
|
|
605
|
-
* Uses dynamic import to defer loading until mountAiMcpServer() is actually used.
|
|
606
|
-
* This avoids loading the mcp-server dependency at startup for users who don't use MCP.
|
|
607
|
-
*/
|
|
608
|
-
async initializeMcpServer() {
|
|
609
|
-
const mcpLogger = (level, message) => this.options.logger(level, `[MCP] ${message}`);
|
|
610
|
-
try {
|
|
611
|
-
// Dynamic import to defer loading until actually needed
|
|
612
|
-
const { ForestMCPServer, ForestServerClientImpl, makeIsMcpRoute } = await Promise.resolve().then(() => __importStar(require('@forestadmin/mcp-server')));
|
|
613
|
-
const forestServerClient = new ForestServerClientImpl(this.options.forestAdminClient.schemaService, this.options.forestAdminClient.activityLogsService, this.options.forestAdminClient.workflowsService, this.options.forestServerUrl);
|
|
614
|
-
const mcpServer = new ForestMCPServer({
|
|
615
|
-
forestServerUrl: this.options.forestServerUrl,
|
|
616
|
-
forestAppUrl: this.options.forestAppUrl,
|
|
617
|
-
envSecret: this.options.envSecret,
|
|
618
|
-
authSecret: this.options.authSecret,
|
|
619
|
-
logger: mcpLogger,
|
|
620
|
-
forestServerClient,
|
|
621
|
-
enabledTools: this.mcpEnabledTools,
|
|
622
|
-
basePath: this.mcpBasePath,
|
|
623
|
-
tokenTtl: this.mcpTokenTtl,
|
|
624
|
-
allowedOAuthClients: this.mcpAllowedOAuthClients,
|
|
625
|
-
fileUploads: this.mcpFileUploads,
|
|
626
|
-
agentDispatcher: this.getInProcessDispatcher(),
|
|
627
|
-
});
|
|
628
|
-
const callback = await mcpServer.getHttpCallback();
|
|
629
|
-
const matches = makeIsMcpRoute(this.mcpBasePath);
|
|
630
|
-
mcpLogger('Info', 'Server initialized successfully');
|
|
631
|
-
mcpLogger('Info', 'Tool calls dispatch in-process and skip any middleware mounted in front of the agent');
|
|
632
|
-
return { callback, matches };
|
|
633
|
-
}
|
|
634
|
-
catch (error) {
|
|
635
|
-
const { message } = error;
|
|
636
|
-
mcpLogger('Error', `Failed to initialize MCP server: ${message}`);
|
|
637
|
-
throw error;
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
417
|
// `installAuditTrail: false` skips wiring the audit hooks (and, with them, the store's DB
|
|
641
418
|
// connection/migration) — used by `generateSchemaOnly()`, which only needs the collection
|
|
642
419
|
// structure and must not depend on the audit database being reachable.
|
|
@@ -750,4 +527,4 @@ class Agent extends framework_mounter_1.default {
|
|
|
750
527
|
}
|
|
751
528
|
}
|
|
752
529
|
exports.default = Agent;
|
|
753
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QkEsOEVBQTBFO0FBQzFFLHdFQUFzRTtBQUN0RSxpRUFBeUM7QUFDekMscURBQTZCO0FBQzdCLHlEQUFpQztBQUNqQywwQ0FBa0Q7QUFDbEQsa0dBQXNEO0FBRXRELCtDQUF1RDtBQUN2RCw2Q0FBbUY7QUFDbkYsa0VBQXlDO0FBQ3pDLDhGQUFvRTtBQUNwRSw0RUFBbUQ7QUFDbkQsdUNBT21CO0FBQ25CLHNEQUFrQztBQUNsQywwREFBc0M7QUFDdEMsa0dBQWlGO0FBQ2pGLDJEQUF3RjtBQUN4RixnRkFBOEQ7QUFDOUQsa0ZBQXlEO0FBRXpELDZGQUE2RjtBQUM3RiwrRkFBK0Y7QUFDL0YscUZBQXFGO0FBQ3JGLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxRQUFpQixFQUFVLEVBQUUsQ0FDekQsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztBQUV4RSxNQUFNLGVBQWUsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRSxDQUM5QyxpRUFBaUUsV0FBVyxnQkFBZ0I7SUFDNUYsc0JBQXNCLHVCQUFVLHVDQUF1Qyx1QkFBVSxVQUFVO0lBQzNGLEdBQUcsdUJBQVUsd0NBQXdDLENBQUM7QUFFeEQsTUFBTSxXQUFXLEdBQUcsK0NBQStDLENBQUM7QUFFcEUsTUFBTSxnQkFBZ0IsR0FDcEIseUZBQXlGO0lBQ3pGLHVGQUF1RjtJQUN2RixhQUFhLFdBQVcsMkJBQTJCLENBQUM7QUFFdEQsTUFBTSxnQkFBZ0IsR0FDcEIsb0ZBQW9GO0lBQ3BGLHdGQUF3RjtJQUN4RixPQUFPLFdBQVcseUNB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
|
|
530
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFzQkEsOEVBQTBFO0FBQzFFLGlFQUF5QztBQUN6QyxxREFBNkI7QUFDN0IseURBQWlDO0FBQ2pDLDBDQUFrRDtBQUNsRCxrR0FBc0Q7QUFFdEQsK0NBQXVEO0FBQ3ZELDRFQUFtRDtBQUNuRCw4RkFBb0U7QUFDcEUsNEVBQW1EO0FBQ25ELHNEQUFrQztBQUNsQywwREFBc0M7QUFDdEMsa0dBQWlGO0FBQ2pGLDJEQUF3RjtBQUN4RixnRkFBOEQ7QUFDOUQsa0ZBQXlEO0FBRXpEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQXFCLEtBQW1DLFNBQVEsMkJBQWdCO0lBc0I5RTs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxZQUFZLE9BQXFCO1FBQy9CLE1BQU0sVUFBVSxHQUFHLDJCQUFnQixDQUFDLFFBQVEsQ0FBQywyQkFBZ0IsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNyRixLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFqQzlDLHVGQUF1RjtRQUMvRSxxQkFBZ0IsR0FBb0MsSUFBSSxDQUFDO1FBSXpELGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFMUI7Ozs7V0FJRztRQUNLLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBc0IzQixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksNENBQW9CLENBQUk7WUFDNUMsZ0NBQWdDLEVBQUUsT0FBTyxDQUFDLGdDQUFnQyxJQUFJLEtBQUs7U0FDcEYsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksdUJBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFD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
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type InProcessDispatcher from './mcp-in-process-dispatcher';
|
|
2
|
+
import type { AgentOptionsWithDefaults, BffEmbedOptions, GatewayOptions, HttpCallback, McpEmbedOptions, RootHandler } from './types';
|
|
3
|
+
import EmbeddedBff from './embedded-bff';
|
|
4
|
+
export type EmbeddedServicesHost = {
|
|
5
|
+
setMcpCallback: (handler: RootHandler | null) => void;
|
|
6
|
+
setGatewayCallback: (handler: RootHandler) => void;
|
|
7
|
+
setBffCallback: (callback: HttpCallback | null) => void;
|
|
8
|
+
getInProcessDispatcher: () => InProcessDispatcher;
|
|
9
|
+
completeMountPrefix: () => string;
|
|
10
|
+
isStopped: () => boolean;
|
|
11
|
+
startupBegun: () => boolean;
|
|
12
|
+
};
|
|
13
|
+
export default class EmbeddedServices {
|
|
14
|
+
private readonly options;
|
|
15
|
+
private readonly host;
|
|
16
|
+
/** Whether MCP server should be mounted */
|
|
17
|
+
private mcpEnabled;
|
|
18
|
+
private mcpEnabledTools?;
|
|
19
|
+
private mcpBasePath?;
|
|
20
|
+
private mcpTokenTtl?;
|
|
21
|
+
private mcpAllowedOAuthClients?;
|
|
22
|
+
private mcpFileUploads?;
|
|
23
|
+
/** In-process BFF, created only when addBff() is called. */
|
|
24
|
+
private embeddedBff;
|
|
25
|
+
private gateway;
|
|
26
|
+
constructor(options: AgentOptionsWithDefaults, host: EmbeddedServicesHost);
|
|
27
|
+
get isMcpEnabled(): boolean;
|
|
28
|
+
get hasGateway(): boolean;
|
|
29
|
+
get hasGatewayBuild(): boolean;
|
|
30
|
+
get bff(): EmbeddedBff | null;
|
|
31
|
+
addGateway(options: GatewayOptions): void;
|
|
32
|
+
mountAiMcpServer(options?: McpEmbedOptions): void;
|
|
33
|
+
addBff(options: BffEmbedOptions): void;
|
|
34
|
+
prepareGateway(): Promise<void>;
|
|
35
|
+
private gatewayApi;
|
|
36
|
+
private rejectGatewayMixing;
|
|
37
|
+
warnIfMcpAliasUsed(): void;
|
|
38
|
+
setRootHandlers(mcp?: RootHandler): void;
|
|
39
|
+
logGatewayRoutes(): void;
|
|
40
|
+
warnIfMcpExemptFromIpWhitelist(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Initialize the MCP server.
|
|
43
|
+
* Uses dynamic import to defer loading until mountAiMcpServer() is actually used.
|
|
44
|
+
* This avoids loading the mcp-server dependency at startup for users who don't use MCP.
|
|
45
|
+
*/
|
|
46
|
+
initializeMcpServer(): Promise<RootHandler>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=embedded-services.d.ts.map
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const forestadmin_client_1 = require("@forestadmin/forestadmin-client");
|
|
40
|
+
const bff_routes_1 = require("./bff-routes");
|
|
41
|
+
const embedded_bff_1 = __importDefault(require("./embedded-bff"));
|
|
42
|
+
const gateway_1 = require("./gateway");
|
|
43
|
+
const normalizeMcpBasePath = (basePath) => `/${(basePath ?? '').trim()}`.replace(/\/+/g, '/').replace(/\/$/, '');
|
|
44
|
+
// Whichever is registered second raises it. `addBff()` registers at builder time and the MCP
|
|
45
|
+
// server only at start(), and the root middleware answers with the first handler whose matcher
|
|
46
|
+
// claims the url — so the BFF wins and the whole MCP surface would go silently dark.
|
|
47
|
+
const bffMcpCollision = (mcpBasePath) => `Cannot use addBff together with mountAiMcpServer({ basePath: '${mcpBasePath}' }): the MCP ` +
|
|
48
|
+
`server would claim ${bff_routes_1.BFF_PREFIX} paths the embedded BFF answers on (${bff_routes_1.BFF_PREFIX}/oauth, ` +
|
|
49
|
+
`${bff_routes_1.BFF_PREFIX}/mcp). Mount the MCP server elsewhere.`;
|
|
50
|
+
const GATEWAY_DOC = 'https://docs.forest.app/product/embed/gateway';
|
|
51
|
+
const MCP_ALIAS_MIXING = 'mountAiMcpServer() is a deprecated alias of addGateway({ mcp }) and cannot be combined ' +
|
|
52
|
+
'with addGateway(): configure every service through a single addGateway({ mcp, api }) ' +
|
|
53
|
+
`call. See ${GATEWAY_DOC}#the-deprecated-mcp-alias`;
|
|
54
|
+
const API_ALIAS_MIXING = 'addBff() is a deprecated alias of addGateway({ api }) and cannot be combined with ' +
|
|
55
|
+
'addGateway(): configure every service through a single addGateway({ mcp, api }) call. ' +
|
|
56
|
+
`See ${GATEWAY_DOC}#moving-from-addbff-to-addgateway--api-`;
|
|
57
|
+
class EmbeddedServices {
|
|
58
|
+
constructor(options, host) {
|
|
59
|
+
this.options = options;
|
|
60
|
+
this.host = host;
|
|
61
|
+
/** Whether MCP server should be mounted */
|
|
62
|
+
this.mcpEnabled = false;
|
|
63
|
+
/** In-process BFF, created only when addBff() is called. */
|
|
64
|
+
this.embeddedBff = null;
|
|
65
|
+
this.gateway = null;
|
|
66
|
+
}
|
|
67
|
+
get isMcpEnabled() {
|
|
68
|
+
return this.mcpEnabled;
|
|
69
|
+
}
|
|
70
|
+
get hasGateway() {
|
|
71
|
+
return Boolean(this.gateway);
|
|
72
|
+
}
|
|
73
|
+
get hasGatewayBuild() {
|
|
74
|
+
return Boolean(this.gateway?.build);
|
|
75
|
+
}
|
|
76
|
+
get bff() {
|
|
77
|
+
return this.embeddedBff;
|
|
78
|
+
}
|
|
79
|
+
addGateway(options) {
|
|
80
|
+
if (this.gateway)
|
|
81
|
+
throw new Error('addGateway can only be called once.');
|
|
82
|
+
if (this.host.startupBegun()) {
|
|
83
|
+
throw new Error('addGateway must be called before start(): the agent is already starting.');
|
|
84
|
+
}
|
|
85
|
+
if (this.mcpEnabled)
|
|
86
|
+
this.rejectGatewayMixing(MCP_ALIAS_MIXING);
|
|
87
|
+
if (this.embeddedBff)
|
|
88
|
+
this.rejectGatewayMixing(API_ALIAS_MIXING);
|
|
89
|
+
const services = (0, gateway_1.resolveGatewayServices)(options);
|
|
90
|
+
this.gateway = {
|
|
91
|
+
basePath: options.basePath ?? '',
|
|
92
|
+
services,
|
|
93
|
+
allowedOAuthClients: options.allowedOAuthClients,
|
|
94
|
+
};
|
|
95
|
+
if (services.mcp) {
|
|
96
|
+
this.mcpEnabled = true;
|
|
97
|
+
this.mcpEnabledTools = services.mcp.enabledTools;
|
|
98
|
+
this.mcpTokenTtl = services.mcp.tokenTtl;
|
|
99
|
+
this.mcpAllowedOAuthClients = options.allowedOAuthClients;
|
|
100
|
+
this.mcpFileUploads = services.mcp.fileUploads;
|
|
101
|
+
}
|
|
102
|
+
if (services.api)
|
|
103
|
+
this.host.getInProcessDispatcher();
|
|
104
|
+
}
|
|
105
|
+
mountAiMcpServer(options) {
|
|
106
|
+
if (this.gateway)
|
|
107
|
+
this.rejectGatewayMixing(MCP_ALIAS_MIXING);
|
|
108
|
+
if (this.embeddedBff && (0, bff_routes_1.collidesWithBff)(options?.basePath)) {
|
|
109
|
+
throw new Error(bffMcpCollision(options?.basePath));
|
|
110
|
+
}
|
|
111
|
+
this.mcpEnabled = true;
|
|
112
|
+
this.mcpEnabledTools = options?.enabledTools;
|
|
113
|
+
this.mcpBasePath = options?.basePath;
|
|
114
|
+
this.mcpTokenTtl = options?.tokenTtl;
|
|
115
|
+
this.mcpAllowedOAuthClients = options?.allowedOAuthClients;
|
|
116
|
+
this.mcpFileUploads = options?.fileUploads;
|
|
117
|
+
}
|
|
118
|
+
addBff(options) {
|
|
119
|
+
if (this.gateway)
|
|
120
|
+
this.rejectGatewayMixing(API_ALIAS_MIXING);
|
|
121
|
+
if (this.embeddedBff) {
|
|
122
|
+
throw new Error('addBff can only be called once.');
|
|
123
|
+
}
|
|
124
|
+
// Refused rather than accepted and left dark: once startup has begun the dispatcher hook has no
|
|
125
|
+
// mount left to attach to and nothing calls the BFF's own start(), so `/bff` would answer 503
|
|
126
|
+
// for the rest of the process while every other route works. A throw on the line the developer
|
|
127
|
+
// wrote instead. Refused from the first line of start(), not from its last: `start()` is async,
|
|
128
|
+
// so a call made while it is still in flight is just as late.
|
|
129
|
+
if (this.host.startupBegun()) {
|
|
130
|
+
throw new Error('addBff must be called before start(): the agent is already starting.');
|
|
131
|
+
}
|
|
132
|
+
if ((0, bff_routes_1.collidesWithBff)(this.mcpBasePath)) {
|
|
133
|
+
throw new Error(bffMcpCollision(this.mcpBasePath));
|
|
134
|
+
}
|
|
135
|
+
const bff = new embedded_bff_1.default(this.options, options, { prefix: bff_routes_1.BFF_PREFIX });
|
|
136
|
+
this.embeddedBff = bff;
|
|
137
|
+
// Registered now rather than at start(): getInProcessDispatcher() pushes its hook the first
|
|
138
|
+
// time it is called, and mount() only runs the hooks registered before it — asked for later,
|
|
139
|
+
// the dispatcher would have no handler until the first restart.
|
|
140
|
+
this.host.getInProcessDispatcher();
|
|
141
|
+
this.host.setBffCallback((0, bff_routes_1.createBffAliasCallback)(bff.handle, this.options.logger));
|
|
142
|
+
}
|
|
143
|
+
async prepareGateway() {
|
|
144
|
+
if (!this.gateway)
|
|
145
|
+
return;
|
|
146
|
+
const { services } = this.gateway;
|
|
147
|
+
if (!services.mcp && !services.api) {
|
|
148
|
+
throw new Error('addGateway() enables no service: pass mcp, api, or both, e.g. addGateway({ mcp: true }).');
|
|
149
|
+
}
|
|
150
|
+
(0, forestadmin_client_1.normalizeDomainList)(this.gateway.allowedOAuthClients);
|
|
151
|
+
const { createGatewaySwitch, makeIsMcpRoute, normalizeMountPath } = await Promise.resolve().then(() => __importStar(require('@forestadmin/mcp-server')));
|
|
152
|
+
const basePath = normalizeMountPath(this.gateway.basePath, 'basePath');
|
|
153
|
+
(0, gateway_1.assertNoGatewayOverlap)(basePath, this.host.completeMountPrefix(), services);
|
|
154
|
+
this.gateway.basePath = basePath;
|
|
155
|
+
if (services.mcp)
|
|
156
|
+
this.mcpBasePath = basePath || undefined;
|
|
157
|
+
const bff = services.api ? this.gatewayApi(basePath, services.api) : null;
|
|
158
|
+
const api = bff ? { matches: (path) => bff.claims(path), callback: bff.handle } : null;
|
|
159
|
+
const isMcpRoute = makeIsMcpRoute(basePath);
|
|
160
|
+
const mcpStarting = services.mcp ? (0, gateway_1.mcpUnavailable)(isMcpRoute, 'starting') : null;
|
|
161
|
+
if (services.mcp)
|
|
162
|
+
this.gateway.mcpStopped = (0, gateway_1.mcpUnavailable)(isMcpRoute, 'stopped');
|
|
163
|
+
this.gateway.build = mcp => createGatewaySwitch({
|
|
164
|
+
basePath,
|
|
165
|
+
mcp: mcp ?? mcpStarting ?? undefined,
|
|
166
|
+
api: api ?? undefined,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
gatewayApi(basePath, options) {
|
|
170
|
+
this.embeddedBff ?? (this.embeddedBff = new embedded_bff_1.default(this.options, options, {
|
|
171
|
+
prefix: `${basePath}/api`,
|
|
172
|
+
name: 'The Gateway API',
|
|
173
|
+
requiredVersion: gateway_1.AGENT_BFF_PEER_VERSION,
|
|
174
|
+
skipIpWhitelistWarning: Boolean(this.gateway?.services.mcp),
|
|
175
|
+
allowedOAuthClients: this.gateway?.allowedOAuthClients,
|
|
176
|
+
gateway: true,
|
|
177
|
+
}));
|
|
178
|
+
return this.embeddedBff;
|
|
179
|
+
}
|
|
180
|
+
rejectGatewayMixing(message) {
|
|
181
|
+
this.options.logger('Error', message);
|
|
182
|
+
throw new Error(message);
|
|
183
|
+
}
|
|
184
|
+
warnIfMcpAliasUsed() {
|
|
185
|
+
if (!this.mcpEnabled || this.gateway)
|
|
186
|
+
return;
|
|
187
|
+
this.options.logger('Warn', '[MCP] mountAiMcpServer() is deprecated: use addGateway({ mcp }) instead. ' +
|
|
188
|
+
'It keeps serving on its current paths.');
|
|
189
|
+
}
|
|
190
|
+
setRootHandlers(mcp) {
|
|
191
|
+
if (!this.gateway?.build) {
|
|
192
|
+
this.host.setMcpCallback(mcp ?? null);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const stopped = this.host.isStopped() ? this.gateway.mcpStopped : undefined;
|
|
196
|
+
this.host.setGatewayCallback(this.gateway.build(stopped ?? mcp));
|
|
197
|
+
}
|
|
198
|
+
logGatewayRoutes() {
|
|
199
|
+
if (!this.gateway)
|
|
200
|
+
return;
|
|
201
|
+
const { basePath, services, allowedOAuthClients } = this.gateway;
|
|
202
|
+
(0, gateway_1.describeGatewayRoutes)(basePath, services).forEach(line => this.options.logger('Info', line));
|
|
203
|
+
if (allowedOAuthClients && !(0, gateway_1.servesOAuth)(services)) {
|
|
204
|
+
this.options.logger('Warn', '[Gateway] allowedOAuthClients is set but no OAuth route is served (MCP off, API OAuth off).');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async warnIfMcpExemptFromIpWhitelist() {
|
|
208
|
+
try {
|
|
209
|
+
const { isFeatureEnabled } = await this.options.forestAdminClient.getIpWhitelistConfiguration();
|
|
210
|
+
if (!isFeatureEnabled)
|
|
211
|
+
return;
|
|
212
|
+
const base = normalizeMcpBasePath(this.mcpBasePath);
|
|
213
|
+
const apiNote = this.gateway?.services.api
|
|
214
|
+
? ` The Gateway API on ${base}/api/* escapes it too: it reaches the agent in-process, ` +
|
|
215
|
+
'which the whitelist exempts as a trusted loopback caller. API calls still require an ' +
|
|
216
|
+
'API key or an OAuth session.'
|
|
217
|
+
: '';
|
|
218
|
+
this.options.logger('Warn', '[MCP] The IP whitelist is enabled for this environment, but it filters none of the MCP ' +
|
|
219
|
+
`routes (${base}/mcp, ${base}/mcp/uploads, ${base}/oauth/*, ` +
|
|
220
|
+
`/.well-known/oauth-authorization-server${base}, ` +
|
|
221
|
+
`/.well-known/oauth-protected-resource${base}/mcp): its middleware is mounted on the ` +
|
|
222
|
+
`/forest router only, so these routes escape it for any caller. Tool calls on ${base}/mcp ` +
|
|
223
|
+
`still require a valid MCP OAuth token.${apiNote}`);
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
this.options.logger('Debug', `[MCP] Could not read the IP whitelist configuration: ${error instanceof Error ? error.message : String(error)}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Initialize the MCP server.
|
|
231
|
+
* Uses dynamic import to defer loading until mountAiMcpServer() is actually used.
|
|
232
|
+
* This avoids loading the mcp-server dependency at startup for users who don't use MCP.
|
|
233
|
+
*/
|
|
234
|
+
async initializeMcpServer() {
|
|
235
|
+
const mcpLogger = (level, message) => this.options.logger(level, `[MCP] ${message}`);
|
|
236
|
+
try {
|
|
237
|
+
// Dynamic import to defer loading until actually needed
|
|
238
|
+
const { ForestMCPServer, ForestServerClientImpl, makeIsMcpRoute } = await Promise.resolve().then(() => __importStar(require('@forestadmin/mcp-server')));
|
|
239
|
+
const forestServerClient = new ForestServerClientImpl(this.options.forestAdminClient.schemaService, this.options.forestAdminClient.activityLogsService, this.options.forestAdminClient.workflowsService, this.options.forestServerUrl);
|
|
240
|
+
const mcpServer = new ForestMCPServer({
|
|
241
|
+
forestServerUrl: this.options.forestServerUrl,
|
|
242
|
+
forestAppUrl: this.options.forestAppUrl,
|
|
243
|
+
envSecret: this.options.envSecret,
|
|
244
|
+
authSecret: this.options.authSecret,
|
|
245
|
+
logger: mcpLogger,
|
|
246
|
+
forestServerClient,
|
|
247
|
+
enabledTools: this.mcpEnabledTools,
|
|
248
|
+
basePath: this.mcpBasePath,
|
|
249
|
+
tokenTtl: this.mcpTokenTtl,
|
|
250
|
+
allowedOAuthClients: this.mcpAllowedOAuthClients,
|
|
251
|
+
fileUploads: this.mcpFileUploads,
|
|
252
|
+
agentDispatcher: this.host.getInProcessDispatcher(),
|
|
253
|
+
});
|
|
254
|
+
const callback = await mcpServer.getHttpCallback();
|
|
255
|
+
const matches = makeIsMcpRoute(this.mcpBasePath);
|
|
256
|
+
mcpLogger('Info', 'Server initialized successfully');
|
|
257
|
+
mcpLogger('Info', 'Tool calls dispatch in-process and skip any middleware mounted in front of the agent');
|
|
258
|
+
return { callback, matches };
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
const { message } = error;
|
|
262
|
+
mcpLogger('Error', `Failed to initialize MCP server: ${message}`);
|
|
263
|
+
throw error;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
exports.default = EmbeddedServices;
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1iZWRkZWQtc2VydmljZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW1iZWRkZWQtc2VydmljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZQSx3RUFBc0U7QUFFdEUsNkNBQW1GO0FBQ25GLGtFQUF5QztBQUN6Qyx1Q0FPbUI7QUFFbkIsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFFBQWlCLEVBQVUsRUFBRSxDQUN6RCxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRXhFLDZGQUE2RjtBQUM3RiwrRkFBK0Y7QUFDL0YscUZBQXFGO0FBQ3JGLE1BQU0sZUFBZSxHQUFHLENBQUMsV0FBbUIsRUFBRSxFQUFFLENBQzlDLGlFQUFpRSxXQUFXLGdCQUFnQjtJQUM1RixzQkFBc0IsdUJBQVUsdUNBQXVDLHVCQUFVLFVBQVU7SUFDM0YsR0FBRyx1QkFBVSx3Q0FBd0MsQ0FBQztBQUV4RCxNQUFNLFdBQVcsR0FBRywrQ0FBK0MsQ0FBQztBQUVwRSxNQUFNLGdCQUFnQixHQUNwQix5RkFBeUY7SUFDekYsdUZBQXVGO0lBQ3ZGLGFBQWEsV0FBVywyQkFBMkIsQ0FBQztBQUV0RCxNQUFNLGdCQUFnQixHQUNwQixvRkFBb0Y7SUFDcEYsd0ZBQXdGO0lBQ3hGLE9BQU8sV0FBVyx5Q0FBeUMsQ0FBQztBQVk5RCxNQUFxQixnQkFBZ0I7SUFvQm5DLFlBQ21CLE9BQWlDLEVBQ2pDLElBQTBCO1FBRDFCLFlBQU8sR0FBUCxPQUFPLENBQTBCO1FBQ2pDLFNBQUksR0FBSixJQUFJLENBQXNCO1FBckI3QywyQ0FBMkM7UUFDbkMsZUFBVSxHQUFHLEtBQUssQ0FBQztRQU8zQiw0REFBNEQ7UUFDcEQs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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/agent",
|
|
3
|
-
"version": "1.111.
|
|
3
|
+
"version": "1.111.2",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"@fastify/express": "^1.1.0",
|
|
54
54
|
"@forestadmin/agent-bff": "1.43.1",
|
|
55
55
|
"@forestadmin/datasource-sql": "1.17.17",
|
|
56
|
-
"@forestadmin/workflow-executor": "1.35.
|
|
56
|
+
"@forestadmin/workflow-executor": "1.35.3",
|
|
57
57
|
"@nestjs/common": "^11.1.24",
|
|
58
58
|
"@nestjs/core": "^11.1.24",
|
|
59
59
|
"@nestjs/platform-express": "^11.1.24",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"peerDependencies": {
|
|
79
79
|
"@fastify/express": "^1.1.0 || ^2.0.0 || ^3.0.0 || ^4.0.0",
|
|
80
80
|
"@forestadmin/agent-bff": "1.43.1",
|
|
81
|
-
"@forestadmin/workflow-executor": "1.35.
|
|
81
|
+
"@forestadmin/workflow-executor": "1.35.3"
|
|
82
82
|
},
|
|
83
83
|
"peerDependenciesMeta": {
|
|
84
84
|
"@fastify/express": {
|