@forestadmin/agent-bff 1.16.0 → 1.18.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 (41) hide show
  1. package/README.md +15 -1
  2. package/dist/action/action-form-mapper.d.ts +2 -1
  3. package/dist/action/action-form-mapper.js +1 -1
  4. package/dist/action/agent-action-client.d.ts +2 -1
  5. package/dist/action/agent-action-client.js +1 -1
  6. package/dist/cli-core.d.ts +3 -0
  7. package/dist/cli-core.js +52 -10
  8. package/dist/cli-dispatch.d.ts +8 -2
  9. package/dist/cli-dispatch.js +90 -9
  10. package/dist/data/data-routes-middleware.js +3 -12
  11. package/dist/data/pack-id.d.ts +1 -0
  12. package/dist/data/pack-id.js +4 -3
  13. package/dist/openapi/collect-unfolding.d.ts +23 -0
  14. package/dist/openapi/collect-unfolding.js +144 -0
  15. package/dist/openapi/component-pool.d.ts +18 -0
  16. package/dist/openapi/component-pool.js +28 -0
  17. package/dist/openapi/field-schemas.d.ts +9 -0
  18. package/dist/openapi/field-schemas.js +43 -0
  19. package/dist/openapi/names.d.ts +16 -0
  20. package/dist/openapi/names.js +28 -0
  21. package/dist/openapi/openapi-document.d.ts +2 -1
  22. package/dist/openapi/openapi-document.js +112 -66
  23. package/dist/openapi/openapi-routes.d.ts +4 -1
  24. package/dist/openapi/openapi-routes.js +46 -9
  25. package/dist/openapi/schemas.d.ts +14 -1
  26. package/dist/openapi/schemas.js +11 -10
  27. package/dist/openapi/unfolded-document.d.ts +28 -0
  28. package/dist/openapi/unfolded-document.js +52 -0
  29. package/dist/openapi/unfolded-paths.d.ts +20 -0
  30. package/dist/openapi/unfolded-paths.js +408 -0
  31. package/dist/openapi/unfolding.d.ts +66 -0
  32. package/dist/openapi/unfolding.js +17 -0
  33. package/dist/read-model/agent-capabilities-fetcher.d.ts +8 -3
  34. package/dist/read-model/agent-capabilities-fetcher.js +15 -7
  35. package/dist/read-model/capabilities-cache.d.ts +11 -1
  36. package/dist/read-model/capabilities-cache.js +1 -1
  37. package/dist/read-model/read-model.d.ts +14 -0
  38. package/dist/read-model/read-model.js +36 -2
  39. package/dist/validation/operator-normalizer.d.ts +6 -0
  40. package/dist/validation/operator-normalizer.js +11 -1
  41. package/package.json +4 -4
@@ -1,29 +1,66 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.OPENAPI_PATH = void 0;
4
7
  exports.default = createOpenApiRoutes;
5
8
  const openapi_document_1 = require("./openapi-document");
9
+ const unfolded_document_1 = __importDefault(require("./unfolded-document"));
10
+ const unfolding_1 = require("./unfolding");
11
+ const agent_route_helpers_1 = require("../http/agent-route-helpers");
6
12
  const bff_local_errors_1 = require("../http/bff-local-errors");
7
13
  exports.OPENAPI_PATH = '/agent/openapi.json';
8
14
  const READ_METHODS = new Set(['GET', 'HEAD']);
9
- function createOpenApiRoutes({ version, enabled, }) {
10
- const document = enabled ? (0, openapi_document_1.serializeOpenApi)((0, openapi_document_1.generateOpenApiDocument)(version)) : undefined;
11
- return async function openApiRoutes(ctx, next) {
12
- if (ctx.path !== exports.OPENAPI_PATH) {
13
- await next();
14
- return;
15
+ const MAX_GENERATION_RETRIES = 3;
16
+ function createOpenApiRoutes({ version, enabled, source, }) {
17
+ const generic = enabled && !source ? (0, openapi_document_1.serializeOpenApi)((0, openapi_document_1.generateOpenApiDocument)(version)) : undefined;
18
+ // Memoized on the read-model identity: the store builds a new one per schema generation, so the
19
+ // document is rebuilt exactly when the schema it describes changed.
20
+ let unfolded;
21
+ async function resolveDocument(ctx, attemptsLeft = MAX_GENERATION_RETRIES) {
22
+ if (!source)
23
+ return generic;
24
+ if (attemptsLeft <= 0) {
25
+ throw new Error('Schema generation kept changing while building the OpenAPI document');
15
26
  }
16
- if (!READ_METHODS.has(ctx.method)) {
27
+ // Before the schema is even read, so a caller with no agent credentials cannot make the BFF
28
+ // fetch anything: the unfolded document needs a token to ask the agent for capabilities.
29
+ const token = (0, agent_route_helpers_1.requireAgentToken)(ctx);
30
+ const readModel = await (0, agent_route_helpers_1.resolveReadModel)(source.store);
31
+ if (unfolded?.readModel === readModel)
32
+ return unfolded.document;
33
+ const { document, unfolding } = await (0, unfolded_document_1.default)(source, readModel, token, version);
34
+ // A schema refresh landing during the capabilities fan-out mixes the new generation's field sets
35
+ // into this generation's collections, relations and actions. Such a document must not be served
36
+ // nor cached — a consumer would generate a client from a self-contradictory schema. Bounded like
37
+ // `ReadModelStore.getCapabilities`, and driven by the 24h schema TTL rather than request volume.
38
+ if ((await (0, agent_route_helpers_1.resolveReadModel)(source.store)) !== readModel) {
39
+ return resolveDocument(ctx, attemptsLeft - 1);
40
+ }
41
+ // Only a complete document is memoized. The memo key is the schema generation, which moves on a
42
+ // 24h TTL, so caching a document built while the agent was briefly down would keep serving a
43
+ // field-less spec for a day — and longer still if a later schema refresh fails without bumping
44
+ // the revision. `CapabilitiesCache` deliberately caches successes only; this keeps that true
45
+ // end to end, at the cost of re-running the fan-out until the agent answers again.
46
+ if (!(0, unfolding_1.hasDegradedCollection)(unfolding)) {
47
+ unfolded = { readModel, document };
48
+ }
49
+ return document;
50
+ }
51
+ return async function openApiRoutes(ctx, next) {
52
+ if (ctx.path !== exports.OPENAPI_PATH || !READ_METHODS.has(ctx.method)) {
17
53
  await next();
18
54
  return;
19
55
  }
20
- if (document === undefined) {
56
+ if (!enabled) {
21
57
  throw (0, bff_local_errors_1.openapiDisabled)();
22
58
  }
59
+ const document = await resolveDocument(ctx);
23
60
  ctx.status = 200;
24
61
  ctx.type = 'application/json';
25
62
  ctx.set('Cache-Control', 'no-store');
26
63
  ctx.body = document;
27
64
  };
28
65
  }
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFwaS1yb3V0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS9vcGVuYXBpLXJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFjQSxzQ0E0QkM7QUF4Q0QseURBQStFO0FBQy9FLCtEQUEyRDtBQUU5QyxRQUFBLFlBQVksR0FBRyxxQkFBcUIsQ0FBQztBQUVsRCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBTzlDLFNBQXdCLG1CQUFtQixDQUFDLEVBQzFDLE9BQU8sRUFDUCxPQUFPLEdBQ2M7SUFDckIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFBLG1DQUFnQixFQUFDLElBQUEsMENBQXVCLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRTFGLE9BQU8sS0FBSyxVQUFVLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSTtRQUMzQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssb0JBQVksRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFFYixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFFYixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBQSxrQ0FBZSxHQUFFLENBQUM7UUFDMUIsQ0FBQztRQUVELEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDOUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckMsR0FBRyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7SUFDdEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyJ9
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFwaS1yb3V0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS9vcGVuYXBpLXJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUF1QkEsc0NBcUVDO0FBeEZELHlEQUErRTtBQUMvRSw0RUFBd0Q7QUFDeEQsMkNBQW9EO0FBQ3BELHFFQUFrRjtBQUNsRiwrREFBMkQ7QUFFOUMsUUFBQSxZQUFZLEdBQUcscUJBQXFCLENBQUM7QUFFbEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUU5QyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQVNqQyxTQUF3QixtQkFBbUIsQ0FBQyxFQUMxQyxPQUFPLEVBQ1AsT0FBTyxFQUNQLE1BQU0sR0FDZTtJQUNyQixNQUFNLE9BQU8sR0FDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUEsbUNBQWdCLEVBQUMsSUFBQSwwQ0FBdUIsRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFdEYsZ0dBQWdHO0lBQ2hHLG9FQUFvRTtJQUNwRSxJQUFJLFFBQWdFLENBQUM7SUFFckUsS0FBSyxVQUFVLGVBQWUsQ0FDNUIsR0FBOEIsRUFDOUIsWUFBWSxHQUFHLHNCQUFzQjtRQUVyQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sT0FBaUIsQ0FBQztRQUV0QyxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUVELDRGQUE0RjtRQUM1Rix5RkFBeUY7UUFDekYsTUFBTSxLQUFLLEdBQUcsSUFBQSx1Q0FBaUIsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsc0NBQWdCLEVBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXZELElBQUksUUFBUSxFQUFFLFNBQVMsS0FBSyxTQUFTO1lBQUUsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBRWhFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFBLDJCQUFxQixFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRS9GLGlHQUFpRztRQUNqRyxnR0FBZ0c7UUFDaEcsaUdBQWlHO1FBQ2pHLGlHQUFpRztRQUNqRyxJQUFJLENBQUMsTUFBTSxJQUFBLHNDQUFnQixFQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pELE9BQU8sZUFBZSxDQUFDLEdBQUcsRUFBRSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUVELGdHQUFnRztRQUNoRyw2RkFBNkY7UUFDN0YsK0ZBQStGO1FBQy9GLDZGQUE2RjtRQUM3RixtRkFBbUY7UUFDbkYsSUFBSSxDQUFDLElBQUEsaUNBQXFCLEVBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxRQUFRLEdBQUcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDckMsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxPQUFPLEtBQUssVUFBVSxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUk7UUFDM0MsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLG9CQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQy9ELE1BQU0sSUFBSSxFQUFFLENBQUM7WUFFYixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBQSxrQ0FBZSxHQUFFLENBQUM7UUFDMUIsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTVDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDOUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckMsR0FBRyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7SUFDdEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyJ9
@@ -1,6 +1,18 @@
1
1
  import { z } from './zod-openapi';
2
2
  declare const OPERATORS: [string, ...string[]];
3
3
  declare const ConditionTreeSchema: z.ZodType;
4
+ export declare const SortClauseSchema: z.ZodObject<{
5
+ field: z.ZodString;
6
+ direction: z.ZodOptional<z.ZodEnum<{
7
+ asc: "asc";
8
+ desc: "desc";
9
+ }>>;
10
+ }, z.core.$strip>;
11
+ export declare const PageSchema: z.ZodObject<{
12
+ limit: z.ZodNumber;
13
+ offset: z.ZodNumber;
14
+ }, z.core.$strip>;
15
+ export declare const TimezoneSchema: z.ZodString;
4
16
  export declare const ListRequestSchema: z.ZodObject<{
5
17
  filter: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
6
18
  projection: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -21,6 +33,7 @@ export declare const CountRequestSchema: z.ZodObject<{
21
33
  filter: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
22
34
  timezone: z.ZodOptional<z.ZodString>;
23
35
  }, z.core.$strip>;
36
+ declare const ParentIdSchema: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
24
37
  export declare const RelationListRequestSchema: z.ZodObject<{
25
38
  filter: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
26
39
  projection: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -81,5 +94,5 @@ export declare const MessagelessErrorResponseSchema: z.ZodObject<{
81
94
  details: z.ZodOptional<z.ZodUnknown>;
82
95
  }, z.core.$strip>;
83
96
  }, z.core.$strip>;
84
- export { ConditionTreeSchema, OPERATORS };
97
+ export { ConditionTreeSchema, ParentIdSchema, OPERATORS };
85
98
  //# sourceMappingURL=schemas.d.ts.map
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OPERATORS = exports.ConditionTreeSchema = exports.MessagelessErrorResponseSchema = exports.ErrorResponseSchema = exports.CountResponseSchema = exports.ListResponseSchema = exports.ActionRequestSchema = exports.RelationCountRequestSchema = exports.RelationListRequestSchema = exports.CountRequestSchema = exports.ListRequestSchema = void 0;
3
+ exports.OPERATORS = exports.ParentIdSchema = exports.ConditionTreeSchema = exports.MessagelessErrorResponseSchema = exports.ErrorResponseSchema = exports.CountResponseSchema = exports.ListResponseSchema = exports.ActionRequestSchema = exports.RelationCountRequestSchema = exports.RelationListRequestSchema = exports.CountRequestSchema = exports.ListRequestSchema = 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
6
  const capabilities_validator_1 = require("../validation/capabilities-validator");
@@ -32,13 +32,13 @@ const ConditionTreeSchema = zod_openapi_1.z
32
32
  'collection capabilities; relation list and count forward the filter without either check.',
33
33
  });
34
34
  exports.ConditionTreeSchema = ConditionTreeSchema;
35
- const SortClauseSchema = zod_openapi_1.z
35
+ exports.SortClauseSchema = zod_openapi_1.z
36
36
  .object({
37
37
  field: zod_openapi_1.z.string(),
38
38
  direction: zod_openapi_1.z.enum(['asc', 'desc']).optional(),
39
39
  })
40
40
  .openapi('SortClause', { description: 'Omitting `direction` sorts ascending.' });
41
- const PageSchema = zod_openapi_1.z
41
+ exports.PageSchema = zod_openapi_1.z
42
42
  .object({
43
43
  limit: zod_openapi_1.z.number().int().positive(),
44
44
  offset: zod_openapi_1.z.number().int().nonnegative(),
@@ -47,7 +47,7 @@ const PageSchema = zod_openapi_1.z
47
47
  description: 'The agent paginates by page number, so `offset` must be a whole multiple of `limit`. ' +
48
48
  'Any other offset is rejected with 400 invalid_request.',
49
49
  });
50
- const TimezoneSchema = zod_openapi_1.z.string().openapi({
50
+ exports.TimezoneSchema = zod_openapi_1.z.string().openapi('Timezone', {
51
51
  description: 'Used when the X-Forest-Timezone header is absent. The header wins when both are sent. A ' +
52
52
  'deployment with no configured default rejects a request carrying neither with 400 ' +
53
53
  'missing_timezone.',
@@ -56,21 +56,22 @@ exports.ListRequestSchema = zod_openapi_1.z
56
56
  .object({
57
57
  filter: ConditionTreeSchema.optional(),
58
58
  projection: zod_openapi_1.z.array(zod_openapi_1.z.string()).optional(),
59
- sort: zod_openapi_1.z.array(SortClauseSchema).optional(),
60
- page: PageSchema.optional(),
61
- timezone: TimezoneSchema.optional(),
59
+ sort: zod_openapi_1.z.array(exports.SortClauseSchema).optional(),
60
+ page: exports.PageSchema.optional(),
61
+ timezone: exports.TimezoneSchema.optional(),
62
62
  })
63
63
  .openapi('ListRequest');
64
64
  exports.CountRequestSchema = zod_openapi_1.z
65
65
  .object({
66
66
  filter: ConditionTreeSchema.optional(),
67
- timezone: TimezoneSchema.optional(),
67
+ timezone: exports.TimezoneSchema.optional(),
68
68
  })
69
69
  .openapi('CountRequest');
70
70
  const ParentIdSchema = zod_openapi_1.z.union([zod_openapi_1.z.string().regex(/\S/), zod_openapi_1.z.number()]).openapi('ParentId', {
71
71
  description: 'The parent record id, opaque: a composite or packed id must be passed unchanged. A ' +
72
72
  'blank string is rejected.',
73
73
  });
74
+ exports.ParentIdSchema = ParentIdSchema;
74
75
  exports.RelationListRequestSchema = exports.ListRequestSchema.extend({
75
76
  parentId: ParentIdSchema,
76
77
  }).openapi('RelationListRequest', {
@@ -84,7 +85,7 @@ exports.ActionRequestSchema = zod_openapi_1.z
84
85
  .object({
85
86
  recordIds: zod_openapi_1.z.array(zod_openapi_1.z.union([zod_openapi_1.z.string(), zod_openapi_1.z.number()])),
86
87
  values: zod_openapi_1.z.record(zod_openapi_1.z.string(), zod_openapi_1.z.unknown()).optional(),
87
- timezone: TimezoneSchema.optional(),
88
+ timezone: exports.TimezoneSchema.optional(),
88
89
  })
89
90
  .openapi('ActionRequest', {
90
91
  description: '`recordIds` is required, even on a global action: send an empty array when the action ' +
@@ -138,4 +139,4 @@ exports.MessagelessErrorResponseSchema = zod_openapi_1.z
138
139
  .openapi('MessagelessErrorResponse', {
139
140
  description: 'The unsupported-action-result body, which carries no message field unlike every other error.',
140
141
  });
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL3NjaGVtYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0VBQStEO0FBRS9ELCtDQUFrQztBQUNsQyxpRkFBd0U7QUFFeEUsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLGlDQUFZLENBQTBCLENBQUM7QUFvSy9CLDhCQUFTO0FBbEt2QyxNQUFNLHVCQUF1QixHQUFHLGVBQUM7S0FDOUIsTUFBTSxDQUFDO0lBQ04sS0FBSyxFQUFFLGVBQUMsQ0FBQyxNQUFNLEVBQUU7SUFDakIsUUFBUSxFQUFFLGVBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzNCLEtBQUssRUFBRSxlQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzlCLENBQUM7S0FDRCxPQUFPLENBQUMsbUJBQW1CLEVBQUU7SUFDNUIsV0FBVyxFQUNULDBGQUEwRjtRQUMxRixxRkFBcUY7Q0FDeEYsQ0FBQyxDQUFDO0FBRUwsTUFBTSxtQkFBbUIsR0FBYyxlQUFDO0tBQ3JDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDVCxlQUFDLENBQUMsS0FBSyxDQUFDO0lBQ04sdUJBQXVCO0lBQ3ZCLGVBQUMsQ0FBQyxNQUFNLENBQUM7UUFDUCxVQUFVLEVBQUUsZUFBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqQyxVQUFVLEVBQUUsZUFBQyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztLQUN6QyxDQUFDO0NBQ0gsQ0FBQyxDQUNIO0tBQ0EsT0FBTyxDQUFDLGVBQWUsRUFBRTtJQUN4QixXQUFXLEVBQ1QsdUZBQXVGO1FBQ3ZGLHVGQUF1RjtRQUN2Rix1RkFBdUY7UUFDdkYsUUFBUSx5Q0FBZ0IsNERBQTREO1FBQ3BGLDJGQUEyRjtDQUM5RixDQUFDLENBQUM7QUFxSUksa0RBQW1CO0FBbkk1QixNQUFNLGdCQUFnQixH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
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL3NjaGVtYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0VBQStEO0FBRS9ELCtDQUFrQztBQUNsQyxpRkFBd0U7QUFFeEUsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLGlDQUFZLENBQTBCLENBQUM7QUFvS2YsOEJBQVM7QUFsS3ZELE1BQU0sdUJBQXVCLEdBQUcsZUFBQztLQUM5QixNQUFNLENBQUM7SUFDTixLQUFLLEVBQUUsZUFBQyxDQUFDLE1BQU0sRUFBRTtJQUNqQixRQUFRLEVBQUUsZUFBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDM0IsS0FBSyxFQUFFLGVBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDOUIsQ0FBQztLQUNELE9BQU8sQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QixXQUFXLEVBQ1QsMEZBQTBGO1FBQzFGLHFGQUFxRjtDQUN4RixDQUFDLENBQUM7QUFFTCxNQUFNLG1CQUFtQixHQUFjLGVBQUM7S0FDckMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUNULGVBQUMsQ0FBQyxLQUFLLENBQUM7SUFDTix1QkFBdUI7SUFDdkIsZUFBQyxDQUFDLE1BQU0sQ0FBQztRQUNQLFVBQVUsRUFBRSxlQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pDLFVBQVUsRUFBRSxlQUFDLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO0tBQ3pDLENBQUM7Q0FDSCxDQUFDLENBQ0g7S0FDQSxPQUFPLENBQUMsZUFBZSxFQUFFO0lBQ3hCLFdBQVcsRUFDVCx1RkFBdUY7UUFDdkYsdUZBQXVGO1FBQ3ZGLHVGQUF1RjtRQUN2RixRQUFRLHlDQUFnQiw0REFBNEQ7UUFDcEYsMkZBQTJGO0NBQzlGLENBQUMsQ0FBQztBQXFJSSxrREFBbUI7QUFuSWYsUUFBQSxnQkFBZ0IsR0FB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
@@ -0,0 +1,28 @@
1
+ import type { Unfolding } from './unfolding';
2
+ import type { Logger } from '../ports/logger-port';
3
+ import type ReadModel from '../read-model/read-model';
4
+ import type ReadModelStore from '../read-model/read-model-store';
5
+ /** Everything needed to unfold. Absent when the deployment cannot reach its schema or its agent. */
6
+ export interface UnfoldSource {
7
+ store: ReadModelStore;
8
+ agentUrl: string;
9
+ timeoutMs?: number;
10
+ logger: Logger;
11
+ }
12
+ export interface UnfoldedDocument {
13
+ document: string;
14
+ /** Handed back so a caller can react to a collection that went out without its field set. */
15
+ unfolding: Unfolding;
16
+ }
17
+ export default function buildUnfoldedDocument(source: UnfoldSource, readModel: ReadModel, token: string | (() => string), version: string): Promise<UnfoldedDocument>;
18
+ /**
19
+ * The CLI has no caller to borrow an agent token from, so it signs its own with the deployment's
20
+ * auth secret — the only thing the agent verifies, and the capabilities route it calls runs no
21
+ * permission check. The identity is inert on purpose: it is never used to read or write records.
22
+ *
23
+ * Minted per capabilities call rather than once: an agent token lives 5 minutes
24
+ * (`AGENT_TOKEN_EXPIRES_IN`) and a fan-out over hundreds of collections against a slow agent can
25
+ * outlive that, which would degrade the tail of the document for no reason.
26
+ */
27
+ export declare function issueOpenApiAgentToken(authSecret: string): string;
28
+ //# sourceMappingURL=unfolded-document.d.ts.map
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = buildUnfoldedDocument;
7
+ exports.issueOpenApiAgentToken = issueOpenApiAgentToken;
8
+ const collect_unfolding_1 = __importDefault(require("./collect-unfolding"));
9
+ const openapi_document_1 = require("./openapi-document");
10
+ const agent_token_1 = require("../api-key/agent-token");
11
+ const agent_capabilities_fetcher_1 = __importDefault(require("../read-model/agent-capabilities-fetcher"));
12
+ async function buildUnfoldedDocument(source, readModel, token, version) {
13
+ const unfolding = await (0, collect_unfolding_1.default)({
14
+ readModel,
15
+ store: source.store,
16
+ capabilitiesFetcher: (0, agent_capabilities_fetcher_1.default)({
17
+ agentUrl: source.agentUrl,
18
+ token,
19
+ timeoutMs: source.timeoutMs,
20
+ }),
21
+ logger: source.logger,
22
+ });
23
+ return { document: (0, openapi_document_1.serializeOpenApi)((0, openapi_document_1.generateOpenApiDocument)(version, unfolding)), unfolding };
24
+ }
25
+ /**
26
+ * The CLI has no caller to borrow an agent token from, so it signs its own with the deployment's
27
+ * auth secret — the only thing the agent verifies, and the capabilities route it calls runs no
28
+ * permission check. The identity is inert on purpose: it is never used to read or write records.
29
+ *
30
+ * Minted per capabilities call rather than once: an agent token lives 5 minutes
31
+ * (`AGENT_TOKEN_EXPIRES_IN`) and a fan-out over hundreds of collections against a slow agent can
32
+ * outlive that, which would degrade the tail of the document for no reason.
33
+ */
34
+ function issueOpenApiAgentToken(authSecret) {
35
+ return (0, agent_token_1.issueAgentToken)({
36
+ authSecret,
37
+ identity: {
38
+ renderingId: 0,
39
+ allowedOrigins: [],
40
+ user: {
41
+ id: 0,
42
+ email: 'openapi@agent-bff.forestadmin.com',
43
+ firstName: 'Forest',
44
+ lastName: 'BFF',
45
+ team: 'Operations',
46
+ tags: [],
47
+ permissionLevel: 'admin',
48
+ },
49
+ },
50
+ });
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5mb2xkZWQtZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS91bmZvbGRlZC1kb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXdCQSx3Q0FrQkM7QUFXRCx3REFpQkM7QUFqRUQsNEVBQW1EO0FBQ25ELHlEQUErRTtBQUMvRSx3REFBeUQ7QUFDekQsMEdBQXNGO0FBZ0J2RSxLQUFLLFVBQVUscUJBQXFCLENBQ2pELE1BQW9CLEVBQ3BCLFNBQW9CLEVBQ3BCLEtBQThCLEVBQzlCLE9BQWU7SUFFZixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsMkJBQWdCLEVBQUM7UUFDdkMsU0FBUztRQUNULEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztRQUNuQixtQkFBbUIsRUFBRSxJQUFBLG9DQUE4QixFQUFDO1lBQ2xELFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixLQUFLO1lBQ0wsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1NBQzVCLENBQUM7UUFDRixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07S0FDdEIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFBLG1DQUFnQixFQUFDLElBQUEsMENBQXVCLEVBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDaEcsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsVUFBa0I7SUFDdkQsT0FBTyxJQUFBLDZCQUFlLEVBQUM7UUFDckIsVUFBVTtRQUNWLFFBQVEsRUFBRTtZQUNSLFdBQVcsRUFBRSxDQUFDO1lBQ2QsY0FBYyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxFQUFFO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEtBQUssRUFBRSxtQ0FBbUM7Z0JBQzFDLFNBQVMsRUFBRSxRQUFRO2dCQUNuQixRQUFRLEVBQUUsS0FBSztnQkFDZixJQUFJLEVBQUUsWUFBWTtnQkFDbEIsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsZUFBZSxFQUFFLE9BQU87YUFDekI7U0FDRjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
@@ -0,0 +1,20 @@
1
+ import type ComponentPool from './component-pool';
2
+ import type { Unfolding } from './unfolding';
3
+ import type { z } from './zod-openapi';
4
+ import type { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
5
+ import type { ReferenceObject } from 'openapi3-ts/oas31';
6
+ interface Deps {
7
+ registry: OpenAPIRegistry;
8
+ pool: ComponentPool;
9
+ prefix: string;
10
+ security: Record<string, string[]>[];
11
+ timezoneHeader: z.ZodType[];
12
+ errorResponses: (executeResults: boolean) => Record<string, ReferenceObject>;
13
+ }
14
+ /**
15
+ * Emits one path per exposed collection, to-many relation and action. The runtime routes stay the
16
+ * generic regexes — only the document unfolds.
17
+ */
18
+ export default function registerUnfoldedPaths(deps: Deps, unfolding: Unfolding): void;
19
+ export {};
20
+ //# sourceMappingURL=unfolded-paths.d.ts.map