@classytic/arc 2.11.4 → 2.13.1

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 (166) hide show
  1. package/README.md +16 -12
  2. package/dist/{BaseController-swXruJ2_.mjs → BaseController-DX_T-bDB.mjs} +388 -423
  3. package/dist/EventTransport-CT_52aWU.d.mts +34 -0
  4. package/dist/EventTransport-DLWoUMHy.mjs +103 -0
  5. package/dist/{ResourceRegistry-DkAeAuTX.mjs → ResourceRegistry-CTERg_2x.mjs} +139 -66
  6. package/dist/audit/index.d.mts +2 -2
  7. package/dist/audit/index.mjs +1 -1
  8. package/dist/auth/audit.d.mts +199 -0
  9. package/dist/auth/audit.mjs +288 -0
  10. package/dist/auth/index.d.mts +3 -3
  11. package/dist/auth/index.mjs +117 -191
  12. package/dist/{betterAuthOpenApi-DwxtK3uG.mjs → betterAuthOpenApi--M_i87dQ.mjs} +1 -1
  13. package/dist/buildHandler-olo-gt94.mjs +610 -0
  14. package/dist/cache/index.mjs +3 -3
  15. package/dist/cli/commands/describe.d.mts +89 -13
  16. package/dist/cli/commands/describe.mjs +56 -2
  17. package/dist/cli/commands/docs.mjs +2 -2
  18. package/dist/cli/commands/generate.mjs +147 -48
  19. package/dist/cli/commands/init.d.mts +13 -0
  20. package/dist/cli/commands/init.mjs +130 -87
  21. package/dist/cli/commands/introspect.mjs +8 -1
  22. package/dist/context/index.mjs +1 -1
  23. package/dist/core/index.d.mts +3 -3
  24. package/dist/core/index.mjs +5 -5
  25. package/dist/core-D72ia0EH.mjs +1399 -0
  26. package/dist/{createActionRouter-CIKOcNA7.mjs → createActionRouter-CEvzKcy8.mjs} +7 -20
  27. package/dist/createAggregationRouter-CyecOxnO.mjs +114 -0
  28. package/dist/{createApp-C9bRrqlX.mjs → createApp-XX2-N0Yd.mjs} +28 -22
  29. package/dist/{defineEvent-D1Ky9M1D.mjs → defineEvent-D5h7EvAx.mjs} +1 -1
  30. package/dist/docs/index.d.mts +1 -1
  31. package/dist/docs/index.mjs +2 -2
  32. package/dist/{elevation-DOFoxoDs.mjs → elevation-DgoeTyfX.mjs} +1 -1
  33. package/dist/errorHandler-Bk-AGhkU.mjs +174 -0
  34. package/dist/errorHandler-DFr45ZG4.d.mts +45 -0
  35. package/dist/errors-j4aJm1Wg.mjs +184 -0
  36. package/dist/{eventPlugin-Cts2-Tfj.mjs → eventPlugin-CaKTYkYM.mjs} +28 -4
  37. package/dist/{eventPlugin-DDJoNEPL.d.mts → eventPlugin-qXpqTebY.d.mts} +24 -1
  38. package/dist/events/index.d.mts +6 -6
  39. package/dist/events/index.mjs +11 -35
  40. package/dist/events/transports/redis-stream-entry.d.mts +1 -1
  41. package/dist/events/transports/redis.d.mts +1 -1
  42. package/dist/factory/index.d.mts +2 -2
  43. package/dist/factory/index.mjs +2 -2
  44. package/dist/{fields-BRjxOAFp.d.mts → fields-COhcH3fk.d.mts} +23 -2
  45. package/dist/hooks/index.d.mts +1 -1
  46. package/dist/hooks/index.mjs +1 -1
  47. package/dist/idempotency/index.d.mts +1 -1
  48. package/dist/idempotency/index.mjs +1 -20
  49. package/dist/idempotency/redis.mjs +1 -1
  50. package/dist/{index-rHjXmJar.d.mts → index-BTqLEvhu.d.mts} +163 -3
  51. package/dist/{index-CXXRbnf8.d.mts → index-BtW7qYwa.d.mts} +660 -326
  52. package/dist/{index-m8mOOlFW.d.mts → index-Ds61mrJE.d.mts} +50 -4
  53. package/dist/{index-D9t1KNaB.d.mts → index-Dz5IKsrE.d.mts} +360 -219
  54. package/dist/index.d.mts +6 -7
  55. package/dist/index.mjs +9 -10
  56. package/dist/integrations/event-gateway.d.mts +1 -1
  57. package/dist/integrations/event-gateway.mjs +1 -1
  58. package/dist/integrations/index.d.mts +1 -1
  59. package/dist/integrations/mcp/index.d.mts +2 -2
  60. package/dist/integrations/mcp/index.mjs +1 -1
  61. package/dist/integrations/mcp/testing.d.mts +1 -1
  62. package/dist/integrations/mcp/testing.mjs +1 -1
  63. package/dist/integrations/streamline.d.mts +60 -11
  64. package/dist/integrations/streamline.mjs +75 -85
  65. package/dist/integrations/websocket.mjs +2 -8
  66. package/dist/middleware/index.d.mts +1 -1
  67. package/dist/middleware/index.mjs +2 -2
  68. package/dist/migrations/index.d.mts +23 -3
  69. package/dist/migrations/index.mjs +0 -7
  70. package/dist/{multipartBody-CvTR1Un6.mjs → multipartBody-BOvVSVCD.mjs} +11 -8
  71. package/dist/{openapi-D7G1V7ex.mjs → openapi-CiOMVW1p.mjs} +143 -13
  72. package/dist/org/index.d.mts +2 -2
  73. package/dist/org/index.mjs +1 -1
  74. package/dist/permissions/index.d.mts +3 -3
  75. package/dist/permissions/index.mjs +3 -3
  76. package/dist/{permissions-gd_aUWrR.mjs → permissions-ohQyv50e.mjs} +404 -176
  77. package/dist/{pipe-DVoIheVC.mjs → pipe-Zr0KXjQe.mjs} +1 -1
  78. package/dist/pipeline/index.d.mts +1 -1
  79. package/dist/pipeline/index.mjs +1 -1
  80. package/dist/plugins/index.d.mts +16 -31
  81. package/dist/plugins/index.mjs +33 -13
  82. package/dist/plugins/response-cache.mjs +1 -1
  83. package/dist/plugins/tracing-entry.mjs +1 -1
  84. package/dist/presets/filesUpload.d.mts +4 -4
  85. package/dist/presets/filesUpload.mjs +6 -9
  86. package/dist/presets/index.d.mts +1 -1
  87. package/dist/presets/index.mjs +1 -1
  88. package/dist/presets/multiTenant.d.mts +1 -1
  89. package/dist/presets/multiTenant.mjs +2 -2
  90. package/dist/presets/search.d.mts +2 -2
  91. package/dist/presets/search.mjs +6 -8
  92. package/dist/{presets-Z7P5w4gF.mjs → presets-BbkjdPeH.mjs} +6 -28
  93. package/dist/{queryCachePlugin-Bq6bO6vc.mjs → queryCachePlugin-m1XsgAIJ.mjs} +3 -3
  94. package/dist/{redis-stream-xTGxB2bm.d.mts → redis-stream-D6HzR1Z_.d.mts} +1 -1
  95. package/dist/registry/index.d.mts +1 -1
  96. package/dist/registry/index.mjs +2 -2
  97. package/dist/{replyHelpers-ByllIXXV.mjs → replyHelpers-CK-FNO8E.mjs} +3 -21
  98. package/dist/{resourceToTools-CxNmI6xF.mjs → resourceToTools-C5coh64w.mjs} +224 -71
  99. package/dist/{routerShared-BqLRb5l7.mjs → routerShared-D6_fEGHh.mjs} +40 -36
  100. package/dist/{schemaIR-Dy2p4MxS.mjs → schemaIR-7Vl611Qs.mjs} +1 -1
  101. package/dist/schemas/index.d.mts +100 -30
  102. package/dist/schemas/index.mjs +86 -29
  103. package/dist/scim/index.d.mts +264 -0
  104. package/dist/scim/index.mjs +963 -0
  105. package/dist/scope/index.d.mts +3 -3
  106. package/dist/scope/index.mjs +4 -4
  107. package/dist/{sse-V7aXc3bW.mjs → sse-Bz-5ZeTt.mjs} +1 -1
  108. package/dist/{store-helpers-Cp4uKC1U.mjs → store-helpers-BkIN9-vu.mjs} +1 -1
  109. package/dist/testing/index.d.mts +2 -8
  110. package/dist/testing/index.mjs +16 -24
  111. package/dist/types/index.d.mts +4 -4
  112. package/dist/{types-D7KpfiL1.d.mts → types-BvqwCCSx.d.mts} +73 -25
  113. package/dist/{types-DDyTPc6y.d.mts → types-CTYvcwHe.d.mts} +195 -1
  114. package/dist/{types-AOD8fxIw.mjs → types-C_s5moIu.mjs} +117 -1
  115. package/dist/{types-BQ9TJQNy.d.mts → types-DQHFc8PM.d.mts} +1 -1
  116. package/dist/utils/index.d.mts +2 -2
  117. package/dist/utils/index.mjs +5 -5
  118. package/dist/{utils-CcYTj09l.mjs → utils-_h9B3c57.mjs} +1269 -1334
  119. package/dist/{versioning-DsglKfM_.d.mts → versioning-DTTvc80y.d.mts} +1 -1
  120. package/package.json +24 -34
  121. package/skills/arc/SKILL.md +147 -51
  122. package/skills/arc/references/agent-auth.md +238 -0
  123. package/skills/arc/references/api-reference.md +187 -0
  124. package/skills/arc/references/auth.md +354 -7
  125. package/skills/arc/references/enterprise-auth.md +94 -0
  126. package/skills/arc/references/events.md +8 -6
  127. package/skills/arc/references/mcp.md +2 -2
  128. package/skills/arc/references/multi-tenancy.md +11 -2
  129. package/skills/arc/references/production.md +10 -9
  130. package/skills/arc/references/scim.md +247 -0
  131. package/skills/arc/references/testing.md +1 -1
  132. package/skills/arc-code-review/SKILL.md +141 -0
  133. package/skills/arc-code-review/references/anti-patterns.md +911 -0
  134. package/skills/arc-code-review/references/arc-cheatsheet.md +380 -0
  135. package/skills/arc-code-review/references/migration-recipes.md +700 -0
  136. package/skills/arc-code-review/references/mongokit-migration.md +386 -0
  137. package/skills/arc-code-review/references/scaffolding.md +230 -0
  138. package/skills/arc-code-review/references/severity.md +127 -0
  139. package/dist/EventTransport-BFQjw9pB.mjs +0 -133
  140. package/dist/EventTransport-CYNUXdCJ.d.mts +0 -293
  141. package/dist/adapters/index.d.mts +0 -3
  142. package/dist/adapters/index.mjs +0 -2
  143. package/dist/adapters-DUUiiimH.mjs +0 -964
  144. package/dist/auth/mongoose.d.mts +0 -191
  145. package/dist/auth/mongoose.mjs +0 -73
  146. package/dist/core-CbcQRIch.mjs +0 -1054
  147. package/dist/errorHandler-BQm8ZxTK.mjs +0 -173
  148. package/dist/errorHandler-DEWmGWPz.d.mts +0 -114
  149. package/dist/errors-D5c-5BJL.mjs +0 -232
  150. package/dist/index-Rg8axYPz.d.mts +0 -370
  151. /package/dist/{HookSystem-CGsMd6oK.mjs → HookSystem-Iiebom92.mjs} +0 -0
  152. /package/dist/{actionPermissions-sUUKDhtP.mjs → actionPermissions-CyUkQu6O.mjs} +0 -0
  153. /package/dist/{caching-CheW3m-S.mjs → caching-SM8gghN6.mjs} +0 -0
  154. /package/dist/{constants-BhY1OHoH.mjs → constants-Cxde4rpC.mjs} +0 -0
  155. /package/dist/{elevation-BQQXZ_VR.d.mts → elevation-BXOWoGCF.d.mts} +0 -0
  156. /package/dist/{keys-CARyUjiR.mjs → keys-CGcCbNyu.mjs} +0 -0
  157. /package/dist/{loadResources-CPpkyKfM.mjs → loadResources-DBMQg_Aj.mjs} +0 -0
  158. /package/dist/{memory-DikHSvWa.mjs → memory-UBydS5ku.mjs} +0 -0
  159. /package/dist/{metrics-Csh4nsvv.mjs → metrics-Qnvwc-LQ.mjs} +0 -0
  160. /package/dist/{pluralize-CWP6MB39.mjs → pluralize-DQgqgifU.mjs} +0 -0
  161. /package/dist/{registry-D63ee7fl.mjs → registry-I-ogLgL9.mjs} +0 -0
  162. /package/dist/{requestContext-C5XeK3VA.mjs → requestContext-SSaaTgW8.mjs} +0 -0
  163. /package/dist/{schemaConverter-B0oKLuqI.mjs → schemaConverter-De34B1ZG.mjs} +0 -0
  164. /package/dist/{typeGuards-CcFZXgU7.mjs → typeGuards-BzkXkvVv.mjs} +0 -0
  165. /package/dist/{types-DV9WDfeg.mjs → types-D57iXYb8.mjs} +0 -0
  166. /package/dist/{versioning-CGPjkqAg.mjs → versioning-BUrT5aP4.mjs} +0 -0
@@ -65,13 +65,15 @@ function multipartBody(options = {}) {
65
65
  for await (const part of parts) if (part.type === "file") {
66
66
  if (fileCount >= maxFiles) continue;
67
67
  if (mimeMatcher && !mimeMatcher.matches(part.mimetype)) return reply.code(415).send({
68
- success: false,
69
- error: `File type '${part.mimetype}' not allowed. Accepted: ${mimeMatcher.describe()}`
68
+ code: "arc.unsupported_media_type",
69
+ message: `File type '${part.mimetype}' not allowed. Accepted: ${mimeMatcher.describe()}`,
70
+ status: 415
70
71
  });
71
72
  const buffer = await part.toBuffer();
72
73
  if (buffer.length > maxFileSize) return reply.code(413).send({
73
- success: false,
74
- error: `File '${part.filename}' exceeds maximum size of ${Math.round(maxFileSize / 1024 / 1024)}MB`
74
+ code: "arc.payload_too_large",
75
+ message: `File '${part.filename}' exceeds maximum size of ${Math.round(maxFileSize / 1024 / 1024)}MB`,
76
+ status: 413
75
77
  });
76
78
  files[part.fieldname] = {
77
79
  filename: part.filename,
@@ -85,16 +87,17 @@ function multipartBody(options = {}) {
85
87
  } catch (err) {
86
88
  request.log.error({ err }, "multipartBody: failed to parse multipart form");
87
89
  return reply.code(400).send({
88
- success: false,
89
- error: "Failed to parse multipart form data"
90
+ code: "arc.bad_request",
91
+ message: "Failed to parse multipart form data",
92
+ status: 400
90
93
  });
91
94
  }
92
95
  if (requiredFields) {
93
96
  const missing = requiredFields.filter((name) => !(name in files));
94
97
  if (missing.length > 0) return reply.code(400).send({
95
- success: false,
96
- error: `Missing required file field${missing.length > 1 ? "s" : ""}: ${missing.join(", ")}`,
97
98
  code: "MISSING_FILE_FIELDS",
99
+ message: `Missing required file field${missing.length > 1 ? "s" : ""}: ${missing.join(", ")}`,
100
+ status: 400,
98
101
  details: { missing }
99
102
  });
100
103
  }
@@ -1,7 +1,7 @@
1
- import { t as getUserRoles } from "./types-DV9WDfeg.mjs";
2
- import { n as convertRouteSchema } from "./schemaConverter-B0oKLuqI.mjs";
3
- import { t as resolveActionPermission } from "./actionPermissions-sUUKDhtP.mjs";
4
- import { t as buildActionBodySchema } from "./createActionRouter-CIKOcNA7.mjs";
1
+ import { t as getUserRoles } from "./types-D57iXYb8.mjs";
2
+ import { n as convertRouteSchema } from "./schemaConverter-De34B1ZG.mjs";
3
+ import { t as resolveActionPermission } from "./actionPermissions-CyUkQu6O.mjs";
4
+ import { t as buildActionBodySchema } from "./createActionRouter-CEvzKcy8.mjs";
5
5
  import fp from "fastify-plugin";
6
6
  //#region src/docs/openapi.ts
7
7
  const openApiPlugin = async (fastify, opts = {}) => {
@@ -160,7 +160,6 @@ const DEFAULT_LIST_PARAMS = [
160
160
  function generateResourcePaths(resource, apiPrefix = "", additionalSecurity = []) {
161
161
  const paths = {};
162
162
  const basePath = `${apiPrefix}${resource.prefix}`;
163
- if (resource.disableDefaultRoutes && (!resource.customRoutes || resource.customRoutes.length === 0) && (!resource.actions || resource.actions.length === 0)) return paths;
164
163
  if (!resource.disableDefaultRoutes) {
165
164
  const disabledSet = new Set(resource.disabledRoutes ?? []);
166
165
  const updateMethod = resource.updateMethod ?? "PATCH";
@@ -173,7 +172,7 @@ function generateResourcePaths(resource, apiPrefix = "", additionalSecurity = []
173
172
  type: "object",
174
173
  properties: {
175
174
  success: { type: "boolean" },
176
- docs: {
175
+ data: {
177
176
  type: "array",
178
177
  items: { $ref: `#/components/schemas/${resource.name}` }
179
178
  },
@@ -358,9 +357,136 @@ function generateResourcePaths(resource, apiPrefix = "", additionalSecurity = []
358
357
  }
359
358
  }, anyAuthRequired, additionalSecurity);
360
359
  }
360
+ if (resource.aggregations && resource.aggregations.length > 0) appendAggregationPaths(paths, resource, basePath, additionalSecurity);
361
361
  return paths;
362
362
  }
363
363
  /**
364
+ * Emit one OpenAPI path entry per declared aggregation.
365
+ *
366
+ * Path: `GET /:resource/aggregations/<name>`
367
+ * Response: `{ rows: AggregationRow[] }` where each row is keyed by
368
+ * the groupBy fields (nested object for joined-alias paths)
369
+ * plus the measure aliases.
370
+ *
371
+ * Auth requirement is read from the aggregation's own `permissions`
372
+ * function — same fallback chain runtime + MCP use.
373
+ */
374
+ function appendAggregationPaths(paths, resource, basePath, additionalSecurity) {
375
+ if (!resource.aggregations) return;
376
+ for (const agg of resource.aggregations) {
377
+ const path = toOpenApiPath(`${basePath}/aggregations/${agg.name}`);
378
+ const requiresAuth = !agg.permissions?._isPublic;
379
+ const rowSchema = buildAggregationRowSchema(normalizeGroupByForOpenApi(agg.groupBy), agg.measures, agg.lookupAliases);
380
+ const querystring = {
381
+ type: "object",
382
+ properties: {},
383
+ additionalProperties: true
384
+ };
385
+ if (agg.requireDateRange) {
386
+ const props = querystring.properties;
387
+ const f = agg.requireDateRange.field;
388
+ props[`${f}[gte]`] = {
389
+ type: "string",
390
+ description: `Lower bound (inclusive) of required date range on \`${f}\`.`
391
+ };
392
+ props[`${f}[lte]`] = {
393
+ type: "string",
394
+ description: `Upper bound (inclusive) of required date range on \`${f}\`.`
395
+ };
396
+ }
397
+ if (agg.requireFilters?.length) {
398
+ const props = querystring.properties;
399
+ for (const f of agg.requireFilters) props[f] = {
400
+ type: "string",
401
+ description: `Required filter on \`${f}\` — request rejected (400) if missing.`
402
+ };
403
+ }
404
+ const descLines = [];
405
+ if (agg.description) descLines.push(agg.description);
406
+ descLines.push("Portable aggregation. Caller filters via query string narrow the base + tenant scope; response shape is `{ rows: [...] }` matching repo-core's `AggResult` contract.");
407
+ if (Object.keys(agg.measures).length > 0) {
408
+ const measureLines = Object.entries(agg.measures).map(([alias, op]) => `- \`${alias}\` — \`${op}\``).join("\n");
409
+ descLines.push("", "**Measures:**", measureLines);
410
+ }
411
+ if (agg.requireDateRange) descLines.push("", `**Required date range** on \`${agg.requireDateRange.field}\` — supply \`?${agg.requireDateRange.field}[gte]=...&${agg.requireDateRange.field}[lte]=...\`.` + (agg.requireDateRange.maxRangeDays ? ` Range cap: ${agg.requireDateRange.maxRangeDays} days.` : ""));
412
+ if (!paths[path]) paths[path] = {};
413
+ paths[path].get = createOperation(resource, `aggregation.${agg.name}`, agg.summary ?? `Aggregation: ${agg.name}`, {
414
+ description: descLines.join("\n"),
415
+ parameters: [{
416
+ name: "querystring",
417
+ in: "query",
418
+ required: false,
419
+ schema: querystring,
420
+ description: "Filter narrowing — composes with base filter + tenant scope."
421
+ }],
422
+ responses: {
423
+ "200": {
424
+ description: "Aggregation result",
425
+ content: { "application/json": { schema: {
426
+ type: "object",
427
+ required: ["rows"],
428
+ properties: { rows: {
429
+ type: "array",
430
+ items: rowSchema
431
+ } }
432
+ } } }
433
+ },
434
+ "400": { description: "Missing required filter or invalid date range" },
435
+ "401": { description: "Authentication required" },
436
+ "403": { description: "Permission denied" },
437
+ "422": { description: "Result row count exceeded `maxGroups` cap" },
438
+ "501": { description: "Adapter does not implement `aggregate()`" },
439
+ "504": { description: "Aggregation execution timed out" }
440
+ }
441
+ }, requiresAuth, additionalSecurity);
442
+ }
443
+ }
444
+ /**
445
+ * Build the JSON Schema for a single aggregation row. Combines the
446
+ * groupBy field shape (nested for joined-alias paths) with the
447
+ * measure-alias scalars.
448
+ *
449
+ * Group keys with dotted paths (e.g. `'category.code'`) emit a nested
450
+ * `category: { code: string }` object, matching the cross-kit
451
+ * `nestDottedKeys` output. Plain group keys are flat.
452
+ *
453
+ * Measure scalars are always `number` — every measure op
454
+ * (`count` / `sum` / `avg` / `min` / `max` / `countDistinct`)
455
+ * produces a numeric result.
456
+ */
457
+ function buildAggregationRowSchema(groupByFields, measures, _lookupAliases) {
458
+ const properties = {};
459
+ for (const field of groupByFields) setNestedSchemaProp(properties, field.split("."), { type: "string" });
460
+ for (const alias of Object.keys(measures)) properties[alias] = { type: "number" };
461
+ return {
462
+ type: "object",
463
+ properties,
464
+ additionalProperties: false
465
+ };
466
+ }
467
+ function normalizeGroupByForOpenApi(groupBy) {
468
+ if (!groupBy) return [];
469
+ return typeof groupBy === "string" ? [groupBy] : groupBy;
470
+ }
471
+ function setNestedSchemaProp(target, path, leaf) {
472
+ if (path.length === 1) {
473
+ target[path[0]] = leaf;
474
+ return;
475
+ }
476
+ const head = path[0];
477
+ const rest = path.slice(1);
478
+ let nested = target[head];
479
+ if (!nested || typeof nested !== "object") {
480
+ nested = {
481
+ type: "object",
482
+ properties: {}
483
+ };
484
+ target[head] = nested;
485
+ }
486
+ if (!nested.properties) nested.properties = {};
487
+ setNestedSchemaProp(nested.properties, rest, leaf);
488
+ }
489
+ /**
364
490
  * Create an operation object
365
491
  * @param requiresAuthOverride - Override for whether auth is required (for additional routes)
366
492
  * @param additionalSecurity - Extra security alternatives from external integrations (OR'd with bearerAuth)
@@ -511,13 +637,17 @@ function generateSchemas(resources) {
511
637
  }
512
638
  }
513
639
  };
514
- if (fieldPerms && schemas[resource.name]?.properties) {
515
- const props = schemas[resource.name].properties;
516
- for (const [field, perm] of Object.entries(fieldPerms)) if (props[field]) {
517
- const desc = props[field]?.description ?? "";
518
- const permDesc = formatFieldPermDescription(perm);
519
- props[field].description = desc ? `${desc} (${permDesc})` : permDesc;
520
- } else if (perm.type === "hidden") {}
640
+ const resourceSchema = schemas[resource.name];
641
+ if (fieldPerms && resourceSchema?.properties) {
642
+ const props = resourceSchema.properties;
643
+ for (const [field, perm] of Object.entries(fieldPerms)) {
644
+ const propSchema = props[field];
645
+ if (propSchema) {
646
+ const desc = propSchema.description ?? "";
647
+ const permDesc = formatFieldPermDescription(perm);
648
+ propSchema.description = desc ? `${desc} (${permDesc})` : permDesc;
649
+ } else if (perm.type === "hidden") {}
650
+ }
521
651
  }
522
652
  if (storedSchemas?.createBody) {
523
653
  schemas[`${resource.name}Input`] = {
@@ -1,5 +1,5 @@
1
- import { yt as RouteHandler } from "../index-CXXRbnf8.mjs";
2
- import { d as UserBase } from "../fields-BRjxOAFp.mjs";
1
+ import { yt as RouteHandler } from "../index-BtW7qYwa.mjs";
2
+ import { d as UserBase } from "../fields-COhcH3fk.mjs";
3
3
  import { InvitationAdapter, InvitationDoc, MemberDoc, OrgAdapter, OrgDoc, OrgPermissionStatement, OrgRole, OrganizationPluginOptions } from "./types.mjs";
4
4
  import { FastifyPluginAsync, RouteHandlerMethod } from "fastify";
5
5
 
@@ -1,4 +1,4 @@
1
- import { _ as isElevated, h as hasOrgAccess, n as PUBLIC_SCOPE, s as getOrgRoles, v as isMember } from "../types-AOD8fxIw.mjs";
1
+ import { _ as hasOrgAccess, b as isMember, l as getOrgRoles, n as PUBLIC_SCOPE, y as isElevated } from "../types-C_s5moIu.mjs";
2
2
  import fp from "fastify-plugin";
3
3
  //#region src/org/organizationPlugin.ts
4
4
  const DEFAULT_ROLES = [
@@ -1,3 +1,3 @@
1
- import { a as applyFieldWritePermissions, c as PermissionCheck, d as UserBase, f as getUserRoles, i as applyFieldReadPermissions, l as PermissionContext, n as FieldPermissionMap, o as fields, p as normalizeRoles, r as FieldPermissionType, s as resolveEffectiveRoles, t as FieldPermission, u as PermissionResult } from "../fields-BRjxOAFp.mjs";
2
- import { A as requireRoles, C as allOf, D as not, E as denyAll, M as when, N as applyPermissionResult, O as requireAuth, P as normalizePermissionResult, S as createOrgPermissions, T as anyOf, _ as ConnectEventsOptions, a as presets_d_exports, b as PermissionEventBus, c as readOnly, d as requireOrgRole, f as requireScopeContext, g as createRoleHierarchy, h as RoleHierarchy, i as ownerWithAdminBypass, j as roles, k as requireOwnership, l as requireOrgInScope, m as requireTeamMembership, n as authenticated, o as publicRead, p as requireServiceScope, r as fullPublic, s as publicReadAdminWrite, t as adminOnly, u as requireOrgMembership, v as DynamicPermissionMatrix, w as allowPublic, x as createDynamicPermissionMatrix, y as DynamicPermissionMatrixConfig } from "../index-rHjXmJar.mjs";
3
- export { ConnectEventsOptions, DynamicPermissionMatrix, DynamicPermissionMatrixConfig, FieldPermission, FieldPermissionMap, FieldPermissionType, PermissionCheck, PermissionContext, PermissionEventBus, PermissionResult, RoleHierarchy, UserBase, adminOnly, allOf, allowPublic, anyOf, applyFieldReadPermissions, applyFieldWritePermissions, applyPermissionResult, authenticated, createDynamicPermissionMatrix, createOrgPermissions, createRoleHierarchy, denyAll, fields, fullPublic, getUserRoles, normalizePermissionResult, normalizeRoles, not, ownerWithAdminBypass, presets_d_exports as permissions, publicRead, publicReadAdminWrite, readOnly, requireAuth, requireOrgInScope, requireOrgMembership, requireOrgRole, requireOwnership, requireRoles, requireScopeContext, requireServiceScope, requireTeamMembership, resolveEffectiveRoles, roles, when };
1
+ import { a as applyFieldWritePermissions, c as PermissionCheck, d as UserBase, f as getUserRoles, i as applyFieldReadPermissions, l as PermissionContext, n as FieldPermissionMap, o as fields, p as normalizeRoles, r as FieldPermissionType, s as resolveEffectiveRoles, t as FieldPermission, u as PermissionResult } from "../fields-COhcH3fk.mjs";
2
+ import { A as requireRoles, C as allOf, D as not, E as denyAll, F as RequireAgentScopeOptions, I as RequireMandateOptions, L as requireAgentScope, M as when, N as applyPermissionResult, O as requireAuth, P as normalizePermissionResult, R as requireDPoP, S as createOrgPermissions, T as anyOf, _ as ConnectEventsOptions, a as presets_d_exports, b as PermissionEventBus, c as readOnly, d as requireOrgRole, f as requireScopeContext, g as createRoleHierarchy, h as RoleHierarchy, i as ownerWithAdminBypass, j as roles, k as requireOwnership, l as requireOrgInScope, m as requireTeamMembership, n as authenticated, o as publicRead, p as requireServiceScope, r as fullPublic, s as publicReadAdminWrite, t as adminOnly, u as requireOrgMembership, v as DynamicPermissionMatrix, w as allowPublic, x as createDynamicPermissionMatrix, y as DynamicPermissionMatrixConfig, z as requireMandate } from "../index-BTqLEvhu.mjs";
3
+ export { ConnectEventsOptions, DynamicPermissionMatrix, DynamicPermissionMatrixConfig, FieldPermission, FieldPermissionMap, FieldPermissionType, PermissionCheck, PermissionContext, PermissionEventBus, PermissionResult, RequireAgentScopeOptions, RequireMandateOptions, RoleHierarchy, UserBase, adminOnly, allOf, allowPublic, anyOf, applyFieldReadPermissions, applyFieldWritePermissions, applyPermissionResult, authenticated, createDynamicPermissionMatrix, createOrgPermissions, createRoleHierarchy, denyAll, fields, fullPublic, getUserRoles, normalizePermissionResult, normalizeRoles, not, ownerWithAdminBypass, presets_d_exports as permissions, publicRead, publicReadAdminWrite, readOnly, requireAgentScope, requireAuth, requireDPoP, requireMandate, requireOrgInScope, requireOrgMembership, requireOrgRole, requireOwnership, requireRoles, requireScopeContext, requireServiceScope, requireTeamMembership, resolveEffectiveRoles, roles, when };
@@ -1,3 +1,3 @@
1
- import { A as normalizePermissionResult, C as requireAuth, D as when, E as roles, M as applyFieldWritePermissions, N as fields, O as applyPermissionResult, P as resolveEffectiveRoles, S as not, T as requireRoles, _ as requireTeamMembership, a as presets_exports, b as anyOf, c as readOnly, d as createOrgPermissions, f as requireOrgInScope, g as requireServiceScope, h as requireScopeContext, i as ownerWithAdminBypass, j as applyFieldReadPermissions, l as createRoleHierarchy, m as requireOrgRole, n as authenticated, o as publicRead, p as requireOrgMembership, r as fullPublic, s as publicReadAdminWrite, t as adminOnly, u as createDynamicPermissionMatrix, v as allOf, w as requireOwnership, x as denyAll, y as allowPublic } from "../permissions-gd_aUWrR.mjs";
2
- import { n as normalizeRoles, t as getUserRoles } from "../types-DV9WDfeg.mjs";
3
- export { adminOnly, allOf, allowPublic, anyOf, applyFieldReadPermissions, applyFieldWritePermissions, applyPermissionResult, authenticated, createDynamicPermissionMatrix, createOrgPermissions, createRoleHierarchy, denyAll, fields, fullPublic, getUserRoles, normalizePermissionResult, normalizeRoles, not, ownerWithAdminBypass, presets_exports as permissions, publicRead, publicReadAdminWrite, readOnly, requireAuth, requireOrgInScope, requireOrgMembership, requireOrgRole, requireOwnership, requireRoles, requireScopeContext, requireServiceScope, requireTeamMembership, resolveEffectiveRoles, roles, when };
1
+ import { A as roles, C as allowPublic, D as requireAuth, E as not, F as applyPermissionResult, L as normalizePermissionResult, M as requireAgentScope, N as requireDPoP, O as requireOwnership, P as requireMandate, S as allOf, T as denyAll, _ as requireOrgMembership, a as presets_exports, b as requireServiceScope, c as readOnly, d as applyFieldWritePermissions, f as fields, g as requireOrgInScope, h as createOrgPermissions, i as ownerWithAdminBypass, j as when, k as requireRoles, l as createRoleHierarchy, m as createDynamicPermissionMatrix, n as authenticated, o as publicRead, p as resolveEffectiveRoles, r as fullPublic, s as publicReadAdminWrite, t as adminOnly, u as applyFieldReadPermissions, v as requireOrgRole, w as anyOf, x as requireTeamMembership, y as requireScopeContext } from "../permissions-ohQyv50e.mjs";
2
+ import { n as normalizeRoles, t as getUserRoles } from "../types-D57iXYb8.mjs";
3
+ export { adminOnly, allOf, allowPublic, anyOf, applyFieldReadPermissions, applyFieldWritePermissions, applyPermissionResult, authenticated, createDynamicPermissionMatrix, createOrgPermissions, createRoleHierarchy, denyAll, fields, fullPublic, getUserRoles, normalizePermissionResult, normalizeRoles, not, ownerWithAdminBypass, presets_exports as permissions, publicRead, publicReadAdminWrite, readOnly, requireAgentScope, requireAuth, requireDPoP, requireMandate, requireOrgInScope, requireOrgMembership, requireOrgRole, requireOwnership, requireRoles, requireScopeContext, requireServiceScope, requireTeamMembership, resolveEffectiveRoles, roles, when };