@eudiplo/cli 9.0.0 → 9.1.0-main.021024e

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 (44) hide show
  1. package/dist/commands/config/portability/migrations.spec.js +3 -2
  2. package/dist/commands/config/portability/migrations.spec.js.map +1 -1
  3. package/dist/commands/config/validate/index.d.ts.map +1 -1
  4. package/dist/commands/config/validate/index.js +2 -2
  5. package/dist/commands/config/validate/index.js.map +1 -1
  6. package/dist/commands/deployment/index.d.ts.map +1 -1
  7. package/dist/commands/deployment/index.js +8 -3
  8. package/dist/commands/deployment/index.js.map +1 -1
  9. package/dist/commands/deployment/pass-through.d.ts +15 -0
  10. package/dist/commands/deployment/pass-through.d.ts.map +1 -0
  11. package/dist/commands/deployment/pass-through.js +52 -0
  12. package/dist/commands/deployment/pass-through.js.map +1 -0
  13. package/dist/commands/upgrade/action.d.ts.map +1 -1
  14. package/dist/commands/upgrade/action.js +5 -2
  15. package/dist/commands/upgrade/action.js.map +1 -1
  16. package/dist/index.js +2786 -1190
  17. package/dist/services/compose-args.d.ts +1 -1
  18. package/dist/services/compose-args.d.ts.map +1 -1
  19. package/dist/services/compose-args.js +4 -2
  20. package/dist/services/compose-args.js.map +1 -1
  21. package/dist/services/compose-upgrade.d.ts +2 -0
  22. package/dist/services/compose-upgrade.d.ts.map +1 -1
  23. package/dist/services/compose-upgrade.js +5 -0
  24. package/dist/services/compose-upgrade.js.map +1 -1
  25. package/dist/services/container-state.d.ts +4 -1
  26. package/dist/services/container-state.d.ts.map +1 -1
  27. package/dist/services/container-state.js +21 -8
  28. package/dist/services/container-state.js.map +1 -1
  29. package/dist/services/diagnostics.d.ts.map +1 -1
  30. package/dist/services/diagnostics.js +10 -0
  31. package/dist/services/diagnostics.js.map +1 -1
  32. package/package.json +5 -5
  33. package/templates/demo-config/clients/test.json +2 -1
  34. package/templates/demo-config/presentation/age-over-18.json +10 -0
  35. package/templates/demo-config/presentation/pid.json +1 -2
  36. package/templates/demo-config.manifest.json +1 -3
  37. package/templates/docker-compose.yml +11 -6
  38. package/templates/schemas/CreateTenantDto.schema.json +1 -1
  39. package/templates/schemas/CredentialConfigCreate.schema.json +6 -5
  40. package/templates/schemas/CredentialConfigFile.schema.json +796 -1
  41. package/templates/schemas/IssuanceConfig.schema.json +20 -0
  42. package/templates/schemas/IssuanceConfigFile.schema.json +676 -1
  43. package/templates/demo-config/attribute-providers/claims-provider.json +0 -15
  44. package/templates/demo-config/webhook-endpoints/notification.json +0 -15
package/dist/index.js CHANGED
@@ -3099,12 +3099,13 @@ var require_data = __commonJS({
3099
3099
  }
3100
3100
  });
3101
3101
 
3102
- // ../../node_modules/.pnpm/fast-uri@3.1.6/node_modules/fast-uri/lib/utils.js
3102
+ // ../../node_modules/.pnpm/fast-uri@3.1.8/node_modules/fast-uri/lib/utils.js
3103
3103
  var require_utils = __commonJS({
3104
- "../../node_modules/.pnpm/fast-uri@3.1.6/node_modules/fast-uri/lib/utils.js"(exports, module) {
3104
+ "../../node_modules/.pnpm/fast-uri@3.1.8/node_modules/fast-uri/lib/utils.js"(exports, module) {
3105
3105
  "use strict";
3106
3106
  var isUUID = RegExp.prototype.test.bind(/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu);
3107
3107
  var isIPv4 = RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u);
3108
+ var isPort = RegExp.prototype.test.bind(/^\d*$/u);
3108
3109
  var isHexPair = RegExp.prototype.test.bind(/^[\da-f]{2}$/iu);
3109
3110
  var isUnreserved = RegExp.prototype.test.bind(/^[\da-z\-._~]$/iu);
3110
3111
  var isPathCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:@/]$/u);
@@ -3570,8 +3571,12 @@ var require_utils = __commonJS({
3570
3571
  uriTokens.push(host);
3571
3572
  }
3572
3573
  if (typeof component.port === "number" || typeof component.port === "string") {
3574
+ const port = String(component.port);
3575
+ if (!isPort(port)) {
3576
+ throw new TypeError("URI port is malformed.");
3577
+ }
3573
3578
  uriTokens.push(":");
3574
- uriTokens.push(String(component.port));
3579
+ uriTokens.push(port);
3575
3580
  }
3576
3581
  return uriTokens.length ? uriTokens.join("") : void 0;
3577
3582
  }
@@ -3596,9 +3601,9 @@ var require_utils = __commonJS({
3596
3601
  }
3597
3602
  });
3598
3603
 
3599
- // ../../node_modules/.pnpm/fast-uri@3.1.6/node_modules/fast-uri/lib/schemes.js
3604
+ // ../../node_modules/.pnpm/fast-uri@3.1.8/node_modules/fast-uri/lib/schemes.js
3600
3605
  var require_schemes = __commonJS({
3601
- "../../node_modules/.pnpm/fast-uri@3.1.6/node_modules/fast-uri/lib/schemes.js"(exports, module) {
3606
+ "../../node_modules/.pnpm/fast-uri@3.1.8/node_modules/fast-uri/lib/schemes.js"(exports, module) {
3602
3607
  "use strict";
3603
3608
  var { isUUID } = require_utils();
3604
3609
  var URN_REG = /^([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-./:;=@]|%[\da-f]{2})+)$/iu;
@@ -3807,9 +3812,9 @@ var require_schemes = __commonJS({
3807
3812
  }
3808
3813
  });
3809
3814
 
3810
- // ../../node_modules/.pnpm/fast-uri@3.1.6/node_modules/fast-uri/index.js
3815
+ // ../../node_modules/.pnpm/fast-uri@3.1.8/node_modules/fast-uri/index.js
3811
3816
  var require_fast_uri = __commonJS({
3812
- "../../node_modules/.pnpm/fast-uri@3.1.6/node_modules/fast-uri/index.js"(exports, module) {
3817
+ "../../node_modules/.pnpm/fast-uri@3.1.8/node_modules/fast-uri/index.js"(exports, module) {
3813
3818
  "use strict";
3814
3819
  var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, serializePathEncoding, normalizeQueryFragmentEncoding, encodeQuery, encodeFragment, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
3815
3820
  var { SCHEMES, getSchemeHandler } = require_schemes();
@@ -4014,12 +4019,15 @@ var require_fast_uri = __commonJS({
4014
4019
  }
4015
4020
  return false;
4016
4021
  }
4022
+ function isIPLiteral(host) {
4023
+ return host[0] === "[" && host[host.length - 1] === "]";
4024
+ }
4017
4025
  function hasMalformedComponentPercentEncoding(matches) {
4018
4026
  const host = matches[4];
4019
- return hasMalformedPercentEncoding(matches[3]) || host !== void 0 && !(host[0] === "[" && host[host.length - 1] === "]") && hasMalformedPercentEncoding(host) || hasMalformedPercentEncoding(matches[6]) || hasMalformedPercentEncoding(matches[7]) || hasMalformedPercentEncoding(matches[8]);
4027
+ return hasMalformedPercentEncoding(matches[3]) || host !== void 0 && !isIPLiteral(host) && hasMalformedPercentEncoding(host) || hasMalformedPercentEncoding(matches[6]) || hasMalformedPercentEncoding(matches[7]) || hasMalformedPercentEncoding(matches[8]);
4020
4028
  }
4021
4029
  function canonicalizeHost(parsed, options, schemeHandler, isIP) {
4022
- if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport) && parsed.host && parsed.host[0] !== "[" && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) {
4030
+ if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport) && parsed.host && !isIPLiteral(parsed.host) && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) {
4023
4031
  try {
4024
4032
  parsed.host = new URL("http://" + parsed.host).hostname;
4025
4033
  } catch (e) {
@@ -4106,10 +4114,11 @@ var require_fast_uri = __commonJS({
4106
4114
  if (parsed.host) {
4107
4115
  const ipv4result = isIPv4(parsed.host);
4108
4116
  if (ipv4result === false) {
4109
- const bracketedIPLiteral = parsed.host[0] === "[" && parsed.host[parsed.host.length - 1] === "]";
4117
+ const bracketedIPLiteral = isIPLiteral(parsed.host);
4118
+ const hasIPLiteralBracket = parsed.host.indexOf("[") !== -1 || parsed.host.indexOf("]") !== -1;
4110
4119
  const ipv6result = normalizeIPv6(parsed.host);
4111
4120
  isIP = ipv6result.isIPV6 || ipv6result.isIPVFuture === true;
4112
- malformedIPLiteral = bracketedIPLiteral && ipv6result.error === true;
4121
+ malformedIPLiteral = hasIPLiteralBracket && (!bracketedIPLiteral || ipv6result.error === true);
4113
4122
  parsed.host = isIP ? ipv6result.host : ipv6result.host.toLowerCase();
4114
4123
  if (malformedIPLiteral) {
4115
4124
  parsed.error = parsed.error || "URI host is malformed.";
@@ -4132,14 +4141,17 @@ var require_fast_uri = __commonJS({
4132
4141
  parsed.error = parsed.error || "URI is not a " + options.reference + " reference.";
4133
4142
  }
4134
4143
  const schemeHandler = getSchemeHandler(options.scheme || parsed.scheme);
4135
- malformedHost = canonicalizeHost(parsed, options, schemeHandler, isIP);
4136
- if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) {
4137
- if (uri.indexOf("%") !== -1) {
4138
- if (parsed.host !== void 0 && !malformedIPLiteral) {
4139
- const host = isIP ? parsed.host : normalizePercentEncoding(parsed.host, true);
4140
- parsed.host = reescapeHostDelimiters(host, isIP);
4141
- }
4144
+ if (!malformedIPLiteral) {
4145
+ malformedHost = canonicalizeHost(parsed, options, schemeHandler, isIP);
4146
+ }
4147
+ if (uri.indexOf("%") !== -1 && parsed.host !== void 0 && !malformedIPLiteral) {
4148
+ let host = isIP ? parsed.host : normalizePercentEncoding(parsed.host, true);
4149
+ if (!isIP) {
4150
+ host = normalizePercentEncoding(host.toLowerCase());
4142
4151
  }
4152
+ parsed.host = reescapeHostDelimiters(host, isIP);
4153
+ }
4154
+ if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) {
4143
4155
  if (parsed.path) {
4144
4156
  parsed.path = normalizePathEncoding(parsed.path);
4145
4157
  }
@@ -14897,12 +14909,12 @@ var CONFIG_FORMATS = {
14897
14909
  IssuanceConfig: {
14898
14910
  slug: "issuance-config",
14899
14911
  file: "IssuanceConfigFile",
14900
- version: 2
14912
+ version: 3
14901
14913
  },
14902
14914
  CredentialConfig: {
14903
14915
  slug: "credential-config",
14904
14916
  file: "CredentialConfigFile",
14905
- version: 1
14917
+ version: 2
14906
14918
  },
14907
14919
  PresentationConfig: {
14908
14920
  slug: "presentation-config",
@@ -14980,6 +14992,25 @@ var CONFIG_MIGRATIONS = [
14980
14992
  // valid v2 spec whose offers keep having no lifetime.
14981
14993
  migrate: (spec) => ({ spec })
14982
14994
  },
14995
+ {
14996
+ id: "issuance-config-v3-trust-list-verifier-pem",
14997
+ kind: "IssuanceConfig",
14998
+ from: 2,
14999
+ to: 3,
15000
+ // v3 only adds the optional verifierKeyPem to wallet provider trust
15001
+ // list references: a v2 spec is a valid v3 spec.
15002
+ migrate: (spec) => ({ spec })
15003
+ },
15004
+ {
15005
+ id: "credential-config-v2-x509-trusted-authority",
15006
+ kind: "CredentialConfig",
15007
+ from: 1,
15008
+ to: 2,
15009
+ // v2 only adds the frameworkType `x509` to schemaMeta trusted
15010
+ // authorities, which schema metadata publishing already writes: a v1
15011
+ // spec is a valid v2 spec.
15012
+ migrate: (spec) => ({ spec })
15013
+ },
14983
15014
  presentationConfigV1ToV2,
14984
15015
  {
14985
15016
  id: "presentation-config-v3-typed-claim-values",
@@ -20060,13 +20091,13 @@ var CONFIG_SCHEMAS = [
20060
20091
  },
20061
20092
  {
20062
20093
  "$schema": "https://json-schema.org/draft/2020-12/schema",
20063
- "$id": "https://eudiplo.dev/schemas/v2/IssuanceConfigFile.schema.json",
20064
- "title": "IssuanceConfigFile",
20094
+ "$id": "https://eudiplo.dev/schemas/v2/CredentialConfigFile.schema.json",
20095
+ "title": "CredentialConfigFile",
20065
20096
  "type": "object",
20066
20097
  "properties": {
20067
20098
  "$schema": {
20068
20099
  "type": "string",
20069
- "const": "https://eudiplo.dev/schemas/v2/IssuanceConfigFile.schema.json"
20100
+ "const": "https://eudiplo.dev/schemas/v2/CredentialConfigFile.schema.json"
20070
20101
  },
20071
20102
  "metadata": {
20072
20103
  "type": "object",
@@ -20088,7 +20119,23 @@ var CONFIG_SCHEMAS = [
20088
20119
  "additionalProperties": false
20089
20120
  },
20090
20121
  "spec": {
20091
- "$ref": "#/$defs/IssuanceConfig"
20122
+ "allOf": [
20123
+ {
20124
+ "$ref": "#/$defs/CredentialConfigCreate"
20125
+ },
20126
+ {
20127
+ "type": "object",
20128
+ "required": [
20129
+ "id"
20130
+ ],
20131
+ "properties": {
20132
+ "id": {
20133
+ "type": "string",
20134
+ "minLength": 1
20135
+ }
20136
+ }
20137
+ }
20138
+ ]
20092
20139
  }
20093
20140
  },
20094
20141
  "required": [
@@ -20097,513 +20144,260 @@ var CONFIG_SCHEMAS = [
20097
20144
  ],
20098
20145
  "additionalProperties": false,
20099
20146
  "$defs": {
20100
- "IssuanceConfig": {
20147
+ "CredentialConfigCreate": {
20101
20148
  "type": "object",
20102
20149
  "properties": {
20103
- "batchSize": {
20104
- "description": "Optional issuance batch size.",
20105
- "type": "integer",
20106
- "minimum": 1,
20107
- "maximum": 9007199254740991
20108
- },
20109
- "dPopRequired": {
20110
- "description": "Require DPoP proofs for issuance endpoints.",
20111
- "type": "boolean"
20150
+ "id": {
20151
+ "type": "string",
20152
+ "minLength": 1,
20153
+ "description": "Credential configuration identifier."
20112
20154
  },
20113
- "walletAttestationRequired": {
20114
- "description": "Default wallet attestation requirement for managed authorization servers.",
20115
- "type": "boolean"
20155
+ "description": {
20156
+ "description": "Optional description for operators and tooling.",
20157
+ "type": [
20158
+ "string",
20159
+ "null"
20160
+ ]
20116
20161
  },
20117
- "walletProviderTrustLists": {
20118
- "description": "Shared wallet provider trust lists for key attestations and default authorization server wallet authentication.",
20119
- "type": "array",
20120
- "items": {
20121
- "type": "object",
20122
- "properties": {
20123
- "trustListId": {
20124
- "type": "string",
20125
- "minLength": 1
20126
- },
20127
- "url": {
20128
- "description": "URL of the wallet provider trust list.",
20129
- "type": "string",
20130
- "format": "uri"
20131
- },
20132
- "verifierKey": {
20133
- "description": "Optional verifier key material used for trust list verification.",
20134
- "type": "object",
20135
- "propertyNames": {
20136
- "type": "string"
20137
- },
20138
- "additionalProperties": {}
20139
- },
20140
- "verifierX509Der": {
20141
- "description": "Optional verifier certificate in DER/base64 form.",
20142
- "type": "string"
20143
- }
20162
+ "config": {
20163
+ "type": "object",
20164
+ "properties": {
20165
+ "format": {
20166
+ "type": "string",
20167
+ "enum": [
20168
+ "mso_mdoc",
20169
+ "dc+sd-jwt"
20170
+ ],
20171
+ "description": "Credential format emitted by this configuration."
20144
20172
  },
20145
- "additionalProperties": false
20146
- }
20147
- },
20148
- "signingKeyId": {
20149
- "description": "Default signing key chain id for credential issuance.",
20150
- "type": "string",
20151
- "minLength": 1
20152
- },
20153
- "authorizationServers": {
20154
- "minItems": 1,
20155
- "type": "array",
20156
- "items": {
20157
- "oneOf": [
20158
- {
20173
+ "display": {
20174
+ "type": "array",
20175
+ "items": {
20159
20176
  "type": "object",
20160
20177
  "properties": {
20161
- "type": {
20178
+ "locale": {
20162
20179
  "type": "string",
20163
- "const": "external",
20164
- "description": "Use an externally managed authorization server."
20180
+ "minLength": 1,
20181
+ "description": "Locale tag for the display entry."
20165
20182
  },
20166
- "id": {
20183
+ "name": {
20167
20184
  "type": "string",
20168
20185
  "minLength": 1,
20169
- "description": "Authorization server identifier."
20186
+ "description": "Human-readable field name."
20170
20187
  },
20171
- "issuer": {
20172
- "type": "string",
20173
- "format": "uri",
20174
- "description": "Issuer URL for the external authorization server."
20188
+ "description": {
20189
+ "description": "Optional field description for this locale.",
20190
+ "type": "string"
20175
20191
  },
20176
- "sessionBinding": {
20177
- "description": "Explicit mapping from an external access-token claim to an existing issuance session.",
20192
+ "background_color": {
20193
+ "description": "Optional background color for card-style rendering.",
20194
+ "type": "string"
20195
+ },
20196
+ "text_color": {
20197
+ "description": "Optional text color for card-style rendering.",
20198
+ "type": "string"
20199
+ },
20200
+ "background_image": {
20201
+ "description": "Optional background image.",
20178
20202
  "type": "object",
20179
20203
  "properties": {
20180
- "method": {
20181
- "type": "string",
20182
- "const": "access_token_claim",
20183
- "description": "Read the correlation value from a configured access-token claim."
20184
- },
20185
- "claim": {
20204
+ "uri": {
20186
20205
  "type": "string",
20187
20206
  "minLength": 1,
20188
- "description": "Claim name that contains the issuance-session correlation value."
20207
+ "description": "Image URI."
20189
20208
  }
20190
20209
  },
20191
20210
  "required": [
20192
- "method",
20193
- "claim"
20211
+ "uri"
20194
20212
  ],
20195
20213
  "additionalProperties": false
20196
20214
  },
20197
- "label": {
20198
- "description": "Optional display label for UI selection.",
20199
- "type": "string"
20200
- },
20201
- "enabled": {
20202
- "description": "Whether this authorization server entry is enabled.",
20203
- "type": "boolean"
20204
- }
20205
- },
20206
- "required": [
20207
- "type",
20208
- "id",
20209
- "issuer"
20210
- ],
20211
- "additionalProperties": false
20212
- },
20213
- {
20214
- "type": "object",
20215
- "properties": {
20216
- "type": {
20217
- "type": "string",
20218
- "const": "oid4vp",
20219
- "description": "Use OID4VP-based authorization server chaining."
20220
- },
20221
- "id": {
20222
- "type": "string",
20223
- "minLength": 1,
20224
- "description": "Authorization server identifier."
20225
- },
20226
- "presentationConfigId": {
20227
- "type": "string",
20228
- "minLength": 1,
20229
- "description": "Presentation configuration id used during authorization."
20230
- },
20231
- "immediateWalletRedirect": {
20232
- "description": "Redirect wallets immediately after authorization response creation.",
20233
- "type": "boolean"
20234
- },
20235
- "token": {
20236
- "description": "Optional token issuance settings.",
20215
+ "logo": {
20216
+ "description": "Optional logo image.",
20237
20217
  "type": "object",
20238
20218
  "properties": {
20239
- "lifetimeSeconds": {
20240
- "description": "Access token lifetime in seconds.",
20241
- "type": "number",
20242
- "minimum": 60
20243
- },
20244
- "signingKeyId": {
20245
- "description": "Optional key chain id used to sign issued tokens.",
20219
+ "uri": {
20246
20220
  "type": "string",
20247
- "minLength": 1
20248
- },
20249
- "refreshTokenEnabled": {
20250
- "description": "Enable issuing refresh tokens.",
20251
- "type": "boolean"
20252
- },
20253
- "refreshTokenExpiresInSeconds": {
20254
- "description": "Refresh token lifetime in seconds.",
20255
- "type": "number",
20256
- "minimum": 60
20221
+ "minLength": 1,
20222
+ "description": "Image URI."
20257
20223
  }
20258
20224
  },
20225
+ "required": [
20226
+ "uri"
20227
+ ],
20259
20228
  "additionalProperties": false
20260
- },
20261
- "requireDPoP": {
20262
- "description": "Require DPoP proofs for token/credential requests.",
20263
- "type": "boolean"
20264
- },
20265
- "walletAttestationRequired": {
20266
- "description": "Require wallet attestation for this authorization server.",
20267
- "type": "boolean"
20268
- },
20269
- "walletProviderTrustLists": {
20270
- "description": "Optional wallet provider trust list references for this authorization server.",
20271
- "type": "array",
20272
- "items": {
20273
- "type": "object",
20274
- "properties": {
20275
- "trustListId": {
20276
- "type": "string",
20277
- "minLength": 1
20278
- },
20279
- "url": {
20280
- "description": "URL of the wallet provider trust list.",
20281
- "type": "string",
20282
- "format": "uri"
20283
- },
20284
- "verifierKey": {
20285
- "description": "Optional verifier key material used for trust list verification.",
20286
- "type": "object",
20287
- "propertyNames": {
20288
- "type": "string"
20289
- },
20290
- "additionalProperties": {}
20291
- },
20292
- "verifierX509Der": {
20293
- "description": "Optional verifier certificate in DER/base64 form.",
20294
- "type": "string"
20295
- }
20296
- },
20297
- "additionalProperties": false
20298
- }
20299
- },
20300
- "label": {
20301
- "description": "Optional display label for UI selection.",
20302
- "type": "string"
20303
- },
20304
- "enabled": {
20305
- "description": "Whether this authorization server entry is enabled.",
20306
- "type": "boolean"
20307
20229
  }
20308
20230
  },
20309
20231
  "required": [
20310
- "type",
20311
- "id",
20312
- "presentationConfigId"
20232
+ "locale",
20233
+ "name"
20313
20234
  ],
20314
20235
  "additionalProperties": false
20315
20236
  },
20316
- {
20317
- "type": "object",
20318
- "properties": {
20319
- "type": {
20320
- "type": "string",
20321
- "const": "chained",
20322
- "description": "Use upstream OIDC as authorization source."
20323
- },
20324
- "id": {
20325
- "type": "string",
20326
- "minLength": 1,
20327
- "description": "Authorization server identifier."
20328
- },
20329
- "upstream": {
20237
+ "description": "Display metadata shown by wallets."
20238
+ },
20239
+ "scope": {
20240
+ "description": "Optional OAuth scope associated with this credential type.",
20241
+ "type": "string"
20242
+ },
20243
+ "docType": {
20244
+ "description": "Optional mDoc document type.",
20245
+ "type": "string"
20246
+ },
20247
+ "keyAttestationsRequired": {
20248
+ "description": "Optional key attestation requirements.",
20249
+ "type": "object",
20250
+ "properties": {
20251
+ "key_storage": {
20252
+ "description": "Required key storage attestations.",
20253
+ "type": "array",
20254
+ "items": {
20255
+ "type": "string"
20256
+ }
20257
+ },
20258
+ "user_authentication": {
20259
+ "description": "Required user authentication attestations.",
20260
+ "type": "array",
20261
+ "items": {
20262
+ "type": "string"
20263
+ }
20264
+ }
20265
+ },
20266
+ "additionalProperties": false
20267
+ },
20268
+ "proofTypesSupported": {
20269
+ "description": "Supported proof types for issuance requests.",
20270
+ "type": "array",
20271
+ "items": {
20272
+ "type": "string",
20273
+ "enum": [
20274
+ "jwt",
20275
+ "attestation"
20276
+ ]
20277
+ }
20278
+ },
20279
+ "credentialReusePolicy": {
20280
+ "description": "Optional PID/EAA reuse policy published in credential metadata.",
20281
+ "type": "object",
20282
+ "properties": {
20283
+ "id": {
20284
+ "type": "string",
20285
+ "minLength": 1
20286
+ },
20287
+ "options": {
20288
+ "type": "array",
20289
+ "items": {
20330
20290
  "type": "object",
20331
20291
  "properties": {
20332
- "issuer": {
20333
- "type": "string",
20334
- "format": "uri",
20335
- "description": "Upstream OIDC issuer URL."
20336
- },
20337
- "clientId": {
20338
- "type": "string",
20339
- "minLength": 1,
20340
- "description": "Client id for upstream OIDC authentication."
20341
- },
20342
- "clientSecret": {
20343
- "description": "Optional client secret for upstream OIDC authentication.",
20344
- "type": "string",
20345
- "minLength": 1
20346
- },
20347
- "scopes": {
20348
- "description": "Optional scopes requested from the upstream issuer.",
20292
+ "details": {
20293
+ "minItems": 1,
20349
20294
  "type": "array",
20350
20295
  "items": {
20351
20296
  "type": "string",
20352
- "minLength": 1
20297
+ "enum": [
20298
+ "once_only",
20299
+ "limited_time",
20300
+ "limited-time",
20301
+ "rotating-batch",
20302
+ "per-relying-party"
20303
+ ]
20353
20304
  }
20354
- }
20355
- },
20356
- "required": [
20357
- "issuer",
20358
- "clientId"
20359
- ],
20360
- "additionalProperties": false,
20361
- "description": "Upstream OIDC connection settings."
20362
- },
20363
- "token": {
20364
- "description": "Optional token issuance settings.",
20365
- "type": "object",
20366
- "properties": {
20367
- "lifetimeSeconds": {
20368
- "description": "Access token lifetime in seconds.",
20369
- "type": "number",
20370
- "minimum": 60
20371
20305
  },
20372
- "signingKeyId": {
20373
- "description": "Optional key chain id used to sign issued tokens.",
20374
- "type": "string",
20375
- "minLength": 1
20306
+ "batch_size": {
20307
+ "type": "integer",
20308
+ "minimum": 2,
20309
+ "maximum": 9007199254740991
20376
20310
  },
20377
- "refreshTokenEnabled": {
20378
- "description": "Enable issuing refresh tokens.",
20379
- "type": "boolean"
20311
+ "reissue_trigger_unused": {
20312
+ "type": "integer",
20313
+ "minimum": 0,
20314
+ "maximum": 9007199254740991
20380
20315
  },
20381
- "refreshTokenExpiresInSeconds": {
20382
- "description": "Refresh token lifetime in seconds.",
20383
- "type": "number",
20384
- "minimum": 60
20316
+ "reissue_trigger_lifetime_left": {
20317
+ "type": "integer",
20318
+ "minimum": 0,
20319
+ "maximum": 9007199254740991
20385
20320
  }
20386
20321
  },
20322
+ "required": [
20323
+ "details"
20324
+ ],
20387
20325
  "additionalProperties": false
20388
- },
20389
- "requireDPoP": {
20390
- "description": "Require DPoP proofs for token/credential requests.",
20391
- "type": "boolean"
20392
- },
20393
- "walletAttestationRequired": {
20394
- "description": "Require wallet attestation for this authorization server.",
20395
- "type": "boolean"
20396
- },
20397
- "walletProviderTrustLists": {
20398
- "description": "Optional wallet provider trust list references for this authorization server.",
20399
- "type": "array",
20400
- "items": {
20401
- "type": "object",
20402
- "properties": {
20403
- "trustListId": {
20404
- "type": "string",
20405
- "minLength": 1
20406
- },
20407
- "url": {
20408
- "description": "URL of the wallet provider trust list.",
20409
- "type": "string",
20410
- "format": "uri"
20411
- },
20412
- "verifierKey": {
20413
- "description": "Optional verifier key material used for trust list verification.",
20414
- "type": "object",
20415
- "propertyNames": {
20416
- "type": "string"
20417
- },
20418
- "additionalProperties": {}
20419
- },
20420
- "verifierX509Der": {
20421
- "description": "Optional verifier certificate in DER/base64 form.",
20422
- "type": "string"
20423
- }
20424
- },
20425
- "additionalProperties": false
20426
- }
20427
- },
20428
- "label": {
20429
- "description": "Optional display label for UI selection.",
20430
- "type": "string"
20431
- },
20432
- "enabled": {
20433
- "description": "Whether this authorization server entry is enabled.",
20434
- "type": "boolean"
20435
20326
  }
20436
- },
20437
- "required": [
20438
- "type",
20439
- "id",
20440
- "upstream"
20441
- ],
20442
- "additionalProperties": false
20327
+ }
20443
20328
  },
20444
- {
20445
- "type": "object",
20446
- "properties": {
20447
- "type": {
20448
- "type": "string",
20449
- "const": "built-in",
20450
- "description": "Use EUDIPLO built-in authorization server."
20451
- },
20452
- "id": {
20453
- "type": "string",
20454
- "minLength": 1,
20455
- "description": "Authorization server identifier."
20456
- },
20457
- "token": {
20458
- "description": "Optional token issuance settings.",
20459
- "type": "object",
20460
- "properties": {
20461
- "lifetimeSeconds": {
20462
- "description": "Access token lifetime in seconds.",
20463
- "type": "number",
20464
- "minimum": 60
20465
- },
20466
- "signingKeyId": {
20467
- "description": "Optional key chain id used to sign issued tokens.",
20468
- "type": "string",
20469
- "minLength": 1
20470
- },
20471
- "refreshTokenEnabled": {
20472
- "description": "Enable issuing refresh tokens.",
20473
- "type": "boolean"
20474
- },
20475
- "refreshTokenExpiresInSeconds": {
20476
- "description": "Refresh token lifetime in seconds.",
20477
- "type": "number",
20478
- "minimum": 60
20479
- }
20480
- },
20481
- "additionalProperties": false
20482
- },
20483
- "requireDPoP": {
20484
- "description": "Require DPoP proofs for token/credential requests.",
20485
- "type": "boolean"
20486
- },
20487
- "walletAttestationRequired": {
20488
- "description": "Require wallet attestation for this authorization server.",
20489
- "type": "boolean"
20490
- },
20491
- "walletProviderTrustLists": {
20492
- "description": "Optional wallet provider trust list references for this authorization server.",
20493
- "type": "array",
20494
- "items": {
20495
- "type": "object",
20496
- "properties": {
20497
- "trustListId": {
20498
- "type": "string",
20499
- "minLength": 1
20500
- },
20501
- "url": {
20502
- "description": "URL of the wallet provider trust list.",
20503
- "type": "string",
20504
- "format": "uri"
20505
- },
20506
- "verifierKey": {
20507
- "description": "Optional verifier key material used for trust list verification.",
20508
- "type": "object",
20509
- "propertyNames": {
20510
- "type": "string"
20511
- },
20512
- "additionalProperties": {}
20513
- },
20514
- "verifierX509Der": {
20515
- "description": "Optional verifier certificate in DER/base64 form.",
20516
- "type": "string"
20517
- }
20518
- },
20519
- "additionalProperties": false
20520
- }
20521
- },
20522
- "label": {
20523
- "description": "Optional display label for UI selection.",
20524
- "type": "string"
20525
- },
20526
- "enabled": {
20527
- "description": "Whether this authorization server entry is enabled.",
20528
- "type": "boolean"
20529
- }
20530
- },
20531
- "required": [
20532
- "type",
20533
- "id"
20534
- ],
20535
- "additionalProperties": false
20536
- }
20537
- ],
20538
- "description": "Supported authorization server configurations."
20329
+ "required": [
20330
+ "id"
20331
+ ],
20332
+ "additionalProperties": false
20333
+ }
20539
20334
  },
20540
- "description": "Configured authorization server entries."
20335
+ "required": [
20336
+ "format",
20337
+ "display"
20338
+ ],
20339
+ "additionalProperties": false,
20340
+ "description": "Issuer metadata-facing credential configuration."
20541
20341
  },
20542
- "federation": {
20543
- "description": "Optional OpenID Federation settings.",
20342
+ "fields": {
20343
+ "type": "array",
20344
+ "items": {
20345
+ "$ref": "#/$defs/CredentialConfigCreate/$defs/__schema0"
20346
+ },
20347
+ "description": "Claim field definitions for credential issuance."
20348
+ },
20349
+ "attributeProviderId": {
20350
+ "description": "Optional attribute provider id used to resolve claim values.",
20351
+ "type": [
20352
+ "string",
20353
+ "null"
20354
+ ]
20355
+ },
20356
+ "webhookEndpointId": {
20357
+ "description": "Not used for notifications: they go to the webhook endpoint of the offer.",
20358
+ "type": [
20359
+ "string",
20360
+ "null"
20361
+ ]
20362
+ },
20363
+ "vct": {
20364
+ "description": "Optional VCT value or structured VCT metadata.",
20544
20365
  "anyOf": [
20366
+ {
20367
+ "type": "string"
20368
+ },
20545
20369
  {
20546
20370
  "type": "object",
20547
20371
  "properties": {
20548
- "role": {
20549
- "description": "Federation role for this issuer.",
20550
- "type": "string",
20551
- "enum": [
20552
- "trust_anchor",
20553
- "intermediate",
20554
- "leaf"
20555
- ]
20372
+ "vct": {
20373
+ "description": "VCT identifier.",
20374
+ "type": "string"
20556
20375
  },
20557
- "mode": {
20558
- "description": "Federation operation mode.",
20559
- "type": "string",
20560
- "enum": [
20561
- "federation-only",
20562
- "hybrid"
20563
- ]
20376
+ "name": {
20377
+ "description": "Human-readable VCT name.",
20378
+ "type": "string"
20564
20379
  },
20565
- "entityId": {
20566
- "description": "Optional local federation entity id.",
20380
+ "description": {
20381
+ "description": "Optional VCT description.",
20567
20382
  "type": "string"
20568
20383
  },
20569
- "enforceSigningPolicy": {
20570
- "description": "Enforce strict signing policy checks.",
20571
- "type": "boolean"
20384
+ "extends": {
20385
+ "description": "Optional base VCT reference.",
20386
+ "type": "string"
20572
20387
  },
20573
- "cacheTtlSeconds": {
20574
- "description": "Cache time-to-live for federation metadata in seconds.",
20575
- "type": "integer",
20576
- "minimum": 1,
20577
- "maximum": 9007199254740991
20388
+ "extends#integrity": {
20389
+ "description": "Integrity hash for the extends reference.",
20390
+ "type": "string"
20578
20391
  },
20579
- "trustAnchors": {
20580
- "type": "array",
20581
- "items": {
20582
- "type": "object",
20583
- "properties": {
20584
- "entityId": {
20585
- "type": "string",
20586
- "minLength": 1,
20587
- "description": "Federation trust anchor entity id."
20588
- },
20589
- "entityConfigurationUri": {
20590
- "type": "string",
20591
- "format": "uri",
20592
- "description": "Entity configuration URI for the trust anchor."
20593
- }
20594
- },
20595
- "required": [
20596
- "entityId",
20597
- "entityConfigurationUri"
20598
- ],
20599
- "additionalProperties": false
20600
- },
20601
- "description": "Federation trust anchors."
20392
+ "schema_uri": {
20393
+ "description": "Optional schema URI for the VCT.",
20394
+ "type": "string"
20395
+ },
20396
+ "schema_uri#integrity": {
20397
+ "description": "Integrity hash for schema_uri.",
20398
+ "type": "string"
20602
20399
  }
20603
20400
  },
20604
- "required": [
20605
- "trustAnchors"
20606
- ],
20607
20401
  "additionalProperties": false
20608
20402
  },
20609
20403
  {
@@ -20611,709 +20405,2446 @@ var CONFIG_SCHEMAS = [
20611
20405
  }
20612
20406
  ]
20613
20407
  },
20614
- "registrationCertificate": {
20615
- "description": "Optional registration certificate settings.",
20408
+ "keyBinding": {
20409
+ "description": "Enable key binding requirements.",
20410
+ "type": "boolean"
20411
+ },
20412
+ "keyChainId": {
20413
+ "description": "Optional key chain id used for credential signing.",
20414
+ "type": "string",
20415
+ "minLength": 1
20416
+ },
20417
+ "statusManagement": {
20418
+ "description": "Enable status management for issued credentials.",
20419
+ "type": "boolean"
20420
+ },
20421
+ "activeCredentials": {
20422
+ "description": "Optional issuer-side policy limiting simultaneously active credentials per subject. Requires statusManagement.",
20616
20423
  "anyOf": [
20617
20424
  {
20618
20425
  "type": "object",
20619
20426
  "properties": {
20620
20427
  "enabled": {
20621
- "description": "Enable issuer registration certificate support.",
20622
- "type": "boolean"
20428
+ "type": "boolean",
20429
+ "description": "Ensure a subject has at most one active credential of this configuration."
20623
20430
  },
20624
- "mode": {
20625
- "description": "How registration certificate data is provided.",
20431
+ "tracking": {
20432
+ "description": "How the subject's active credential set is tracked. Only 'internal' (pseudonymous, issuer-side) is currently supported.",
20626
20433
  "type": "string",
20627
20434
  "enum": [
20628
- "import",
20629
- "generate"
20435
+ "internal"
20630
20436
  ]
20631
- },
20632
- "jwt": {
20633
- "description": "Optional registration certificate JWT when using import mode.",
20634
- "type": "string"
20635
- },
20636
- "privacyPolicy": {
20637
- "description": "Optional privacy policy URI.",
20638
- "type": "string"
20639
- },
20640
- "supportUri": {
20641
- "description": "Optional support URI.",
20642
- "type": "string"
20643
20437
  }
20644
20438
  },
20645
- "additionalProperties": false
20439
+ "required": [
20440
+ "enabled"
20441
+ ],
20442
+ "additionalProperties": false,
20443
+ "description": "Issuer-side policy limiting the number of simultaneously active credentials per subject."
20646
20444
  },
20647
20445
  {
20648
20446
  "type": "null"
20649
20447
  }
20650
20448
  ]
20651
20449
  },
20652
- "display": {
20653
- "description": "Localized issuer metadata shown to wallets.",
20654
- "type": "array",
20655
- "items": {
20656
- "type": "object",
20657
- "properties": {
20658
- "name": {
20659
- "description": "Issuer display name.",
20660
- "type": "string"
20661
- },
20662
- "locale": {
20663
- "description": "Locale tag for this display entry.",
20664
- "type": "string"
20665
- },
20666
- "logo": {
20667
- "description": "Optional issuer logo metadata.",
20668
- "type": "object",
20669
- "properties": {
20670
- "uri": {
20671
- "type": "string",
20672
- "minLength": 1,
20673
- "description": "Logo URI."
20674
- },
20675
- "alt_text": {
20676
- "description": "Optional localized alternative text.",
20677
- "type": "string"
20678
- }
20679
- },
20680
- "required": [
20681
- "uri"
20682
- ],
20683
- "additionalProperties": {}
20684
- }
20685
- },
20686
- "additionalProperties": {}
20687
- }
20688
- },
20689
- "notificationEndpointEnabled": {
20690
- "description": "Whether the OID4VCI notification endpoint is exposed for this issuance configuration.",
20691
- "type": "boolean"
20692
- },
20693
- "credentialResponseEncryption": {
20694
- "description": "Enable encrypted credential responses.",
20695
- "type": "boolean"
20696
- },
20697
- "credentialRequestEncryption": {
20698
- "description": "Require encrypted credential requests.",
20699
- "type": "boolean"
20700
- },
20701
- "txCodeMaxAttempts": {
20702
- "description": "Maximum verification attempts for transaction codes. Null resets to defaults.",
20450
+ "iaeActions": {
20451
+ "description": "Interactive authorization steps (a presentation or a web flow) that the wallet completes, in order, before the credential is issued.",
20703
20452
  "anyOf": [
20704
20453
  {
20705
- "type": "integer",
20706
- "minimum": 1,
20707
- "maximum": 9007199254740991
20454
+ "type": "array",
20455
+ "items": {
20456
+ "oneOf": [
20457
+ {
20458
+ "type": "object",
20459
+ "properties": {
20460
+ "type": {
20461
+ "type": "string",
20462
+ "const": "openid4vp_presentation",
20463
+ "description": "Trigger an OpenID4VP presentation action."
20464
+ },
20465
+ "label": {
20466
+ "description": "Optional UI label for the action.",
20467
+ "type": "string"
20468
+ },
20469
+ "presentationConfigId": {
20470
+ "type": "string",
20471
+ "minLength": 1,
20472
+ "description": "Presentation configuration id to execute."
20473
+ }
20474
+ },
20475
+ "required": [
20476
+ "type",
20477
+ "presentationConfigId"
20478
+ ],
20479
+ "additionalProperties": false
20480
+ },
20481
+ {
20482
+ "type": "object",
20483
+ "properties": {
20484
+ "type": {
20485
+ "type": "string",
20486
+ "const": "redirect_to_web",
20487
+ "description": "Trigger a redirect-to-web action."
20488
+ },
20489
+ "label": {
20490
+ "description": "Optional UI label for the action.",
20491
+ "type": "string"
20492
+ },
20493
+ "url": {
20494
+ "type": "string",
20495
+ "format": "uri",
20496
+ "description": "Destination URL for the redirect action."
20497
+ },
20498
+ "callbackUrl": {
20499
+ "description": "Optional callback URL after redirect completion.",
20500
+ "type": "string",
20501
+ "format": "uri"
20502
+ },
20503
+ "description": {
20504
+ "description": "Optional action description.",
20505
+ "type": "string"
20506
+ }
20507
+ },
20508
+ "required": [
20509
+ "type",
20510
+ "url"
20511
+ ],
20512
+ "additionalProperties": false
20513
+ }
20514
+ ],
20515
+ "description": "In-app experience action definitions."
20516
+ }
20708
20517
  },
20709
20518
  {
20710
20519
  "type": "null"
20711
20520
  }
20712
20521
  ]
20713
20522
  },
20714
- "offerLifetimeSeconds": {
20715
- "description": "Default lifetime of credential offers in seconds. Can be overridden per offer request. Null or unset: offers do not expire.",
20523
+ "sdJwtTrustFormat": {
20524
+ "description": "Trust format used for SD-JWT verification metadata.",
20716
20525
  "anyOf": [
20717
20526
  {
20718
- "type": "integer",
20719
- "minimum": 1,
20720
- "maximum": 9007199254740991
20527
+ "type": "string",
20528
+ "enum": [
20529
+ "x5c",
20530
+ "federation"
20531
+ ]
20721
20532
  },
20722
20533
  {
20723
20534
  "type": "null"
20724
20535
  }
20725
20536
  ]
20726
- }
20727
- },
20728
- "required": [
20729
- "authorizationServers"
20730
- ],
20731
- "additionalProperties": false,
20732
- "title": "IssuanceConfig"
20733
- }
20734
- }
20735
- },
20736
- {
20737
- "$schema": "https://json-schema.org/draft/2020-12/schema",
20738
- "$id": "https://eudiplo.dev/schemas/v2/PresentationConfigFile.schema.json",
20739
- "title": "PresentationConfigFile",
20740
- "type": "object",
20741
- "properties": {
20742
- "$schema": {
20743
- "type": "string",
20744
- "const": "https://eudiplo.dev/schemas/v2/PresentationConfigFile.schema.json"
20745
- },
20746
- "metadata": {
20747
- "type": "object",
20748
- "properties": {
20749
- "generation": {
20750
- "type": "integer",
20751
- "minimum": 1,
20752
- "description": "Monotonically increasing configuration generation."
20753
- },
20754
- "ownership": {
20755
- "type": "string",
20756
- "enum": [
20757
- "unmanaged",
20758
- "file-managed"
20759
- ],
20760
- "description": "Requested ownership recorded when the document is applied."
20761
- }
20762
- },
20763
- "additionalProperties": false
20764
- },
20765
- "spec": {
20766
- "allOf": [
20767
- {
20768
- "$ref": "#/$defs/PresentationConfigCreateDto"
20769
- },
20770
- {
20771
- "type": "object",
20772
- "required": [
20773
- "id"
20774
- ],
20775
- "properties": {
20776
- "id": {
20777
- "type": "string",
20778
- "minLength": 1
20779
- }
20780
- }
20781
- }
20782
- ]
20783
- }
20784
- },
20785
- "required": [
20786
- "$schema",
20787
- "spec"
20788
- ],
20789
- "additionalProperties": false,
20790
- "$defs": {
20791
- "PresentationConfigCreateDto": {
20792
- "type": "object",
20793
- "properties": {
20794
- "id": {
20795
- "type": "string",
20796
- "minLength": 1,
20797
- "description": "Presentation configuration identifier."
20798
- },
20799
- "description": {
20800
- "description": "Optional presentation configuration description.",
20801
- "type": [
20802
- "string",
20803
- "null"
20804
- ]
20805
20537
  },
20806
20538
  "lifeTime": {
20807
- "description": "Presentation request lifetime in seconds.",
20539
+ "description": "Credential lifetime in seconds.",
20808
20540
  "type": "integer",
20809
20541
  "minimum": 1,
20810
20542
  "maximum": 9007199254740991
20811
20543
  },
20812
- "skewSeconds": {
20813
- "description": "Clock skew tolerance in seconds.",
20814
- "type": "integer",
20815
- "minimum": 0,
20816
- "maximum": 9007199254740991
20817
- },
20818
- "statusCheckMode": {
20819
- "description": "Revocation/status check mode.",
20820
- "type": "string",
20821
- "enum": [
20822
- "strict",
20823
- "best_effort",
20824
- "disabled"
20825
- ]
20826
- },
20827
- "dcql_query": {
20828
- "type": "object",
20829
- "properties": {
20830
- "credentials": {
20831
- "minItems": 1,
20832
- "type": "array",
20833
- "items": {
20834
- "oneOf": [
20835
- {
20544
+ "schemaMeta": {
20545
+ "description": "Optional schema metadata and trust bindings.",
20546
+ "anyOf": [
20547
+ {
20548
+ "type": "object",
20549
+ "properties": {
20550
+ "id": {
20551
+ "description": "Optional schema metadata identifier.",
20552
+ "type": "string"
20553
+ },
20554
+ "name": {
20555
+ "description": "Optional schema metadata name.",
20556
+ "type": "string"
20557
+ },
20558
+ "version": {
20559
+ "type": "string",
20560
+ "description": "Schema metadata version."
20561
+ },
20562
+ "rulebookURI": {
20563
+ "description": "Optional rulebook URI reference.",
20564
+ "type": "string"
20565
+ },
20566
+ "attestationLoS": {
20567
+ "type": "string",
20568
+ "enum": [
20569
+ "iso_18045_high",
20570
+ "iso_18045_moderate",
20571
+ "iso_18045_enhanced-basic",
20572
+ "iso_18045_basic"
20573
+ ],
20574
+ "description": "Assurance level for attestation requirements."
20575
+ },
20576
+ "bindingType": {
20577
+ "type": "string",
20578
+ "enum": [
20579
+ "claim",
20580
+ "key",
20581
+ "biometric",
20582
+ "none"
20583
+ ],
20584
+ "description": "Subject binding type."
20585
+ },
20586
+ "schemaURIs": {
20587
+ "description": "Optional schema URI entries.",
20588
+ "type": "array",
20589
+ "items": {
20836
20590
  "type": "object",
20837
20591
  "properties": {
20838
- "id": {
20839
- "type": "string",
20840
- "minLength": 1,
20841
- "pattern": "^[A-Za-z0-9_-]+$",
20842
- "description": "Credential query identifier."
20592
+ "credentialConfigId": {
20593
+ "description": "Optional credential configuration id this schema URI applies to.",
20594
+ "type": "string"
20843
20595
  },
20844
- "multiple": {
20845
- "description": "Allow multiple matching credentials.",
20846
- "type": "boolean"
20596
+ "format": {
20597
+ "description": "Optional credential format for this schema URI.",
20598
+ "type": "string"
20847
20599
  },
20848
- "claim_sets": {
20849
- "description": "Optional claim set constraints.",
20850
- "type": "array",
20851
- "items": {
20852
- "type": "array",
20600
+ "uri": {
20601
+ "description": "Schema URI reference.",
20602
+ "type": "string"
20603
+ },
20604
+ "meta": {
20605
+ "description": "Optional metadata attached to the schema URI.",
20606
+ "type": "object",
20607
+ "propertyNames": {
20608
+ "type": "string"
20609
+ },
20610
+ "additionalProperties": {}
20611
+ }
20612
+ },
20613
+ "additionalProperties": false
20614
+ }
20615
+ },
20616
+ "trustedAuthorities": {
20617
+ "description": "Optional trusted authority entries.",
20618
+ "type": "array",
20619
+ "items": {
20620
+ "type": "object",
20621
+ "properties": {
20622
+ "trustListId": {
20623
+ "description": "Optional trust list id.",
20624
+ "type": "string"
20625
+ },
20626
+ "frameworkType": {
20627
+ "description": "Trust framework type. `x509` takes a root certificate in `value` and no `verificationMethod`.",
20628
+ "type": "string",
20629
+ "enum": [
20630
+ "aki",
20631
+ "etsi_tl",
20632
+ "openid_federation",
20633
+ "x509"
20634
+ ]
20635
+ },
20636
+ "value": {
20637
+ "description": "Framework-specific authority value, for example the trust list URL for `etsi_tl` or the root certificate (base64 DER or PEM) for `x509`.",
20638
+ "type": "string"
20639
+ },
20640
+ "verificationMethod": {
20641
+ "description": "Verification method descriptor.",
20642
+ "anyOf": [
20643
+ {
20644
+ "type": "object",
20645
+ "propertyNames": {
20646
+ "type": "string"
20647
+ },
20648
+ "additionalProperties": {}
20649
+ },
20650
+ {
20651
+ "type": "string"
20652
+ }
20653
+ ]
20654
+ }
20655
+ },
20656
+ "additionalProperties": false
20657
+ }
20658
+ }
20659
+ },
20660
+ "required": [
20661
+ "version",
20662
+ "attestationLoS",
20663
+ "bindingType"
20664
+ ],
20665
+ "additionalProperties": false
20666
+ },
20667
+ {
20668
+ "type": "null"
20669
+ }
20670
+ ]
20671
+ },
20672
+ "embeddedDisclosurePolicy": {
20673
+ "description": "Optional embedded disclosure policy.",
20674
+ "anyOf": [
20675
+ {
20676
+ "oneOf": [
20677
+ {
20678
+ "type": "object",
20679
+ "properties": {
20680
+ "policy": {
20681
+ "type": "string",
20682
+ "const": "attestationBased",
20683
+ "description": "Attestation-based policy discriminator."
20684
+ },
20685
+ "values": {
20686
+ "type": "array",
20687
+ "items": {
20688
+ "type": "object",
20689
+ "properties": {
20690
+ "claims": {
20691
+ "description": "Claims constraints considered by policy evaluation.",
20692
+ "type": "array",
20693
+ "items": {}
20694
+ },
20695
+ "credentials": {
20696
+ "type": "array",
20697
+ "items": {},
20698
+ "description": "Credential constraints considered by policy evaluation."
20699
+ },
20700
+ "credential_sets": {
20701
+ "description": "Optional credential set constraints.",
20702
+ "type": "array",
20703
+ "items": {}
20704
+ }
20705
+ },
20706
+ "required": [
20707
+ "credentials"
20708
+ ],
20709
+ "additionalProperties": false
20710
+ },
20711
+ "description": "Attestation requirements used for policy enforcement."
20712
+ }
20713
+ },
20714
+ "required": [
20715
+ "policy",
20716
+ "values"
20717
+ ],
20718
+ "additionalProperties": false
20719
+ },
20720
+ {
20721
+ "type": "object",
20722
+ "properties": {
20723
+ "policy": {
20724
+ "type": "string",
20725
+ "const": "none",
20726
+ "description": "No disclosure policy enforcement."
20727
+ }
20728
+ },
20729
+ "required": [
20730
+ "policy"
20731
+ ],
20732
+ "additionalProperties": false
20733
+ },
20734
+ {
20735
+ "type": "object",
20736
+ "properties": {
20737
+ "policy": {
20738
+ "type": "string",
20739
+ "const": "allowList",
20740
+ "description": "Allow-list based policy discriminator."
20741
+ },
20742
+ "values": {
20743
+ "type": "array",
20744
+ "items": {
20745
+ "type": "string"
20746
+ },
20747
+ "description": "Allowed values for policy checks."
20748
+ }
20749
+ },
20750
+ "required": [
20751
+ "policy",
20752
+ "values"
20753
+ ],
20754
+ "additionalProperties": false
20755
+ },
20756
+ {
20757
+ "type": "object",
20758
+ "properties": {
20759
+ "policy": {
20760
+ "type": "string",
20761
+ "const": "rootOfTrust",
20762
+ "description": "Root-of-trust policy discriminator."
20763
+ },
20764
+ "values": {
20765
+ "type": "string",
20766
+ "description": "Root-of-trust identifier or reference."
20767
+ }
20768
+ },
20769
+ "required": [
20770
+ "policy",
20771
+ "values"
20772
+ ],
20773
+ "additionalProperties": false
20774
+ }
20775
+ ],
20776
+ "description": "Embedded disclosure policy configuration."
20777
+ },
20778
+ {
20779
+ "type": "null"
20780
+ }
20781
+ ]
20782
+ }
20783
+ },
20784
+ "required": [
20785
+ "id",
20786
+ "config",
20787
+ "fields"
20788
+ ],
20789
+ "additionalProperties": false,
20790
+ "description": "Payload for creating credential issuance configuration.",
20791
+ "$defs": {
20792
+ "__schema0": {
20793
+ "type": "object",
20794
+ "properties": {
20795
+ "path": {
20796
+ "type": "array",
20797
+ "items": {
20798
+ "type": [
20799
+ "string",
20800
+ "number",
20801
+ "null"
20802
+ ]
20803
+ },
20804
+ "description": "Path to this claim inside the credential payload."
20805
+ },
20806
+ "type": {
20807
+ "type": "string",
20808
+ "enum": [
20809
+ "string",
20810
+ "number",
20811
+ "integer",
20812
+ "boolean",
20813
+ "object",
20814
+ "array"
20815
+ ],
20816
+ "description": "Data type of the claim value."
20817
+ },
20818
+ "defaultValue": {
20819
+ "description": "Optional default value for this field."
20820
+ },
20821
+ "mandatory": {
20822
+ "description": "Whether the field is required at issuance time.",
20823
+ "type": "boolean"
20824
+ },
20825
+ "disclosable": {
20826
+ "description": "Whether the claim is selectively disclosable.",
20827
+ "type": "boolean"
20828
+ },
20829
+ "namespace": {
20830
+ "description": "Optional namespace for claim grouping.",
20831
+ "type": "string"
20832
+ },
20833
+ "display": {
20834
+ "description": "Localized display metadata for this field.",
20835
+ "type": "array",
20836
+ "items": {
20837
+ "type": "object",
20838
+ "properties": {
20839
+ "locale": {
20840
+ "type": "string",
20841
+ "minLength": 1,
20842
+ "description": "Locale tag for the display entry."
20843
+ },
20844
+ "name": {
20845
+ "type": "string",
20846
+ "minLength": 1,
20847
+ "description": "Human-readable field name."
20848
+ },
20849
+ "description": {
20850
+ "description": "Optional field description for this locale.",
20851
+ "type": "string"
20852
+ }
20853
+ },
20854
+ "required": [
20855
+ "locale",
20856
+ "name"
20857
+ ],
20858
+ "additionalProperties": false
20859
+ }
20860
+ },
20861
+ "constraints": {
20862
+ "description": "Optional validation constraints for the claim value.",
20863
+ "type": "object",
20864
+ "propertyNames": {
20865
+ "type": "string"
20866
+ },
20867
+ "additionalProperties": {}
20868
+ },
20869
+ "children": {
20870
+ "description": "Nested child claim definitions for object or array fields.",
20871
+ "type": "array",
20872
+ "items": {
20873
+ "$ref": "#/$defs/CredentialConfigCreate/$defs/__schema0"
20874
+ }
20875
+ }
20876
+ },
20877
+ "required": [
20878
+ "path",
20879
+ "type"
20880
+ ],
20881
+ "additionalProperties": false
20882
+ }
20883
+ },
20884
+ "title": "CredentialConfigCreate"
20885
+ }
20886
+ }
20887
+ },
20888
+ {
20889
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
20890
+ "$id": "https://eudiplo.dev/schemas/v2/IssuanceConfigFile.schema.json",
20891
+ "title": "IssuanceConfigFile",
20892
+ "type": "object",
20893
+ "properties": {
20894
+ "$schema": {
20895
+ "type": "string",
20896
+ "const": "https://eudiplo.dev/schemas/v2/IssuanceConfigFile.schema.json"
20897
+ },
20898
+ "metadata": {
20899
+ "type": "object",
20900
+ "properties": {
20901
+ "generation": {
20902
+ "type": "integer",
20903
+ "minimum": 1,
20904
+ "description": "Monotonically increasing configuration generation."
20905
+ },
20906
+ "ownership": {
20907
+ "type": "string",
20908
+ "enum": [
20909
+ "unmanaged",
20910
+ "file-managed"
20911
+ ],
20912
+ "description": "Requested ownership recorded when the document is applied."
20913
+ }
20914
+ },
20915
+ "additionalProperties": false
20916
+ },
20917
+ "spec": {
20918
+ "$ref": "#/$defs/IssuanceConfig"
20919
+ }
20920
+ },
20921
+ "required": [
20922
+ "$schema",
20923
+ "spec"
20924
+ ],
20925
+ "additionalProperties": false,
20926
+ "$defs": {
20927
+ "IssuanceConfig": {
20928
+ "type": "object",
20929
+ "properties": {
20930
+ "batchSize": {
20931
+ "description": "Optional issuance batch size.",
20932
+ "type": "integer",
20933
+ "minimum": 1,
20934
+ "maximum": 9007199254740991
20935
+ },
20936
+ "dPopRequired": {
20937
+ "description": "Require DPoP proofs for issuance endpoints.",
20938
+ "type": "boolean"
20939
+ },
20940
+ "walletAttestationRequired": {
20941
+ "description": "Default wallet attestation requirement for managed authorization servers.",
20942
+ "type": "boolean"
20943
+ },
20944
+ "walletProviderTrustLists": {
20945
+ "description": "Shared wallet provider trust lists for key attestations and default authorization server wallet authentication.",
20946
+ "type": "array",
20947
+ "items": {
20948
+ "type": "object",
20949
+ "properties": {
20950
+ "trustListId": {
20951
+ "type": "string",
20952
+ "minLength": 1
20953
+ },
20954
+ "url": {
20955
+ "description": "URL of the wallet provider trust list.",
20956
+ "type": "string",
20957
+ "format": "uri"
20958
+ },
20959
+ "verifierKey": {
20960
+ "description": "Optional verifier key material used for trust list verification.",
20961
+ "type": "object",
20962
+ "propertyNames": {
20963
+ "type": "string"
20964
+ },
20965
+ "additionalProperties": {}
20966
+ },
20967
+ "verifierX509Der": {
20968
+ "description": "Optional verifier certificate in DER/base64 form.",
20969
+ "type": "string"
20970
+ }
20971
+ },
20972
+ "additionalProperties": false
20973
+ }
20974
+ },
20975
+ "signingKeyId": {
20976
+ "description": "Default signing key chain id for credential issuance.",
20977
+ "type": "string",
20978
+ "minLength": 1
20979
+ },
20980
+ "authorizationServers": {
20981
+ "minItems": 1,
20982
+ "type": "array",
20983
+ "items": {
20984
+ "oneOf": [
20985
+ {
20986
+ "type": "object",
20987
+ "properties": {
20988
+ "type": {
20989
+ "type": "string",
20990
+ "const": "external",
20991
+ "description": "Use an externally managed authorization server."
20992
+ },
20993
+ "id": {
20994
+ "type": "string",
20995
+ "minLength": 1,
20996
+ "description": "Authorization server identifier."
20997
+ },
20998
+ "issuer": {
20999
+ "type": "string",
21000
+ "format": "uri",
21001
+ "description": "Issuer URL for the external authorization server."
21002
+ },
21003
+ "sessionBinding": {
21004
+ "description": "Explicit mapping from an external access-token claim to an existing issuance session.",
21005
+ "type": "object",
21006
+ "properties": {
21007
+ "method": {
21008
+ "type": "string",
21009
+ "const": "access_token_claim",
21010
+ "description": "Read the correlation value from a configured access-token claim."
21011
+ },
21012
+ "claim": {
21013
+ "type": "string",
21014
+ "minLength": 1,
21015
+ "description": "Claim name that contains the issuance-session correlation value."
21016
+ }
21017
+ },
21018
+ "required": [
21019
+ "method",
21020
+ "claim"
21021
+ ],
21022
+ "additionalProperties": false
21023
+ },
21024
+ "label": {
21025
+ "description": "Optional display label for UI selection.",
21026
+ "type": "string"
21027
+ },
21028
+ "enabled": {
21029
+ "description": "Whether this authorization server entry is enabled.",
21030
+ "type": "boolean"
21031
+ }
21032
+ },
21033
+ "required": [
21034
+ "type",
21035
+ "id",
21036
+ "issuer"
21037
+ ],
21038
+ "additionalProperties": false
21039
+ },
21040
+ {
21041
+ "type": "object",
21042
+ "properties": {
21043
+ "type": {
21044
+ "type": "string",
21045
+ "const": "oid4vp",
21046
+ "description": "Use OID4VP-based authorization server chaining."
21047
+ },
21048
+ "id": {
21049
+ "type": "string",
21050
+ "minLength": 1,
21051
+ "description": "Authorization server identifier."
21052
+ },
21053
+ "presentationConfigId": {
21054
+ "type": "string",
21055
+ "minLength": 1,
21056
+ "description": "Presentation configuration id used during authorization."
21057
+ },
21058
+ "immediateWalletRedirect": {
21059
+ "description": "Redirect wallets immediately after authorization response creation.",
21060
+ "type": "boolean"
21061
+ },
21062
+ "token": {
21063
+ "description": "Optional token issuance settings.",
21064
+ "type": "object",
21065
+ "properties": {
21066
+ "lifetimeSeconds": {
21067
+ "description": "Access token lifetime in seconds.",
21068
+ "type": "number",
21069
+ "minimum": 60
21070
+ },
21071
+ "signingKeyId": {
21072
+ "description": "Optional key chain id used to sign issued tokens.",
21073
+ "type": "string",
21074
+ "minLength": 1
21075
+ },
21076
+ "refreshTokenEnabled": {
21077
+ "description": "Enable issuing refresh tokens.",
21078
+ "type": "boolean"
21079
+ },
21080
+ "refreshTokenExpiresInSeconds": {
21081
+ "description": "Refresh token lifetime in seconds.",
21082
+ "type": "number",
21083
+ "minimum": 60
21084
+ }
21085
+ },
21086
+ "additionalProperties": false
21087
+ },
21088
+ "requireDPoP": {
21089
+ "description": "Require DPoP proofs for token/credential requests.",
21090
+ "type": "boolean"
21091
+ },
21092
+ "walletAttestationRequired": {
21093
+ "description": "Require wallet attestation for this authorization server.",
21094
+ "type": "boolean"
21095
+ },
21096
+ "walletProviderTrustLists": {
21097
+ "description": "Optional wallet provider trust list references for this authorization server.",
21098
+ "type": "array",
21099
+ "items": {
21100
+ "type": "object",
21101
+ "properties": {
21102
+ "trustListId": {
21103
+ "type": "string",
21104
+ "minLength": 1
21105
+ },
21106
+ "url": {
21107
+ "description": "URL of the wallet provider trust list.",
21108
+ "type": "string",
21109
+ "format": "uri"
21110
+ },
21111
+ "verifierKey": {
21112
+ "description": "Optional verifier key material used for trust list verification.",
21113
+ "type": "object",
21114
+ "propertyNames": {
21115
+ "type": "string"
21116
+ },
21117
+ "additionalProperties": {}
21118
+ },
21119
+ "verifierX509Der": {
21120
+ "description": "Optional verifier certificate in DER/base64 form.",
21121
+ "type": "string"
21122
+ }
21123
+ },
21124
+ "additionalProperties": false
21125
+ }
21126
+ },
21127
+ "label": {
21128
+ "description": "Optional display label for UI selection.",
21129
+ "type": "string"
21130
+ },
21131
+ "enabled": {
21132
+ "description": "Whether this authorization server entry is enabled.",
21133
+ "type": "boolean"
21134
+ }
21135
+ },
21136
+ "required": [
21137
+ "type",
21138
+ "id",
21139
+ "presentationConfigId"
21140
+ ],
21141
+ "additionalProperties": false
21142
+ },
21143
+ {
21144
+ "type": "object",
21145
+ "properties": {
21146
+ "type": {
21147
+ "type": "string",
21148
+ "const": "chained",
21149
+ "description": "Use upstream OIDC as authorization source."
21150
+ },
21151
+ "id": {
21152
+ "type": "string",
21153
+ "minLength": 1,
21154
+ "description": "Authorization server identifier."
21155
+ },
21156
+ "upstream": {
21157
+ "type": "object",
21158
+ "properties": {
21159
+ "issuer": {
21160
+ "type": "string",
21161
+ "format": "uri",
21162
+ "description": "Upstream OIDC issuer URL."
21163
+ },
21164
+ "clientId": {
21165
+ "type": "string",
21166
+ "minLength": 1,
21167
+ "description": "Client id for upstream OIDC authentication."
21168
+ },
21169
+ "clientSecret": {
21170
+ "description": "Optional client secret for upstream OIDC authentication.",
21171
+ "type": "string",
21172
+ "minLength": 1
21173
+ },
21174
+ "scopes": {
21175
+ "description": "Optional scopes requested from the upstream issuer.",
21176
+ "type": "array",
21177
+ "items": {
21178
+ "type": "string",
21179
+ "minLength": 1
21180
+ }
21181
+ }
21182
+ },
21183
+ "required": [
21184
+ "issuer",
21185
+ "clientId"
21186
+ ],
21187
+ "additionalProperties": false,
21188
+ "description": "Upstream OIDC connection settings."
21189
+ },
21190
+ "token": {
21191
+ "description": "Optional token issuance settings.",
21192
+ "type": "object",
21193
+ "properties": {
21194
+ "lifetimeSeconds": {
21195
+ "description": "Access token lifetime in seconds.",
21196
+ "type": "number",
21197
+ "minimum": 60
21198
+ },
21199
+ "signingKeyId": {
21200
+ "description": "Optional key chain id used to sign issued tokens.",
21201
+ "type": "string",
21202
+ "minLength": 1
21203
+ },
21204
+ "refreshTokenEnabled": {
21205
+ "description": "Enable issuing refresh tokens.",
21206
+ "type": "boolean"
21207
+ },
21208
+ "refreshTokenExpiresInSeconds": {
21209
+ "description": "Refresh token lifetime in seconds.",
21210
+ "type": "number",
21211
+ "minimum": 60
21212
+ }
21213
+ },
21214
+ "additionalProperties": false
21215
+ },
21216
+ "requireDPoP": {
21217
+ "description": "Require DPoP proofs for token/credential requests.",
21218
+ "type": "boolean"
21219
+ },
21220
+ "walletAttestationRequired": {
21221
+ "description": "Require wallet attestation for this authorization server.",
21222
+ "type": "boolean"
21223
+ },
21224
+ "walletProviderTrustLists": {
21225
+ "description": "Optional wallet provider trust list references for this authorization server.",
21226
+ "type": "array",
21227
+ "items": {
21228
+ "type": "object",
21229
+ "properties": {
21230
+ "trustListId": {
21231
+ "type": "string",
21232
+ "minLength": 1
21233
+ },
21234
+ "url": {
21235
+ "description": "URL of the wallet provider trust list.",
21236
+ "type": "string",
21237
+ "format": "uri"
21238
+ },
21239
+ "verifierKey": {
21240
+ "description": "Optional verifier key material used for trust list verification.",
21241
+ "type": "object",
21242
+ "propertyNames": {
21243
+ "type": "string"
21244
+ },
21245
+ "additionalProperties": {}
21246
+ },
21247
+ "verifierX509Der": {
21248
+ "description": "Optional verifier certificate in DER/base64 form.",
21249
+ "type": "string"
21250
+ }
21251
+ },
21252
+ "additionalProperties": false
21253
+ }
21254
+ },
21255
+ "label": {
21256
+ "description": "Optional display label for UI selection.",
21257
+ "type": "string"
21258
+ },
21259
+ "enabled": {
21260
+ "description": "Whether this authorization server entry is enabled.",
21261
+ "type": "boolean"
21262
+ }
21263
+ },
21264
+ "required": [
21265
+ "type",
21266
+ "id",
21267
+ "upstream"
21268
+ ],
21269
+ "additionalProperties": false
21270
+ },
21271
+ {
21272
+ "type": "object",
21273
+ "properties": {
21274
+ "type": {
21275
+ "type": "string",
21276
+ "const": "built-in",
21277
+ "description": "Use EUDIPLO built-in authorization server."
21278
+ },
21279
+ "id": {
21280
+ "type": "string",
21281
+ "minLength": 1,
21282
+ "description": "Authorization server identifier."
21283
+ },
21284
+ "token": {
21285
+ "description": "Optional token issuance settings.",
21286
+ "type": "object",
21287
+ "properties": {
21288
+ "lifetimeSeconds": {
21289
+ "description": "Access token lifetime in seconds.",
21290
+ "type": "number",
21291
+ "minimum": 60
21292
+ },
21293
+ "signingKeyId": {
21294
+ "description": "Optional key chain id used to sign issued tokens.",
21295
+ "type": "string",
21296
+ "minLength": 1
21297
+ },
21298
+ "refreshTokenEnabled": {
21299
+ "description": "Enable issuing refresh tokens.",
21300
+ "type": "boolean"
21301
+ },
21302
+ "refreshTokenExpiresInSeconds": {
21303
+ "description": "Refresh token lifetime in seconds.",
21304
+ "type": "number",
21305
+ "minimum": 60
21306
+ }
21307
+ },
21308
+ "additionalProperties": false
21309
+ },
21310
+ "requireDPoP": {
21311
+ "description": "Require DPoP proofs for token/credential requests.",
21312
+ "type": "boolean"
21313
+ },
21314
+ "walletAttestationRequired": {
21315
+ "description": "Require wallet attestation for this authorization server.",
21316
+ "type": "boolean"
21317
+ },
21318
+ "walletProviderTrustLists": {
21319
+ "description": "Optional wallet provider trust list references for this authorization server.",
21320
+ "type": "array",
21321
+ "items": {
21322
+ "type": "object",
21323
+ "properties": {
21324
+ "trustListId": {
21325
+ "type": "string",
21326
+ "minLength": 1
21327
+ },
21328
+ "url": {
21329
+ "description": "URL of the wallet provider trust list.",
21330
+ "type": "string",
21331
+ "format": "uri"
21332
+ },
21333
+ "verifierKey": {
21334
+ "description": "Optional verifier key material used for trust list verification.",
21335
+ "type": "object",
21336
+ "propertyNames": {
21337
+ "type": "string"
21338
+ },
21339
+ "additionalProperties": {}
21340
+ },
21341
+ "verifierX509Der": {
21342
+ "description": "Optional verifier certificate in DER/base64 form.",
21343
+ "type": "string"
21344
+ }
21345
+ },
21346
+ "additionalProperties": false
21347
+ }
21348
+ },
21349
+ "label": {
21350
+ "description": "Optional display label for UI selection.",
21351
+ "type": "string"
21352
+ },
21353
+ "enabled": {
21354
+ "description": "Whether this authorization server entry is enabled.",
21355
+ "type": "boolean"
21356
+ }
21357
+ },
21358
+ "required": [
21359
+ "type",
21360
+ "id"
21361
+ ],
21362
+ "additionalProperties": false
21363
+ }
21364
+ ],
21365
+ "description": "Supported authorization server configurations."
21366
+ },
21367
+ "description": "Configured authorization server entries."
21368
+ },
21369
+ "federation": {
21370
+ "description": "Optional OpenID Federation settings.",
21371
+ "anyOf": [
21372
+ {
21373
+ "type": "object",
21374
+ "properties": {
21375
+ "role": {
21376
+ "description": "Federation role for this issuer.",
21377
+ "type": "string",
21378
+ "enum": [
21379
+ "trust_anchor",
21380
+ "intermediate",
21381
+ "leaf"
21382
+ ]
21383
+ },
21384
+ "mode": {
21385
+ "description": "Federation operation mode.",
21386
+ "type": "string",
21387
+ "enum": [
21388
+ "federation-only",
21389
+ "hybrid"
21390
+ ]
21391
+ },
21392
+ "entityId": {
21393
+ "description": "Optional local federation entity id.",
21394
+ "type": "string"
21395
+ },
21396
+ "enforceSigningPolicy": {
21397
+ "description": "Enforce strict signing policy checks.",
21398
+ "type": "boolean"
21399
+ },
21400
+ "cacheTtlSeconds": {
21401
+ "description": "Cache time-to-live for federation metadata in seconds.",
21402
+ "type": "integer",
21403
+ "minimum": 1,
21404
+ "maximum": 9007199254740991
21405
+ },
21406
+ "trustAnchors": {
21407
+ "type": "array",
21408
+ "items": {
21409
+ "type": "object",
21410
+ "properties": {
21411
+ "entityId": {
21412
+ "type": "string",
21413
+ "minLength": 1,
21414
+ "description": "Federation trust anchor entity id."
21415
+ },
21416
+ "entityConfigurationUri": {
21417
+ "type": "string",
21418
+ "format": "uri",
21419
+ "description": "Entity configuration URI for the trust anchor."
21420
+ }
21421
+ },
21422
+ "required": [
21423
+ "entityId",
21424
+ "entityConfigurationUri"
21425
+ ],
21426
+ "additionalProperties": false
21427
+ },
21428
+ "description": "Federation trust anchors."
21429
+ }
21430
+ },
21431
+ "required": [
21432
+ "trustAnchors"
21433
+ ],
21434
+ "additionalProperties": false
21435
+ },
21436
+ {
21437
+ "type": "null"
21438
+ }
21439
+ ]
21440
+ },
21441
+ "registrationCertificate": {
21442
+ "description": "Optional registration certificate settings.",
21443
+ "anyOf": [
21444
+ {
21445
+ "type": "object",
21446
+ "properties": {
21447
+ "enabled": {
21448
+ "description": "Enable issuer registration certificate support.",
21449
+ "type": "boolean"
21450
+ },
21451
+ "mode": {
21452
+ "description": "How registration certificate data is provided.",
21453
+ "type": "string",
21454
+ "enum": [
21455
+ "import",
21456
+ "generate"
21457
+ ]
21458
+ },
21459
+ "jwt": {
21460
+ "description": "Optional registration certificate JWT when using import mode.",
21461
+ "type": "string"
21462
+ },
21463
+ "privacyPolicy": {
21464
+ "description": "Optional privacy policy URI.",
21465
+ "type": "string"
21466
+ },
21467
+ "supportUri": {
21468
+ "description": "Optional support URI.",
21469
+ "type": "string"
21470
+ }
21471
+ },
21472
+ "additionalProperties": false
21473
+ },
21474
+ {
21475
+ "type": "null"
21476
+ }
21477
+ ]
21478
+ },
21479
+ "display": {
21480
+ "description": "Localized issuer metadata shown to wallets.",
21481
+ "type": "array",
21482
+ "items": {
21483
+ "type": "object",
21484
+ "properties": {
21485
+ "name": {
21486
+ "description": "Issuer display name.",
21487
+ "type": "string"
21488
+ },
21489
+ "locale": {
21490
+ "description": "Locale tag for this display entry.",
21491
+ "type": "string"
21492
+ },
21493
+ "logo": {
21494
+ "description": "Optional issuer logo metadata.",
21495
+ "type": "object",
21496
+ "properties": {
21497
+ "uri": {
21498
+ "type": "string",
21499
+ "minLength": 1,
21500
+ "description": "Logo URI."
21501
+ },
21502
+ "alt_text": {
21503
+ "description": "Optional localized alternative text.",
21504
+ "type": "string"
21505
+ }
21506
+ },
21507
+ "required": [
21508
+ "uri"
21509
+ ],
21510
+ "additionalProperties": {}
21511
+ }
21512
+ },
21513
+ "additionalProperties": {}
21514
+ }
21515
+ },
21516
+ "notificationEndpointEnabled": {
21517
+ "description": "Whether the OID4VCI notification endpoint is exposed for this issuance configuration.",
21518
+ "type": "boolean"
21519
+ },
21520
+ "credentialResponseEncryption": {
21521
+ "description": "Enable encrypted credential responses.",
21522
+ "type": "boolean"
21523
+ },
21524
+ "credentialRequestEncryption": {
21525
+ "description": "Require encrypted credential requests.",
21526
+ "type": "boolean"
21527
+ },
21528
+ "txCodeMaxAttempts": {
21529
+ "description": "Maximum verification attempts for transaction codes. Null resets to defaults.",
21530
+ "anyOf": [
21531
+ {
21532
+ "type": "integer",
21533
+ "minimum": 1,
21534
+ "maximum": 9007199254740991
21535
+ },
21536
+ {
21537
+ "type": "null"
21538
+ }
21539
+ ]
21540
+ },
21541
+ "offerLifetimeSeconds": {
21542
+ "description": "Default lifetime of credential offers in seconds. Can be overridden per offer request. Null or unset: offers do not expire.",
21543
+ "anyOf": [
21544
+ {
21545
+ "type": "integer",
21546
+ "minimum": 1,
21547
+ "maximum": 9007199254740991
21548
+ },
21549
+ {
21550
+ "type": "null"
21551
+ }
21552
+ ]
21553
+ }
21554
+ },
21555
+ "required": [
21556
+ "authorizationServers"
21557
+ ],
21558
+ "additionalProperties": false,
21559
+ "title": "IssuanceConfig"
21560
+ }
21561
+ }
21562
+ },
21563
+ {
21564
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
21565
+ "$id": "https://eudiplo.dev/schemas/v2/PresentationConfigFile.schema.json",
21566
+ "title": "PresentationConfigFile",
21567
+ "type": "object",
21568
+ "properties": {
21569
+ "$schema": {
21570
+ "type": "string",
21571
+ "const": "https://eudiplo.dev/schemas/v2/PresentationConfigFile.schema.json"
21572
+ },
21573
+ "metadata": {
21574
+ "type": "object",
21575
+ "properties": {
21576
+ "generation": {
21577
+ "type": "integer",
21578
+ "minimum": 1,
21579
+ "description": "Monotonically increasing configuration generation."
21580
+ },
21581
+ "ownership": {
21582
+ "type": "string",
21583
+ "enum": [
21584
+ "unmanaged",
21585
+ "file-managed"
21586
+ ],
21587
+ "description": "Requested ownership recorded when the document is applied."
21588
+ }
21589
+ },
21590
+ "additionalProperties": false
21591
+ },
21592
+ "spec": {
21593
+ "allOf": [
21594
+ {
21595
+ "$ref": "#/$defs/PresentationConfigCreateDto"
21596
+ },
21597
+ {
21598
+ "type": "object",
21599
+ "required": [
21600
+ "id"
21601
+ ],
21602
+ "properties": {
21603
+ "id": {
21604
+ "type": "string",
21605
+ "minLength": 1
21606
+ }
21607
+ }
21608
+ }
21609
+ ]
21610
+ }
21611
+ },
21612
+ "required": [
21613
+ "$schema",
21614
+ "spec"
21615
+ ],
21616
+ "additionalProperties": false,
21617
+ "$defs": {
21618
+ "PresentationConfigCreateDto": {
21619
+ "type": "object",
21620
+ "properties": {
21621
+ "id": {
21622
+ "type": "string",
21623
+ "minLength": 1,
21624
+ "description": "Presentation configuration identifier."
21625
+ },
21626
+ "description": {
21627
+ "description": "Optional presentation configuration description.",
21628
+ "type": [
21629
+ "string",
21630
+ "null"
21631
+ ]
21632
+ },
21633
+ "lifeTime": {
21634
+ "description": "Presentation request lifetime in seconds.",
21635
+ "type": "integer",
21636
+ "minimum": 1,
21637
+ "maximum": 9007199254740991
21638
+ },
21639
+ "skewSeconds": {
21640
+ "description": "Clock skew tolerance in seconds.",
21641
+ "type": "integer",
21642
+ "minimum": 0,
21643
+ "maximum": 9007199254740991
21644
+ },
21645
+ "statusCheckMode": {
21646
+ "description": "Revocation/status check mode.",
21647
+ "type": "string",
21648
+ "enum": [
21649
+ "strict",
21650
+ "best_effort",
21651
+ "disabled"
21652
+ ]
21653
+ },
21654
+ "dcql_query": {
21655
+ "type": "object",
21656
+ "properties": {
21657
+ "credentials": {
21658
+ "minItems": 1,
21659
+ "type": "array",
21660
+ "items": {
21661
+ "oneOf": [
21662
+ {
21663
+ "type": "object",
21664
+ "properties": {
21665
+ "id": {
21666
+ "type": "string",
21667
+ "minLength": 1,
21668
+ "pattern": "^[A-Za-z0-9_-]+$",
21669
+ "description": "Credential query identifier."
21670
+ },
21671
+ "multiple": {
21672
+ "description": "Allow multiple matching credentials.",
21673
+ "type": "boolean"
21674
+ },
21675
+ "claim_sets": {
21676
+ "description": "Optional claim set constraints.",
21677
+ "type": "array",
21678
+ "items": {
21679
+ "type": "array",
21680
+ "items": {
21681
+ "type": "string"
21682
+ }
21683
+ }
21684
+ },
21685
+ "trusted_authorities": {
21686
+ "description": "Optional trusted authority constraints.",
21687
+ "type": "array",
21688
+ "items": {
21689
+ "oneOf": [
21690
+ {
21691
+ "type": "object",
21692
+ "properties": {
21693
+ "type": {
21694
+ "type": "string",
21695
+ "const": "etsi_tl",
21696
+ "description": "Trusted authority type discriminator for ETSI trust lists."
21697
+ },
21698
+ "values": {
21699
+ "type": "array",
21700
+ "items": {
21701
+ "type": "object",
21702
+ "properties": {
21703
+ "trustListId": {
21704
+ "description": "Optional trust list id reference.",
21705
+ "type": "string"
21706
+ },
21707
+ "url": {
21708
+ "description": "Optional trust list URL reference.",
21709
+ "anyOf": [
21710
+ {
21711
+ "type": "string",
21712
+ "format": "uri"
21713
+ },
21714
+ {
21715
+ "type": "string",
21716
+ "pattern": "^<TENANT_URL>(?:\\/.*)?$"
21717
+ }
21718
+ ]
21719
+ },
21720
+ "verifierKey": {
21721
+ "description": "Optional verifier key material.",
21722
+ "type": "object",
21723
+ "propertyNames": {
21724
+ "type": "string"
21725
+ },
21726
+ "additionalProperties": {}
21727
+ },
21728
+ "verifierX509Der": {
21729
+ "description": "Optional verifier certificate in DER/base64 form.",
21730
+ "type": "string"
21731
+ }
21732
+ },
21733
+ "additionalProperties": false
21734
+ },
21735
+ "description": "Trust list references for ETSI TL verification."
21736
+ }
21737
+ },
21738
+ "required": [
21739
+ "type",
21740
+ "values"
21741
+ ],
21742
+ "additionalProperties": false
21743
+ },
21744
+ {
21745
+ "type": "object",
21746
+ "properties": {
21747
+ "type": {
21748
+ "type": "string",
21749
+ "const": "openid_federation",
21750
+ "description": "Trusted authority type discriminator for OpenID Federation."
21751
+ },
21752
+ "values": {
21753
+ "type": "array",
21754
+ "items": {
21755
+ "type": "string"
21756
+ },
21757
+ "description": "OpenID Federation authority identifiers."
21758
+ }
21759
+ },
21760
+ "required": [
21761
+ "type",
21762
+ "values"
21763
+ ],
21764
+ "additionalProperties": false
21765
+ }
21766
+ ]
21767
+ }
21768
+ },
21769
+ "format": {
21770
+ "type": "string",
21771
+ "const": "dc+sd-jwt",
21772
+ "description": "Credential format discriminator."
21773
+ },
21774
+ "meta": {
21775
+ "type": "object",
21776
+ "properties": {
21777
+ "vct_values": {
21778
+ "minItems": 1,
21779
+ "type": "array",
21780
+ "items": {
21781
+ "type": "string"
21782
+ },
21783
+ "description": "Accepted VCT values."
21784
+ }
21785
+ },
21786
+ "required": [
21787
+ "vct_values"
21788
+ ],
21789
+ "additionalProperties": false
21790
+ },
21791
+ "claims": {
21792
+ "description": "Optional claim-level constraints.",
21793
+ "type": "array",
21794
+ "items": {
21795
+ "type": "object",
21796
+ "properties": {
21797
+ "id": {
21798
+ "description": "Optional claim query id.",
21799
+ "type": "string"
21800
+ },
21801
+ "path": {
21802
+ "type": "array",
21803
+ "items": {
21804
+ "type": [
21805
+ "string",
21806
+ "number"
21807
+ ]
21808
+ },
21809
+ "description": "Path to the claim value in presented credentials."
21810
+ },
21811
+ "values": {
21812
+ "description": "Optional allowed values for the claim.",
21813
+ "type": "array",
21814
+ "items": {
21815
+ "type": "string"
21816
+ }
21817
+ }
21818
+ },
21819
+ "required": [
21820
+ "path"
21821
+ ],
21822
+ "additionalProperties": false
21823
+ }
21824
+ }
21825
+ },
21826
+ "required": [
21827
+ "id",
21828
+ "format",
21829
+ "meta"
21830
+ ],
21831
+ "additionalProperties": false
21832
+ },
21833
+ {
21834
+ "type": "object",
21835
+ "properties": {
21836
+ "id": {
21837
+ "type": "string",
21838
+ "minLength": 1,
21839
+ "pattern": "^[A-Za-z0-9_-]+$",
21840
+ "description": "Credential query identifier."
21841
+ },
21842
+ "multiple": {
21843
+ "description": "Allow multiple matching credentials.",
21844
+ "type": "boolean"
21845
+ },
21846
+ "claim_sets": {
21847
+ "description": "Optional claim set constraints.",
21848
+ "type": "array",
21849
+ "items": {
21850
+ "type": "array",
20853
21851
  "items": {
20854
21852
  "type": "string"
20855
- }
21853
+ }
21854
+ }
21855
+ },
21856
+ "trusted_authorities": {
21857
+ "description": "Optional trusted authority constraints.",
21858
+ "type": "array",
21859
+ "items": {
21860
+ "oneOf": [
21861
+ {
21862
+ "type": "object",
21863
+ "properties": {
21864
+ "type": {
21865
+ "type": "string",
21866
+ "const": "etsi_tl",
21867
+ "description": "Trusted authority type discriminator for ETSI trust lists."
21868
+ },
21869
+ "values": {
21870
+ "type": "array",
21871
+ "items": {
21872
+ "type": "object",
21873
+ "properties": {
21874
+ "trustListId": {
21875
+ "description": "Optional trust list id reference.",
21876
+ "type": "string"
21877
+ },
21878
+ "url": {
21879
+ "description": "Optional trust list URL reference.",
21880
+ "anyOf": [
21881
+ {
21882
+ "type": "string",
21883
+ "format": "uri"
21884
+ },
21885
+ {
21886
+ "type": "string",
21887
+ "pattern": "^<TENANT_URL>(?:\\/.*)?$"
21888
+ }
21889
+ ]
21890
+ },
21891
+ "verifierKey": {
21892
+ "description": "Optional verifier key material.",
21893
+ "type": "object",
21894
+ "propertyNames": {
21895
+ "type": "string"
21896
+ },
21897
+ "additionalProperties": {}
21898
+ },
21899
+ "verifierX509Der": {
21900
+ "description": "Optional verifier certificate in DER/base64 form.",
21901
+ "type": "string"
21902
+ }
21903
+ },
21904
+ "additionalProperties": false
21905
+ },
21906
+ "description": "Trust list references for ETSI TL verification."
21907
+ }
21908
+ },
21909
+ "required": [
21910
+ "type",
21911
+ "values"
21912
+ ],
21913
+ "additionalProperties": false
21914
+ },
21915
+ {
21916
+ "type": "object",
21917
+ "properties": {
21918
+ "type": {
21919
+ "type": "string",
21920
+ "const": "openid_federation",
21921
+ "description": "Trusted authority type discriminator for OpenID Federation."
21922
+ },
21923
+ "values": {
21924
+ "type": "array",
21925
+ "items": {
21926
+ "type": "string"
21927
+ },
21928
+ "description": "OpenID Federation authority identifiers."
21929
+ }
21930
+ },
21931
+ "required": [
21932
+ "type",
21933
+ "values"
21934
+ ],
21935
+ "additionalProperties": false
21936
+ }
21937
+ ]
21938
+ }
21939
+ },
21940
+ "format": {
21941
+ "type": "string",
21942
+ "const": "mso_mdoc",
21943
+ "description": "Credential format discriminator."
21944
+ },
21945
+ "meta": {
21946
+ "type": "object",
21947
+ "properties": {
21948
+ "doctype_value": {
21949
+ "type": "string",
21950
+ "minLength": 1,
21951
+ "description": "Expected mDoc doctype value."
21952
+ }
21953
+ },
21954
+ "required": [
21955
+ "doctype_value"
21956
+ ],
21957
+ "additionalProperties": false
21958
+ },
21959
+ "claims": {
21960
+ "description": "Optional mDoc claim-level constraints.",
21961
+ "type": "array",
21962
+ "items": {
21963
+ "type": "object",
21964
+ "properties": {
21965
+ "id": {
21966
+ "description": "Optional claim query id.",
21967
+ "type": "string"
21968
+ },
21969
+ "path": {
21970
+ "type": "array",
21971
+ "items": {
21972
+ "type": [
21973
+ "string",
21974
+ "number"
21975
+ ]
21976
+ },
21977
+ "description": "Path to the claim value in presented credentials."
21978
+ },
21979
+ "values": {
21980
+ "description": "Optional allowed values for the claim.",
21981
+ "type": "array",
21982
+ "items": {
21983
+ "type": "string"
21984
+ }
21985
+ },
21986
+ "intent_to_retain": {
21987
+ "description": "Whether relying party intends to retain the claim.",
21988
+ "type": "boolean"
21989
+ }
21990
+ },
21991
+ "required": [
21992
+ "path"
21993
+ ],
21994
+ "additionalProperties": false
21995
+ }
21996
+ }
21997
+ },
21998
+ "required": [
21999
+ "id",
22000
+ "format",
22001
+ "meta"
22002
+ ],
22003
+ "additionalProperties": false
22004
+ }
22005
+ ]
22006
+ },
22007
+ "description": "Credential queries requested by the verifier."
22008
+ },
22009
+ "credential_sets": {
22010
+ "description": "Optional higher-level credential set requirements.",
22011
+ "type": "array",
22012
+ "items": {
22013
+ "type": "object",
22014
+ "properties": {
22015
+ "options": {
22016
+ "minItems": 1,
22017
+ "type": "array",
22018
+ "items": {
22019
+ "minItems": 1,
22020
+ "type": "array",
22021
+ "items": {
22022
+ "type": "string"
22023
+ }
22024
+ },
22025
+ "description": "Alternative credential query id combinations."
22026
+ },
22027
+ "required": {
22028
+ "description": "Whether this credential set is mandatory.",
22029
+ "type": "boolean"
22030
+ }
22031
+ },
22032
+ "required": [
22033
+ "options"
22034
+ ],
22035
+ "additionalProperties": false
22036
+ }
22037
+ }
22038
+ },
22039
+ "required": [
22040
+ "credentials"
22041
+ ],
22042
+ "additionalProperties": false,
22043
+ "description": "DCQL query defining requested credentials and claims."
22044
+ },
22045
+ "transaction_data": {
22046
+ "description": "Optional transaction data descriptors.",
22047
+ "anyOf": [
22048
+ {
22049
+ "type": "array",
22050
+ "items": {
22051
+ "type": "object",
22052
+ "properties": {
22053
+ "type": {
22054
+ "type": "string",
22055
+ "description": "Transaction data type identifier."
22056
+ },
22057
+ "credential_ids": {
22058
+ "type": "array",
22059
+ "items": {
22060
+ "type": "string"
22061
+ },
22062
+ "description": "Credential query ids this transaction data applies to."
22063
+ },
22064
+ "payload": {
22065
+ "description": "Transaction details. Required for TS12 SCA transaction data."
22066
+ }
22067
+ },
22068
+ "required": [
22069
+ "type",
22070
+ "credential_ids"
22071
+ ],
22072
+ "additionalProperties": {}
22073
+ }
22074
+ },
22075
+ {
22076
+ "type": "null"
22077
+ }
22078
+ ]
22079
+ },
22080
+ "registration_cert": {
22081
+ "description": "Optional registration certificate request settings.",
22082
+ "anyOf": [
22083
+ {
22084
+ "type": "object",
22085
+ "properties": {
22086
+ "id": {
22087
+ "type": "string"
22088
+ },
22089
+ "body": {
22090
+ "type": "object",
22091
+ "properties": {
22092
+ "privacy_policy": {
22093
+ "type": "string"
22094
+ },
22095
+ "support_uri": {
22096
+ "type": "string"
22097
+ },
22098
+ "intermediary": {
22099
+ "type": "string"
22100
+ },
22101
+ "purpose": {
22102
+ "type": "array",
22103
+ "items": {
22104
+ "type": "object",
22105
+ "properties": {
22106
+ "lang": {
22107
+ "type": "string"
22108
+ },
22109
+ "content": {
22110
+ "type": "string"
22111
+ }
22112
+ },
22113
+ "required": [
22114
+ "lang",
22115
+ "content"
22116
+ ],
22117
+ "additionalProperties": false
22118
+ }
22119
+ },
22120
+ "credentials": {
22121
+ "type": "array",
22122
+ "items": {
22123
+ "type": "object",
22124
+ "propertyNames": {
22125
+ "type": "string"
22126
+ },
22127
+ "additionalProperties": {}
22128
+ }
22129
+ },
22130
+ "provides_attestations": {
22131
+ "type": "array",
22132
+ "items": {
22133
+ "type": "string",
22134
+ "minLength": 1
22135
+ }
22136
+ }
22137
+ },
22138
+ "additionalProperties": false
22139
+ },
22140
+ "jwt": {
22141
+ "type": "string"
22142
+ }
22143
+ },
22144
+ "additionalProperties": false
22145
+ },
22146
+ {
22147
+ "type": "null"
22148
+ }
22149
+ ]
22150
+ },
22151
+ "registrationCertImportJwt": {
22152
+ "description": "Optional imported registration certificate JWT.",
22153
+ "type": [
22154
+ "string",
22155
+ "null"
22156
+ ]
22157
+ },
22158
+ "registrationCertImportId": {
22159
+ "description": "Optional registrar-side registration certificate id.",
22160
+ "type": [
22161
+ "string",
22162
+ "null"
22163
+ ]
22164
+ },
22165
+ "registrationCertBodyPrivacyPolicy": {
22166
+ "description": "Optional registration certificate privacy policy URI.",
22167
+ "type": [
22168
+ "string",
22169
+ "null"
22170
+ ]
22171
+ },
22172
+ "registrationCertBodySupportUri": {
22173
+ "description": "Optional registration certificate support URI.",
22174
+ "type": [
22175
+ "string",
22176
+ "null"
22177
+ ]
22178
+ },
22179
+ "registrationCertBodyIntermediary": {
22180
+ "description": "Optional registration certificate intermediary.",
22181
+ "type": [
22182
+ "string",
22183
+ "null"
22184
+ ]
22185
+ },
22186
+ "registrationCertBodyPurpose": {
22187
+ "description": "Optional registration certificate purpose entries.",
22188
+ "anyOf": [
22189
+ {
22190
+ "type": "array",
22191
+ "items": {
22192
+ "type": "object",
22193
+ "properties": {
22194
+ "lang": {
22195
+ "type": "string"
22196
+ },
22197
+ "content": {
22198
+ "type": "string"
22199
+ }
22200
+ },
22201
+ "additionalProperties": false
22202
+ }
22203
+ },
22204
+ {
22205
+ "type": "null"
22206
+ }
22207
+ ]
22208
+ },
22209
+ "webhookEndpointId": {
22210
+ "description": "Optional webhook endpoint id for presentation callbacks.",
22211
+ "type": [
22212
+ "string",
22213
+ "null"
22214
+ ]
22215
+ },
22216
+ "attached": {
22217
+ "description": "Optional attachments included with presentation requests.",
22218
+ "anyOf": [
22219
+ {
22220
+ "type": "array",
22221
+ "items": {
22222
+ "type": "object",
22223
+ "properties": {
22224
+ "format": {
22225
+ "type": "string",
22226
+ "description": "Attachment format identifier."
22227
+ },
22228
+ "data": {
22229
+ "description": "Attachment payload."
22230
+ },
22231
+ "credential_ids": {
22232
+ "description": "Optional credential query ids bound to this attachment.",
22233
+ "type": "array",
22234
+ "items": {
22235
+ "type": "string"
22236
+ }
22237
+ }
22238
+ },
22239
+ "required": [
22240
+ "format",
22241
+ "data"
22242
+ ],
22243
+ "additionalProperties": false
22244
+ }
22245
+ },
22246
+ {
22247
+ "type": "null"
22248
+ }
22249
+ ]
22250
+ },
22251
+ "redirectUri": {
22252
+ "description": "Optional redirect URI after presentation completion.",
22253
+ "type": [
22254
+ "string",
22255
+ "null"
22256
+ ]
22257
+ },
22258
+ "accessKeyChainId": {
22259
+ "description": "Optional key chain id for access token/auth operations.",
22260
+ "type": [
22261
+ "string",
22262
+ "null"
22263
+ ]
22264
+ },
22265
+ "readerAuth": {
22266
+ "description": "Whether reader authentication is required for mDoc requests.",
22267
+ "type": [
22268
+ "boolean",
22269
+ "null"
22270
+ ]
22271
+ }
22272
+ },
22273
+ "required": [
22274
+ "id",
22275
+ "dcql_query"
22276
+ ],
22277
+ "additionalProperties": false,
22278
+ "title": "PresentationConfigCreateDto"
22279
+ }
22280
+ }
22281
+ },
22282
+ {
22283
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
22284
+ "$id": "https://eudiplo.dev/schemas/v3/IssuanceConfigFile.schema.json",
22285
+ "title": "IssuanceConfigFile",
22286
+ "type": "object",
22287
+ "properties": {
22288
+ "$schema": {
22289
+ "type": "string",
22290
+ "const": "https://eudiplo.dev/schemas/v3/IssuanceConfigFile.schema.json"
22291
+ },
22292
+ "metadata": {
22293
+ "type": "object",
22294
+ "properties": {
22295
+ "generation": {
22296
+ "type": "integer",
22297
+ "minimum": 1,
22298
+ "description": "Monotonically increasing configuration generation."
22299
+ },
22300
+ "ownership": {
22301
+ "type": "string",
22302
+ "enum": [
22303
+ "unmanaged",
22304
+ "file-managed"
22305
+ ],
22306
+ "description": "Requested ownership recorded when the document is applied."
22307
+ }
22308
+ },
22309
+ "additionalProperties": false
22310
+ },
22311
+ "spec": {
22312
+ "$ref": "#/$defs/IssuanceConfig"
22313
+ }
22314
+ },
22315
+ "required": [
22316
+ "$schema",
22317
+ "spec"
22318
+ ],
22319
+ "additionalProperties": false,
22320
+ "$defs": {
22321
+ "IssuanceConfig": {
22322
+ "type": "object",
22323
+ "properties": {
22324
+ "batchSize": {
22325
+ "description": "Optional issuance batch size.",
22326
+ "type": "integer",
22327
+ "minimum": 1,
22328
+ "maximum": 9007199254740991
22329
+ },
22330
+ "dPopRequired": {
22331
+ "description": "Require DPoP proofs for issuance endpoints.",
22332
+ "type": "boolean"
22333
+ },
22334
+ "walletAttestationRequired": {
22335
+ "description": "Default wallet attestation requirement for managed authorization servers.",
22336
+ "type": "boolean"
22337
+ },
22338
+ "walletProviderTrustLists": {
22339
+ "description": "Shared wallet provider trust lists for key attestations and default authorization server wallet authentication.",
22340
+ "type": "array",
22341
+ "items": {
22342
+ "type": "object",
22343
+ "properties": {
22344
+ "trustListId": {
22345
+ "type": "string",
22346
+ "minLength": 1
22347
+ },
22348
+ "url": {
22349
+ "description": "URL of the wallet provider trust list.",
22350
+ "type": "string",
22351
+ "format": "uri"
22352
+ },
22353
+ "verifierKey": {
22354
+ "description": "Optional verifier key material used for trust list verification.",
22355
+ "type": "object",
22356
+ "propertyNames": {
22357
+ "type": "string"
22358
+ },
22359
+ "additionalProperties": {}
22360
+ },
22361
+ "verifierKeyPem": {
22362
+ "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
22363
+ "type": "string",
22364
+ "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
22365
+ },
22366
+ "verifierX509Der": {
22367
+ "description": "Optional verifier certificate in DER/base64 form.",
22368
+ "type": "string"
22369
+ }
22370
+ },
22371
+ "additionalProperties": false
22372
+ }
22373
+ },
22374
+ "signingKeyId": {
22375
+ "description": "Default signing key chain id for credential issuance.",
22376
+ "type": "string",
22377
+ "minLength": 1
22378
+ },
22379
+ "authorizationServers": {
22380
+ "minItems": 1,
22381
+ "type": "array",
22382
+ "items": {
22383
+ "oneOf": [
22384
+ {
22385
+ "type": "object",
22386
+ "properties": {
22387
+ "type": {
22388
+ "type": "string",
22389
+ "const": "external",
22390
+ "description": "Use an externally managed authorization server."
22391
+ },
22392
+ "id": {
22393
+ "type": "string",
22394
+ "minLength": 1,
22395
+ "description": "Authorization server identifier."
22396
+ },
22397
+ "issuer": {
22398
+ "type": "string",
22399
+ "format": "uri",
22400
+ "description": "Issuer URL for the external authorization server."
22401
+ },
22402
+ "sessionBinding": {
22403
+ "description": "Explicit mapping from an external access-token claim to an existing issuance session.",
22404
+ "type": "object",
22405
+ "properties": {
22406
+ "method": {
22407
+ "type": "string",
22408
+ "const": "access_token_claim",
22409
+ "description": "Read the correlation value from a configured access-token claim."
22410
+ },
22411
+ "claim": {
22412
+ "type": "string",
22413
+ "minLength": 1,
22414
+ "description": "Claim name that contains the issuance-session correlation value."
22415
+ }
22416
+ },
22417
+ "required": [
22418
+ "method",
22419
+ "claim"
22420
+ ],
22421
+ "additionalProperties": false
22422
+ },
22423
+ "label": {
22424
+ "description": "Optional display label for UI selection.",
22425
+ "type": "string"
22426
+ },
22427
+ "enabled": {
22428
+ "description": "Whether this authorization server entry is enabled.",
22429
+ "type": "boolean"
22430
+ }
22431
+ },
22432
+ "required": [
22433
+ "type",
22434
+ "id",
22435
+ "issuer"
22436
+ ],
22437
+ "additionalProperties": false
22438
+ },
22439
+ {
22440
+ "type": "object",
22441
+ "properties": {
22442
+ "type": {
22443
+ "type": "string",
22444
+ "const": "oid4vp",
22445
+ "description": "Use OID4VP-based authorization server chaining."
22446
+ },
22447
+ "id": {
22448
+ "type": "string",
22449
+ "minLength": 1,
22450
+ "description": "Authorization server identifier."
22451
+ },
22452
+ "presentationConfigId": {
22453
+ "type": "string",
22454
+ "minLength": 1,
22455
+ "description": "Presentation configuration id used during authorization."
22456
+ },
22457
+ "immediateWalletRedirect": {
22458
+ "description": "Redirect wallets immediately after authorization response creation.",
22459
+ "type": "boolean"
22460
+ },
22461
+ "token": {
22462
+ "description": "Optional token issuance settings.",
22463
+ "type": "object",
22464
+ "properties": {
22465
+ "lifetimeSeconds": {
22466
+ "description": "Access token lifetime in seconds.",
22467
+ "type": "number",
22468
+ "minimum": 60
22469
+ },
22470
+ "signingKeyId": {
22471
+ "description": "Optional key chain id used to sign issued tokens.",
22472
+ "type": "string",
22473
+ "minLength": 1
22474
+ },
22475
+ "refreshTokenEnabled": {
22476
+ "description": "Enable issuing refresh tokens.",
22477
+ "type": "boolean"
22478
+ },
22479
+ "refreshTokenExpiresInSeconds": {
22480
+ "description": "Refresh token lifetime in seconds.",
22481
+ "type": "number",
22482
+ "minimum": 60
22483
+ }
22484
+ },
22485
+ "additionalProperties": false
22486
+ },
22487
+ "requireDPoP": {
22488
+ "description": "Require DPoP proofs for token/credential requests.",
22489
+ "type": "boolean"
22490
+ },
22491
+ "walletAttestationRequired": {
22492
+ "description": "Require wallet attestation for this authorization server.",
22493
+ "type": "boolean"
22494
+ },
22495
+ "walletProviderTrustLists": {
22496
+ "description": "Optional wallet provider trust list references for this authorization server.",
22497
+ "type": "array",
22498
+ "items": {
22499
+ "type": "object",
22500
+ "properties": {
22501
+ "trustListId": {
22502
+ "type": "string",
22503
+ "minLength": 1
22504
+ },
22505
+ "url": {
22506
+ "description": "URL of the wallet provider trust list.",
22507
+ "type": "string",
22508
+ "format": "uri"
22509
+ },
22510
+ "verifierKey": {
22511
+ "description": "Optional verifier key material used for trust list verification.",
22512
+ "type": "object",
22513
+ "propertyNames": {
22514
+ "type": "string"
22515
+ },
22516
+ "additionalProperties": {}
22517
+ },
22518
+ "verifierKeyPem": {
22519
+ "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
22520
+ "type": "string",
22521
+ "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
22522
+ },
22523
+ "verifierX509Der": {
22524
+ "description": "Optional verifier certificate in DER/base64 form.",
22525
+ "type": "string"
20856
22526
  }
20857
22527
  },
20858
- "trusted_authorities": {
20859
- "description": "Optional trusted authority constraints.",
20860
- "type": "array",
20861
- "items": {
20862
- "oneOf": [
20863
- {
20864
- "type": "object",
20865
- "properties": {
20866
- "type": {
20867
- "type": "string",
20868
- "const": "etsi_tl",
20869
- "description": "Trusted authority type discriminator for ETSI trust lists."
20870
- },
20871
- "values": {
20872
- "type": "array",
20873
- "items": {
20874
- "type": "object",
20875
- "properties": {
20876
- "trustListId": {
20877
- "description": "Optional trust list id reference.",
20878
- "type": "string"
20879
- },
20880
- "url": {
20881
- "description": "Optional trust list URL reference.",
20882
- "anyOf": [
20883
- {
20884
- "type": "string",
20885
- "format": "uri"
20886
- },
20887
- {
20888
- "type": "string",
20889
- "pattern": "^<TENANT_URL>(?:\\/.*)?$"
20890
- }
20891
- ]
20892
- },
20893
- "verifierKey": {
20894
- "description": "Optional verifier key material.",
20895
- "type": "object",
20896
- "propertyNames": {
20897
- "type": "string"
20898
- },
20899
- "additionalProperties": {}
20900
- },
20901
- "verifierX509Der": {
20902
- "description": "Optional verifier certificate in DER/base64 form.",
20903
- "type": "string"
20904
- }
20905
- },
20906
- "additionalProperties": false
20907
- },
20908
- "description": "Trust list references for ETSI TL verification."
20909
- }
20910
- },
20911
- "required": [
20912
- "type",
20913
- "values"
20914
- ],
20915
- "additionalProperties": false
20916
- },
20917
- {
20918
- "type": "object",
20919
- "properties": {
20920
- "type": {
20921
- "type": "string",
20922
- "const": "openid_federation",
20923
- "description": "Trusted authority type discriminator for OpenID Federation."
20924
- },
20925
- "values": {
20926
- "type": "array",
20927
- "items": {
20928
- "type": "string"
20929
- },
20930
- "description": "OpenID Federation authority identifiers."
20931
- }
20932
- },
20933
- "required": [
20934
- "type",
20935
- "values"
20936
- ],
20937
- "additionalProperties": false
20938
- }
20939
- ]
20940
- }
22528
+ "additionalProperties": false
22529
+ }
22530
+ },
22531
+ "label": {
22532
+ "description": "Optional display label for UI selection.",
22533
+ "type": "string"
22534
+ },
22535
+ "enabled": {
22536
+ "description": "Whether this authorization server entry is enabled.",
22537
+ "type": "boolean"
22538
+ }
22539
+ },
22540
+ "required": [
22541
+ "type",
22542
+ "id",
22543
+ "presentationConfigId"
22544
+ ],
22545
+ "additionalProperties": false
22546
+ },
22547
+ {
22548
+ "type": "object",
22549
+ "properties": {
22550
+ "type": {
22551
+ "type": "string",
22552
+ "const": "chained",
22553
+ "description": "Use upstream OIDC as authorization source."
22554
+ },
22555
+ "id": {
22556
+ "type": "string",
22557
+ "minLength": 1,
22558
+ "description": "Authorization server identifier."
22559
+ },
22560
+ "upstream": {
22561
+ "type": "object",
22562
+ "properties": {
22563
+ "issuer": {
22564
+ "type": "string",
22565
+ "format": "uri",
22566
+ "description": "Upstream OIDC issuer URL."
20941
22567
  },
20942
- "format": {
22568
+ "clientId": {
20943
22569
  "type": "string",
20944
- "const": "dc+sd-jwt",
20945
- "description": "Credential format discriminator."
22570
+ "minLength": 1,
22571
+ "description": "Client id for upstream OIDC authentication."
20946
22572
  },
20947
- "meta": {
20948
- "type": "object",
20949
- "properties": {
20950
- "vct_values": {
20951
- "minItems": 1,
20952
- "type": "array",
20953
- "items": {
20954
- "type": "string"
20955
- },
20956
- "description": "Accepted VCT values."
20957
- }
20958
- },
20959
- "required": [
20960
- "vct_values"
20961
- ],
20962
- "additionalProperties": false
22573
+ "clientSecret": {
22574
+ "description": "Optional client secret for upstream OIDC authentication.",
22575
+ "type": "string",
22576
+ "minLength": 1
20963
22577
  },
20964
- "claims": {
20965
- "description": "Optional claim-level constraints.",
22578
+ "scopes": {
22579
+ "description": "Optional scopes requested from the upstream issuer.",
20966
22580
  "type": "array",
20967
22581
  "items": {
20968
- "type": "object",
20969
- "properties": {
20970
- "id": {
20971
- "description": "Optional claim query id.",
20972
- "type": "string"
20973
- },
20974
- "path": {
20975
- "type": "array",
20976
- "items": {
20977
- "type": [
20978
- "string",
20979
- "number"
20980
- ]
20981
- },
20982
- "description": "Path to the claim value in presented credentials."
20983
- },
20984
- "values": {
20985
- "description": "Optional allowed values for the claim.",
20986
- "type": "array",
20987
- "items": {
20988
- "type": "string"
20989
- }
20990
- }
20991
- },
20992
- "required": [
20993
- "path"
20994
- ],
20995
- "additionalProperties": false
22582
+ "type": "string",
22583
+ "minLength": 1
20996
22584
  }
20997
22585
  }
20998
22586
  },
20999
22587
  "required": [
21000
- "id",
21001
- "format",
21002
- "meta"
22588
+ "issuer",
22589
+ "clientId"
21003
22590
  ],
21004
- "additionalProperties": false
22591
+ "additionalProperties": false,
22592
+ "description": "Upstream OIDC connection settings."
21005
22593
  },
21006
- {
22594
+ "token": {
22595
+ "description": "Optional token issuance settings.",
21007
22596
  "type": "object",
21008
22597
  "properties": {
21009
- "id": {
21010
- "type": "string",
21011
- "minLength": 1,
21012
- "pattern": "^[A-Za-z0-9_-]+$",
21013
- "description": "Credential query identifier."
21014
- },
21015
- "multiple": {
21016
- "description": "Allow multiple matching credentials.",
21017
- "type": "boolean"
21018
- },
21019
- "claim_sets": {
21020
- "description": "Optional claim set constraints.",
21021
- "type": "array",
21022
- "items": {
21023
- "type": "array",
21024
- "items": {
21025
- "type": "string"
21026
- }
21027
- }
21028
- },
21029
- "trusted_authorities": {
21030
- "description": "Optional trusted authority constraints.",
21031
- "type": "array",
21032
- "items": {
21033
- "oneOf": [
21034
- {
21035
- "type": "object",
21036
- "properties": {
21037
- "type": {
21038
- "type": "string",
21039
- "const": "etsi_tl",
21040
- "description": "Trusted authority type discriminator for ETSI trust lists."
21041
- },
21042
- "values": {
21043
- "type": "array",
21044
- "items": {
21045
- "type": "object",
21046
- "properties": {
21047
- "trustListId": {
21048
- "description": "Optional trust list id reference.",
21049
- "type": "string"
21050
- },
21051
- "url": {
21052
- "description": "Optional trust list URL reference.",
21053
- "anyOf": [
21054
- {
21055
- "type": "string",
21056
- "format": "uri"
21057
- },
21058
- {
21059
- "type": "string",
21060
- "pattern": "^<TENANT_URL>(?:\\/.*)?$"
21061
- }
21062
- ]
21063
- },
21064
- "verifierKey": {
21065
- "description": "Optional verifier key material.",
21066
- "type": "object",
21067
- "propertyNames": {
21068
- "type": "string"
21069
- },
21070
- "additionalProperties": {}
21071
- },
21072
- "verifierX509Der": {
21073
- "description": "Optional verifier certificate in DER/base64 form.",
21074
- "type": "string"
21075
- }
21076
- },
21077
- "additionalProperties": false
21078
- },
21079
- "description": "Trust list references for ETSI TL verification."
21080
- }
21081
- },
21082
- "required": [
21083
- "type",
21084
- "values"
21085
- ],
21086
- "additionalProperties": false
21087
- },
21088
- {
21089
- "type": "object",
21090
- "properties": {
21091
- "type": {
21092
- "type": "string",
21093
- "const": "openid_federation",
21094
- "description": "Trusted authority type discriminator for OpenID Federation."
21095
- },
21096
- "values": {
21097
- "type": "array",
21098
- "items": {
21099
- "type": "string"
21100
- },
21101
- "description": "OpenID Federation authority identifiers."
21102
- }
21103
- },
21104
- "required": [
21105
- "type",
21106
- "values"
21107
- ],
21108
- "additionalProperties": false
21109
- }
21110
- ]
21111
- }
22598
+ "lifetimeSeconds": {
22599
+ "description": "Access token lifetime in seconds.",
22600
+ "type": "number",
22601
+ "minimum": 60
21112
22602
  },
21113
- "format": {
22603
+ "signingKeyId": {
22604
+ "description": "Optional key chain id used to sign issued tokens.",
21114
22605
  "type": "string",
21115
- "const": "mso_mdoc",
21116
- "description": "Credential format discriminator."
22606
+ "minLength": 1
21117
22607
  },
21118
- "meta": {
21119
- "type": "object",
21120
- "properties": {
21121
- "doctype_value": {
21122
- "type": "string",
21123
- "minLength": 1,
21124
- "description": "Expected mDoc doctype value."
21125
- }
21126
- },
21127
- "required": [
21128
- "doctype_value"
21129
- ],
21130
- "additionalProperties": false
22608
+ "refreshTokenEnabled": {
22609
+ "description": "Enable issuing refresh tokens.",
22610
+ "type": "boolean"
21131
22611
  },
21132
- "claims": {
21133
- "description": "Optional mDoc claim-level constraints.",
21134
- "type": "array",
21135
- "items": {
21136
- "type": "object",
21137
- "properties": {
21138
- "id": {
21139
- "description": "Optional claim query id.",
21140
- "type": "string"
21141
- },
21142
- "path": {
21143
- "type": "array",
21144
- "items": {
21145
- "type": [
21146
- "string",
21147
- "number"
21148
- ]
21149
- },
21150
- "description": "Path to the claim value in presented credentials."
21151
- },
21152
- "values": {
21153
- "description": "Optional allowed values for the claim.",
21154
- "type": "array",
21155
- "items": {
21156
- "type": "string"
21157
- }
21158
- },
21159
- "intent_to_retain": {
21160
- "description": "Whether relying party intends to retain the claim.",
21161
- "type": "boolean"
21162
- }
21163
- },
21164
- "required": [
21165
- "path"
21166
- ],
21167
- "additionalProperties": false
21168
- }
21169
- }
21170
- },
21171
- "required": [
21172
- "id",
21173
- "format",
21174
- "meta"
21175
- ],
22612
+ "refreshTokenExpiresInSeconds": {
22613
+ "description": "Refresh token lifetime in seconds.",
22614
+ "type": "number",
22615
+ "minimum": 60
22616
+ }
22617
+ },
21176
22618
  "additionalProperties": false
21177
- }
21178
- ]
21179
- },
21180
- "description": "Credential queries requested by the verifier."
21181
- },
21182
- "credential_sets": {
21183
- "description": "Optional higher-level credential set requirements.",
21184
- "type": "array",
21185
- "items": {
21186
- "type": "object",
21187
- "properties": {
21188
- "options": {
21189
- "minItems": 1,
22619
+ },
22620
+ "requireDPoP": {
22621
+ "description": "Require DPoP proofs for token/credential requests.",
22622
+ "type": "boolean"
22623
+ },
22624
+ "walletAttestationRequired": {
22625
+ "description": "Require wallet attestation for this authorization server.",
22626
+ "type": "boolean"
22627
+ },
22628
+ "walletProviderTrustLists": {
22629
+ "description": "Optional wallet provider trust list references for this authorization server.",
21190
22630
  "type": "array",
21191
22631
  "items": {
21192
- "minItems": 1,
21193
- "type": "array",
21194
- "items": {
21195
- "type": "string"
21196
- }
21197
- },
21198
- "description": "Alternative credential query id combinations."
22632
+ "type": "object",
22633
+ "properties": {
22634
+ "trustListId": {
22635
+ "type": "string",
22636
+ "minLength": 1
22637
+ },
22638
+ "url": {
22639
+ "description": "URL of the wallet provider trust list.",
22640
+ "type": "string",
22641
+ "format": "uri"
22642
+ },
22643
+ "verifierKey": {
22644
+ "description": "Optional verifier key material used for trust list verification.",
22645
+ "type": "object",
22646
+ "propertyNames": {
22647
+ "type": "string"
22648
+ },
22649
+ "additionalProperties": {}
22650
+ },
22651
+ "verifierKeyPem": {
22652
+ "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
22653
+ "type": "string",
22654
+ "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
22655
+ },
22656
+ "verifierX509Der": {
22657
+ "description": "Optional verifier certificate in DER/base64 form.",
22658
+ "type": "string"
22659
+ }
22660
+ },
22661
+ "additionalProperties": false
22662
+ }
21199
22663
  },
21200
- "required": {
21201
- "description": "Whether this credential set is mandatory.",
22664
+ "label": {
22665
+ "description": "Optional display label for UI selection.",
22666
+ "type": "string"
22667
+ },
22668
+ "enabled": {
22669
+ "description": "Whether this authorization server entry is enabled.",
21202
22670
  "type": "boolean"
21203
22671
  }
21204
22672
  },
21205
22673
  "required": [
21206
- "options"
22674
+ "type",
22675
+ "id",
22676
+ "upstream"
21207
22677
  ],
21208
22678
  "additionalProperties": false
21209
- }
21210
- }
21211
- },
21212
- "required": [
21213
- "credentials"
21214
- ],
21215
- "additionalProperties": false,
21216
- "description": "DCQL query defining requested credentials and claims."
21217
- },
21218
- "transaction_data": {
21219
- "description": "Optional transaction data descriptors.",
21220
- "anyOf": [
21221
- {
21222
- "type": "array",
21223
- "items": {
22679
+ },
22680
+ {
21224
22681
  "type": "object",
21225
22682
  "properties": {
21226
22683
  "type": {
21227
22684
  "type": "string",
21228
- "description": "Transaction data type identifier."
22685
+ "const": "built-in",
22686
+ "description": "Use EUDIPLO built-in authorization server."
21229
22687
  },
21230
- "credential_ids": {
22688
+ "id": {
22689
+ "type": "string",
22690
+ "minLength": 1,
22691
+ "description": "Authorization server identifier."
22692
+ },
22693
+ "token": {
22694
+ "description": "Optional token issuance settings.",
22695
+ "type": "object",
22696
+ "properties": {
22697
+ "lifetimeSeconds": {
22698
+ "description": "Access token lifetime in seconds.",
22699
+ "type": "number",
22700
+ "minimum": 60
22701
+ },
22702
+ "signingKeyId": {
22703
+ "description": "Optional key chain id used to sign issued tokens.",
22704
+ "type": "string",
22705
+ "minLength": 1
22706
+ },
22707
+ "refreshTokenEnabled": {
22708
+ "description": "Enable issuing refresh tokens.",
22709
+ "type": "boolean"
22710
+ },
22711
+ "refreshTokenExpiresInSeconds": {
22712
+ "description": "Refresh token lifetime in seconds.",
22713
+ "type": "number",
22714
+ "minimum": 60
22715
+ }
22716
+ },
22717
+ "additionalProperties": false
22718
+ },
22719
+ "requireDPoP": {
22720
+ "description": "Require DPoP proofs for token/credential requests.",
22721
+ "type": "boolean"
22722
+ },
22723
+ "walletAttestationRequired": {
22724
+ "description": "Require wallet attestation for this authorization server.",
22725
+ "type": "boolean"
22726
+ },
22727
+ "walletProviderTrustLists": {
22728
+ "description": "Optional wallet provider trust list references for this authorization server.",
21231
22729
  "type": "array",
21232
22730
  "items": {
21233
- "type": "string"
21234
- },
21235
- "description": "Credential query ids this transaction data applies to."
22731
+ "type": "object",
22732
+ "properties": {
22733
+ "trustListId": {
22734
+ "type": "string",
22735
+ "minLength": 1
22736
+ },
22737
+ "url": {
22738
+ "description": "URL of the wallet provider trust list.",
22739
+ "type": "string",
22740
+ "format": "uri"
22741
+ },
22742
+ "verifierKey": {
22743
+ "description": "Optional verifier key material used for trust list verification.",
22744
+ "type": "object",
22745
+ "propertyNames": {
22746
+ "type": "string"
22747
+ },
22748
+ "additionalProperties": {}
22749
+ },
22750
+ "verifierKeyPem": {
22751
+ "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
22752
+ "type": "string",
22753
+ "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
22754
+ },
22755
+ "verifierX509Der": {
22756
+ "description": "Optional verifier certificate in DER/base64 form.",
22757
+ "type": "string"
22758
+ }
22759
+ },
22760
+ "additionalProperties": false
22761
+ }
21236
22762
  },
21237
- "payload": {
21238
- "description": "Transaction details. Required for TS12 SCA transaction data."
22763
+ "label": {
22764
+ "description": "Optional display label for UI selection.",
22765
+ "type": "string"
22766
+ },
22767
+ "enabled": {
22768
+ "description": "Whether this authorization server entry is enabled.",
22769
+ "type": "boolean"
21239
22770
  }
21240
22771
  },
21241
22772
  "required": [
21242
22773
  "type",
21243
- "credential_ids"
22774
+ "id"
21244
22775
  ],
21245
- "additionalProperties": {}
22776
+ "additionalProperties": false
21246
22777
  }
21247
- },
21248
- {
21249
- "type": "null"
21250
- }
21251
- ]
22778
+ ],
22779
+ "description": "Supported authorization server configurations."
22780
+ },
22781
+ "description": "Configured authorization server entries."
21252
22782
  },
21253
- "registration_cert": {
21254
- "description": "Optional registration certificate request settings.",
22783
+ "federation": {
22784
+ "description": "Optional OpenID Federation settings.",
21255
22785
  "anyOf": [
21256
22786
  {
21257
22787
  "type": "object",
21258
22788
  "properties": {
21259
- "id": {
21260
- "type": "string"
22789
+ "role": {
22790
+ "description": "Federation role for this issuer.",
22791
+ "type": "string",
22792
+ "enum": [
22793
+ "trust_anchor",
22794
+ "intermediate",
22795
+ "leaf"
22796
+ ]
21261
22797
  },
21262
- "body": {
21263
- "type": "object",
21264
- "properties": {
21265
- "privacy_policy": {
21266
- "type": "string"
21267
- },
21268
- "support_uri": {
21269
- "type": "string"
21270
- },
21271
- "intermediary": {
21272
- "type": "string"
21273
- },
21274
- "purpose": {
21275
- "type": "array",
21276
- "items": {
21277
- "type": "object",
21278
- "properties": {
21279
- "lang": {
21280
- "type": "string"
21281
- },
21282
- "content": {
21283
- "type": "string"
21284
- }
21285
- },
21286
- "required": [
21287
- "lang",
21288
- "content"
21289
- ],
21290
- "additionalProperties": false
21291
- }
21292
- },
21293
- "credentials": {
21294
- "type": "array",
21295
- "items": {
21296
- "type": "object",
21297
- "propertyNames": {
21298
- "type": "string"
21299
- },
21300
- "additionalProperties": {}
21301
- }
21302
- },
21303
- "provides_attestations": {
21304
- "type": "array",
21305
- "items": {
22798
+ "mode": {
22799
+ "description": "Federation operation mode.",
22800
+ "type": "string",
22801
+ "enum": [
22802
+ "federation-only",
22803
+ "hybrid"
22804
+ ]
22805
+ },
22806
+ "entityId": {
22807
+ "description": "Optional local federation entity id.",
22808
+ "type": "string"
22809
+ },
22810
+ "enforceSigningPolicy": {
22811
+ "description": "Enforce strict signing policy checks.",
22812
+ "type": "boolean"
22813
+ },
22814
+ "cacheTtlSeconds": {
22815
+ "description": "Cache time-to-live for federation metadata in seconds.",
22816
+ "type": "integer",
22817
+ "minimum": 1,
22818
+ "maximum": 9007199254740991
22819
+ },
22820
+ "trustAnchors": {
22821
+ "type": "array",
22822
+ "items": {
22823
+ "type": "object",
22824
+ "properties": {
22825
+ "entityId": {
21306
22826
  "type": "string",
21307
- "minLength": 1
22827
+ "minLength": 1,
22828
+ "description": "Federation trust anchor entity id."
22829
+ },
22830
+ "entityConfigurationUri": {
22831
+ "type": "string",
22832
+ "format": "uri",
22833
+ "description": "Entity configuration URI for the trust anchor."
21308
22834
  }
21309
- }
22835
+ },
22836
+ "required": [
22837
+ "entityId",
22838
+ "entityConfigurationUri"
22839
+ ],
22840
+ "additionalProperties": false
21310
22841
  },
21311
- "additionalProperties": false
21312
- },
21313
- "jwt": {
21314
- "type": "string"
22842
+ "description": "Federation trust anchors."
21315
22843
  }
21316
22844
  },
22845
+ "required": [
22846
+ "trustAnchors"
22847
+ ],
21317
22848
  "additionalProperties": false
21318
22849
  },
21319
22850
  {
@@ -21321,134 +22852,125 @@ var CONFIG_SCHEMAS = [
21321
22852
  }
21322
22853
  ]
21323
22854
  },
21324
- "registrationCertImportJwt": {
21325
- "description": "Optional imported registration certificate JWT.",
21326
- "type": [
21327
- "string",
21328
- "null"
21329
- ]
21330
- },
21331
- "registrationCertImportId": {
21332
- "description": "Optional registrar-side registration certificate id.",
21333
- "type": [
21334
- "string",
21335
- "null"
21336
- ]
21337
- },
21338
- "registrationCertBodyPrivacyPolicy": {
21339
- "description": "Optional registration certificate privacy policy URI.",
21340
- "type": [
21341
- "string",
21342
- "null"
21343
- ]
21344
- },
21345
- "registrationCertBodySupportUri": {
21346
- "description": "Optional registration certificate support URI.",
21347
- "type": [
21348
- "string",
21349
- "null"
21350
- ]
21351
- },
21352
- "registrationCertBodyIntermediary": {
21353
- "description": "Optional registration certificate intermediary.",
21354
- "type": [
21355
- "string",
21356
- "null"
21357
- ]
21358
- },
21359
- "registrationCertBodyPurpose": {
21360
- "description": "Optional registration certificate purpose entries.",
22855
+ "registrationCertificate": {
22856
+ "description": "Optional registration certificate settings.",
21361
22857
  "anyOf": [
21362
22858
  {
21363
- "type": "array",
21364
- "items": {
21365
- "type": "object",
21366
- "properties": {
21367
- "lang": {
21368
- "type": "string"
21369
- },
21370
- "content": {
21371
- "type": "string"
21372
- }
22859
+ "type": "object",
22860
+ "properties": {
22861
+ "enabled": {
22862
+ "description": "Enable issuer registration certificate support.",
22863
+ "type": "boolean"
21373
22864
  },
21374
- "additionalProperties": false
21375
- }
22865
+ "mode": {
22866
+ "description": "How registration certificate data is provided.",
22867
+ "type": "string",
22868
+ "enum": [
22869
+ "import",
22870
+ "generate"
22871
+ ]
22872
+ },
22873
+ "jwt": {
22874
+ "description": "Optional registration certificate JWT when using import mode.",
22875
+ "type": "string"
22876
+ },
22877
+ "privacyPolicy": {
22878
+ "description": "Optional privacy policy URI.",
22879
+ "type": "string"
22880
+ },
22881
+ "supportUri": {
22882
+ "description": "Optional support URI.",
22883
+ "type": "string"
22884
+ }
22885
+ },
22886
+ "additionalProperties": false
21376
22887
  },
21377
22888
  {
21378
22889
  "type": "null"
21379
22890
  }
21380
22891
  ]
21381
22892
  },
21382
- "webhookEndpointId": {
21383
- "description": "Optional webhook endpoint id for presentation callbacks.",
21384
- "type": [
21385
- "string",
21386
- "null"
21387
- ]
21388
- },
21389
- "attached": {
21390
- "description": "Optional attachments included with presentation requests.",
21391
- "anyOf": [
21392
- {
21393
- "type": "array",
21394
- "items": {
22893
+ "display": {
22894
+ "description": "Localized issuer metadata shown to wallets.",
22895
+ "type": "array",
22896
+ "items": {
22897
+ "type": "object",
22898
+ "properties": {
22899
+ "name": {
22900
+ "description": "Issuer display name.",
22901
+ "type": "string"
22902
+ },
22903
+ "locale": {
22904
+ "description": "Locale tag for this display entry.",
22905
+ "type": "string"
22906
+ },
22907
+ "logo": {
22908
+ "description": "Optional issuer logo metadata.",
21395
22909
  "type": "object",
21396
22910
  "properties": {
21397
- "format": {
22911
+ "uri": {
21398
22912
  "type": "string",
21399
- "description": "Attachment format identifier."
21400
- },
21401
- "data": {
21402
- "description": "Attachment payload."
22913
+ "minLength": 1,
22914
+ "description": "Logo URI."
21403
22915
  },
21404
- "credential_ids": {
21405
- "description": "Optional credential query ids bound to this attachment.",
21406
- "type": "array",
21407
- "items": {
21408
- "type": "string"
21409
- }
22916
+ "alt_text": {
22917
+ "description": "Optional localized alternative text.",
22918
+ "type": "string"
21410
22919
  }
21411
22920
  },
21412
22921
  "required": [
21413
- "format",
21414
- "data"
22922
+ "uri"
21415
22923
  ],
21416
- "additionalProperties": false
22924
+ "additionalProperties": {}
21417
22925
  }
21418
22926
  },
22927
+ "additionalProperties": {}
22928
+ }
22929
+ },
22930
+ "notificationEndpointEnabled": {
22931
+ "description": "Whether the OID4VCI notification endpoint is exposed for this issuance configuration.",
22932
+ "type": "boolean"
22933
+ },
22934
+ "credentialResponseEncryption": {
22935
+ "description": "Enable encrypted credential responses.",
22936
+ "type": "boolean"
22937
+ },
22938
+ "credentialRequestEncryption": {
22939
+ "description": "Require encrypted credential requests.",
22940
+ "type": "boolean"
22941
+ },
22942
+ "txCodeMaxAttempts": {
22943
+ "description": "Maximum verification attempts for transaction codes. Null resets to defaults.",
22944
+ "anyOf": [
22945
+ {
22946
+ "type": "integer",
22947
+ "minimum": 1,
22948
+ "maximum": 9007199254740991
22949
+ },
21419
22950
  {
21420
22951
  "type": "null"
21421
22952
  }
21422
22953
  ]
21423
22954
  },
21424
- "redirectUri": {
21425
- "description": "Optional redirect URI after presentation completion.",
21426
- "type": [
21427
- "string",
21428
- "null"
21429
- ]
21430
- },
21431
- "accessKeyChainId": {
21432
- "description": "Optional key chain id for access token/auth operations.",
21433
- "type": [
21434
- "string",
21435
- "null"
21436
- ]
21437
- },
21438
- "readerAuth": {
21439
- "description": "Whether reader authentication is required for mDoc requests.",
21440
- "type": [
21441
- "boolean",
21442
- "null"
22955
+ "offerLifetimeSeconds": {
22956
+ "description": "Default lifetime of credential offers in seconds. Can be overridden per offer request. Null or unset: offers do not expire.",
22957
+ "anyOf": [
22958
+ {
22959
+ "type": "integer",
22960
+ "minimum": 1,
22961
+ "maximum": 9007199254740991
22962
+ },
22963
+ {
22964
+ "type": "null"
22965
+ }
21443
22966
  ]
21444
22967
  }
21445
22968
  },
21446
22969
  "required": [
21447
- "id",
21448
- "dcql_query"
22970
+ "authorizationServers"
21449
22971
  ],
21450
22972
  "additionalProperties": false,
21451
- "title": "PresentationConfigCreateDto"
22973
+ "title": "IssuanceConfig"
21452
22974
  }
21453
22975
  }
21454
22976
  },
@@ -23723,7 +25245,10 @@ function createTenantCommand(context, setExitCode) {
23723
25245
 
23724
25246
  // src/commands/config/validate/index.ts
23725
25247
  function createValidateCommand(context, setExitCode) {
23726
- return new Command("validate").description("Validate CLI or tenant config-import files").argument("[scope]").argument("[path]").addOption(
25248
+ return new Command("validate").description("Validate CLI or tenant config-import files").argument(
25249
+ "[scope]",
25250
+ '"tenant" for one tenant folder or "tenants" for a folder of tenant folders; omit it to validate the CLI config file'
25251
+ ).argument("[path]", "the folder to validate (required with a scope)").addOption(
23727
25252
  new Option("--format <text|json>", "tenant report format").choices(["text", "json"]).default("text")
23728
25253
  ).action(async (scope, path2, options) => {
23729
25254
  const state = await loadCliState(context);
@@ -23842,9 +25367,9 @@ function buildComposeLogsArgs(service, options = {}) {
23842
25367
  }
23843
25368
  return args;
23844
25369
  }
23845
- function buildComposePullArgs(service) {
25370
+ function buildComposePullArgs(services) {
23846
25371
  const args = ["pull"];
23847
- if (service !== void 0) {
25372
+ for (const service of typeof services === "string" ? [services] : services ?? []) {
23848
25373
  assertServiceName(service);
23849
25374
  args.push(service);
23850
25375
  }
@@ -23882,23 +25407,28 @@ function parseContainerStates(stdout) {
23882
25407
  return entries.map((entry) => {
23883
25408
  const record = entry;
23884
25409
  const names = record.Names;
25410
+ const status = String(record.Status ?? "");
25411
+ const exitCode2 = typeof record.ExitCode === "number" ? record.ExitCode : /^Exited \((\d+)\)/.exec(status)?.[1];
23885
25412
  return {
23886
25413
  name: Array.isArray(names) ? String(names[0] ?? "") : String(names ?? record.Name ?? ""),
23887
25414
  state: String(record.State ?? ""),
23888
- status: String(record.Status ?? "")
25415
+ status,
25416
+ exitCode: exitCode2 === void 0 ? void 0 : Number(exitCode2)
23889
25417
  };
23890
25418
  });
23891
25419
  }
23892
25420
  function summarizeContainerStates(containers, projectName) {
23893
25421
  const name = "service containers";
23894
- if (containers.length === 0) {
25422
+ const services = containers.filter((container) => !hasCompleted(container));
25423
+ const completed = containers.length - services.length;
25424
+ if (services.length === 0) {
23895
25425
  return {
23896
25426
  name,
23897
25427
  status: "warn",
23898
25428
  message: `No containers found for project ${projectName}. Start it with eudiplo up.`
23899
25429
  };
23900
25430
  }
23901
- const unhealthy = containers.filter(
25431
+ const unhealthy = services.filter(
23902
25432
  (container) => container.status.toLowerCase().includes("unhealthy")
23903
25433
  );
23904
25434
  if (unhealthy.length > 0) {
@@ -23908,25 +25438,28 @@ function summarizeContainerStates(containers, projectName) {
23908
25438
  message: `Unhealthy: ${describe(unhealthy)}`
23909
25439
  };
23910
25440
  }
23911
- const notRunning = containers.filter(
25441
+ const notRunning = services.filter(
23912
25442
  (container) => container.state.toLowerCase() !== "running"
23913
25443
  );
23914
25444
  if (notRunning.length > 0) {
23915
25445
  return {
23916
25446
  name,
23917
25447
  status: "warn",
23918
- message: `${containers.length - notRunning.length}/${containers.length} running. Not running: ${describe(notRunning)}`
25448
+ message: `${services.length - notRunning.length}/${services.length} running. Not running: ${describe(notRunning)}`
23919
25449
  };
23920
25450
  }
23921
- const starting = containers.filter(
25451
+ const starting = services.filter(
23922
25452
  (container) => container.status.toLowerCase().includes("starting")
23923
25453
  ).length;
23924
25454
  return {
23925
25455
  name,
23926
25456
  status: "pass",
23927
- message: `${containers.length} container(s) running${starting > 0 ? `, ${starting} still starting` : ""}.`
25457
+ message: `${services.length} container(s) running${starting > 0 ? `, ${starting} still starting` : ""}${completed > 0 ? `, ${completed} completed` : ""}.`
23928
25458
  };
23929
25459
  }
25460
+ function hasCompleted(container) {
25461
+ return container.state.toLowerCase() === "exited" && container.exitCode === 0;
25462
+ }
23930
25463
  function asArray(value) {
23931
25464
  return Array.isArray(value) ? value : [];
23932
25465
  }
@@ -24860,11 +26393,57 @@ async function runDriverCommand(config, command, parsed, context) {
24860
26393
  });
24861
26394
  }
24862
26395
 
26396
+ // src/commands/deployment/pass-through.ts
26397
+ function runtimeArguments(command, args) {
26398
+ const options = command.options.flatMap((option) => option.long ?? []);
26399
+ for (const arg of args) {
26400
+ if (!arg.startsWith("--") || arg === "--") {
26401
+ continue;
26402
+ }
26403
+ const flag = arg.split("=", 1)[0];
26404
+ const similar = options.filter(
26405
+ (option) => option !== flag && editDistance2(flag, option) <= 2
26406
+ );
26407
+ if (similar.length > 0) {
26408
+ const suggestion = similar.length === 1 ? similar[0] : `one of ${similar.join(", ")}`;
26409
+ command.error(
26410
+ `error: unknown option '${arg}'
26411
+ (Did you mean ${suggestion}?)`,
26412
+ { code: "commander.unknownOption" }
26413
+ );
26414
+ }
26415
+ }
26416
+ const separator = args.indexOf("--");
26417
+ return separator === -1 ? args : [...args.slice(0, separator), ...args.slice(separator + 1)];
26418
+ }
26419
+ function editDistance2(a, b) {
26420
+ const distances = Array.from(
26421
+ { length: a.length + 1 },
26422
+ (_, i2) => Array.from({ length: b.length + 1 }, (_2, j) => Math.max(i2, j))
26423
+ );
26424
+ for (let i2 = 1; i2 <= a.length; i2++) {
26425
+ for (let j = 1; j <= b.length; j++) {
26426
+ distances[i2][j] = Math.min(
26427
+ distances[i2 - 1][j] + 1,
26428
+ distances[i2][j - 1] + 1,
26429
+ distances[i2 - 1][j - 1] + (a[i2 - 1] === b[j - 1] ? 0 : 1)
26430
+ );
26431
+ if (i2 > 1 && j > 1 && a[i2 - 1] === b[j - 2] && a[i2 - 2] === b[j - 1]) {
26432
+ distances[i2][j] = Math.min(
26433
+ distances[i2][j],
26434
+ distances[i2 - 2][j - 2] + 1
26435
+ );
26436
+ }
26437
+ }
26438
+ }
26439
+ return distances[a.length][b.length];
26440
+ }
26441
+
24863
26442
  // src/commands/deployment/index.ts
24864
26443
  var descriptions = {
24865
26444
  up: "Start the selected Compose deployment",
24866
26445
  down: "Stop the selected Compose deployment",
24867
- logs: "Stream logs for the selected deployment",
26446
+ logs: "Print the logs of the selected deployment, or stream them with --follow",
24868
26447
  ps: "List the running containers or pods for the selected deployment",
24869
26448
  restart: "Restart the workloads of the selected deployment",
24870
26449
  pull: "Download the configured images without changing configuration"
@@ -24879,8 +26458,8 @@ function createDeploymentCommands(context, setExitCode) {
24879
26458
  (name) => {
24880
26459
  const command = new Command(name).description(descriptions[name]).argument(
24881
26460
  "[args...]",
24882
- "additional arguments passed to the deployment runtime"
24883
- ).option("--instance <name>", "select a configured instance");
26461
+ "additional arguments and options passed to the deployment runtime"
26462
+ ).allowUnknownOption().option("--instance <name>", "select a configured instance");
24884
26463
  if (serviceScoped.has(name)) {
24885
26464
  command.option(
24886
26465
  "--service <name>",
@@ -24900,12 +26479,13 @@ function createDeploymentCommands(context, setExitCode) {
24900
26479
  );
24901
26480
  }
24902
26481
  return command.action(async (args, options) => {
26482
+ const runtimeArgs = runtimeArguments(command, args);
24903
26483
  const { config } = await loadCliState(context);
24904
26484
  setExitCode(
24905
26485
  await runDriverCommand(
24906
26486
  config,
24907
26487
  name,
24908
- parsedArgs(name, void 0, args, options),
26488
+ parsedArgs(name, void 0, runtimeArgs, options),
24909
26489
  context
24910
26490
  )
24911
26491
  );
@@ -24917,7 +26497,7 @@ function createDeploymentCommands(context, setExitCode) {
24917
26497
  // package.json
24918
26498
  var package_default = {
24919
26499
  name: "@eudiplo/cli",
24920
- version: "9.0.0",
26500
+ version: "9.1.0-main.021024e",
24921
26501
  description: "Deployment-aware command line tools for EUDIPLO",
24922
26502
  private: false,
24923
26503
  type: "module",
@@ -24977,12 +26557,12 @@ var package_default = {
24977
26557
  "jsonc-parser": "^3.3.1"
24978
26558
  },
24979
26559
  devDependencies: {
24980
- "@biomejs/biome": "2.5.14",
24981
- "@types/node": "^26.4.0",
26560
+ "@biomejs/biome": "2.5.15",
26561
+ "@types/node": "^26.6.4",
24982
26562
  esbuild: "^0.28.2",
24983
- tsx: "^4.23.13",
26563
+ tsx: "^4.23.15",
24984
26564
  typescript: "^7.0.2",
24985
- vitest: "5.0.2"
26565
+ vitest: "5.0.3"
24986
26566
  }
24987
26567
  };
24988
26568
 
@@ -25360,6 +26940,13 @@ var kmsHealthCheck = {
25360
26940
  message: "This backend does not expose the KMS provider health endpoint."
25361
26941
  };
25362
26942
  }
26943
+ if (response.status === 401 || response.status === 403) {
26944
+ return {
26945
+ name: "KMS providers",
26946
+ status: "skip",
26947
+ message: `Needs a tenant client with issuance:manage or presentation:manage (${response.reason}).`
26948
+ };
26949
+ }
25363
26950
  return {
25364
26951
  name: "KMS providers",
25365
26952
  status: "fail",
@@ -26270,6 +27857,10 @@ var managedImages = {
26270
27857
  EUDIPLO_IMAGE: "ghcr.io/eudiplo/eudiplo",
26271
27858
  EUDIPLO_CLIENT_IMAGE: "ghcr.io/eudiplo/eudiplo-client"
26272
27859
  };
27860
+ var managedServices = {
27861
+ EUDIPLO_IMAGE: "eudiplo",
27862
+ EUDIPLO_CLIENT_IMAGE: "eudiplo-client"
27863
+ };
26273
27864
  var legacyImages = {
26274
27865
  EUDIPLO_IMAGE: "ghcr.io/openwallet-foundation/eudiplo",
26275
27866
  EUDIPLO_CLIENT_IMAGE: "ghcr.io/openwallet-foundation/eudiplo-client"
@@ -26436,7 +28027,12 @@ async function runUpgradeCommand(config, parsed, context) {
26436
28027
  return 0;
26437
28028
  }
26438
28029
  await writeFile6(envPath, plan.content, "utf8");
26439
- const pulled = await runCompose(buildComposePullArgs(void 0), options);
28030
+ const pulled = await runCompose(
28031
+ buildComposePullArgs(
28032
+ plan.changes.map((change) => managedServices[change.key])
28033
+ ),
28034
+ options
28035
+ );
26440
28036
  if (pulled !== 0) {
26441
28037
  await writeFile6(envPath, original, "utf8");
26442
28038
  context.stderr.write(