@forestadmin/agent-bff 1.23.8 → 1.25.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.
@@ -36,7 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.ROUTE_PREFIX = exports.OPENAPI_VERSION = void 0;
39
+ exports.DOCUMENT_PATH = exports.ROUTE_PREFIX = exports.OPENAPI_VERSION = void 0;
40
40
  exports.generateOpenApiDocument = generateOpenApiDocument;
41
41
  exports.serializeOpenApi = serializeOpenApi;
42
42
  const zod_to_openapi_1 = require("@asteasolutions/zod-to-openapi");
@@ -46,8 +46,10 @@ const unfolded_paths_1 = __importDefault(require("./unfolded-paths"));
46
46
  const zod_openapi_1 = require("./zod-openapi");
47
47
  const bff_local_errors_1 = require("../http/bff-local-errors");
48
48
  const body_limit_1 = __importStar(require("../http/body-limit"));
49
+ const permissions_cache_1 = require("../permissions/permissions-cache");
49
50
  exports.OPENAPI_VERSION = '3.1.0';
50
51
  exports.ROUTE_PREFIX = '/agent/v1';
52
+ exports.DOCUMENT_PATH = '/agent/openapi.json';
51
53
  const SESSION_SCHEME = 'bffSession';
52
54
  const API_KEY_SCHEME = 'bffApiKey';
53
55
  const SECURITY = [{ [SESSION_SCHEME]: [] }, { [API_KEY_SCHEME]: [] }];
@@ -63,14 +65,17 @@ const ERROR_STATUSES = {
63
65
  500: 'The agent payload could not be mapped to the BFF contract, or the BFF hit an unexpected error',
64
66
  501: 'The BFF is running without an agent configured, so the proxy is not implemented',
65
67
  502: 'The agent refused the connection, its host could not be resolved, or the transport failed another way (a connection reset mid-flight, a socket hang up, a TLS failure) — it failed outright rather than running out of time',
66
- 503: 'The agent schema is unavailable, the agent returned a 5xx, or the API key could not be resolved',
68
+ 503: 'The agent schema is unavailable, the agent returned a 5xx, the API key could not be resolved, or the Forest permissions could not be fetched and no fresh cache was left (type permissions_unavailable)',
67
69
  504: 'The agent did not answer before the BFF timeout (BFF_AGENT_TIMEOUT_MS, 10s by default). The deadline is armed when the request starts, so at the default it also covers a host that accepts nothing and never resets the connection — raise the timeout past the OS connect timeout and that case reverts to 502',
68
70
  };
69
71
  const UNSUPPORTED_RESULT_DESCRIPTION = 'Either the BFF runs without an agent configured, or the action returned a result shape the ' +
70
72
  'BFF cannot normalize. The second case carries no message field.';
71
73
  const ERROR_RESPONSE_REF = '#/components/schemas/ErrorResponse';
72
74
  const MESSAGELESS_ERROR_RESPONSE_REF = '#/components/schemas/MessagelessErrorResponse';
75
+ const OPENAPI_DISABLED_RESPONSE_REF = '#/components/schemas/OpenapiDisabledErrorResponse';
73
76
  const UNSUPPORTED_ACTION_RESULT_COMPONENT = 'UnsupportedActionResult';
77
+ const OPENAPI_DISABLED_COMPONENT = 'Error404OpenapiDisabled';
78
+ const OPENAPI_DISABLED_DESCRIPTION = 'The deployment runs with `BFF_OPENAPI_ENABLED=false`, so the document is not served over HTTP.';
74
79
  const retryAfterHeader = (description) => ({
75
80
  'Retry-After': {
76
81
  description,
@@ -78,12 +83,23 @@ const retryAfterHeader = (description) => ({
78
83
  schema: { type: 'integer' },
79
84
  },
80
85
  });
81
- const RETRY_AFTER_HEADER = retryAfterHeader('Seconds to wait before retrying. Set when the API key could not be resolved.');
86
+ const RETRY_AFTER_HEADER = retryAfterHeader('Seconds to wait before retrying. Set when the BFF could not reach the Forest server — an ' +
87
+ 'unresolvable API key, or permissions it could not fetch.');
82
88
  const RETRY_AFTER_RATE_LIMIT_HEADER = retryAfterHeader('Seconds until the BFF rate-limit window of the caller resets. When the limiter is ' +
83
89
  'saturated the caller has no window yet, so the value is a lower bound instead: the ' +
84
90
  'earliest reset among the identities currently holding one, after which a slot may free ' +
85
91
  'up. Present when the BFF itself emitted this 429; an agent 429 relayed from upstream ' +
86
92
  'carries no header.');
93
+ const HEAD_DOCUMENT_RESPONSES = {
94
+ 200: { description: 'The document exists and is readable; no body is returned for HEAD' },
95
+ 400: { description: ERROR_STATUSES['400'] },
96
+ 401: { description: ERROR_STATUSES['401'] },
97
+ 403: { description: ERROR_STATUSES['403'] },
98
+ 404: { description: `${OPENAPI_DISABLED_DESCRIPTION} The status is the same as the GET one.` },
99
+ 429: { description: ERROR_STATUSES['429'], headers: RETRY_AFTER_RATE_LIMIT_HEADER },
100
+ 500: { description: ERROR_STATUSES['500'] },
101
+ 503: { description: ERROR_STATUSES['503'], headers: RETRY_AFTER_HEADER },
102
+ };
87
103
  function registerErrorComponent(registry, name, { description, schema, headers }) {
88
104
  return registry.registerComponent('responses', name, {
89
105
  description,
@@ -103,7 +119,12 @@ function retryAfterHeaders(status) {
103
119
  }
104
120
  function registerErrorResponses(registry, statuses, withActionResults) {
105
121
  registry.register('ErrorResponse', schemas_1.ErrorResponseSchema);
122
+ registry.register('OpenapiDisabledErrorResponse', schemas_1.OpenapiDisabledErrorResponseSchema);
106
123
  const byStatus = {};
124
+ const openapiDisabled = registerErrorComponent(registry, OPENAPI_DISABLED_COMPONENT, {
125
+ description: `${OPENAPI_DISABLED_DESCRIPTION} The body is typed \`openapi_disabled\`, and the schema pins that value so a generated client can tell this 404 from any other; a bare 404 with no typed body means the agent edge is not mounted at all.`,
126
+ schema: { $ref: OPENAPI_DISABLED_RESPONSE_REF },
127
+ });
107
128
  statuses.forEach(status => {
108
129
  const description = ERROR_STATUSES[status];
109
130
  if (!description)
@@ -116,8 +137,9 @@ function registerErrorResponses(registry, statuses, withActionResults) {
116
137
  });
117
138
  // A document with no action path must not carry this response, nor the messageless body it
118
139
  // references: an unreferenced component trips redocly's unused-component rule.
119
- if (!withActionResults)
120
- return { byStatus, unsupportedActionResult: byStatus['501'] };
140
+ if (!withActionResults) {
141
+ return { byStatus, openapiDisabled, unsupportedActionResult: byStatus['501'] };
142
+ }
121
143
  registry.register('MessagelessErrorResponse', schemas_1.MessagelessErrorResponseSchema);
122
144
  const unsupportedActionResult = registerErrorComponent(registry, UNSUPPORTED_ACTION_RESULT_COMPONENT, {
123
145
  description: UNSUPPORTED_RESULT_DESCRIPTION,
@@ -125,7 +147,7 @@ function registerErrorResponses(registry, statuses, withActionResults) {
125
147
  anyOf: [{ $ref: ERROR_RESPONSE_REF }, { $ref: MESSAGELESS_ERROR_RESPONSE_REF }],
126
148
  },
127
149
  });
128
- return { byStatus, unsupportedActionResult };
150
+ return { byStatus, openapiDisabled, unsupportedActionResult };
129
151
  }
130
152
  function errorResponses(refs, executeResults) {
131
153
  return executeResults
@@ -281,6 +303,12 @@ const SHARED_DESCRIPTION = 'The timezone is resolved from the `X-Forest-Timezone
281
303
  'routes read application/json (and application/*+json) bodies only: any other Content-Type, ' +
282
304
  'form-urlencoded included, is rejected with 415 instead of being read as an absent body, and ' +
283
305
  'so is a body sent with no Content-Type at all. A bodyless POST needs no Content-Type.';
306
+ const SURFACE_DESCRIPTION = 'Only the auth-gated `/agent` surface is described here. Three live route families are ' +
307
+ 'deliberately absent because they sit outside that surface and outside its auth edge: the ' +
308
+ '`/health` probe (`GET` and `HEAD`), which answers 200 `ok` or 503 `degraded` to an ' +
309
+ 'unauthenticated request; the `/oauth/*` login routes; and the unauthenticated `/docs` viewer ' +
310
+ 'that renders this very document — `GET` and `HEAD` on the page and on its public ' +
311
+ '`redoc.standalone.js` bundle. The package README documents all three.';
284
312
  const GENERIC_DESCRIPTION = 'Paths are generic: one per operation, with the collection, relation and action passed as path ' +
285
313
  'segments, and no field enumerated. This is the fallback form — a deployment configured to ' +
286
314
  'reach its Forest schema and its agent unfolds one path per real collection, relation and ' +
@@ -294,6 +322,105 @@ const UNFOLDED_DESCRIPTION = 'Paths are unfolded: one per exposed collection, to
294
322
  "collection's capabilities. Only to-many relations appear; a to-one or polymorphic relation has " +
295
323
  'no list or count route. This document describes the whole exposed schema regardless of the ' +
296
324
  'caller: it is not filtered by the permissions of whoever fetched it.';
325
+ function registerPermissionsPath(registry, errorRefs, timezoneHeader) {
326
+ registry.registerPath({
327
+ method: 'get',
328
+ path: `${exports.ROUTE_PREFIX}/permissions`,
329
+ operationId: 'getPermissionHints',
330
+ summary: 'Read what the caller may see and do, as display hints',
331
+ description: 'Answers for the caller behind the credentials, so two callers get two different payloads. ' +
332
+ 'The hints come from the Forest permissions, cached for ' +
333
+ `${permissions_cache_1.PERMISSIONS_CACHE_TTL_MS / 60000} minutes, so they lag a change made in Forest. The agent runs with ` +
334
+ '`instantCacheRefresh` by default, so its own cache has no meaningful expiry — about a year — ' +
335
+ 'and freshness rides on the Forest event stream: as long as those events reach it, the agent ' +
336
+ 'enforces the new permission while these hints are still stale. If the stream is cut — a ' +
337
+ 'reverse proxy that swallows it, which the agent logs once at subscribe time when the first ' +
338
+ 'heartbeat never arrives — the agent can hold the old permission far longer than these ' +
339
+ 'hints, and the hints are then the fresher of the two. An agent ' +
340
+ 'explicitly configured with `instantCacheRefresh: false` caches for ' +
341
+ '`permissionsCacheDurationInSeconds` — 15 minutes by default, configurable with a 60-second ' +
342
+ 'floor — independently of these hints. That agent refetches on a denial, so a newly GRANTED ' +
343
+ 'permission lands on the next call while these hints still hide it; only a REVOKED one ' +
344
+ 'lingers agent-side until the cache expires. A 503 here is `permissions_unavailable` or ' +
345
+ '`key_resolution_unavailable`, which always carry Retry-After, or `schema_unavailable`, ' +
346
+ 'which does not. Unlike the context and document routes, and the AI-query relay where it is ' +
347
+ 'published, this one sits behind the ' +
348
+ 'timezone middleware even though it reads no timezone, so a deployment with no configured ' +
349
+ 'default answers 400 `missing_timezone` unless `X-Forest-Timezone` is sent.',
350
+ security: SECURITY,
351
+ request: {
352
+ query: zod_openapi_1.z.object({
353
+ collections: zod_openapi_1.z
354
+ .union([zod_openapi_1.z.string(), zod_openapi_1.z.array(zod_openapi_1.z.string())])
355
+ .optional()
356
+ .openapi({
357
+ description: 'Comma-separated collection names to restrict the answer to, repeatable — a ' +
358
+ 'repeated parameter is joined with commas before being split again, so both forms ' +
359
+ 'behave the same. Absent means every exposed collection. Entries are trimmed and ' +
360
+ 'deduplicated, and a name the schema does not expose is dropped silently rather ' +
361
+ 'than rejected — so an empty `collections` object means none of the names matched.',
362
+ }),
363
+ }),
364
+ headers: timezoneHeader,
365
+ },
366
+ responses: {
367
+ 200: {
368
+ description: 'The display hints for the caller role',
369
+ content: { 'application/json': { schema: schemas_1.PermissionHintsSchema } },
370
+ },
371
+ 400: errorRefs.byStatus['400'],
372
+ 401: errorRefs.byStatus['401'],
373
+ 403: errorRefs.byStatus['403'],
374
+ 429: errorRefs.byStatus['429'],
375
+ 500: errorRefs.byStatus['500'],
376
+ 501: errorRefs.byStatus['501'],
377
+ 503: errorRefs.byStatus['503'],
378
+ },
379
+ });
380
+ }
381
+ function registerDocumentPath(registry, errorRefs) {
382
+ registry.registerPath({
383
+ method: 'get',
384
+ path: exports.DOCUMENT_PATH,
385
+ operationId: 'getOpenApiDocument',
386
+ summary: 'Read this document',
387
+ description: 'Serves this very document behind credentials, like every other `/agent` route: without ' +
388
+ 'them the schema it describes is not readable. Both auth modes reach it — a session or an ' +
389
+ 'API key — as they do on every data, action, context and permissions route; the AI-query ' +
390
+ 'relay, where it is published, is the one exception and takes a session only. `HEAD` is ' +
391
+ 'served identically. The ' +
392
+ 'answer is never cached (`Cache-Control: no-store`) and is regenerated when the BFF ' +
393
+ 'refreshes its schema, so a client can re-fetch it to pick up a new collection or field.',
394
+ security: SECURITY,
395
+ request: {},
396
+ responses: {
397
+ 200: {
398
+ description: 'The OpenAPI document of this BFF',
399
+ content: { 'application/json': { schema: zod_openapi_1.z.unknown() } },
400
+ },
401
+ 400: errorRefs.byStatus['400'],
402
+ 401: errorRefs.byStatus['401'],
403
+ 403: errorRefs.byStatus['403'],
404
+ 404: errorRefs.openapiDisabled,
405
+ 429: errorRefs.byStatus['429'],
406
+ 500: errorRefs.byStatus['500'],
407
+ 503: errorRefs.byStatus['503'],
408
+ },
409
+ });
410
+ registry.registerPath({
411
+ method: 'head',
412
+ path: exports.DOCUMENT_PATH,
413
+ operationId: 'headOpenApiDocument',
414
+ summary: 'Probe this document without fetching it',
415
+ description: 'Same route as `GET`, answering the same statuses and headers with no body, so a client can ' +
416
+ 'probe whether the document is enabled and reachable before re-fetching it. The six error ' +
417
+ 'statuses below reuse the GET wording, which describes a JSON body no HEAD ever returns: ' +
418
+ 'read the status, not the type. The 200 and the 404 carry their own.',
419
+ security: SECURITY,
420
+ request: {},
421
+ responses: HEAD_DOCUMENT_RESPONSES,
422
+ });
423
+ }
297
424
  function registerAiQueryPath(registry, aiErrorRefs) {
298
425
  registry.registerPath({
299
426
  method: 'post',
@@ -377,6 +504,8 @@ function generateOpenApiDocument(version, { unfolding, hasAiQueryRoute = false,
377
504
  503: errorRefs.byStatus['503'],
378
505
  },
379
506
  });
507
+ registerPermissionsPath(registry, errorRefs, timezoneHeader);
508
+ registerDocumentPath(registry, errorRefs);
380
509
  if (aiErrorRefs)
381
510
  registerAiQueryPath(registry, aiErrorRefs);
382
511
  if (unfolding) {
@@ -428,7 +557,7 @@ function generateOpenApiDocument(version, { unfolding, hasAiQueryRoute = false,
428
557
  title: 'Forest BFF',
429
558
  version,
430
559
  license: { name: 'GPL-3.0', url: 'https://www.gnu.org/licenses/gpl-3.0.html' },
431
- description: `${unfolding ? UNFOLDED_DESCRIPTION : GENERIC_DESCRIPTION} ${SHARED_DESCRIPTION}`,
560
+ description: `${unfolding ? UNFOLDED_DESCRIPTION : GENERIC_DESCRIPTION} ${SHARED_DESCRIPTION} ${SURFACE_DESCRIPTION}`,
432
561
  },
433
562
  servers: [
434
563
  publicUrl
@@ -440,4 +569,4 @@ function generateOpenApiDocument(version, { unfolding, hasAiQueryRoute = false,
440
569
  function serializeOpenApi(document) {
441
570
  return JSON.stringify(document, null, 2);
442
571
  }
443
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFwaS1kb2N1bWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL29wZW5hcGktZG9jdW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa2FBLDBEQTBIQztBQUVELDRDQUVDO0FBN2hCRCxtRUFBc0Y7QUFFdEYsc0VBQTZDO0FBQzdDLHVDQWNtQjtBQUNuQixzRUFBcUQ7QUFDckQsK0NBQWtDO0FBQ2xDLCtEQUE2RDtBQUM3RCxpRUFBK0Q7QUFFbEQsUUFBQSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQzFCLFFBQUEsWUFBWSxHQUFHLFdBQVcsQ0FBQztBQUV4QyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUM7QUFDcEMsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDO0FBRW5DLE1BQU0sUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRXRFLE1BQU0sY0FBYyxHQUEyQjtJQUM3QyxHQUFHLEVBQUUsa1ZBQWtWO0lBQ3ZWLEdBQUcsRUFBRSwwQ0FBMEM7SUFDL0MsR0FBRyxFQUFFLDBPQUEwTztJQUMvTyxHQUFHLEVBQUUseUNBQXlDO0lBQzlDLEdBQUcsRUFBRSw2Q0FBNkMsb0JBQVUsRUFBRTtJQUM5RCxHQUFHLEVBQUUsNlNBQTZTO0lBQ2xULEdBQUcsRUFBRSx1SUFBdUk7SUFDNUksR0FBRyxFQUFFLDhQQUE4UCxvQ0FBaUIsQ0FBQyxhQUFhLFdBQVcsb0NBQWlCLENBQUMsZ0JBQWdCLDRUQUE0VDtJQUMzb0IsR0FBRyxFQUFFLCtGQUErRjtJQUNwRyxHQUFHLEVBQUUsaUZBQWlGO0lBQ3RGLEdBQUcsRUFBRSw2TkFBNk47SUFDbE8sR0FBRyxFQUFFLGlHQUFpRztJQUN0RyxHQUFHLEVBQUUsa1RB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
572
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFwaS1kb2N1bWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL29wZW5hcGktZG9jdW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd2pCQSwwREE2SEM7QUFFRCw0Q0FFQztBQXRyQkQsbUVBQXNGO0FBRXRGLHNFQUE2QztBQUM3Qyx1Q0FnQm1CO0FBQ25CLHNFQUFxRDtBQUNyRCwrQ0FBa0M7QUFDbEMsK0RBQTZEO0FBQzdELGlFQUErRDtBQUMvRCx3RUFBNEU7QUFFL0QsUUFBQSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQzFCLFFBQUEsWUFBWSxHQUFHLFdBQVcsQ0FBQztBQUMzQixRQUFBLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQztBQUVuRCxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUM7QUFDcEMsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDO0FBRW5DLE1BQU0sUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRXRFLE1BQU0sY0FBYyxHQUEyQjtJQUM3QyxHQUFHLEVBQUUsa1ZBQWtWO0lBQ3ZWLEdBQUcsRUFBRSwwQ0FBMEM7SUFDL0MsR0FBRyxFQUFFLDBPQUEwTztJQUMvTyxHQUFHLEVBQUUseUNBQXlDO0lBQzlDLEdBQUcsRUFBRSw2Q0FBNkMsb0JBQVUsRUFBRTtJQUM5RCxHQUFHLEVBQUUsNlNBQTZTO0lBQ2xULEdBQUcsRUFBRSx1SUFBdUk7SUFDNUksR0FBRyxFQUFFLDhQQUE4UCxvQ0FBaUIsQ0FBQyxhQUFhLFdBQVcsb0NBQWlCLENBQUMsZ0JBQWdCLDRUQUE0VDtJQUMzb0IsR0FBRyxFQUFFLCtGQUErRjtJQUNwRyxHQUFHLEVBQUUsaUZBQWlGO0lBQ3RGLEdBQUcsRUFBRSw2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
@@ -0,0 +1,21 @@
1
+ import type { UnfoldedCollection } from './unfolding';
2
+ import type { ReferenceObject, SchemaObject } from 'openapi3-ts/oas31';
3
+ /**
4
+ * The key a field really carries in a response record. `agent-client` deserializes the agent's
5
+ * JSON:API with `keyForAttribute: 'camelCase'` (`http-requester.ts`), which is exactly this pair of
6
+ * `inflected` calls (`jsonapi-serializer/lib/inflector.js`), so a `first_name` column is PROJECTED
7
+ * under that name and RETURNED as `firstName`. The same library rather than a transcription: the
8
+ * transform handles acronyms and non-ASCII, and a mirror would drift from the deserializer without
9
+ * anything failing.
10
+ */
11
+ export declare function recordKey(field: string): string;
12
+ /**
13
+ * The record shape of one collection. The properties are what the capabilities report, and nothing
14
+ * more is forbidden: the capabilities route leaves out a OneToOne relation that the default
15
+ * projection returns, so a closed schema would reject responses the runtime really sends. `id` wins
16
+ * over any field of that name, because the deserializer overwrites the attribute with the resource
17
+ * id.
18
+ */
19
+ export default function recordSchema(collection: UnfoldedCollection, forestMeta: ReferenceObject): SchemaObject;
20
+ export declare function listResponseSchema(collection: UnfoldedCollection, record: ReferenceObject): SchemaObject;
21
+ //# sourceMappingURL=record-schemas.d.ts.map
@@ -0,0 +1,149 @@
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.recordKey = recordKey;
7
+ exports.default = recordSchema;
8
+ exports.listResponseSchema = listResponseSchema;
9
+ const inflected_1 = __importDefault(require("inflected"));
10
+ const field_schemas_1 = __importDefault(require("./field-schemas"));
11
+ const names_1 = require("./names");
12
+ const pack_id_1 = require("../data/pack-id");
13
+ /**
14
+ * The key a field really carries in a response record. `agent-client` deserializes the agent's
15
+ * JSON:API with `keyForAttribute: 'camelCase'` (`http-requester.ts`), which is exactly this pair of
16
+ * `inflected` calls (`jsonapi-serializer/lib/inflector.js`), so a `first_name` column is PROJECTED
17
+ * under that name and RETURNED as `firstName`. The same library rather than a transcription: the
18
+ * transform handles acronyms and non-ASCII, and a mirror would drift from the deserializer without
19
+ * anything failing.
20
+ */
21
+ function recordKey(field) {
22
+ return inflected_1.default.camelize(inflected_1.default.underscore(field), false);
23
+ }
24
+ // The flat id is the JSON:API resource id, which is a string by specification whatever the key
25
+ // column holds. `__forest.primaryKey` is the same id unpacked and typed, so the two forms of one
26
+ // record disagree by construction — the trap this schema exists to name.
27
+ const ID_SCHEMA = {
28
+ type: 'string',
29
+ description: 'The record id, always a string — the agent serializes it as the JSON:API resource id, even ' +
30
+ 'when the key column is a Number. `__forest.primaryKey` carries the same id TYPED, so ' +
31
+ `comparing the two without coercion fails. A composite key is its values joined by ` +
32
+ `${(0, names_1.quoted)(pack_id_1.PACKED_ID_SEPARATOR)}.`,
33
+ };
34
+ function isReference(schema) {
35
+ return '$ref' in schema;
36
+ }
37
+ function collapsedSchema(names, tail) {
38
+ return {
39
+ description: `${names.join(', ')} all reach the response under this single key, so which one it holds ` +
40
+ `is not determined here.${tail}`,
41
+ };
42
+ }
43
+ /**
44
+ * One published field, at every depth: renamed to the key the response carries it under, and
45
+ * widened to accept null. The capabilities report a column type and never its nullability, so a
46
+ * nullable column answers `null` against a type this schema would otherwise declare non-null — a
47
+ * generated client validating the response would reject what the runtime really sends. An
48
+ * unconstrained schema already accepts null and keeps its type as it is. Renaming and widening are
49
+ * one traversal because they visit the same structure. The rename is as lossy one level down as it
50
+ * is at the top: two members collapsing onto one key would silently drop one, so that key is
51
+ * published unconstrained and names them all instead.
52
+ */
53
+ function publishedSchema(schema) {
54
+ const published = typeof schema.type === 'string' ? { ...schema, type: [schema.type, 'null'] } : { ...schema };
55
+ if (schema.items !== undefined && !isReference(schema.items)) {
56
+ published.items = publishedSchema(schema.items);
57
+ }
58
+ const { properties } = schema;
59
+ if (properties !== undefined) {
60
+ const byKey = new Map();
61
+ Object.keys(properties).forEach(name => {
62
+ const key = recordKey(name);
63
+ const collapsed = byKey.get(key);
64
+ if (collapsed)
65
+ collapsed.push(name);
66
+ else
67
+ byKey.set(key, [name]);
68
+ });
69
+ published.properties = Object.fromEntries([...byKey].map(([key, names]) => {
70
+ if (names.length > 1)
71
+ return [key, collapsedSchema(names.map(names_1.quoted), '')];
72
+ const nested = properties[names[0]];
73
+ return [key, isReference(nested) ? nested : publishedSchema(nested)];
74
+ }));
75
+ }
76
+ return published;
77
+ }
78
+ /**
79
+ * The schema of one field, under the key the response carries it as. Several fields can collapse to
80
+ * the same key — the transform is lossy, `first_name` and `firstName` both yield `firstName` — and
81
+ * which one wins depends on the order the agent serialized them in, so the type is left open rather
82
+ * than picked.
83
+ */
84
+ function propertySchema(key, fields) {
85
+ const names = fields.map(field => (0, names_1.quoted)(field.name));
86
+ if (fields.length > 1) {
87
+ return collapsedSchema(names, ' Project one of them at a time to know.');
88
+ }
89
+ const [field] = fields;
90
+ const schema = publishedSchema((0, field_schemas_1.default)(field.type));
91
+ if (field.name === key)
92
+ return schema;
93
+ const description = [schema.description, `The ${names.join(', ')} field.`]
94
+ .filter(Boolean)
95
+ .join(' ');
96
+ return { ...schema, description };
97
+ }
98
+ function fieldProperties(projectable) {
99
+ const byKey = new Map();
100
+ projectable.forEach(field => {
101
+ const key = recordKey(field.name);
102
+ const collapsed = byKey.get(key);
103
+ if (collapsed)
104
+ collapsed.push(field);
105
+ else
106
+ byKey.set(key, [field]);
107
+ });
108
+ return Object.fromEntries([...byKey].map(([key, fields]) => [key, propertySchema(key, fields)]));
109
+ }
110
+ /**
111
+ * The record shape of one collection. The properties are what the capabilities report, and nothing
112
+ * more is forbidden: the capabilities route leaves out a OneToOne relation that the default
113
+ * projection returns, so a closed schema would reject responses the runtime really sends. `id` wins
114
+ * over any field of that name, because the deserializer overwrites the attribute with the resource
115
+ * id.
116
+ */
117
+ function recordSchema(collection, forestMeta) {
118
+ return {
119
+ type: 'object',
120
+ description: `A record of ${(0, names_1.quoted)(collection.name)}. It carries the fields the request projected — ` +
121
+ 'omit `projection` and the agent returns them all. The properties below are the ones the ' +
122
+ "collection's capabilities report; a record can carry more, such as a to-one relation. " +
123
+ 'Every field is nullable: the capabilities report a column type and never its nullability, ' +
124
+ 'so a null is always possible whatever the type says.',
125
+ properties: {
126
+ ...fieldProperties(collection.fields.projectable),
127
+ id: ID_SCHEMA,
128
+ __forest: forestMeta,
129
+ },
130
+ required: ['id', '__forest'],
131
+ };
132
+ }
133
+ function listResponseSchema(collection, record) {
134
+ return {
135
+ type: 'object',
136
+ description: `A page of ${(0, names_1.quoted)(collection.name)} records. The list never carries a total: call the ` +
137
+ 'count endpoint for that, which is why `countStatus` is always `not_requested`.',
138
+ properties: {
139
+ data: { type: 'array', items: record },
140
+ meta: {
141
+ type: 'object',
142
+ properties: { countStatus: { type: 'string', const: 'not_requested' } },
143
+ required: ['countStatus'],
144
+ },
145
+ },
146
+ required: ['data', 'meta'],
147
+ };
148
+ }
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLXNjaGVtYXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS9yZWNvcmQtc2NoZW1hcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWlCQSw4QkFFQztBQXFIRCwrQkFtQkM7QUFFRCxnREFtQkM7QUE3S0QsMERBQWtDO0FBRWxDLG9FQUE0QztBQUM1QyxtQ0FBaUM7QUFDakMsNkNBQXNEO0FBRXREOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLG1CQUFTLENBQUMsUUFBUSxDQUFDLG1CQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCwrRkFBK0Y7QUFDL0YsaUdBQWlHO0FBQ2pHLHlFQUF5RTtBQUN6RSxNQUFNLFNBQVMsR0FBaUI7SUFDOUIsSUFBSSxFQUFFLFFBQVE7SUFDZCxXQUFXLEVBQ1QsNkZBQTZGO1FBQzdGLHVGQUF1RjtRQUN2RixvRkFBb0Y7UUFDcEYsR0FBRyxJQUFBLGNBQU0sRUFBQyw2QkFBbUIsQ0FBQyxHQUFHO0NBQ3BDLENBQUM7QUFFRixTQUFTLFdBQVcsQ0FBQyxNQUFzQztJQUN6RCxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEtBQWUsRUFBRSxJQUFZO0lBQ3BELE9BQU87UUFDTCxXQUFXLEVBQ1QsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1RUFBdUU7WUFDMUYsMEJBQTBCLElBQUksRUFBRTtLQUNuQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQW9CO0lBQzNDLE1BQU0sU0FBUyxHQUNiLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLENB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
@@ -100,6 +100,10 @@ export declare const ActionResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
100
100
  type: z.ZodLiteral<"redirect">;
101
101
  path: z.ZodString;
102
102
  }, z.core.$strip>], "type">;
103
+ export declare const ForestRecordMetaSchema: z.ZodObject<{
104
+ collection: z.ZodString;
105
+ primaryKey: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
106
+ }, z.core.$strip>;
103
107
  export declare const ListResponseSchema: z.ZodObject<{
104
108
  data: z.ZodArray<z.ZodIntersection<z.ZodRecord<z.ZodString, z.ZodUnknown>, z.ZodObject<{
105
109
  __forest: z.ZodObject<{
@@ -164,6 +168,31 @@ export declare const ContextResponseSchema: z.ZodObject<{
164
168
  environmentId: z.ZodOptional<z.ZodNumber>;
165
169
  }, z.core.$strip>;
166
170
  }, z.core.$strip>;
171
+ export declare const PermissionHintsSchema: z.ZodObject<{
172
+ collections: z.ZodRecord<z.ZodString, z.ZodObject<{
173
+ crud: z.ZodObject<{
174
+ browse: z.ZodBoolean;
175
+ read: z.ZodBoolean;
176
+ edit: z.ZodBoolean;
177
+ add: z.ZodBoolean;
178
+ delete: z.ZodBoolean;
179
+ export: z.ZodBoolean;
180
+ }, z.core.$strip>;
181
+ actions: z.ZodRecord<z.ZodString, z.ZodObject<{
182
+ collection: z.ZodString;
183
+ name: z.ZodString;
184
+ visible: z.ZodBoolean;
185
+ requiresApprovalHint: z.ZodBoolean;
186
+ canApproveHint: z.ZodBoolean;
187
+ canSelfApproveHint: z.ZodBoolean;
188
+ finality: z.ZodLiteral<"display_hint">;
189
+ }, z.core.$strip>>;
190
+ }, z.core.$strip>>;
191
+ visibleActions: z.ZodArray<z.ZodObject<{
192
+ collection: z.ZodString;
193
+ name: z.ZodString;
194
+ }, z.core.$strip>>;
195
+ }, z.core.$strip>;
167
196
  export declare const AiQueryRequestSchema: z.ZodUnknown;
168
197
  export declare const ErrorResponseSchema: z.ZodObject<{
169
198
  error: z.ZodObject<{
@@ -180,5 +209,12 @@ export declare const MessagelessErrorResponseSchema: z.ZodObject<{
180
209
  details: z.ZodOptional<z.ZodUnknown>;
181
210
  }, z.core.$strip>;
182
211
  }, z.core.$strip>;
212
+ export declare const OpenapiDisabledErrorResponseSchema: z.ZodObject<{
213
+ error: z.ZodObject<{
214
+ type: z.ZodLiteral<"openapi_disabled">;
215
+ status: z.ZodLiteral<404>;
216
+ message: z.ZodString;
217
+ }, z.core.$strip>;
218
+ }, z.core.$strip>;
183
219
  export { ConditionTreeSchema, ParentIdSchema, OPERATORS };
184
220
  //# sourceMappingURL=schemas.d.ts.map