From 8c1048b58532dcc2cd3c57058f92d5ee410f3955 Mon Sep 17 00:00:00 2001 From: Souvik Ghosh Date: Mon, 20 Apr 2026 12:56:15 +0530 Subject: [PATCH 1/4] lowercase CLI enum values in HelpText and error messages (Group 3) (#3444) ## Summary - Closes on #3445 Fixes 4 issues where CLI `--help` text and error messages showed PascalCase or UPPERCASE enum values instead of the lowercase values required by the JSON schema. The JSON serialization layer already produces lowercase (via `EnumMemberJsonEnumConverterFactory`), so these fixes align the CLI display layer to match. ## Issues Addressed | Issue | Option | CLI Showed | Schema Requires | Fix | |-------|--------|-----------|-----------------|-----| | #3361 | `--host-mode` (init) | `Development or Production` | `development or production` | HelpText lowercased | | #3362 | `--rest.methods` (add/update) | `[GET, POST, PUT, PATCH, DELETE]` | `[get, post, put, patch, delete]` | HelpText lowercased | | #3363 | `--graphql.operation` (add/update) | `[Query, Mutation]` | `[query, mutation]` | HelpText lowercased | | #3364 | `--graphql.operation` (add/update) | Same as #3363 | Same as #3363 | Same fix | ## Files Changed | File | Changes | |------|---------| | `src/Cli/Commands/InitOptions.cs` | `host-mode` HelpText: lowercase enum values | | `src/Cli/Commands/EntityOptions.cs` | `rest.methods` and `graphql.operation` HelpText: lowercase enum values | | `src/Cli/Utils.cs` | REST method and GraphQL operation error messages: lowercase enum names | ## Testing - [x] Unit tests Co-authored-by: Aniruddh Munde --- src/Cli/Commands/EntityOptions.cs | 4 ++-- src/Cli/Commands/InitOptions.cs | 2 +- src/Cli/Utils.cs | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Cli/Commands/EntityOptions.cs b/src/Cli/Commands/EntityOptions.cs index 3b2b77d9b2..fc423337a2 100644 --- a/src/Cli/Commands/EntityOptions.cs +++ b/src/Cli/Commands/EntityOptions.cs @@ -83,13 +83,13 @@ public EntityOptions( [Option("rest", Required = false, HelpText = "Route for rest api.")] public string? RestRoute { get; } - [Option("rest.methods", Required = false, Separator = ',', HelpText = "HTTP actions to be supported for stored procedure. Specify the actions as a comma separated list. Valid HTTP actions are : [GET, POST, PUT, PATCH, DELETE]")] + [Option("rest.methods", Required = false, Separator = ',', HelpText = "HTTP actions to be supported for stored procedure. Specify the actions as a comma separated list. Valid HTTP actions are: [get, post, put, patch, delete]")] public IEnumerable? RestMethodsForStoredProcedure { get; } [Option("graphql", Required = false, HelpText = "Type of graphQL.")] public string? GraphQLType { get; } - [Option("graphql.operation", Required = false, HelpText = $"GraphQL operation to be supported for stored procedure. Valid operations are : [Query, Mutation] ")] + [Option("graphql.operation", Required = false, HelpText = "GraphQL operation to be supported for stored procedure. Valid operations are: [query, mutation]")] public string? GraphQLOperationForStoredProcedure { get; } [Option("fields.include", Required = false, Separator = ',', HelpText = "Fields that are allowed access to permission.")] diff --git a/src/Cli/Commands/InitOptions.cs b/src/Cli/Commands/InitOptions.cs index 9064bf1f4d..69670a293b 100644 --- a/src/Cli/Commands/InitOptions.cs +++ b/src/Cli/Commands/InitOptions.cs @@ -90,7 +90,7 @@ public InitOptions( [Option("set-session-context", Default = false, Required = false, HelpText = "Enable sending data to MsSql using session context.")] public bool SetSessionContext { get; } - [Option("host-mode", Default = HostMode.Production, Required = false, HelpText = "Specify the Host mode - Development or Production")] + [Option("host-mode", Default = HostMode.Production, Required = false, HelpText = "Specify the Host mode - development or production")] public HostMode HostMode { get; } [Option("cors-origin", Separator = ',', Required = false, HelpText = "Specify the list of allowed origins.")] diff --git a/src/Cli/Utils.cs b/src/Cli/Utils.cs index c1ff7f2a99..4263728405 100644 --- a/src/Cli/Utils.cs +++ b/src/Cli/Utils.cs @@ -602,7 +602,7 @@ public static bool TryConvertRestMethodNameToRestMethod(string? method, out Supp { if (!Enum.TryParse(method, ignoreCase: true, out restMethod)) { - _logger.LogError("Invalid REST Method. Supported methods are {restMethods}.", string.Join(", ", Enum.GetNames())); + _logger.LogError("Invalid REST Method. Supported methods are {restMethods}.", string.Join(", ", Enum.GetNames().Select(n => n.ToLowerInvariant()))); return false; } @@ -652,8 +652,8 @@ public static bool TryConvertGraphQLOperationNameToGraphQLOperation(string? oper { _logger.LogError( "Invalid GraphQL Operation. Supported operations are {queryName} and {mutationName}.", - GraphQLOperation.Query, - GraphQLOperation.Mutation); + nameof(GraphQLOperation.Query).ToLowerInvariant(), + nameof(GraphQLOperation.Mutation).ToLowerInvariant()); return false; } From 85df9ae48c20fed0f65f8d78975aea46fa6a9456 Mon Sep 17 00:00:00 2001 From: Souvik Ghosh Date: Sat, 25 Apr 2026 00:29:51 +0530 Subject: [PATCH 2/4] fix: align CLI HelpText defaults and descriptions with JSON schema (Group 2) (#3417) - Closes on #3418 Fixes 14 issues where CLI option `--help` text showed incorrect default values, wrong descriptions, or enum mismatches compared to the JSON schema (`dab.draft.schema.json`) and C# runtime defaults. | # | Property | Before | After | Resolution | |---|----------|--------|-------|------------| | #3347 | `runtime.mcp.dml-tools.read-records` | CLI: true, Schema: false | Both: true | Schema changed false?true to match C# runtime | | #3348 | `runtime.mcp.dml-tools.create-record` | CLI: true, Schema: false | Both: true | Schema changed false?true to match C# runtime | | #3349 | `runtime.mcp.dml-tools.describe-entities` | CLI: true, Schema: false | Both: true | Schema changed false?true to match C# runtime | | #3350 | `runtime.graphql.multiple-mutations.create.enabled` | CLI: true, Schema: false | CLI: false | HelpText corrected to match schema | | #3351 | `runtime.host.mode` | CLI: Development, Schema: production | CLI: production | HelpText corrected to match schema | | #3352 | `data-source.options.set-session-context` | CLI: "(default)" text | No default | Removed misleading text | | #3353 | `runtime.rest.request-body-strict` | init: false, Schema: true | init: false | HelpText corrected to match schema | | #3354 | `runtime.mcp.dml-tools.aggregate-records` | Schema: .enabled=true, top-level=false | Both: true | Schema changed false?true to match C# runtime | | # | Property | Fix | |---|----------|-----| | #3355 | `--otel-service-name` | Changed description from "Headers for Open Telemetry" to "Service name for Open Telemetry" | | #3356 | `dab add-telemetry` options | Removed duplicate `(Default: X)` from HelpText where `Default=` attribute already displays the value | | #3357 | `runtime.graphql.depth-limit` | Changed description from "infinity"/"-1" to "Default: null (no limit)" | | # | Property | Fix | |---|----------|-----| | #3359 | `--database-type` (configure) | Already fixed in PR #3409 | | #3360 | `--database-type` (configure) | Changed to lowercase enum values | - #3378 (`rest.request-body-strict`) ? same fix as #3353 - #3379 (`host.mode`) ? same fix as #3351 - #3380 (`set-session-context`) ? same fix as #3352 - #3381 (`multiple-mutations.create.enabled`) ? same fix as #3350 - #3382 (DML tool defaults) ? same fix as #3347-#3349; schema aligned to `true` to match C# runtime | File | Changes | |------|---------| | `src/Cli/Commands/ConfigureOptions.cs` | 5 HelpText corrections (host.mode, multiple-mutations, set-session-context, depth-limit, database-type) | | `src/Cli/Commands/InitOptions.cs` | 2 HelpText corrections (request-body-strict, database-type) | | `src/Cli/Commands/AddTelemetryOptions.cs` | 4 HelpText/description corrections | | `schemas/dab.draft.schema.json` | DML tool defaults changed false?true (8 locations) to match C# runtime (`DmlToolsConfig.DEFAULT_ENABLED = true`) | - ConfigureOptionsTests: 78 passed, 0 failed - EndToEndTests: 138 passed, 0 failed, 3 skipped - Build: 0 warnings, 0 errors --- schemas/dab.draft.schema.json | 20 +++++++------- src/Cli/Commands/AddTelemetryOptions.cs | 8 +++--- src/Cli/Commands/ConfigureOptions.cs | 36 ++++++++++++++++++++----- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/schemas/dab.draft.schema.json b/schemas/dab.draft.schema.json index 84f8e5cfbd..95e083650d 100644 --- a/schemas/dab.draft.schema.json +++ b/schemas/dab.draft.schema.json @@ -24,7 +24,7 @@ "postgresql", "mysql", "cosmosdb_nosql", - "cosmosdb_postgresql" + "dwsql" ] }, "connection-string": { @@ -124,7 +124,7 @@ "if": { "properties": { "database-type": { - "const": "mssql" + "enum": ["mssql", "dwsql"] } } }, @@ -217,7 +217,7 @@ "request-body-strict": { "$ref": "#/$defs/boolean-or-string", "description": "Does not allow extraneous fields in request body when set to true.", - "default": true + "default": false } } }, @@ -295,32 +295,32 @@ "describe-entities": { "$ref": "#/$defs/boolean-or-string", "description": "Enable/disable the describe-entities tool.", - "default": false + "default": true }, "create-record": { "$ref": "#/$defs/boolean-or-string", "description": "Enable/disable the create-record tool.", - "default": false + "default": true }, "read-records": { "$ref": "#/$defs/boolean-or-string", "description": "Enable/disable the read-records tool.", - "default": false + "default": true }, "update-record": { "$ref": "#/$defs/boolean-or-string", "description": "Enable/disable the update-record tool.", - "default": false + "default": true }, "delete-record": { "$ref": "#/$defs/boolean-or-string", "description": "Enable/disable the delete-record tool.", - "default": false + "default": true }, "execute-entity": { "$ref": "#/$defs/boolean-or-string", "description": "Enable/disable the execute-entity tool.", - "default": false + "default": true }, "aggregate-records": { "description": "Enable/disable or configure the aggregate-records MCP tool.", @@ -349,7 +349,7 @@ } } ], - "default": false + "default": true } } } diff --git a/src/Cli/Commands/AddTelemetryOptions.cs b/src/Cli/Commands/AddTelemetryOptions.cs index 8ec9313d14..f30552b19b 100644 --- a/src/Cli/Commands/AddTelemetryOptions.cs +++ b/src/Cli/Commands/AddTelemetryOptions.cs @@ -44,7 +44,7 @@ public AddTelemetryOptions( public string? AppInsightsConnString { get; } // To specify whether Application Insights telemetry should be enabled. This flag is optional and default value is false. - [Option("app-insights-enabled", Default = CliBool.False, Required = false, HelpText = "(Default: false) Enable/Disable Application Insights")] + [Option("app-insights-enabled", Default = CliBool.False, Required = false, HelpText = "Enable/Disable Application Insights.")] public CliBool? AppInsightsEnabled { get; } // Connection string for the Open Telemetry resource to which telemetry data should be sent. @@ -53,7 +53,7 @@ public AddTelemetryOptions( public string? OpenTelemetryEndpoint { get; } // To specify whether Open Telemetry telemetry should be enabled. This flag is optional and default value is false. - [Option("otel-enabled", Default = CliBool.False, Required = false, HelpText = "(Default: false) Enable/Disable OTEL")] + [Option("otel-enabled", Default = CliBool.False, Required = false, HelpText = "Enable/Disable OTEL.")] public CliBool? OpenTelemetryEnabled { get; } // Headers for the Open Telemetry resource to which telemetry data should be sent. @@ -61,11 +61,11 @@ public AddTelemetryOptions( public string? OpenTelemetryHeaders { get; } // Specify the Open Telemetry protocol. This flag is optional and default value is grpc. - [Option("otel-protocol", Default = OtlpExportProtocol.Grpc, Required = false, HelpText = "(Default: grpc) Accepted: grpc/httpprotobuf")] + [Option("otel-protocol", Default = OtlpExportProtocol.Grpc, Required = false, HelpText = "Accepted: grpc, httpprotobuf.")] public OtlpExportProtocol? OpenTelemetryExportProtocol { get; } // Service Name for the Open Telemetry resource to which telemetry data should be sent. This flag is optional and default value is dab. - [Option("otel-service-name", Default = "dab", Required = false, HelpText = "(Default: dab) Headers for Open Telemetry for telemetry data")] + [Option("otel-service-name", Default = "dab", Required = false, HelpText = "Service name for Open Telemetry.")] public string? OpenTelemetryServiceName { get; } public int Handler(ILogger logger, FileSystemRuntimeConfigLoader loader, IFileSystem fileSystem) diff --git a/src/Cli/Commands/ConfigureOptions.cs b/src/Cli/Commands/ConfigureOptions.cs index be076d7983..cc78aa44a0 100644 --- a/src/Cli/Commands/ConfigureOptions.cs +++ b/src/Cli/Commands/ConfigureOptions.cs @@ -149,7 +149,7 @@ public ConfigureOptions( ShowEffectivePermissions = showEffectivePermissions; } - [Option("data-source.database-type", Required = false, HelpText = "Database type. Allowed values: MSSQL, PostgreSQL, CosmosDB_NoSQL, MySQL.")] + [Option("data-source.database-type", Required = false, HelpText = "Database type. Allowed values: mssql, postgresql, cosmosdb_nosql, mysql, dwsql.")] public string? DataSourceDatabaseType { get; } [Option("data-source.connection-string", Required = false, HelpText = "Connection string for the data source.")] @@ -164,7 +164,7 @@ public ConfigureOptions( [Option("data-source.options.schema", Required = false, HelpText = "Schema path for Cosmos DB for NoSql.")] public string? DataSourceOptionsSchema { get; } - [Option("data-source.options.set-session-context", Required = false, HelpText = "Enable session context. Allowed values: true (default), false.")] + [Option("data-source.options.set-session-context", Required = false, HelpText = "Enable session context. Allowed values: true, false.")] public bool? DataSourceOptionsSetSessionContext { get; } [Option("data-source.health.name", Required = false, HelpText = "Identifier for data source in health check report.")] @@ -176,7 +176,19 @@ public ConfigureOptions( [Option("data-source.user-delegated-auth.database-audience", Required = false, HelpText = "Database resource identifier for token acquisition (e.g., https://database.windows.net for Azure SQL).")] public string? DataSourceUserDelegatedAuthDatabaseAudience { get; } - [Option("runtime.graphql.depth-limit", Required = false, HelpText = "Max allowed depth of the nested query. Allowed values: (0,2147483647] inclusive. Default is infinity. Use -1 to remove limit.")] + [Option("data-source.user-delegated-auth.provider", Required = false, HelpText = "Authentication provider for user-delegated auth. Allowed values: EntraId. Default: EntraId.")] + public string? DataSourceUserDelegatedAuthProvider { get; } + + [Option("data-source.health.enabled", Required = false, HelpText = "Enable health check for this data source. Default: true (boolean).")] + public bool? DataSourceHealthEnabled { get; } + + [Option("data-source.health.threshold-ms", Required = false, HelpText = "Health check response time threshold in milliseconds. Default: 1000. Range: 1-2147483647.")] + public int? DataSourceHealthThresholdMs { get; } + + [Option("data-source-files", Required = false, Separator = ',', HelpText = "Comma-separated list of additional runtime config files for multi-database scenarios.")] + public IEnumerable? DataSourceFiles { get; } + + [Option("runtime.graphql.depth-limit", Required = false, HelpText = "Max allowed depth of a nested query. Allowed values: 1-2147483647, or -1 to remove a previously set limit. Default: -1.")] public int? DepthLimit { get; } [Option("runtime.graphql.enabled", Required = false, HelpText = "Enable DAB's GraphQL endpoint. Default: true (boolean).")] @@ -188,7 +200,7 @@ public ConfigureOptions( [Option("runtime.graphql.allow-introspection", Required = false, HelpText = "Allow/Deny GraphQL introspection requests in GraphQL Schema. Default: true (boolean).")] public bool? RuntimeGraphQLAllowIntrospection { get; } - [Option("runtime.graphql.multiple-mutations.create.enabled", Required = false, HelpText = "Enable/Disable multiple-mutation create operations on DAB's generated GraphQL schema. Default: true (boolean).")] + [Option("runtime.graphql.multiple-mutations.create.enabled", Required = false, HelpText = "Enable/Disable multiple-mutation create operations on DAB's generated GraphQL schema. Default: false (boolean).")] public bool? RuntimeGraphQLMultipleMutationsCreateEnabled { get; } [Option("runtime.rest.enabled", Required = false, HelpText = "Enable DAB's Rest endpoint. Default: true (boolean).")] @@ -197,7 +209,7 @@ public ConfigureOptions( [Option("runtime.rest.path", Required = false, HelpText = "Customize DAB's REST endpoint path. Default: '/api' Conditions: Prefix path with '/'.")] public string? RuntimeRestPath { get; } - [Option("runtime.rest.request-body-strict", Required = false, HelpText = "Prohibit extraneous REST request body fields. Default: true (boolean).")] + [Option("runtime.rest.request-body-strict", Required = false, HelpText = "Prohibit extraneous REST request body fields. Default: false (boolean).")] public bool? RuntimeRestRequestBodyStrict { get; } [Option("runtime.mcp.enabled", Required = false, HelpText = "Enable DAB's MCP endpoint. Default: true (boolean).")] @@ -245,7 +257,19 @@ public ConfigureOptions( [Option("runtime.compression.level", Required = false, HelpText = "Set the response compression level. Allowed values: optimal (default), fastest, none.")] public CompressionLevel? RuntimeCompressionLevel { get; } - [Option("runtime.host.mode", Required = false, HelpText = "Set the host running mode of DAB in Development or Production. Default: Development.")] + [Option("runtime.health.enabled", Required = false, HelpText = "Enable runtime health checks. Default: true (boolean).")] + public bool? RuntimeHealthEnabled { get; } + + [Option("runtime.health.cache-ttl-seconds", Required = false, HelpText = "Time to live in seconds for cached health check results. Default: 5.")] + public int? RuntimeHealthCacheTtlSeconds { get; } + + [Option("runtime.health.max-query-parallelism", Required = false, HelpText = "Maximum number of parallel health check queries. Default: 4. Range: 1-8.")] + public int? RuntimeHealthMaxQueryParallelism { get; } + + [Option("runtime.health.roles", Required = false, Separator = ',', HelpText = "Comma-separated list of roles allowed to access health check details.")] + public IEnumerable? RuntimeHealthRoles { get; } + + [Option("runtime.host.mode", Required = false, HelpText = "Set the host running mode of DAB in Development or Production. Default: Production.")] public HostMode? RuntimeHostMode { get; } [Option("runtime.host.cors.origins", Required = false, HelpText = "Overwrite Allowed Origins in CORS. Default: [] (Space separated array of strings).")] From 8ec142305998b2fe42fdf63633efdb0150687b06 Mon Sep 17 00:00:00 2001 From: Souvik Ghosh Date: Tue, 28 Apr 2026 11:47:44 +0530 Subject: [PATCH 3/4] Missing/Invalid Default Value (Group 4) (#3454) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Why make this change? Parent issue #3466 Closes #3366 — `runtime.rest.enabled` has no `default` in the JSON schema Closes #3367 — `runtime.graphql.enabled` has no `default` in the JSON schema These schema properties were missing an explicit `default` value. 5 of 7 Group 4 issues (#3378–#3382) were already fixed in PR #3417 as Group 2 overlaps. ## What is this change? Adds `"default": true` to the `enabled` property under both `runtime.rest` and `runtime.graphql` in `schemas/dab.draft.schema.json`. This matches the C# runtime behavior where both REST and GraphQL are enabled by default. ## How was this tested? Schema-only metadata change — no runtime behavior affected. Validated that the schema still passes JSON Schema draft-07 validation. ## Sample Request(s) NA --- schemas/dab.draft.schema.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/schemas/dab.draft.schema.json b/schemas/dab.draft.schema.json index 95e083650d..61d56666ce 100644 --- a/schemas/dab.draft.schema.json +++ b/schemas/dab.draft.schema.json @@ -212,7 +212,8 @@ }, "enabled": { "$ref": "#/$defs/boolean-or-string", - "description": "Allow enabling/disabling REST requests for all entities." + "description": "Allow enabling/disabling REST requests for all entities.", + "default": true }, "request-body-strict": { "$ref": "#/$defs/boolean-or-string", @@ -237,7 +238,8 @@ }, "enabled": { "$ref": "#/$defs/boolean-or-string", - "description": "Allow enabling/disabling GraphQL requests for all entities." + "description": "Allow enabling/disabling GraphQL requests for all entities.", + "default": true }, "depth-limit": { "type": [ "integer", "null" ], From 52e6caba6ea2d6125aa0b8c8f8131cf438572707 Mon Sep 17 00:00:00 2001 From: Souvik Ghosh Date: Wed, 29 Apr 2026 21:51:28 +0530 Subject: [PATCH 4/4] fix: improve schema descriptions (Group 5) (#3471) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Why make this change? Closes #3470 Fixes #3365, #3368, #3369, #3370, #3371 Schema descriptions were missing, placeholder, or misleading — affecting VS Code IntelliSense and tooling that reads JSON Schema metadata. ## What is this change? Updates \schemas/dab.draft.schema.json\ descriptions: | Issue | Property | Fix | |-------|----------|-----| | #3365 | \data-source.health.enabled\ | Updated description | | #3368 | \permissions[].role\ | Added missing description (3 locations) | | #3369 | \permissions[].actions\ | Added missing description (3 locations) | | #3370 | \data-source.options\ | Clarified vague description (2 locations) | | #3371 | \ untime.graphql.depth-limit\ | Documented null (no limit) and -1 (CLI remove limit) semantics | ## How was this tested? Schema-only metadata change — no runtime behavior affected. JSON validated. --------- Co-authored-by: Copilot --- schemas/dab.draft.schema.json | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/schemas/dab.draft.schema.json b/schemas/dab.draft.schema.json index 61d56666ce..ec8f04f603 100644 --- a/schemas/dab.draft.schema.json +++ b/schemas/dab.draft.schema.json @@ -32,7 +32,7 @@ "type": "string" }, "options": { - "description": "Database specific properties for the backend database", + "description": "Database-specific connection and configuration properties. Available options depend on the database-type.", "type": "object" }, "health": { @@ -42,7 +42,7 @@ "properties": { "enabled": { "$ref": "#/$defs/boolean-or-string", - "description": "Enable health check endpoint for something", + "description": "Enable health check for this data source.", "default": true, "additionalProperties": false }, @@ -97,7 +97,7 @@ "then": { "properties": { "options": { - "description": "Database specific properties for the backend database", + "description": "Database-specific connection and configuration properties. Available options depend on the database-type.", "type": "object", "additionalProperties": false, "properties": { @@ -243,7 +243,7 @@ }, "depth-limit": { "type": [ "integer", "null" ], - "description": "Maximum allowed depth of a GraphQL query.", + "description": "Maximum allowed depth of a GraphQL query. Only positive integers are enforced. Default: null (no limit). Use -1 to explicitly remove a previously set limit.", "default": null }, "multiple-mutations": { @@ -909,9 +909,11 @@ "additionalProperties": false, "properties": { "role": { - "type": "string" + "type": "string", + "description": "The role to which this permission applies (e.g. anonymous, authenticated, or a custom role)." }, "actions": { + "description": "The operations permitted for this role. Use '*' to allow all, or specify an array of actions.", "oneOf": [ { "type": "string", @@ -1302,9 +1304,11 @@ "additionalProperties": false, "properties": { "role": { - "type": "string" + "type": "string", + "description": "The role to which this permission applies (e.g. anonymous, authenticated, or a custom role)." }, "actions": { + "description": "The operations permitted for this role. Use '*' to allow all, or specify an array of actions.", "oneOf": [ { "type": "string", @@ -1376,9 +1380,11 @@ "additionalProperties": false, "properties": { "role": { - "type": "string" + "type": "string", + "description": "The role to which this permission applies (e.g. anonymous, authenticated, or a custom role)." }, "actions": { + "description": "The operations permitted for this role. Use '*' to allow all, or specify an array of actions.", "oneOf": [ { "type": "string",