@forestadmin/agent-bff 1.20.2 → 1.21.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.
package/README.md CHANGED
@@ -6,7 +6,28 @@ agent from a browser without learning MCP or JSON:API.
6
6
  It is a bootable Koa 3 server with a `/health` endpoint, a version header, env-driven config
7
7
  validation, OAuth (Mode 1) + API-key (Mode 2) auth, and a hardened request edge (timezone, CORS,
8
8
  auth-mode precedence, structured error contract), and it serves and exports its own OpenAPI
9
- document. The data-endpoint proxy lands in a later slice.
9
+ document.
10
+
11
+ ## The routes it serves
12
+
13
+ Everything the agent proxy exposes lives under `/agent/v1`. The data and action routes are `POST`
14
+ — the filter, projection and paging all travel in the body, never in the query string:
15
+
16
+ | Route | Method | What it does |
17
+ | --- | --- | --- |
18
+ | `/agent/v1/{collection}/list` · `/count` | `POST` | list or count records of a collection |
19
+ | `/agent/v1/{collection}/relations/{relation}/list` · `/count` | `POST` | same, through a **to-many** relation — to-one relations are not listable and 404 by design |
20
+ | `/agent/v1/{collection}/actions/{action}/form` · `/execute` | `POST` | load a Smart Action's form, then run it |
21
+ | `/agent/v1/permissions` | `GET` | what the caller may see and do, **as display hints** for graying out UI — never an authorization decision |
22
+ | `/agent/openapi.json` | `GET`/`HEAD` | the unfolded document, auth-gated, when `BFF_OPENAPI_ENABLED` is on |
23
+
24
+ `/health` and `/oauth/*` sit outside the prefix and outside the auth edge.
25
+
26
+ **The agent enforces permissions and scopes, not the BFF.** Each proxied call carries a
27
+ short-lived agent token the BFF mints for the caller, so a request reaches the agent as that
28
+ person and comes back filtered exactly as it would for them in Forest. A collection the current
29
+ schema no longer exposes is re-checked on every call, so a schema refresh can never leave a
30
+ dropped collection reachable.
10
31
 
11
32
  ## Usage
12
33
 
@@ -66,7 +87,7 @@ yarn start:dev # node --env-file=.env dist/cli.js
66
87
  | `FOREST_AUTH_SECRET` | yes | Agent JWT signing secret (never logged or echoed). |
67
88
  | `FOREST_ENV_SECRET` | yes | Forest SaaS environment secret (`forest-secret-key`), server-to-server. |
68
89
  | `FOREST_SERVER_URL` | yes | Forest SaaS API base URL. |
69
- | `FOREST_APP_URL` | yes | Forest front base URL (OAuth front-channel, later slices). |
90
+ | `FOREST_APP_URL` | yes | Forest front base URL, used to build the OAuth front-channel redirect (`src/oauth/oauth-routes.ts`). |
70
91
  | `AGENT_URL` | yes | The customer agent base URL the BFF calls via agent-client. |
71
92
  | `BFF_TOKEN_ENCRYPTION_KEY`| for OAuth | Base64-encoded 32-byte AES-256 key encrypting stored refresh tokens. Until it is set, the `/oauth/*` token-issuance routes are disabled and `/health` reports `degraded`; already-issued `bff_access` tokens still authenticate on `/agent/*` whenever `FOREST_AUTH_SECRET` is present. |
72
93
  | `HTTP_PORT` | no | Server port, integer 0–65535. Defaults to `3450`. `0` binds an OS-assigned ephemeral port. |
@@ -87,7 +108,7 @@ yarn start:dev # node --env-file=.env dist/cli.js
87
108
  ## Request edge (`/agent/*`)
88
109
 
89
110
  Every agent call flows through a request edge that enforces three cross-cutting concerns before the
90
- (Slice-3) proxy runs. Errors use a structured, type-first contract — `{ error: { type, status,
111
+ call is proxied to the agent. Errors use a structured, type-first contract — `{ error: { type, status,
91
112
  message, details? } }` — so consumers branch on `error.type`, never on message text.
92
113
 
93
114
  ### Auth-mode precedence
@@ -13,9 +13,13 @@ export interface ListRequestBody {
13
13
  projection?: string[];
14
14
  sort?: BffSortClause[];
15
15
  page?: BffPage;
16
+ search?: string;
17
+ searchExtended?: boolean;
16
18
  }
17
19
  export interface CountRequestBody {
18
20
  filter?: unknown;
21
+ search?: string;
22
+ searchExtended?: boolean;
19
23
  }
20
24
  export type RelationListRequestBody = ListRequestBody & {
21
25
  parentId: string;
@@ -10,6 +10,7 @@ exports.parseParentId = parseParentId;
10
10
  exports.parseRelationListRequest = parseRelationListRequest;
11
11
  exports.parseRelationCountRequest = parseRelationCountRequest;
12
12
  exports.collectCountFieldPaths = collectCountFieldPaths;
13
+ const request_schemas_1 = require("./request-schemas");
13
14
  const bff_local_errors_1 = require("../http/bff-local-errors");
14
15
  const capabilities_validator_1 = require("../validation/capabilities-validator");
15
16
  Object.defineProperty(exports, "MAX_PARSED_FILTER_DEPTH", { enumerable: true, get: function () { return capabilities_validator_1.MAX_FILTER_DEPTH; } });
@@ -30,54 +31,41 @@ function assertNoNodeReadableAsBothLeafAndBranch(node, depth = 0) {
30
31
  node.conditions.forEach(condition => assertNoNodeReadableAsBothLeafAndBranch(condition, depth + 1));
31
32
  }
32
33
  }
33
- // Validate the untyped request body before it reaches the query builders, so malformed shapes
34
- // (e.g. `projection` or `sort` as a string) surface as 400 invalid_request rather than a 500 from
35
- // an array method blowing up downstream.
34
+ /**
35
+ * Checks the flat inputs against the shared schema and reports the first failure as
36
+ * 400 invalid_request, so a malformed shape (`projection` as a string, a fractional `page.limit`)
37
+ * surfaces as a client error rather than a 500 from an array method blowing up downstream.
38
+ *
39
+ * Unknown keys are left alone: the object schemas ignore them, so `filter`, `timezone` and
40
+ * `parentId` travel through untouched and the body is returned by reference, not rebuilt.
41
+ */
42
+ function assertFlatInputs(schema, body) {
43
+ const result = schema.safeParse(body);
44
+ if (result.success)
45
+ return;
46
+ const [issue] = result.error.issues;
47
+ const path = issue.path.join('.');
48
+ throw (0, bff_local_errors_1.invalidRequest)(path ? `${path}: ${issue.message}` : issue.message);
49
+ }
50
+ function assertFilter(filter) {
51
+ if (filter === undefined)
52
+ return;
53
+ if (!isPlainObject(filter))
54
+ throw (0, bff_local_errors_1.invalidRequest)('filter must be an object');
55
+ assertNoNodeReadableAsBothLeafAndBranch(filter);
56
+ }
36
57
  function parseListRequest(body) {
37
58
  if (!isPlainObject(body))
38
59
  throw (0, bff_local_errors_1.invalidRequest)('Request body must be an object');
39
- const { filter, projection, sort, page } = body;
40
- if (projection !== undefined) {
41
- if (!Array.isArray(projection) || projection.some(field => typeof field !== 'string')) {
42
- throw (0, bff_local_errors_1.invalidRequest)('projection must be an array of field names');
43
- }
44
- }
45
- if (sort !== undefined) {
46
- const valid = Array.isArray(sort) &&
47
- sort.every(clause => isPlainObject(clause) &&
48
- typeof clause.field === 'string' &&
49
- (clause.direction === undefined ||
50
- clause.direction === 'asc' ||
51
- clause.direction === 'desc'));
52
- if (!valid)
53
- throw (0, bff_local_errors_1.invalidRequest)('sort must be an array of { field, direction? }');
54
- }
55
- if (filter !== undefined) {
56
- if (!isPlainObject(filter))
57
- throw (0, bff_local_errors_1.invalidRequest)('filter must be an object');
58
- assertNoNodeReadableAsBothLeafAndBranch(filter);
59
- }
60
- if (page !== undefined) {
61
- if (!isPlainObject(page)) {
62
- throw (0, bff_local_errors_1.invalidRequest)('page must be an object with limit and offset');
63
- }
64
- if (!Number.isInteger(page.limit) || page.limit <= 0) {
65
- throw (0, bff_local_errors_1.invalidRequest)('page.limit must be a positive integer');
66
- }
67
- if (!Number.isInteger(page.offset) || page.offset < 0) {
68
- throw (0, bff_local_errors_1.invalidRequest)('page.offset must be a non-negative integer');
69
- }
70
- }
60
+ assertFlatInputs(request_schemas_1.ListFlatInputs, body);
61
+ assertFilter(body.filter);
71
62
  return body;
72
63
  }
73
64
  function parseCountRequest(body) {
74
65
  if (!isPlainObject(body))
75
66
  throw (0, bff_local_errors_1.invalidRequest)('Request body must be an object');
76
- if (body.filter !== undefined) {
77
- if (!isPlainObject(body.filter))
78
- throw (0, bff_local_errors_1.invalidRequest)('filter must be an object');
79
- assertNoNodeReadableAsBothLeafAndBranch(body.filter);
80
- }
67
+ assertFlatInputs(request_schemas_1.CountFlatInputs, body);
68
+ assertFilter(body.filter);
81
69
  return body;
82
70
  }
83
71
  function collectFilterFields(filter, acc) {
@@ -101,6 +89,28 @@ function serializePage(page) {
101
89
  }
102
90
  return { 'page[size]': limit, 'page[number]': offset / limit + 1 };
103
91
  }
92
+ /**
93
+ * `search` and `searchExtended` are the wire names the agent reads; no other spelling is parsed.
94
+ *
95
+ * A blank search is dropped rather than forwarded. The agent's search decorator already treats it
96
+ * as absent, but `parseSearch` guards on a truthy value, so a whitespace-only search would raise
97
+ * "Collection is not searchable" on a non-searchable collection while an empty one would not — a
98
+ * cleared search box must not depend on how many spaces it holds.
99
+ *
100
+ * `searchExtended` only ships alongside a real search: on its own it changes nothing agent-side,
101
+ * and emitting it would alter the outgoing query of every search-less request.
102
+ *
103
+ * The value is trimmed on the way out, not in the parser: parsing stays pure validation here, and
104
+ * `parseListRequest` returns the caller's body untouched, which its own callers rely on.
105
+ */
106
+ function applySearch(query, body) {
107
+ const search = body.search?.trim();
108
+ if (!search)
109
+ return;
110
+ query.search = search;
111
+ if (body.searchExtended !== undefined)
112
+ query.searchExtended = body.searchExtended;
113
+ }
104
114
  function buildListAgentQuery(collection, timezone, body) {
105
115
  const query = { timezone };
106
116
  if (body.filter !== undefined)
@@ -111,12 +121,14 @@ function buildListAgentQuery(collection, timezone, body) {
111
121
  query.sort = serializeSort(body.sort);
112
122
  if (body.page)
113
123
  Object.assign(query, serializePage(body.page));
124
+ applySearch(query, body);
114
125
  return query;
115
126
  }
116
127
  function buildCountAgentQuery(timezone, body) {
117
128
  const query = { timezone };
118
129
  if (body.filter !== undefined)
119
130
  query.filters = JSON.stringify(body.filter);
131
+ applySearch(query, body);
120
132
  return query;
121
133
  }
122
134
  function collectListFieldPaths(body) {
@@ -152,4 +164,4 @@ function collectCountFieldPaths(body) {
152
164
  collectFilterFields(body.filter, paths);
153
165
  return paths;
154
166
  }
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtcXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS9hZ2VudC1xdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF5REEsNENBNkNDO0FBRUQsOENBU0M7QUEyQkQsa0RBYUM7QUFFRCxvREFNQztBQUVELHNEQU1DO0FBS0Qsc0NBWUM7QUFFRCw0REFJQztBQUVELDhEQUlDO0FBRUQsd0RBS0M7QUE3TUQsK0RBQTBEO0FBQzFELGlGQUEwRjtBQUc3RCx3R0FIcEIseUNBQWdCLE9BRzJCO0FBRnBELHVFQUFnRTtBQStCaEUsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsU0FBUyx1Q0FBdUMsQ0FBQyxJQUFhLEVBQUUsS0FBSyxHQUFHLENBQUM7SUFDdkUsSUFBSSxLQUFLLEdBQUcseUNBQWdCO1FBQUUsTUFBTSxJQUFBLGlDQUFhLEVBQUMseUNBQWdCLENBQUMsQ0FBQztJQUNwRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssSUFBSTtRQUFFLE9BQU87SUFFdEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLGlDQUFRLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFFeEMsSUFBSSxJQUFBLCtCQUFNLEVBQUMsSUFBSSxDQUFDLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUEsaUNBQWMsRUFBQywwREFBMEQsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FDbEMsdUNBQXVDLENBQUMsU0FBUyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FD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
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtcXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS9hZ2VudC1xdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzRkEsNENBT0M7QUFFRCw4Q0FPQztBQW9ERCxrREFjQztBQUVELG9EQU9DO0FBRUQsc0RBTUM7QUFLRCxzQ0FZQztBQUVELDREQUlDO0FBRUQsOERBSUM7QUFFRCx3REFLQztBQTNORCx1REFBb0U7QUFDcEUsK0RBQTBEO0FBQzFELGlGQUEwRjtBQUc3RCx3R0FIcEIseUNBQWdCLE9BRzJCO0FBRnBELHVFQUFnRTtBQW1DaEUsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsU0FBUyx1Q0FBdUMsQ0FBQyxJQUFhLEVBQUUsS0FBSyxHQUFHLENBQUM7SUFDdkUsSUFBSSxLQUFLLEdBQUcseUNBQWdCO1FBQUUsTUFBTSxJQUFBLGlDQUFhLEVBQUMseUNBQWdCLENBQUMsQ0FBQztJQUNwRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssSUFBSTtRQUFFLE9BQU87SUFFdEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLGlDQUFRLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFFeEMsSUFBSSxJQUFBLCtCQUFNLEVBQUMsSUFBSSxDQUFDLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUEsaUNBQWMsRUFBQywwREFBMEQsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FDbEMsdUNBQXVDLENBQUMsU0FBUyxFQUFFLEtBQUssR0FBRyxD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
@@ -0,0 +1,49 @@
1
+ import { z } from '../zod';
2
+ /**
3
+ * The validation rules of a request body, declared once. `src/openapi/schemas.ts` decorates these
4
+ * with names and descriptions to publish them, and the parsers below check bodies against them, so
5
+ * the document and the runtime cannot drift apart.
6
+ *
7
+ * `filter` is deliberately absent: its operators are checked against the collection capabilities
8
+ * (`capabilities-validator`), and a node readable as both leaf and branch has no schema equivalent,
9
+ * so it keeps its own path in `agent-query.ts`.
10
+ */
11
+ export declare const SortClauseInput: z.ZodObject<{
12
+ field: z.ZodString;
13
+ direction: z.ZodOptional<z.ZodEnum<{
14
+ asc: "asc";
15
+ desc: "desc";
16
+ }>>;
17
+ }, z.core.$strip>;
18
+ export declare const PageInput: z.ZodObject<{
19
+ limit: z.ZodNumber;
20
+ offset: z.ZodNumber;
21
+ }, z.core.$strip>;
22
+ export declare const ProjectionInput: z.ZodArray<z.ZodString>;
23
+ export declare const SearchInput: z.ZodString;
24
+ export declare const SearchExtendedInput: z.ZodBoolean;
25
+ export declare const TimezoneInput: z.ZodString;
26
+ export declare const ParentIdInput: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
27
+ /** Everything a list body carries except `filter`, which is validated separately. */
28
+ export declare const ListFlatInputs: z.ZodObject<{
29
+ projection: z.ZodOptional<z.ZodArray<z.ZodString>>;
30
+ sort: z.ZodOptional<z.ZodArray<z.ZodObject<{
31
+ field: z.ZodString;
32
+ direction: z.ZodOptional<z.ZodEnum<{
33
+ asc: "asc";
34
+ desc: "desc";
35
+ }>>;
36
+ }, z.core.$strip>>>;
37
+ page: z.ZodOptional<z.ZodObject<{
38
+ limit: z.ZodNumber;
39
+ offset: z.ZodNumber;
40
+ }, z.core.$strip>>;
41
+ search: z.ZodOptional<z.ZodString>;
42
+ searchExtended: z.ZodOptional<z.ZodBoolean>;
43
+ }, z.core.$strip>;
44
+ /** A count body carries no projection, sort or page. */
45
+ export declare const CountFlatInputs: z.ZodObject<{
46
+ search: z.ZodOptional<z.ZodString>;
47
+ searchExtended: z.ZodOptional<z.ZodBoolean>;
48
+ }, z.core.$strip>;
49
+ //# sourceMappingURL=request-schemas.d.ts.map
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CountFlatInputs = exports.ListFlatInputs = exports.ParentIdInput = exports.TimezoneInput = exports.SearchExtendedInput = exports.SearchInput = exports.ProjectionInput = exports.PageInput = exports.SortClauseInput = void 0;
4
+ const zod_1 = require("../zod");
5
+ /**
6
+ * The validation rules of a request body, declared once. `src/openapi/schemas.ts` decorates these
7
+ * with names and descriptions to publish them, and the parsers below check bodies against them, so
8
+ * the document and the runtime cannot drift apart.
9
+ *
10
+ * `filter` is deliberately absent: its operators are checked against the collection capabilities
11
+ * (`capabilities-validator`), and a node readable as both leaf and branch has no schema equivalent,
12
+ * so it keeps its own path in `agent-query.ts`.
13
+ */
14
+ exports.SortClauseInput = zod_1.z.object({
15
+ field: zod_1.z.string(),
16
+ direction: zod_1.z.enum(['asc', 'desc']).optional(),
17
+ });
18
+ exports.PageInput = zod_1.z.object({
19
+ limit: zod_1.z.number().int().positive(),
20
+ offset: zod_1.z.number().int().nonnegative(),
21
+ });
22
+ exports.ProjectionInput = zod_1.z.array(zod_1.z.string());
23
+ exports.SearchInput = zod_1.z.string();
24
+ exports.SearchExtendedInput = zod_1.z.boolean();
25
+ exports.TimezoneInput = zod_1.z.string();
26
+ exports.ParentIdInput = zod_1.z.union([zod_1.z.string().regex(/\S/), zod_1.z.number()]);
27
+ /** Everything a list body carries except `filter`, which is validated separately. */
28
+ exports.ListFlatInputs = zod_1.z.object({
29
+ projection: exports.ProjectionInput.optional(),
30
+ sort: zod_1.z.array(exports.SortClauseInput).optional(),
31
+ page: exports.PageInput.optional(),
32
+ search: exports.SearchInput.optional(),
33
+ searchExtended: exports.SearchExtendedInput.optional(),
34
+ });
35
+ /** A count body carries no projection, sort or page. */
36
+ exports.CountFlatInputs = zod_1.z.object({
37
+ search: exports.SearchInput.optional(),
38
+ searchExtended: exports.SearchExtendedInput.optional(),
39
+ });
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1zY2hlbWFzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEvcmVxdWVzdC1zY2hlbWFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdDQUEyQjtBQUUzQjs7Ozs7Ozs7R0FRRztBQUNVLFFBQUEsZUFBZSxHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDdEMsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDakIsU0FBUyxFQUFFLE9BQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7Q0FDOUMsQ0FBQyxDQUFDO0FBRVUsUUFBQSxTQUFTLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNoQyxLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNsQyxNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRTtDQUN2QyxDQUFDLENBQUM7QUFFVSxRQUFBLGVBQWUsR0FBRyxPQUFDLENBQUMsS0FBSyxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRXRDLFFBQUEsV0FBVyxHQUFHLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUV6QixRQUFBLG1CQUFtQixHQUFHLE9BQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUVsQyxRQUFBLGFBQWEsR0FBRyxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFFM0IsUUFBQSxhQUFhLEdBQUcsT0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUUzRSxxRkFBcUY7QUFDeEUsUUFBQSxjQUFjLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQyxVQUFVLEVBQUUsdUJBQWUsQ0FBQyxRQUFRLEVBQUU7SUFDdEMsSUFBSSxFQUFFLE9BQUMsQ0FBQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUN6QyxJQUFJLEVBQUUsaUJBQVMsQ0FBQyxRQUFRLEVBQUU7SUFDMUIsTUFBTSxFQUFFLG1CQUFXLENBQUMsUUFBUSxFQUFFO0lBQzlCLGNBQWMsRUFBRSwyQkFBbUIsQ0FBQyxRQUFRLEVBQUU7Q0FDL0MsQ0FBQyxDQUFDO0FBRUgsd0RBQXdEO0FBQzNDLFFBQUEsZUFBZSxHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDdEMsTUFBTSxFQUFFLG1CQUFXLENBQUMsUUFBUSxFQUFFO0lBQzlCLGNBQWMsRUFBRSwyQkFBbUIsQ0FBQyxRQUFRLEVBQUU7Q0FDL0MsQ0FBQyxDQUFDIn0=
@@ -13,6 +13,8 @@ export declare const PageSchema: z.ZodObject<{
13
13
  offset: z.ZodNumber;
14
14
  }, z.core.$strip>;
15
15
  export declare const TimezoneSchema: z.ZodString;
16
+ export declare const SearchSchema: z.ZodString;
17
+ export declare const SearchExtendedSchema: z.ZodBoolean;
16
18
  export declare const ListRequestSchema: z.ZodObject<{
17
19
  filter: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
18
20
  projection: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -27,10 +29,14 @@ export declare const ListRequestSchema: z.ZodObject<{
27
29
  limit: z.ZodNumber;
28
30
  offset: z.ZodNumber;
29
31
  }, z.core.$strip>>;
32
+ search: z.ZodOptional<z.ZodString>;
33
+ searchExtended: z.ZodOptional<z.ZodBoolean>;
30
34
  timezone: z.ZodOptional<z.ZodString>;
31
35
  }, z.core.$strip>;
32
36
  export declare const CountRequestSchema: z.ZodObject<{
33
37
  filter: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
38
+ search: z.ZodOptional<z.ZodString>;
39
+ searchExtended: z.ZodOptional<z.ZodBoolean>;
34
40
  timezone: z.ZodOptional<z.ZodString>;
35
41
  }, z.core.$strip>;
36
42
  declare const ParentIdSchema: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
@@ -48,11 +54,15 @@ export declare const RelationListRequestSchema: z.ZodObject<{
48
54
  limit: z.ZodNumber;
49
55
  offset: z.ZodNumber;
50
56
  }, z.core.$strip>>;
57
+ search: z.ZodOptional<z.ZodString>;
58
+ searchExtended: z.ZodOptional<z.ZodBoolean>;
51
59
  timezone: z.ZodOptional<z.ZodString>;
52
60
  parentId: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
53
61
  }, z.core.$strip>;
54
62
  export declare const RelationCountRequestSchema: z.ZodObject<{
55
63
  filter: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
64
+ search: z.ZodOptional<z.ZodString>;
65
+ searchExtended: z.ZodOptional<z.ZodBoolean>;
56
66
  timezone: z.ZodOptional<z.ZodString>;
57
67
  parentId: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
58
68
  }, z.core.$strip>;
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OPERATORS = exports.ParentIdSchema = exports.ConditionTreeSchema = exports.MessagelessErrorResponseSchema = exports.ErrorResponseSchema = exports.ContextResponseSchema = exports.CountResponseSchema = exports.ListResponseSchema = exports.ActionRequestSchema = exports.RelationCountRequestSchema = exports.RelationListRequestSchema = exports.CountRequestSchema = exports.ListRequestSchema = exports.TimezoneSchema = exports.PageSchema = exports.SortClauseSchema = void 0;
3
+ exports.OPERATORS = exports.ParentIdSchema = exports.ConditionTreeSchema = exports.MessagelessErrorResponseSchema = exports.ErrorResponseSchema = exports.ContextResponseSchema = exports.CountResponseSchema = exports.ListResponseSchema = exports.ActionRequestSchema = exports.RelationCountRequestSchema = exports.RelationListRequestSchema = exports.CountRequestSchema = exports.ListRequestSchema = exports.SearchExtendedSchema = exports.SearchSchema = exports.TimezoneSchema = exports.PageSchema = exports.SortClauseSchema = void 0;
4
4
  const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
5
5
  const zod_openapi_1 = require("./zod-openapi");
6
+ const request_schemas_1 = require("../data/request-schemas");
6
7
  const read_model_1 = require("../read-model/read-model");
7
8
  const capabilities_validator_1 = require("../validation/capabilities-validator");
8
9
  const OPERATORS = [...datasource_toolkit_1.allOperators];
@@ -33,42 +34,59 @@ const ConditionTreeSchema = zod_openapi_1.z
33
34
  'collection capabilities; relation list and count forward the filter without either check.',
34
35
  });
35
36
  exports.ConditionTreeSchema = ConditionTreeSchema;
36
- exports.SortClauseSchema = zod_openapi_1.z
37
- .object({
38
- field: zod_openapi_1.z.string(),
39
- direction: zod_openapi_1.z.enum(['asc', 'desc']).optional(),
40
- })
41
- .openapi('SortClause', { description: 'Omitting `direction` sorts ascending.' });
42
- exports.PageSchema = zod_openapi_1.z
43
- .object({
44
- limit: zod_openapi_1.z.number().int().positive(),
45
- offset: zod_openapi_1.z.number().int().nonnegative(),
46
- })
47
- .openapi('Page', {
37
+ exports.SortClauseSchema = request_schemas_1.SortClauseInput.openapi('SortClause', {
38
+ description: 'Omitting `direction` sorts ascending.',
39
+ });
40
+ exports.PageSchema = request_schemas_1.PageInput.openapi('Page', {
48
41
  description: 'The agent paginates by page number, so `offset` must be a whole multiple of `limit`. ' +
49
42
  'Any other offset is rejected with 400 invalid_request.',
50
43
  });
51
- exports.TimezoneSchema = zod_openapi_1.z.string().openapi('Timezone', {
44
+ exports.TimezoneSchema = request_schemas_1.TimezoneInput.openapi('Timezone', {
52
45
  description: 'Used when the X-Forest-Timezone header is absent. The header wins when both are sent. A ' +
53
46
  'deployment with no configured default rejects a request carrying neither with 400 ' +
54
47
  'missing_timezone.',
55
48
  });
49
+ exports.SearchSchema = request_schemas_1.SearchInput.openapi('Search', {
50
+ description: "The agent's native full-text search, applied on top of `filter` rather than instead of it. " +
51
+ 'An empty or whitespace-only value is treated as absent, so clearing a search box is not an ' +
52
+ 'error. Searching a collection whose search is disabled is not rejected here: the agent ' +
53
+ 'answers 400 validation_error with "Collection is not searchable". The response does not say ' +
54
+ 'which field matched. The value is a query, not a plain term: `column:value` narrows the ' +
55
+ 'search to one column, and `relation.column:value` narrows it to a column of a related ' +
56
+ 'collection — so a search reaches relation fields on its own, with no `searchExtended`, and ' +
57
+ 'escapes the 422 relation_field_not_supported that the same path draws in `filter`, `sort` or ' +
58
+ '`projection`. The agent resolves a relation named in a query against its own schema, so a ' +
59
+ 'query can filter on a column of a collection this BFF does not expose.',
60
+ });
61
+ exports.SearchExtendedSchema = request_schemas_1.SearchExtendedInput.openapi('SearchExtended', {
62
+ description: 'Widens `search` to every related collection reachable from this one, instead of only this ' +
63
+ "collection's own columns. Meaningless on its own: sent without `search` it is ignored and " +
64
+ 'changes nothing. It is not the only way a search reaches a relation — see `Search` for the ' +
65
+ '`relation.column:value` syntax, which does so without this flag.',
66
+ });
56
67
  exports.ListRequestSchema = zod_openapi_1.z
57
68
  .object({
58
69
  filter: ConditionTreeSchema.optional(),
59
- projection: zod_openapi_1.z.array(zod_openapi_1.z.string()).optional(),
70
+ projection: request_schemas_1.ProjectionInput.optional(),
60
71
  sort: zod_openapi_1.z.array(exports.SortClauseSchema).optional(),
61
72
  page: exports.PageSchema.optional(),
73
+ search: exports.SearchSchema.optional(),
74
+ searchExtended: exports.SearchExtendedSchema.optional(),
62
75
  timezone: exports.TimezoneSchema.optional(),
63
76
  })
64
77
  .openapi('ListRequest');
65
78
  exports.CountRequestSchema = zod_openapi_1.z
66
79
  .object({
67
80
  filter: ConditionTreeSchema.optional(),
81
+ search: exports.SearchSchema.optional(),
82
+ searchExtended: exports.SearchExtendedSchema.optional(),
68
83
  timezone: exports.TimezoneSchema.optional(),
69
84
  })
70
- .openapi('CountRequest');
71
- const ParentIdSchema = zod_openapi_1.z.union([zod_openapi_1.z.string().regex(/\S/), zod_openapi_1.z.number()]).openapi('ParentId', {
85
+ .openapi('CountRequest', {
86
+ description: 'Accepts the same search inputs as list, so a client can count exactly the rows its search ' +
87
+ 'returns.',
88
+ });
89
+ const ParentIdSchema = request_schemas_1.ParentIdInput.openapi('ParentId', {
72
90
  description: 'The parent record id, opaque: a composite or packed id must be passed unchanged. A ' +
73
91
  'blank string is rejected.',
74
92
  });
@@ -76,7 +94,7 @@ exports.ParentIdSchema = ParentIdSchema;
76
94
  exports.RelationListRequestSchema = exports.ListRequestSchema.extend({
77
95
  parentId: ParentIdSchema,
78
96
  }).openapi('RelationListRequest', {
79
- description: 'Filter, sort and projection apply to the FOREIGN collection; the parent only resolves ' +
97
+ description: 'Filter, sort, projection and search apply to the FOREIGN collection; the parent only resolves ' +
80
98
  'which records are related.',
81
99
  });
82
100
  exports.RelationCountRequestSchema = exports.CountRequestSchema.extend({
@@ -229,4 +247,4 @@ exports.MessagelessErrorResponseSchema = zod_openapi_1.z
229
247
  .openapi('MessagelessErrorResponse', {
230
248
  description: 'The unsupported-action-result body, which carries no message field unlike every other error.',
231
249
  });
232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL3NjaGVtYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0VBQStEO0FBRS9ELCtDQUFrQztBQUNsQyx5REFBOEQ7QUFDOUQsaUZBQXdFO0FBRXhFLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxpQ0FBWSxDQUEwQixDQUFDO0FBNlFmLDhCQUFTO0FBM1F2RCxNQUFNLHVCQUF1QixHQUFHLGVBQUM7S0FDOUIsTUFBTSxDQUFDO0lBQ04sS0FBSyxFQUFFLGVBQUMsQ0FBQyxNQUFNLEVBQUU7SUFDakIsUUFBUSxFQUFFLGVBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzNCLEtBQUssRUFBRSxlQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzlCLENBQUM7S0FDRCxPQUFPLENBQUMsbUJBQW1CLEVBQUU7SUFDNUIsV0FBVyxFQUNULDBGQUEwRjtRQUMxRixxRkFBcUY7Q0FDeEYsQ0FBQyxDQUFDO0FBRUwsTUFBTSxtQkFBbUIsR0FBYyxlQUFDO0tBQ3JDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDVCxlQUFDLENBQUMsS0FBSyxDQUFDO0lBQ04sdUJBQXVCO0lBQ3ZCLGVBQUMsQ0FBQyxNQUFNLENBQUM7UUFDUCxVQUFVLEVBQUUsZUFBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqQyxVQUFVLEVBQUUsZUFBQyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztLQUN6QyxDQUFDO0NBQ0gsQ0FBQyxDQUNIO0tBQ0EsT0FBTyxDQUFDLGVBQWUsRUFBRTtJQUN4QixXQUFXLEVBQ1QsdUZBQXVGO1FBQ3ZGLHVGQUF1RjtRQUN2Rix1RkFBdUY7UUFDdkYsUUFBUSx5Q0FBZ0IsNERBQTREO1FBQ3BGLDJGQUEyRjtDQUM5RixDQUFDLENBQUM7QUE4T0ksa0RBQW1CO0FBNU9mLFFB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
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL3NjaGVtYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0VBQStEO0FBRS9ELCtDQUFrQztBQUNsQyw2REFRaUM7QUFDakMseURBQThEO0FBQzlELGlGQUF3RTtBQUV4RSxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsaUNBQVksQ0FBMEIsQ0FBQztBQW1TZiw4QkFBUztBQWpTdkQsTUFBTSx1QkFBdUIsR0FBRyxlQUFDO0tBQzlCLE1BQU0sQ0FBQztJQUNOLEtBQUssRUFBRSxlQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2pCLFFBQVEsRUFBRSxlQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMzQixLQUFLLEVBQUUsZUFBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUM5QixDQUFDO0tBQ0QsT0FBTyxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLFdBQVcsRUFDVCwwRkFBMEY7UUFDMUYscUZBQXFGO0NBQ3hGLENBQUMsQ0FBQztBQUVMLE1BQU0sbUJBQW1CLEdBQWMsZUFBQztLQUNyQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQ1QsZUFBQyxDQUFDLEtBQUssQ0FBQztJQUNOLHVCQUF1QjtJQUN2QixlQUFDLENBQUMsTUFBTSxDQUFDO1FBQ1AsVUFBVSxFQUFFLGVBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakMsVUFBVSxFQUFFLGVBQUMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7S0FDekMsQ0FBQztDQUNILENBQUMsQ0FDSDtLQUNBLE9BQU8sQ0FBQyxlQUFlLEVBQUU7SUFDeEIsV0FBVyxFQUNULHVGQUF1RjtRQUN2Rix1RkFBdUY7UUFDdkYsdUZBQXVGO1FBQ3ZGLFFBQVEseUNBQWdCLDREQUE0RDtRQUNwRiwyRkFBMkY7Q0FDOUYsQ0FBQyxDQUFDO0FBb1FJLGtE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
@@ -1,3 +1,2 @@
1
- import { z } from 'zod';
2
- export { z };
1
+ export { z } from '../zod';
3
2
  //# sourceMappingURL=zod-openapi.d.ts.map
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.z = void 0;
4
- const zod_to_openapi_1 = require("@asteasolutions/zod-to-openapi");
5
- const zod_1 = require("zod");
4
+ // Kept as the openapi module's entry point for zod; the extension itself lives in `src/zod.ts` so
5
+ // the request schemas can share the same extended instance without depending on this folder.
6
+ // eslint-disable-next-line import/prefer-default-export
7
+ var zod_1 = require("../zod");
6
8
  Object.defineProperty(exports, "z", { enumerable: true, get: function () { return zod_1.z; } });
7
- (0, zod_to_openapi_1.extendZodWithOpenApi)(zod_1.z);
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLW9wZW5hcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS96b2Qtb3BlbmFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtRUFBc0U7QUFDdEUsNkJBQXdCO0FBS2Ysa0ZBTEEsT0FBQyxPQUtBO0FBSFYsSUFBQSxxQ0FBb0IsRUFBQyxPQUFDLENBQUMsQ0FBQyJ9
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLW9wZW5hcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS96b2Qtb3BlbmFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrR0FBa0c7QUFDbEcsNkZBQTZGO0FBQzdGLHdEQUF3RDtBQUN4RCw4QkFBMkI7QUFBbEIsd0ZBQUEsQ0FBQyxPQUFBIn0=
package/dist/zod.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { z } from 'zod';
2
+ export { z };
3
+ //# sourceMappingURL=zod.d.ts.map
package/dist/zod.js ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.z = void 0;
4
+ const zod_to_openapi_1 = require("@asteasolutions/zod-to-openapi");
5
+ const zod_1 = require("zod");
6
+ Object.defineProperty(exports, "z", { enumerable: true, get: function () { return zod_1.z; } });
7
+ // Extended once, here, and imported from here by everyone. A schema built from a plain `zod` import
8
+ // has no `.openapi()`, so the request schemas and the OpenAPI document must share this instance for
9
+ // the same declaration to serve both.
10
+ (0, zod_to_openapi_1.extendZodWithOpenApi)(zod_1.z);
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3pvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtRUFBc0U7QUFDdEUsNkJBQXdCO0FBUWYsa0ZBUkEsT0FBQyxPQVFBO0FBTlYsb0dBQW9HO0FBQ3BHLG9HQUFvRztBQUNwRyxzQ0FBc0M7QUFDdEMsSUFBQSxxQ0FBb0IsRUFBQyxPQUFDLENBQUMsQ0FBQyJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forestadmin/agent-bff",
3
- "version": "1.20.2",
3
+ "version": "1.21.0",
4
4
  "main": "dist/index.js",
5
5
  "bin": {
6
6
  "forest-bff": "dist/cli.js"
@@ -42,6 +42,8 @@
42
42
  "zod": "4.3.6"
43
43
  },
44
44
  "devDependencies": {
45
+ "@forestadmin/agent": "1.98.0",
46
+ "@forestadmin/agent-testing": "1.2.4",
45
47
  "@hey-api/openapi-ts": "0.99.0",
46
48
  "@redocly/cli": "2.35.1",
47
49
  "@types/jsonwebtoken": "^9.0.1",