@forestadmin/agent 1.111.1 → 1.111.3

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 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
- /** In-process BFF, created only when addBff() is called. */
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 bff_routes_1 = require("./bff-routes");
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.embeddedBff?.prepare();
89
+ await this.embeddedServices.prepareGateway();
90
+ await this.embeddedServices.bff?.prepare();
137
91
  if (this.isStopped)
138
- await this.embeddedBff?.stop();
139
- if (this.gateway)
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.embeddedBff?.start(this.getInProcessDispatcher());
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.mcpEnabled)
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.gateway?.build)
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.embeddedBff?.stop();
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.embeddedBff?.invalidate();
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
- if (this.gateway)
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
- if (this.gateway)
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
- if (this.gateway)
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.mcpEnabled) {
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.1",
3
+ "version": "1.111.3",
4
4
  "main": "dist/index.js",
5
5
  "license": "Apache-2.0",
6
6
  "publishConfig": {
@@ -17,7 +17,7 @@
17
17
  "@forestadmin/datasource-customizer": "1.73.2",
18
18
  "@forestadmin/datasource-toolkit": "1.56.2",
19
19
  "@forestadmin/forestadmin-client": "1.44.1",
20
- "@forestadmin/mcp-server": "1.29.2",
20
+ "@forestadmin/mcp-server": "1.29.3",
21
21
  "@koa/bodyparser": "^6.0.0",
22
22
  "@koa/cors": "^5.0.0",
23
23
  "@koa/router": "^13.1.0",
@@ -51,9 +51,9 @@
51
51
  },
52
52
  "devDependencies": {
53
53
  "@fastify/express": "^1.1.0",
54
- "@forestadmin/agent-bff": "1.43.1",
54
+ "@forestadmin/agent-bff": "1.43.2",
55
55
  "@forestadmin/datasource-sql": "1.17.17",
56
- "@forestadmin/workflow-executor": "1.35.2",
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",
@@ -77,8 +77,8 @@
77
77
  },
78
78
  "peerDependencies": {
79
79
  "@fastify/express": "^1.1.0 || ^2.0.0 || ^3.0.0 || ^4.0.0",
80
- "@forestadmin/agent-bff": "1.43.1",
81
- "@forestadmin/workflow-executor": "1.35.2"
80
+ "@forestadmin/agent-bff": "1.43.2",
81
+ "@forestadmin/workflow-executor": "1.35.3"
82
82
  },
83
83
  "peerDependenciesMeta": {
84
84
  "@fastify/express": {