@forestadmin/agent-bff 1.20.2 → 1.22.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.
Files changed (40) hide show
  1. package/README.md +64 -6
  2. package/dist/ai/ai-proxy-client.d.ts +26 -0
  3. package/dist/ai/ai-proxy-client.js +74 -0
  4. package/dist/ai/ai-proxy-timeout-error.d.ts +5 -0
  5. package/dist/ai/ai-proxy-timeout-error.js +11 -0
  6. package/dist/ai/ai-routes-middleware.d.ts +15 -0
  7. package/dist/ai/ai-routes-middleware.js +96 -0
  8. package/dist/api-key/agent-token.js +4 -7
  9. package/dist/auth/auth-mode.d.ts +2 -0
  10. package/dist/auth/auth-mode.js +9 -1
  11. package/dist/cli-core.d.ts +9 -0
  12. package/dist/cli-core.js +55 -7
  13. package/dist/cli-dispatch.js +15 -3
  14. package/dist/config/env-config.d.ts +3 -1
  15. package/dist/config/env-config.js +10 -8
  16. package/dist/data/agent-query.d.ts +4 -0
  17. package/dist/data/agent-query.js +53 -41
  18. package/dist/data/request-schemas.d.ts +49 -0
  19. package/dist/data/request-schemas.js +40 -0
  20. package/dist/docs/docs-samples.js +24 -16
  21. package/dist/http/bff-local-errors.d.ts +4 -0
  22. package/dist/http/bff-local-errors.js +19 -1
  23. package/dist/http/body-limit.d.ts +1 -0
  24. package/dist/http/body-limit.js +3 -1
  25. package/dist/oauth/oauth-error.d.ts +3 -2
  26. package/dist/oauth/oauth-error.js +5 -4
  27. package/dist/oauth/session-lifecycle.js +2 -2
  28. package/dist/openapi/openapi-document.d.ts +5 -1
  29. package/dist/openapi/openapi-document.js +133 -17
  30. package/dist/openapi/openapi-routes.d.ts +2 -1
  31. package/dist/openapi/openapi-routes.js +9 -4
  32. package/dist/openapi/schemas.d.ts +11 -0
  33. package/dist/openapi/schemas.js +45 -19
  34. package/dist/openapi/unfolded-document.d.ts +5 -1
  35. package/dist/openapi/unfolded-document.js +6 -3
  36. package/dist/openapi/zod-openapi.d.ts +1 -2
  37. package/dist/openapi/zod-openapi.js +5 -4
  38. package/dist/zod.d.ts +3 -0
  39. package/dist/zod.js +11 -0
  40. package/package.json +3 -1
@@ -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.AiQueryRequestSchema = 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({
@@ -208,6 +226,14 @@ exports.ContextResponseSchema = zod_openapi_1.z
208
226
  'from its own secret — it is telemetry, not a routing input, and it is absent when the ' +
209
227
  'deployment runs without the OAuth configuration.',
210
228
  });
229
+ exports.AiQueryRequestSchema = zod_openapi_1.z.unknown().openapi('AiQueryRequest', {
230
+ description: 'Passed through to the Forest AI proxy without validation or rewriting, so the authority on ' +
231
+ 'this shape is the upstream contract, not the BFF. It is left free-form on purpose: the BFF ' +
232
+ 'enforces nothing here, and a shape published from this side would drift from the upstream ' +
233
+ 'one nobody keeps it in sync with. In practice it is the OpenAI chat-completion body — ' +
234
+ '`messages`, and optionally `tools`, `tool_choice`, `parallel_tool_calls`. A malformed body ' +
235
+ 'is rejected by the Forest server, not here.',
236
+ });
211
237
  exports.ErrorResponseSchema = zod_openapi_1.z
212
238
  .object({
213
239
  error: zod_openapi_1.z.object({
@@ -229,4 +255,4 @@ exports.MessagelessErrorResponseSchema = zod_openapi_1.z
229
255
  .openapi('MessagelessErrorResponse', {
230
256
  description: 'The unsupported-action-result body, which carries no message field unlike every other error.',
231
257
  });
232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL3NjaGVtYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0VBQStEO0FBRS9ELCtDQUFrQztBQUNsQyx5REFBOEQ7QUFDOUQsaUZBQXdFO0FBRXhFLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxpQ0FBWSxDQUEwQixDQUFDO0FBNlFmLDhCQUFTO0FBM1F2RCxNQUFNLHVCQUF1QixHQUFHLGVBQUM7S0FDOUIsTUFBTSxDQUFDO0lBQ04sS0FBSyxFQUFFLGVBQUMsQ0FBQyxNQUFNLEVBQUU7SUFDakIsUUFBUSxFQUFFLGVBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzNCLEtBQUssRUFBRSxlQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzlCLENBQUM7S0FDRCxPQUFPLENBQUMsbUJBQW1CLEVBQUU7SUFDNUIsV0FBVyxFQUNULDBGQUEwRjtRQUMxRixxRkFBcUY7Q0FDeEYsQ0FBQyxDQUFDO0FBRUwsTUFBTSxtQkFBbUIsR0FBYyxlQUFDO0tBQ3JDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDVCxlQUFDLENBQUMsS0FBSyxDQUFDO0lBQ04sdUJBQXVCO0lBQ3ZCLGVBQUMsQ0FBQyxNQUFNLENBQUM7UUFDUCxVQUFVLEVBQUUsZUFBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqQyxVQUFVLEVBQUUsZUFBQyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztLQUN6QyxDQUFDO0NBQ0gsQ0FBQyxDQUNIO0tBQ0EsT0FBTyxDQUFDLGVBQWUsRUFBRTtJQUN4QixXQUFXLEVBQ1QsdUZBQXVGO1FBQ3ZGLHVGQUF1RjtRQUN2Rix1RkFBdUY7UUFDdkYsUUFBUSx5Q0FBZ0IsNERBQTREO1FBQ3BGLDJGQUEyRjtDQUM5RixDQUFDLENBQUM7QUE4T0ksa0RBQW1CO0FBNU9mLFFB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
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL3NjaGVtYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0VBQStEO0FBRS9ELCtDQUFrQztBQUNsQyw2REFRaUM7QUFDakMseURBQThEO0FBQzlELGlGQUF3RTtBQUV4RSxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsaUNBQVksQ0FBMEIsQ0FBQztBQTZTZiw4QkFBUztBQTNTdkQsTUFBTSx1QkFBdUIsR0FBRyxlQUFDO0tBQzlCLE1BQU0sQ0FBQztJQUNOLEtBQUssRUFBRSxlQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2pCLFFBQVEsRUFBRSxlQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMzQixLQUFLLEVBQUUsZUFBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUM5QixDQUFDO0tBQ0QsT0FBTyxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLFdBQVcsRUFDVCwwRkFBMEY7UUFDMUYscUZBQXFGO0NBQ3hGLENBQUMsQ0FBQztBQUVMLE1BQU0sbUJBQW1CLEdBQWMsZUFBQztLQUNyQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQ1QsZUFBQyxDQUFDLEtBQUssQ0FBQztJQUNOLHVCQUF1QjtJQUN2QixlQUFDLENBQUMsTUFBTSxDQUFDO1FBQ1AsVUFBVSxFQUFFLGVBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakMsVUFBVSxFQUFFLGVBQUMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7S0FDekMsQ0FBQztDQUNILENBQUMsQ0FDSDtLQUNBLE9BQU8sQ0FBQyxlQUFlLEVBQUU7SUFDeEIsV0FBVyxFQUNULHVGQUF1RjtRQUN2Rix1RkFBdUY7UUFDdkYsdUZBQXVGO1FBQ3ZGLFFBQVEseUNBQWdCLDREQUE0RDtRQUNwRiwyRkFBMkY7Q0FDOUYsQ0FBQyxDQUFDO0FBOFFJLGtE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
@@ -14,7 +14,11 @@ export interface UnfoldedDocument {
14
14
  /** Handed back so a caller can react to a collection that went out without its field set. */
15
15
  unfolding: Unfolding;
16
16
  }
17
- export default function buildUnfoldedDocument(source: UnfoldSource, readModel: ReadModel, token: string | (() => string), version: string): Promise<UnfoldedDocument>;
17
+ export interface UnfoldOptions {
18
+ version: string;
19
+ hasAiQueryRoute: boolean;
20
+ }
21
+ export default function buildUnfoldedDocument(source: UnfoldSource, readModel: ReadModel, token: string | (() => string), { version, hasAiQueryRoute }: UnfoldOptions): Promise<UnfoldedDocument>;
18
22
  /**
19
23
  * The CLI has no caller to borrow an agent token from, so it signs its own with the deployment's
20
24
  * auth secret — the only thing the agent verifies, and the capabilities route it calls runs no
@@ -9,7 +9,7 @@ const collect_unfolding_1 = __importDefault(require("./collect-unfolding"));
9
9
  const openapi_document_1 = require("./openapi-document");
10
10
  const agent_token_1 = require("../api-key/agent-token");
11
11
  const agent_capabilities_fetcher_1 = __importDefault(require("../read-model/agent-capabilities-fetcher"));
12
- async function buildUnfoldedDocument(source, readModel, token, version) {
12
+ async function buildUnfoldedDocument(source, readModel, token, { version, hasAiQueryRoute }) {
13
13
  const unfolding = await (0, collect_unfolding_1.default)({
14
14
  readModel,
15
15
  store: source.store,
@@ -20,7 +20,10 @@ async function buildUnfoldedDocument(source, readModel, token, version) {
20
20
  }),
21
21
  logger: source.logger,
22
22
  });
23
- return { document: (0, openapi_document_1.serializeOpenApi)((0, openapi_document_1.generateOpenApiDocument)(version, unfolding)), unfolding };
23
+ return {
24
+ document: (0, openapi_document_1.serializeOpenApi)((0, openapi_document_1.generateOpenApiDocument)(version, { unfolding, hasAiQueryRoute })),
25
+ unfolding,
26
+ };
24
27
  }
25
28
  /**
26
29
  * The CLI has no caller to borrow an agent token from, so it signs its own with the deployment's
@@ -49,4 +52,4 @@ function issueOpenApiAgentToken(authSecret) {
49
52
  },
50
53
  });
51
54
  }
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5mb2xkZWQtZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS91bmZvbGRlZC1kb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXdCQSx3Q0FrQkM7QUFXRCx3REFpQkM7QUFqRUQsNEVBQW1EO0FBQ25ELHlEQUErRTtBQUMvRSx3REFBeUQ7QUFDekQsMEdBQXNGO0FBZ0J2RSxLQUFLLFVBQVUscUJBQXFCLENBQ2pELE1BQW9CLEVBQ3BCLFNBQW9CLEVBQ3BCLEtBQThCLEVBQzlCLE9BQWU7SUFFZixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsMkJBQWdCLEVBQUM7UUFDdkMsU0FBUztRQUNULEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztRQUNuQixtQkFBbUIsRUFBRSxJQUFBLG9DQUE4QixFQUFDO1lBQ2xELFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixLQUFLO1lBQ0wsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1NBQzVCLENBQUM7UUFDRixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07S0FDdEIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFBLG1DQUFnQixFQUFDLElBQUEsMENBQXVCLEVBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDaEcsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsVUFBa0I7SUFDdkQsT0FBTyxJQUFBLDZCQUFlLEVBQUM7UUFDckIsVUFBVTtRQUNWLFFBQVEsRUFBRTtZQUNSLFdBQVcsRUFBRSxDQUFDO1lBQ2QsY0FBYyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxFQUFFO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEtBQUssRUFBRSxtQ0FBbUM7Z0JBQzFDLFNBQVMsRUFBRSxRQUFRO2dCQUNuQixRQUFRLEVBQUUsS0FBSztnQkFDZixJQUFJLEVBQUUsWUFBWTtnQkFDbEIsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsZUFBZSxFQUFFLE9BQU87YUFDekI7U0FDRjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5mb2xkZWQtZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS91bmZvbGRlZC1kb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQTZCQSx3Q0FxQkM7QUFXRCx3REFpQkM7QUF6RUQsNEVBQW1EO0FBQ25ELHlEQUErRTtBQUMvRSx3REFBeUQ7QUFDekQsMEdBQXNGO0FBcUJ2RSxLQUFLLFVBQVUscUJBQXFCLENBQ2pELE1BQW9CLEVBQ3BCLFNBQW9CLEVBQ3BCLEtBQThCLEVBQzlCLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBaUI7SUFFM0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFBLDJCQUFnQixFQUFDO1FBQ3ZDLFNBQVM7UUFDVCxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7UUFDbkIsbUJBQW1CLEVBQUUsSUFBQSxvQ0FBOEIsRUFBQztZQUNsRCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsS0FBSztZQUNMLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztTQUM1QixDQUFDO1FBQ0YsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO0tBQ3RCLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxRQUFRLEVBQUUsSUFBQSxtQ0FBZ0IsRUFBQyxJQUFBLDBDQUF1QixFQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLFNBQVM7S0FDVixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsVUFBa0I7SUFDdkQsT0FBTyxJQUFBLDZCQUFlLEVBQUM7UUFDckIsVUFBVTtRQUNWLFFBQVEsRUFBRTtZQUNSLFdBQVcsRUFBRSxDQUFDO1lBQ2QsY0FBYyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxFQUFFO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEtBQUssRUFBRSxtQ0FBbUM7Z0JBQzFDLFNBQVMsRUFBRSxRQUFRO2dCQUNuQixRQUFRLEVBQUUsS0FBSztnQkFDZixJQUFJLEVBQUUsWUFBWTtnQkFDbEIsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsZUFBZSxFQUFFLE9BQU87YUFDekI7U0FDRjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
@@ -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.22.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",