@forestadmin/agent 1.108.2 → 1.110.0

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.
@@ -69,7 +69,7 @@ export type AuditHistoryQuery = {
69
69
  after?: Pick<AuditRecord, 'timestamp' | 'id'>;
70
70
  };
71
71
  /**
72
- * Cross-collection timeline, newest first. Paged by cursor rather than by offset: a project-wide
72
+ * Cross-collection timeline, newest first unless `order` says otherwise. Paged by cursor rather than by offset: a project-wide
73
73
  * feed keeps growing at the head, so an offset silently shifts rows across pages.
74
74
  */
75
75
  export type AuditTimelineQuery = {
@@ -81,7 +81,11 @@ export type AuditTimelineQuery = {
81
81
  * sharing the boundary timestamp aren't skipped; `excludeIds` drops the ones already returned.
82
82
  */
83
83
  before?: string;
84
+ /** Mirror of `before` for an `asc` walk: an inclusive lower bound from the previous page. */
85
+ after?: string;
84
86
  excludeIds?: number[];
87
+ /** Defaults to `'desc'`; ties follow `id` in the same direction. */
88
+ order?: 'asc' | 'desc';
85
89
  userIds?: number[];
86
90
  operations?: AuditOperation[];
87
91
  /** Inclusive lower bound on `timestamp` as a UTC ISO instant. */
@@ -122,10 +126,16 @@ export interface AuditStore {
122
126
  /** Flat list of entries recorded under any of `correlationKeys` for a record, oldest first. */
123
127
  listByCorrelations(query: AuditCorrelationsQuery): AuditRecord[] | Promise<AuditRecord[]>;
124
128
  /**
125
- * Cross-collection timeline, newest first (ties broken by descending `id`). Optional: a store
129
+ * Cross-collection timeline in `order`, ties broken by `id` the same way. Optional: a store
126
130
  * written before this existed simply doesn't serve the project-level route.
127
131
  */
128
132
  listTimeline?(query: AuditTimelineQuery): AuditRecord[] | Promise<AuditRecord[]>;
133
+ /**
134
+ * Distinct authors matching the timeline's filters, independent of its cursor. Optional like
135
+ * `listTimeline`: without it the route serves the rows but no author list. An empty
136
+ * `collections` must match nothing.
137
+ */
138
+ listTimelineUsers?(query: Omit<AuditTimelineQuery, 'limit' | 'before' | 'after' | 'excludeIds' | 'order'>): AuditUserSummary[] | Promise<AuditUserSummary[]>;
129
139
  /** Distinct authors matching the query filters, independent of pagination. */
130
140
  listDistinctUsers(query: Omit<AuditHistoryQuery, 'skip' | 'limit' | 'order'>): AuditUserSummary[] | Promise<AuditUserSummary[]>;
131
141
  /** One-shot bootstrap awaited by `agent.start()`. Must be idempotent. */
@@ -1,3 +1,5 @@
1
+ import type { HttpCallback } from './types';
2
+ import type { Logger } from '@forestadmin/datasource-toolkit';
1
3
  /**
2
4
  * Where an embedded BFF answers, at the root of the host application. Fixed: the BFF serves its own
3
5
  * `/oauth/*` and `/docs`, which would otherwise collide with the MCP server's root paths and with
@@ -14,6 +16,10 @@ export declare function isBffRoute(url: string): boolean;
14
16
  * as a malformed request rather than as the root.
15
17
  */
16
18
  export declare function stripBffPrefix(url: string): string;
19
+ export declare const BFF_DEPRECATION_TIMESTAMP: number;
20
+ export declare const BFF_DEPRECATION_LINK = "https://docs.forestadmin.com/product/embed/bff";
21
+ export declare const BFF_DEPRECATION_LOG_INTERVAL_MS: number;
22
+ export declare function createBffAliasCallback(handle: HttpCallback, logger: Logger): HttpCallback;
17
23
  /**
18
24
  * Whether an MCP mount path would land inside `/bff`. The MCP server normalizes its `basePath`
19
25
  * (trim, leading slash, collapsed and stripped trailing slashes) before deriving
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BFF_PREFIX = void 0;
3
+ exports.BFF_DEPRECATION_LOG_INTERVAL_MS = exports.BFF_DEPRECATION_LINK = exports.BFF_DEPRECATION_TIMESTAMP = exports.BFF_PREFIX = void 0;
4
4
  exports.isBffRoute = isBffRoute;
5
5
  exports.stripBffPrefix = stripBffPrefix;
6
+ exports.createBffAliasCallback = createBffAliasCallback;
6
7
  exports.collidesWithBff = collidesWithBff;
7
8
  /**
8
9
  * Where an embedded BFF answers, at the root of the host application. Fixed: the BFF serves its own
@@ -23,11 +24,59 @@ function isBffRoute(url) {
23
24
  * as a malformed request rather than as the root.
24
25
  */
25
26
  function stripBffPrefix(url) {
27
+ if (!isBffRoute(url))
28
+ return url;
26
29
  const remainder = url.slice(exports.BFF_PREFIX.length);
27
30
  if (remainder === '')
28
31
  return '/';
29
32
  return remainder.startsWith('/') ? remainder : `/${remainder}`;
30
33
  }
34
+ exports.BFF_DEPRECATION_TIMESTAMP = Date.UTC(2026, 9, 5) / 1000;
35
+ exports.BFF_DEPRECATION_LINK = 'https://docs.forestadmin.com/product/embed/bff';
36
+ exports.BFF_DEPRECATION_LOG_INTERVAL_MS = 60 * 60 * 1000;
37
+ const EXPOSE_HEADERS = 'Access-Control-Expose-Headers';
38
+ const DEPRECATION_HEADERS = ['Deprecation', 'Link'];
39
+ const DEPRECATION_LINK = `<${exports.BFF_DEPRECATION_LINK}>; rel="deprecation"`;
40
+ function headerValues(res, name) {
41
+ const value = res.getHeader(name);
42
+ return value === undefined ? [] : [value].flat().map(String);
43
+ }
44
+ function markDeprecated(res) {
45
+ const exposed = headerValues(res, EXPOSE_HEADERS)
46
+ .flatMap(value => value.split(','))
47
+ .map(name => name.trim())
48
+ .filter(Boolean);
49
+ const links = headerValues(res, 'Link');
50
+ res.setHeader('Deprecation', `@${exports.BFF_DEPRECATION_TIMESTAMP}`);
51
+ if (!links.includes(DEPRECATION_LINK)) {
52
+ res.setHeader('Link', [...links, DEPRECATION_LINK].join(', '));
53
+ }
54
+ res.setHeader(EXPOSE_HEADERS, [...new Set([...exposed, ...DEPRECATION_HEADERS])].join(', '));
55
+ }
56
+ function markDeprecatedOnWriteHead(res) {
57
+ const { writeHead } = res;
58
+ res.writeHead = ((...args) => {
59
+ markDeprecated(res);
60
+ return writeHead.apply(res, args);
61
+ });
62
+ }
63
+ function createBffAliasCallback(handle, logger) {
64
+ let lastWarnedAt = null;
65
+ return (req, res, next) => {
66
+ const now = Date.now();
67
+ if (lastWarnedAt === null || now - lastWarnedAt >= exports.BFF_DEPRECATION_LOG_INTERVAL_MS) {
68
+ lastWarnedAt = now;
69
+ logger('Warn', `[BFF] ${exports.BFF_PREFIX}/* is deprecated and was called: use addGateway({ api }), ` +
70
+ `which serves the same routes under <basePath>/api (/api by default). ` +
71
+ `See ${exports.BFF_DEPRECATION_LINK}`);
72
+ }
73
+ const aliasReq = req;
74
+ aliasReq.originalUrl ?? (aliasReq.originalUrl = req.url);
75
+ req.url = stripBffPrefix(req.url ?? exports.BFF_PREFIX);
76
+ markDeprecatedOnWriteHead(res);
77
+ handle(req, res, next);
78
+ };
79
+ }
31
80
  /**
32
81
  * Whether an MCP mount path would land inside `/bff`. The MCP server normalizes its `basePath`
33
82
  * (trim, leading slash, collapsed and stripped trailing slashes) before deriving
@@ -46,4 +95,4 @@ function collidesWithBff(mcpBasePath) {
46
95
  .replace(/\/+$/, '');
47
96
  return isBffRoute(`${normalized}/mcp`);
48
97
  }
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmZmLXJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9iZmYtcm91dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVVBLGdDQUlDO0FBT0Qsd0NBTUM7QUFTRCwwQ0FZQztBQWhERDs7OztHQUlHO0FBQ1UsUUFBQSxVQUFVLEdBQUcsTUFBTSxDQUFDO0FBRWpDOztHQUVHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLEdBQVc7SUFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXhDLE9BQU8sUUFBUSxLQUFLLGtCQUFVLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLGtCQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLEdBQVc7SUFDeEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRS9DLElBQUksU0FBUyxLQUFLLEVBQUU7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUVqQyxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztBQUNqRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFdBQW9CO0lBQ2xELElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFL0IsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBRW5DLElBQUksT0FBTyxLQUFLLEVBQUUsSUFBSSxPQUFPLEtBQUssR0FBRztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXBELE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1NBQ25FLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO1NBQ3BCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFdkIsT0FBTyxVQUFVLENBQUMsR0FBRyxVQUFVLE1BQU0sQ0FBQyxDQUFDO0FBQ3pDLENBQUMifQ==
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmZmLXJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9iZmYtcm91dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWNBLGdDQUlDO0FBT0Qsd0NBUUM7QUEwQ0Qsd0RBc0JDO0FBU0QsMENBWUM7QUFsSEQ7Ozs7R0FJRztBQUNVLFFBQUEsVUFBVSxHQUFHLE1BQU0sQ0FBQztBQUVqQzs7R0FFRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxHQUFXO0lBQ3BDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV4QyxPQUFPLFFBQVEsS0FBSyxrQkFBVSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxrQkFBVSxHQUFHLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxHQUFXO0lBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFFakMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRS9DLElBQUksU0FBUyxLQUFLLEVBQUU7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUVqQyxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztBQUNqRSxDQUFDO0FBRVksUUFBQSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3hELFFBQUEsb0JBQW9CLEdBQUcsZ0RBQWdELENBQUM7QUFDeEUsUUFBQSwrQkFBK0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUU5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
@@ -1,19 +1,32 @@
1
1
  import type { AgentOptionsWithDefaults, BffEmbedOptions, HttpCallback } from './types';
2
- import type { AgentDispatcher } from '@forestadmin/agent-bff';
2
+ import type { AgentDispatcher, ConfigLabels } from '@forestadmin/agent-bff';
3
+ export declare const GATEWAY_API_CONFIG_LABELS: ConfigLabels;
4
+ export type EmbeddedBffMount = {
5
+ prefix: string;
6
+ name?: string;
7
+ requiredVersion?: string;
8
+ skipIpWhitelistWarning?: boolean;
9
+ allowedOAuthClients?: string[];
10
+ gateway?: boolean;
11
+ };
3
12
  /** How long `stop()` waits for the activity-log writes no connection holds. */
4
13
  export declare const SHUTDOWN_TIMEOUT_MS = 10000;
5
14
  /**
6
15
  * Owns the lifecycle of a BFF embedded in the agent process: configuration, dynamic loading of the
7
- * optional package, build, and the request handler the agent mounts at `/bff`. The agent only wires
8
- * the callback and delegates start/stop.
16
+ * optional package, build, and the request handler the agent mounts under its prefix. The agent
17
+ * only wires the callback and delegates start/stop.
9
18
  */
10
19
  export default class EmbeddedBff {
11
20
  private readonly options;
12
21
  private readonly embedOptions;
22
+ private readonly mount;
13
23
  private config;
14
24
  private bff;
15
25
  private stopped;
16
- constructor(options: AgentOptionsWithDefaults, embedOptions: BffEmbedOptions);
26
+ private claimsBffPath;
27
+ constructor(options: AgentOptionsWithDefaults, embedOptions: BffEmbedOptions, mount: EmbeddedBffMount);
28
+ private get name();
29
+ private log;
17
30
  /**
18
31
  * Load the package and validate the options the caller handed to `addBff()`. Called before the
19
32
  * agent mounts anything: everything checked here is caller input, and `parseConfig` throws on a
@@ -21,6 +34,8 @@ export default class EmbeddedBff {
21
34
  * where failing after mount() would leave the host with a live `/forest` and a bricked `/bff`.
22
35
  */
23
36
  prepare(): Promise<void>;
37
+ private assertRequiredVersion;
38
+ claims(pathname: string): boolean;
24
39
  /**
25
40
  * Build the BFF. Called from agent.start() after mount(), because the dispatcher only reaches the
26
41
  * agent's own stack once that stack is mounted.
@@ -56,8 +71,10 @@ export default class EmbeddedBff {
56
71
  */
57
72
  stop(): Promise<void>;
58
73
  /**
59
- * The callback the agent registers at `/bff`. Answers 503 rather than falling through while the
60
- * BFF is not serving: a 404 from the host would read as "wrong url" instead of "not available".
74
+ * The callback the agent registers under the mount prefix, handed requests already stripped of
75
+ * it: terminal, it never strips nor calls `next`. Answers 503 rather than falling through while
76
+ * the BFF is not serving: a 404 from the host would read as "wrong url" instead of "not
77
+ * available".
61
78
  * Boot and shutdown are told apart, because a probe should wait on the first and drain on the
62
79
  * second.
63
80
  */
@@ -33,8 +33,21 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.SHUTDOWN_TIMEOUT_MS = void 0;
37
- const bff_routes_1 = require("./bff-routes");
36
+ exports.SHUTDOWN_TIMEOUT_MS = exports.GATEWAY_API_CONFIG_LABELS = void 0;
37
+ const gateway_1 = require("./gateway");
38
+ const BFF_PACKAGE = '@forestadmin/agent-bff';
39
+ exports.GATEWAY_API_CONFIG_LABELS = {
40
+ FOREST_AUTH_SECRET: 'authSecret',
41
+ FOREST_ENV_SECRET: 'envSecret',
42
+ FOREST_SERVER_URL: 'forestServerUrl',
43
+ FOREST_APP_URL: 'forestAppUrl',
44
+ BFF_TOKEN_ENCRYPTION_KEY: 'api.tokenEncryptionKey',
45
+ BFF_ALLOWED_ORIGINS: 'api.allowedOrigins',
46
+ BFF_DEFAULT_TIMEZONE: 'api.defaultTimezone',
47
+ BFF_AGENT_TIMEOUT_MS: 'api.agentTimeoutMs',
48
+ BFF_AI_TIMEOUT_MS: 'api.aiTimeoutMs',
49
+ BFF_OPENAPI_ENABLED: 'api.openapiEnabled',
50
+ };
38
51
  /** How long `stop()` waits for the activity-log writes no connection holds. */
39
52
  exports.SHUTDOWN_TIMEOUT_MS = 10000;
40
53
  /**
@@ -43,34 +56,38 @@ exports.SHUTDOWN_TIMEOUT_MS = 10000;
43
56
  * hand — their `message` and `stack` are not enumerable, so `JSON.stringify` alone turns the one
44
57
  * value worth logging into `{}`. Never throws — logging must not break a request.
45
58
  */
46
- function formatLog(message, context) {
59
+ function formatLog(tag, message, context) {
47
60
  if (!context || Object.keys(context).length === 0)
48
- return `[BFF] ${message}`;
61
+ return `${tag} ${message}`;
49
62
  try {
50
63
  const serialized = JSON.stringify(context, (_key, value) => value instanceof Error
51
64
  ? { name: value.name, message: value.message, stack: value.stack }
52
65
  : value);
53
- return `[BFF] ${message} ${serialized}`;
66
+ return `${tag} ${message} ${serialized}`;
54
67
  }
55
68
  catch {
56
- return `[BFF] ${message} [unserializable context]`;
69
+ return `${tag} ${message} [unserializable context]`;
57
70
  }
58
71
  }
59
72
  /**
60
73
  * Owns the lifecycle of a BFF embedded in the agent process: configuration, dynamic loading of the
61
- * optional package, build, and the request handler the agent mounts at `/bff`. The agent only wires
62
- * the callback and delegates start/stop.
74
+ * optional package, build, and the request handler the agent mounts under its prefix. The agent
75
+ * only wires the callback and delegates start/stop.
63
76
  */
64
77
  class EmbeddedBff {
65
- constructor(options, embedOptions) {
78
+ constructor(options, embedOptions, mount) {
66
79
  this.options = options;
67
80
  this.embedOptions = embedOptions;
81
+ this.mount = mount;
68
82
  this.config = null;
69
83
  this.bff = null;
70
84
  this.stopped = false;
85
+ this.claimsBffPath = null;
71
86
  /**
72
- * The callback the agent registers at `/bff`. Answers 503 rather than falling through while the
73
- * BFF is not serving: a 404 from the host would read as "wrong url" instead of "not available".
87
+ * The callback the agent registers under the mount prefix, handed requests already stripped of
88
+ * it: terminal, it never strips nor calls `next`. Answers 503 rather than falling through while
89
+ * the BFF is not serving: a 404 from the host would read as "wrong url" instead of "not
90
+ * available".
74
91
  * Boot and shutdown are told apart, because a probe should wait on the first and drain on the
75
92
  * second.
76
93
  */
@@ -78,21 +95,22 @@ class EmbeddedBff {
78
95
  if (!this.bff) {
79
96
  const type = this.stopped ? 'bff_stopped' : 'bff_not_started';
80
97
  const message = this.stopped
81
- ? 'The embedded BFF was stopped with the agent.'
82
- : 'The embedded BFF is not started yet.';
98
+ ? `${this.name} was stopped with the agent.`
99
+ : `${this.name} is not started yet.`;
83
100
  res.statusCode = 503;
84
101
  res.setHeader('Content-Type', 'application/json');
85
102
  res.end(JSON.stringify({ error: { type, status: 503, message } }));
86
103
  return;
87
104
  }
88
- // The BFF knows nothing of the prefix it is served under. `originalUrl` is claimed before the
89
- // rewrite so a host logger reading it still reports the url the client asked for.
90
- const bffReq = req;
91
- bffReq.originalUrl ?? (bffReq.originalUrl = bffReq.url);
92
- req.url = (0, bff_routes_1.stripBffPrefix)(req.url ?? bff_routes_1.BFF_PREFIX);
93
105
  this.bff.callback(req, res);
94
106
  };
95
107
  }
108
+ get name() {
109
+ return this.mount.name ?? 'The embedded BFF';
110
+ }
111
+ log(message, context) {
112
+ return formatLog(this.mount.gateway ? '[Gateway API]' : '[BFF]', message, context);
113
+ }
96
114
  /**
97
115
  * Load the package and validate the options the caller handed to `addBff()`. Called before the
98
116
  * agent mounts anything: everything checked here is caller input, and `parseConfig` throws on a
@@ -100,9 +118,12 @@ class EmbeddedBff {
100
118
  * where failing after mount() would leave the host with a live `/forest` and a bricked `/bff`.
101
119
  */
102
120
  async prepare() {
103
- const { parseConfig, IN_PROCESS_AGENT_URL } = await this.importPackage();
121
+ const bffPackage = await this.importPackage();
122
+ const { parseConfig, IN_PROCESS_AGENT_URL } = bffPackage;
104
123
  const { embedOptions } = this;
105
- this.config = parseConfig({
124
+ this.assertRequiredVersion(bffPackage.version);
125
+ this.claimsBffPath = bffPackage.claimsBffPath;
126
+ const env = {
106
127
  FOREST_AUTH_SECRET: this.options.authSecret,
107
128
  FOREST_ENV_SECRET: this.options.envSecret,
108
129
  FOREST_SERVER_URL: this.options.forestServerUrl,
@@ -117,7 +138,20 @@ class EmbeddedBff {
117
138
  // Off unless asked for: the document is not filtered per caller, so mounting a BFF must not
118
139
  // publish the name of every exposed collection and field on an already-open port.
119
140
  BFF_OPENAPI_ENABLED: String(embedOptions.openapiEnabled ?? false),
120
- });
141
+ };
142
+ this.config = parseConfig(env, this.mount.gateway ? exports.GATEWAY_API_CONFIG_LABELS : undefined);
143
+ }
144
+ assertRequiredVersion(installed) {
145
+ const { requiredVersion } = this.mount;
146
+ if (!requiredVersion || installed === requiredVersion)
147
+ return;
148
+ throw new Error(`addGateway({ api }) requires ${BFF_PACKAGE} ${requiredVersion}, found ${installed}. ` +
149
+ `Install it with \`npm install ${BFF_PACKAGE}@${requiredVersion}\`.`);
150
+ }
151
+ claims(pathname) {
152
+ if (!this.claimsBffPath)
153
+ return false;
154
+ return this.claimsBffPath(pathname, { docs: this.embedOptions.openapiEnabled ?? false });
121
155
  }
122
156
  /**
123
157
  * Build the BFF. Called from agent.start() after mount(), because the dispatcher only reaches the
@@ -133,7 +167,10 @@ class EmbeddedBff {
133
167
  const bff = await buildBff({
134
168
  config: this.config,
135
169
  dispatcher,
136
- basePath: bff_routes_1.BFF_PREFIX,
170
+ basePath: this.mount.prefix,
171
+ allowedOAuthClients: this.mount.allowedOAuthClients,
172
+ gatewayVersion: gateway_1.AGENT_VERSION,
173
+ ...(this.mount.gateway ? { labels: exports.GATEWAY_API_CONFIG_LABELS, name: 'Gateway API' } : {}),
137
174
  // Counters are the schema cache's and the action-endpoint resolver's only channel — they take
138
175
  // no logger — and every one of them reports a failure, so they go to the host's logs. Gauges
139
176
  // do not: they are periodic cache sizes, and the default console sink reports them at Info,
@@ -142,18 +179,19 @@ class EmbeddedBff {
142
179
  // Tags carried through: `action_endpoint_error` and `action_endpoint_miss` name the
143
180
  // rendering, collection and action that failed, which is the whole of what makes the line
144
181
  // actionable — the metric name alone says only that something, somewhere, did not resolve.
145
- increment: (name, tags) => this.options.logger('Warn', formatLog(`metric ${name}`, tags)),
182
+ increment: (name, tags) => this.options.logger('Warn', this.log(`metric ${name}`, tags)),
146
183
  gauge: () => undefined,
147
184
  },
148
- logger: (level, message, context) => this.options.logger(level, formatLog(message, context)),
185
+ logger: (level, message, context) => this.options.logger(level, this.log(message, context)),
149
186
  });
150
187
  // stop() may have landed while buildBff() was in flight. Assigning anyway would resurrect a
151
188
  // stopped agent's /bff — dispatching into the stack it just tore down instead of answering 503.
152
189
  if (this.stopped)
153
190
  return;
154
191
  this.bff = bff;
155
- this.options.logger('Info', formatLog(`Embedded BFF mounted on ${bff_routes_1.BFF_PREFIX}`));
156
- await this.warnIfExemptFromIpWhitelist();
192
+ this.options.logger('Info', this.log(`${this.mount.name ?? 'Embedded BFF'} mounted on ${this.mount.prefix}`));
193
+ if (!this.mount.skipIpWhitelistWarning)
194
+ await this.warnIfExemptFromIpWhitelist();
157
195
  }
158
196
  /**
159
197
  * The whitelist exempts a caller arriving over a loopback socket with no proxy hop, which is
@@ -173,13 +211,13 @@ class EmbeddedBff {
173
211
  const { isFeatureEnabled } = await this.options.forestAdminClient.getIpWhitelistConfiguration();
174
212
  if (!isFeatureEnabled)
175
213
  return;
176
- this.options.logger('Warn', formatLog(`The IP whitelist is enabled for this environment, but requests served under ` +
177
- `${bff_routes_1.BFF_PREFIX} are not subject to it: they reach the agent in-process, which the ` +
214
+ this.options.logger('Warn', this.log(`The IP whitelist is enabled for this environment, but requests served under ` +
215
+ `${this.mount.prefix} are not subject to it: they reach the agent in-process, which the ` +
178
216
  `whitelist exempts as a trusted loopback caller. A resolved API key or a valid OAuth ` +
179
217
  `session is still required.`));
180
218
  }
181
219
  catch (error) {
182
- this.options.logger('Debug', formatLog('Could not read the IP whitelist configuration', {
220
+ this.options.logger('Debug', this.log('Could not read the IP whitelist configuration', {
183
221
  cause: error instanceof Error ? error.message : String(error),
184
222
  }));
185
223
  }
@@ -210,7 +248,7 @@ class EmbeddedBff {
210
248
  const unfinished = await bff.drainActivityLogs(timeoutMs);
211
249
  if (unfinished.length === 0)
212
250
  return;
213
- this.options.logger('Warn', formatLog('Stopped the embedded BFF with activity logs still in flight', {
251
+ this.options.logger('Warn', this.log(`Stopped ${this.mount.gateway ? 'the Gateway API' : 'the embedded BFF'} with activity logs still in flight`, {
214
252
  timeoutMs,
215
253
  unfinished,
216
254
  }));
@@ -228,7 +266,7 @@ class EmbeddedBff {
228
266
  // also fires on a broken transitive dependency, a SyntaxError from a partial install, or a
229
267
  // throw during the package's own evaluation — none of which "install it" would fix.
230
268
  const { message } = error;
231
- const wrapped = new Error(`The embedded BFF requires the \`@forestadmin/agent-bff\` package, which failed to ` +
269
+ const wrapped = new Error(`${this.name} requires the \`@forestadmin/agent-bff\` package, which failed to ` +
232
270
  `load: ${message}. Install it with \`npm install @forestadmin/agent-bff\`.`);
233
271
  // Assigned rather than passed to the constructor: the repo targets ES2020, whose lib types no
234
272
  // options bag on Error. A plain assignment carries the cause on every runtime, and the reason
@@ -239,4 +277,4 @@ class EmbeddedBff {
239
277
  }
240
278
  }
241
279
  exports.default = EmbeddedBff;
242
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1iZWRkZWQtYmZmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2VtYmVkZGVkLWJmZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSw2Q0FBMEQ7QUFFMUQsK0VBQStFO0FBQ2xFLFFBQUEsbUJBQW1CLEdBQUcsS0FBTSxDQUFDO0FBRTFDOzs7OztHQUtHO0FBQ0gsU0FBUyxTQUFTLENBQUMsT0FBZSxFQUFFLE9BQWlDO0lBQ25FLElBQUksQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sU0FBUyxPQUFPLEVBQUUsQ0FBQztJQUU3RSxJQUFJLENBQUM7UUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUN6RCxLQUFLLFlBQVksS0FBSztZQUNwQixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRTtZQUNsRSxDQUFDLENBQUMsS0FBSyxDQUNWLENBQUM7UUFFRixPQUFPLFNBQVMsT0FBTyxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsT0FBTywyQkFBMkIsQ0FBQztJQUNyRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFxQixXQUFXO0lBSzlCLFlBQ21CLE9BQWlDLEVBQ2pDLFlBQTZCO1FBRDdCLFlBQU8sR0FBUCxPQUFPLENBQTBCO1FBQ2pDLGlCQUFZLEdBQVosWUFBWSxDQUFpQjtRQU54QyxXQUFNLEdBQXFCLElBQUksQ0FBQztRQUNoQyxRQUFHLEdBQWUs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
280
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1iZWRkZWQtYmZmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2VtYmVkZGVkLWJmZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTQSx1Q0FBMEM7QUFFMUMsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQUM7QUFFaEMsUUFBQSx5QkFBeUIsR0FBaUI7SUFDckQsa0JBQWtCLEVBQUUsWUFBWTtJQUNoQyxpQkFBaUIsRUFBRSxXQUFXO0lBQzlCLGlCQUFpQixFQUFFLGlCQUFpQjtJQUNwQyxjQUFjLEVBQUUsY0FBYztJQUM5Qix3QkFBd0IsRUFBRSx3QkFBd0I7SUFDbEQsbUJBQW1CLEVBQUUsb0JBQW9CO0lBQ3pDLG9CQUFvQixFQUFFLHFCQUFxQjtJQUMzQyxvQkFBb0IsRUFBRSxvQkFBb0I7SUFDMUMsaUJBQWlCLEVBQUUsaUJBQWlCO0lBQ3BDLG1CQUFtQixFQUFFLG9CQUFvQjtDQUMxQyxDQUFDO0FBV0YsK0VBQStFO0FBQ2xFLFFBQUEsbUJBQW1CLEdBQUcsS0FBTSxDQUFDO0FBRTFDOzs7OztHQUtHO0FBQ0gsU0FBUyxTQUFTLENBQUMsR0FBVyxFQUFFLE9BQWUsRUFBRSxPQUFpQztJQUNoRixJQUFJLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRTlFLElBQUksQ0FBQztRQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ3pELEtBQUssWUFBWSxLQUFLO1lBQ3BCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssRUFB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
@@ -15,7 +15,7 @@ export default class FrameworkMounter {
15
15
  private readonly inProcessDispatcher;
16
16
  private inProcessHookRegistered;
17
17
  /** Compute the prefix that the main router should be mounted at in the client's application */
18
- private get completeMountPrefix();
18
+ protected get completeMountPrefix(): string;
19
19
  constructor(prefix: string, logger: Logger);
20
20
  /**
21
21
  * Register the MCP server at the root of the host application, or `null` to unregister it. The
@@ -24,6 +24,7 @@ export default class FrameworkMounter {
24
24
  */
25
25
  protected setMcpCallback(handler: RootHandler | null): void;
26
26
  /** Serve an embedded BFF at `/bff`. Pass null to stop answering there. */
27
+ protected setGatewayCallback(handler: RootHandler): void;
27
28
  protected setBffCallback(callback: HttpCallback | null): void;
28
29
  /**
29
30
  * Dispatcher that runs agent-client requests against the agent's own `/forest` stack in-memory.
@@ -36,6 +36,9 @@ class FrameworkMounter {
36
36
  this.rootMiddleware.set('mcp', handler);
37
37
  }
38
38
  /** Serve an embedded BFF at `/bff`. Pass null to stop answering there. */
39
+ setGatewayCallback(handler) {
40
+ this.rootMiddleware.set('gateway', handler);
41
+ }
39
42
  setBffCallback(callback) {
40
43
  this.rootMiddleware.set('bff', callback && { callback, matches: bff_routes_1.isBffRoute });
41
44
  }
@@ -208,4 +211,4 @@ class FrameworkMounter {
208
211
  }
209
212
  }
210
213
  exports.default = FrameworkMounter;
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWV3b3JrLW1vdW50ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnJhbWV3b3JrLW1vdW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSx5REFBaUM7QUFDakMsK0JBQW9DO0FBQ3BDLDhDQUFzQjtBQUN0QixnREFBd0I7QUFFeEIsNkNBQTBDO0FBQzFDLHdFQUErQztBQUMvQyw0RkFBOEQ7QUFDOUQsd0VBQStDO0FBRS9DLE1BQXFCLGdCQUFnQjtJQWdCbkMsK0ZBQStGO0lBQy9GLElBQVksbUJBQW1CO1FBQzdCLE9BQU8sY0FBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELFlBQVksTUFBYyxFQUFFLE1BQWM7UUFqQnpCLGlCQUFZLEdBQTRCLEVBQUUsQ0FBQztRQUMzQyxnQkFBVyxHQUEwQyxFQUFFLENBQUM7UUFFeEQsV0FBTSxHQUE0QixFQUFFLENBQUM7UUFPOUMsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBUXRDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSx5QkFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSx5QkFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLG1DQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7OztPQUlHO0lBQ08sY0FBYyxDQUFDLE9BQTJCO1FBQ2xELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsMEVBQTBFO0lBQ2hFLGNB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
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWV3b3JrLW1vdW50ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnJhbWV3b3JrLW1vdW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSx5REFBaUM7QUFDakMsK0JBQW9DO0FBQ3BDLDhDQUFzQjtBQUN0QixnREFBd0I7QUFFeEIsNkNBQTBDO0FBQzFDLHdFQUErQztBQUMvQyw0RkFBOEQ7QUFDOUQsd0VBQStDO0FBRS9DLE1BQXFCLGdCQUFnQjtJQWdCbkMsK0ZBQStGO0lBQy9GLElBQWMsbUJBQW1CO1FBQy9CLE9BQU8sY0FBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELFlBQVksTUFBYyxFQUFFLE1BQWM7UUFqQnpCLGlCQUFZLEdBQTRCLEVBQUUsQ0FBQztRQUMzQyxnQkFBVyxHQUEwQyxFQUFFLENBQUM7UUFFeEQsV0FBTSxHQUE0QixFQUFFLENBQUM7UUFPOUMsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBUXRDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSx5QkFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSx5QkFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLG1DQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7OztPQUlHO0lBQ08sY0FBYyxDQUFDLE9BQTJCO1FBQ2xELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsMEVBQTBFO0lBQ2hFLGtC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
@@ -0,0 +1,19 @@
1
+ import type { BffEmbedOptions, GatewayOptions, McpEmbedOptions, RootHandler } from './types';
2
+ export declare const AGENT_BFF_PEER_VERSION: string;
3
+ export declare const AGENT_VERSION: string;
4
+ declare const MCP_UNAVAILABLE: {
5
+ starting: string;
6
+ stopped: string;
7
+ };
8
+ export declare function mcpUnavailable(isMcpRoute: (url: string) => boolean, state: keyof typeof MCP_UNAVAILABLE): RootHandler;
9
+ export type GatewayMcpOptions = Omit<McpEmbedOptions, 'basePath' | 'allowedOAuthClients'>;
10
+ export type GatewayServices = {
11
+ mcp: GatewayMcpOptions | null;
12
+ api: BffEmbedOptions | null;
13
+ };
14
+ export declare function resolveGatewayServices({ mcp, api }: GatewayOptions): GatewayServices;
15
+ export declare function assertNoGatewayOverlap(basePath: string, forestPath: string, { mcp, api }: GatewayServices): void;
16
+ export declare function servesOAuth({ mcp, api }: GatewayServices): boolean;
17
+ export declare function describeGatewayRoutes(basePath: string, { mcp, api }: GatewayServices): string[];
18
+ export {};
19
+ //# sourceMappingURL=gateway.d.ts.map