@eudiplo/cli 9.0.0-main.1d44ec5 → 9.0.0-main.22d3602

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 (39) 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 +868 -90
  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 +1 -1
  33. package/templates/demo-config/presentation/pid.json +1 -2
  34. package/templates/demo-config.manifest.json +1 -3
  35. package/templates/docker-compose.yml +11 -6
  36. package/templates/schemas/IssuanceConfig.schema.json +20 -0
  37. package/templates/schemas/IssuanceConfigFile.schema.json +676 -1
  38. package/templates/demo-config/attribute-providers/claims-provider.json +0 -15
  39. package/templates/demo-config/webhook-endpoints/notification.json +0 -15
package/dist/index.js CHANGED
@@ -14909,7 +14909,7 @@ var CONFIG_FORMATS = {
14909
14909
  IssuanceConfig: {
14910
14910
  slug: "issuance-config",
14911
14911
  file: "IssuanceConfigFile",
14912
- version: 2
14912
+ version: 3
14913
14913
  },
14914
14914
  CredentialConfig: {
14915
14915
  slug: "credential-config",
@@ -14992,6 +14992,15 @@ var CONFIG_MIGRATIONS = [
14992
14992
  // valid v2 spec whose offers keep having no lifetime.
14993
14993
  migrate: (spec) => ({ spec })
14994
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
+ },
14995
15004
  presentationConfigV1ToV2,
14996
15005
  {
14997
15006
  id: "presentation-config-v3-typed-claim-values",
@@ -21466,13 +21475,13 @@ var CONFIG_SCHEMAS = [
21466
21475
  },
21467
21476
  {
21468
21477
  "$schema": "https://json-schema.org/draft/2020-12/schema",
21469
- "$id": "https://eudiplo.dev/schemas/v3/PresentationConfigFile.schema.json",
21470
- "title": "PresentationConfigFile",
21478
+ "$id": "https://eudiplo.dev/schemas/v3/IssuanceConfigFile.schema.json",
21479
+ "title": "IssuanceConfigFile",
21471
21480
  "type": "object",
21472
21481
  "properties": {
21473
21482
  "$schema": {
21474
21483
  "type": "string",
21475
- "const": "https://eudiplo.dev/schemas/v3/PresentationConfigFile.schema.json"
21484
+ "const": "https://eudiplo.dev/schemas/v3/IssuanceConfigFile.schema.json"
21476
21485
  },
21477
21486
  "metadata": {
21478
21487
  "type": "object",
@@ -21494,23 +21503,7 @@ var CONFIG_SCHEMAS = [
21494
21503
  "additionalProperties": false
21495
21504
  },
21496
21505
  "spec": {
21497
- "allOf": [
21498
- {
21499
- "$ref": "#/$defs/PresentationConfigCreateDto"
21500
- },
21501
- {
21502
- "type": "object",
21503
- "required": [
21504
- "id"
21505
- ],
21506
- "properties": {
21507
- "id": {
21508
- "type": "string",
21509
- "minLength": 1
21510
- }
21511
- }
21512
- }
21513
- ]
21506
+ "$ref": "#/$defs/IssuanceConfig"
21514
21507
  }
21515
21508
  },
21516
21509
  "required": [
@@ -21519,76 +21512,787 @@ var CONFIG_SCHEMAS = [
21519
21512
  ],
21520
21513
  "additionalProperties": false,
21521
21514
  "$defs": {
21522
- "PresentationConfigCreateDto": {
21515
+ "IssuanceConfig": {
21523
21516
  "type": "object",
21524
21517
  "properties": {
21525
- "id": {
21526
- "type": "string",
21527
- "minLength": 1,
21528
- "description": "Presentation configuration identifier."
21529
- },
21530
- "description": {
21531
- "description": "Optional presentation configuration description.",
21532
- "type": [
21533
- "string",
21534
- "null"
21535
- ]
21536
- },
21537
- "lifeTime": {
21538
- "description": "Presentation request lifetime in seconds.",
21518
+ "batchSize": {
21519
+ "description": "Optional issuance batch size.",
21539
21520
  "type": "integer",
21540
21521
  "minimum": 1,
21541
21522
  "maximum": 9007199254740991
21542
21523
  },
21543
- "skewSeconds": {
21544
- "description": "Clock skew tolerance in seconds.",
21545
- "type": "integer",
21546
- "minimum": 0,
21547
- "maximum": 9007199254740991
21524
+ "dPopRequired": {
21525
+ "description": "Require DPoP proofs for issuance endpoints.",
21526
+ "type": "boolean"
21548
21527
  },
21549
- "statusCheckMode": {
21550
- "description": "Revocation/status check mode.",
21528
+ "walletAttestationRequired": {
21529
+ "description": "Default wallet attestation requirement for managed authorization servers.",
21530
+ "type": "boolean"
21531
+ },
21532
+ "walletProviderTrustLists": {
21533
+ "description": "Shared wallet provider trust lists for key attestations and default authorization server wallet authentication.",
21534
+ "type": "array",
21535
+ "items": {
21536
+ "type": "object",
21537
+ "properties": {
21538
+ "trustListId": {
21539
+ "type": "string",
21540
+ "minLength": 1
21541
+ },
21542
+ "url": {
21543
+ "description": "URL of the wallet provider trust list.",
21544
+ "type": "string",
21545
+ "format": "uri"
21546
+ },
21547
+ "verifierKey": {
21548
+ "description": "Optional verifier key material used for trust list verification.",
21549
+ "type": "object",
21550
+ "propertyNames": {
21551
+ "type": "string"
21552
+ },
21553
+ "additionalProperties": {}
21554
+ },
21555
+ "verifierKeyPem": {
21556
+ "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
21557
+ "type": "string",
21558
+ "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
21559
+ },
21560
+ "verifierX509Der": {
21561
+ "description": "Optional verifier certificate in DER/base64 form.",
21562
+ "type": "string"
21563
+ }
21564
+ },
21565
+ "additionalProperties": false
21566
+ }
21567
+ },
21568
+ "signingKeyId": {
21569
+ "description": "Default signing key chain id for credential issuance.",
21551
21570
  "type": "string",
21552
- "enum": [
21553
- "strict",
21554
- "best_effort",
21555
- "disabled"
21556
- ]
21571
+ "minLength": 1
21557
21572
  },
21558
- "dcql_query": {
21559
- "type": "object",
21560
- "properties": {
21561
- "credentials": {
21562
- "minItems": 1,
21563
- "type": "array",
21564
- "items": {
21565
- "oneOf": [
21566
- {
21573
+ "authorizationServers": {
21574
+ "minItems": 1,
21575
+ "type": "array",
21576
+ "items": {
21577
+ "oneOf": [
21578
+ {
21579
+ "type": "object",
21580
+ "properties": {
21581
+ "type": {
21582
+ "type": "string",
21583
+ "const": "external",
21584
+ "description": "Use an externally managed authorization server."
21585
+ },
21586
+ "id": {
21587
+ "type": "string",
21588
+ "minLength": 1,
21589
+ "description": "Authorization server identifier."
21590
+ },
21591
+ "issuer": {
21592
+ "type": "string",
21593
+ "format": "uri",
21594
+ "description": "Issuer URL for the external authorization server."
21595
+ },
21596
+ "sessionBinding": {
21597
+ "description": "Explicit mapping from an external access-token claim to an existing issuance session.",
21567
21598
  "type": "object",
21568
21599
  "properties": {
21569
- "id": {
21600
+ "method": {
21601
+ "type": "string",
21602
+ "const": "access_token_claim",
21603
+ "description": "Read the correlation value from a configured access-token claim."
21604
+ },
21605
+ "claim": {
21570
21606
  "type": "string",
21571
21607
  "minLength": 1,
21572
- "pattern": "^[A-Za-z0-9_-]+$",
21573
- "description": "Credential query identifier."
21608
+ "description": "Claim name that contains the issuance-session correlation value."
21609
+ }
21610
+ },
21611
+ "required": [
21612
+ "method",
21613
+ "claim"
21614
+ ],
21615
+ "additionalProperties": false
21616
+ },
21617
+ "label": {
21618
+ "description": "Optional display label for UI selection.",
21619
+ "type": "string"
21620
+ },
21621
+ "enabled": {
21622
+ "description": "Whether this authorization server entry is enabled.",
21623
+ "type": "boolean"
21624
+ }
21625
+ },
21626
+ "required": [
21627
+ "type",
21628
+ "id",
21629
+ "issuer"
21630
+ ],
21631
+ "additionalProperties": false
21632
+ },
21633
+ {
21634
+ "type": "object",
21635
+ "properties": {
21636
+ "type": {
21637
+ "type": "string",
21638
+ "const": "oid4vp",
21639
+ "description": "Use OID4VP-based authorization server chaining."
21640
+ },
21641
+ "id": {
21642
+ "type": "string",
21643
+ "minLength": 1,
21644
+ "description": "Authorization server identifier."
21645
+ },
21646
+ "presentationConfigId": {
21647
+ "type": "string",
21648
+ "minLength": 1,
21649
+ "description": "Presentation configuration id used during authorization."
21650
+ },
21651
+ "immediateWalletRedirect": {
21652
+ "description": "Redirect wallets immediately after authorization response creation.",
21653
+ "type": "boolean"
21654
+ },
21655
+ "token": {
21656
+ "description": "Optional token issuance settings.",
21657
+ "type": "object",
21658
+ "properties": {
21659
+ "lifetimeSeconds": {
21660
+ "description": "Access token lifetime in seconds.",
21661
+ "type": "number",
21662
+ "minimum": 60
21574
21663
  },
21575
- "multiple": {
21576
- "description": "Allow multiple matching credentials.",
21664
+ "signingKeyId": {
21665
+ "description": "Optional key chain id used to sign issued tokens.",
21666
+ "type": "string",
21667
+ "minLength": 1
21668
+ },
21669
+ "refreshTokenEnabled": {
21670
+ "description": "Enable issuing refresh tokens.",
21577
21671
  "type": "boolean"
21578
21672
  },
21579
- "claim_sets": {
21580
- "description": "Optional claim set constraints.",
21581
- "type": "array",
21582
- "items": {
21583
- "type": "array",
21584
- "items": {
21673
+ "refreshTokenExpiresInSeconds": {
21674
+ "description": "Refresh token lifetime in seconds.",
21675
+ "type": "number",
21676
+ "minimum": 60
21677
+ }
21678
+ },
21679
+ "additionalProperties": false
21680
+ },
21681
+ "requireDPoP": {
21682
+ "description": "Require DPoP proofs for token/credential requests.",
21683
+ "type": "boolean"
21684
+ },
21685
+ "walletAttestationRequired": {
21686
+ "description": "Require wallet attestation for this authorization server.",
21687
+ "type": "boolean"
21688
+ },
21689
+ "walletProviderTrustLists": {
21690
+ "description": "Optional wallet provider trust list references for this authorization server.",
21691
+ "type": "array",
21692
+ "items": {
21693
+ "type": "object",
21694
+ "properties": {
21695
+ "trustListId": {
21696
+ "type": "string",
21697
+ "minLength": 1
21698
+ },
21699
+ "url": {
21700
+ "description": "URL of the wallet provider trust list.",
21701
+ "type": "string",
21702
+ "format": "uri"
21703
+ },
21704
+ "verifierKey": {
21705
+ "description": "Optional verifier key material used for trust list verification.",
21706
+ "type": "object",
21707
+ "propertyNames": {
21585
21708
  "type": "string"
21586
- }
21587
- }
21588
- },
21589
- "trusted_authorities": {
21590
- "description": "Optional trusted authority constraints.",
21591
- "type": "array",
21709
+ },
21710
+ "additionalProperties": {}
21711
+ },
21712
+ "verifierKeyPem": {
21713
+ "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
21714
+ "type": "string",
21715
+ "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
21716
+ },
21717
+ "verifierX509Der": {
21718
+ "description": "Optional verifier certificate in DER/base64 form.",
21719
+ "type": "string"
21720
+ }
21721
+ },
21722
+ "additionalProperties": false
21723
+ }
21724
+ },
21725
+ "label": {
21726
+ "description": "Optional display label for UI selection.",
21727
+ "type": "string"
21728
+ },
21729
+ "enabled": {
21730
+ "description": "Whether this authorization server entry is enabled.",
21731
+ "type": "boolean"
21732
+ }
21733
+ },
21734
+ "required": [
21735
+ "type",
21736
+ "id",
21737
+ "presentationConfigId"
21738
+ ],
21739
+ "additionalProperties": false
21740
+ },
21741
+ {
21742
+ "type": "object",
21743
+ "properties": {
21744
+ "type": {
21745
+ "type": "string",
21746
+ "const": "chained",
21747
+ "description": "Use upstream OIDC as authorization source."
21748
+ },
21749
+ "id": {
21750
+ "type": "string",
21751
+ "minLength": 1,
21752
+ "description": "Authorization server identifier."
21753
+ },
21754
+ "upstream": {
21755
+ "type": "object",
21756
+ "properties": {
21757
+ "issuer": {
21758
+ "type": "string",
21759
+ "format": "uri",
21760
+ "description": "Upstream OIDC issuer URL."
21761
+ },
21762
+ "clientId": {
21763
+ "type": "string",
21764
+ "minLength": 1,
21765
+ "description": "Client id for upstream OIDC authentication."
21766
+ },
21767
+ "clientSecret": {
21768
+ "description": "Optional client secret for upstream OIDC authentication.",
21769
+ "type": "string",
21770
+ "minLength": 1
21771
+ },
21772
+ "scopes": {
21773
+ "description": "Optional scopes requested from the upstream issuer.",
21774
+ "type": "array",
21775
+ "items": {
21776
+ "type": "string",
21777
+ "minLength": 1
21778
+ }
21779
+ }
21780
+ },
21781
+ "required": [
21782
+ "issuer",
21783
+ "clientId"
21784
+ ],
21785
+ "additionalProperties": false,
21786
+ "description": "Upstream OIDC connection settings."
21787
+ },
21788
+ "token": {
21789
+ "description": "Optional token issuance settings.",
21790
+ "type": "object",
21791
+ "properties": {
21792
+ "lifetimeSeconds": {
21793
+ "description": "Access token lifetime in seconds.",
21794
+ "type": "number",
21795
+ "minimum": 60
21796
+ },
21797
+ "signingKeyId": {
21798
+ "description": "Optional key chain id used to sign issued tokens.",
21799
+ "type": "string",
21800
+ "minLength": 1
21801
+ },
21802
+ "refreshTokenEnabled": {
21803
+ "description": "Enable issuing refresh tokens.",
21804
+ "type": "boolean"
21805
+ },
21806
+ "refreshTokenExpiresInSeconds": {
21807
+ "description": "Refresh token lifetime in seconds.",
21808
+ "type": "number",
21809
+ "minimum": 60
21810
+ }
21811
+ },
21812
+ "additionalProperties": false
21813
+ },
21814
+ "requireDPoP": {
21815
+ "description": "Require DPoP proofs for token/credential requests.",
21816
+ "type": "boolean"
21817
+ },
21818
+ "walletAttestationRequired": {
21819
+ "description": "Require wallet attestation for this authorization server.",
21820
+ "type": "boolean"
21821
+ },
21822
+ "walletProviderTrustLists": {
21823
+ "description": "Optional wallet provider trust list references for this authorization server.",
21824
+ "type": "array",
21825
+ "items": {
21826
+ "type": "object",
21827
+ "properties": {
21828
+ "trustListId": {
21829
+ "type": "string",
21830
+ "minLength": 1
21831
+ },
21832
+ "url": {
21833
+ "description": "URL of the wallet provider trust list.",
21834
+ "type": "string",
21835
+ "format": "uri"
21836
+ },
21837
+ "verifierKey": {
21838
+ "description": "Optional verifier key material used for trust list verification.",
21839
+ "type": "object",
21840
+ "propertyNames": {
21841
+ "type": "string"
21842
+ },
21843
+ "additionalProperties": {}
21844
+ },
21845
+ "verifierKeyPem": {
21846
+ "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
21847
+ "type": "string",
21848
+ "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
21849
+ },
21850
+ "verifierX509Der": {
21851
+ "description": "Optional verifier certificate in DER/base64 form.",
21852
+ "type": "string"
21853
+ }
21854
+ },
21855
+ "additionalProperties": false
21856
+ }
21857
+ },
21858
+ "label": {
21859
+ "description": "Optional display label for UI selection.",
21860
+ "type": "string"
21861
+ },
21862
+ "enabled": {
21863
+ "description": "Whether this authorization server entry is enabled.",
21864
+ "type": "boolean"
21865
+ }
21866
+ },
21867
+ "required": [
21868
+ "type",
21869
+ "id",
21870
+ "upstream"
21871
+ ],
21872
+ "additionalProperties": false
21873
+ },
21874
+ {
21875
+ "type": "object",
21876
+ "properties": {
21877
+ "type": {
21878
+ "type": "string",
21879
+ "const": "built-in",
21880
+ "description": "Use EUDIPLO built-in authorization server."
21881
+ },
21882
+ "id": {
21883
+ "type": "string",
21884
+ "minLength": 1,
21885
+ "description": "Authorization server identifier."
21886
+ },
21887
+ "token": {
21888
+ "description": "Optional token issuance settings.",
21889
+ "type": "object",
21890
+ "properties": {
21891
+ "lifetimeSeconds": {
21892
+ "description": "Access token lifetime in seconds.",
21893
+ "type": "number",
21894
+ "minimum": 60
21895
+ },
21896
+ "signingKeyId": {
21897
+ "description": "Optional key chain id used to sign issued tokens.",
21898
+ "type": "string",
21899
+ "minLength": 1
21900
+ },
21901
+ "refreshTokenEnabled": {
21902
+ "description": "Enable issuing refresh tokens.",
21903
+ "type": "boolean"
21904
+ },
21905
+ "refreshTokenExpiresInSeconds": {
21906
+ "description": "Refresh token lifetime in seconds.",
21907
+ "type": "number",
21908
+ "minimum": 60
21909
+ }
21910
+ },
21911
+ "additionalProperties": false
21912
+ },
21913
+ "requireDPoP": {
21914
+ "description": "Require DPoP proofs for token/credential requests.",
21915
+ "type": "boolean"
21916
+ },
21917
+ "walletAttestationRequired": {
21918
+ "description": "Require wallet attestation for this authorization server.",
21919
+ "type": "boolean"
21920
+ },
21921
+ "walletProviderTrustLists": {
21922
+ "description": "Optional wallet provider trust list references for this authorization server.",
21923
+ "type": "array",
21924
+ "items": {
21925
+ "type": "object",
21926
+ "properties": {
21927
+ "trustListId": {
21928
+ "type": "string",
21929
+ "minLength": 1
21930
+ },
21931
+ "url": {
21932
+ "description": "URL of the wallet provider trust list.",
21933
+ "type": "string",
21934
+ "format": "uri"
21935
+ },
21936
+ "verifierKey": {
21937
+ "description": "Optional verifier key material used for trust list verification.",
21938
+ "type": "object",
21939
+ "propertyNames": {
21940
+ "type": "string"
21941
+ },
21942
+ "additionalProperties": {}
21943
+ },
21944
+ "verifierKeyPem": {
21945
+ "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
21946
+ "type": "string",
21947
+ "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
21948
+ },
21949
+ "verifierX509Der": {
21950
+ "description": "Optional verifier certificate in DER/base64 form.",
21951
+ "type": "string"
21952
+ }
21953
+ },
21954
+ "additionalProperties": false
21955
+ }
21956
+ },
21957
+ "label": {
21958
+ "description": "Optional display label for UI selection.",
21959
+ "type": "string"
21960
+ },
21961
+ "enabled": {
21962
+ "description": "Whether this authorization server entry is enabled.",
21963
+ "type": "boolean"
21964
+ }
21965
+ },
21966
+ "required": [
21967
+ "type",
21968
+ "id"
21969
+ ],
21970
+ "additionalProperties": false
21971
+ }
21972
+ ],
21973
+ "description": "Supported authorization server configurations."
21974
+ },
21975
+ "description": "Configured authorization server entries."
21976
+ },
21977
+ "federation": {
21978
+ "description": "Optional OpenID Federation settings.",
21979
+ "anyOf": [
21980
+ {
21981
+ "type": "object",
21982
+ "properties": {
21983
+ "role": {
21984
+ "description": "Federation role for this issuer.",
21985
+ "type": "string",
21986
+ "enum": [
21987
+ "trust_anchor",
21988
+ "intermediate",
21989
+ "leaf"
21990
+ ]
21991
+ },
21992
+ "mode": {
21993
+ "description": "Federation operation mode.",
21994
+ "type": "string",
21995
+ "enum": [
21996
+ "federation-only",
21997
+ "hybrid"
21998
+ ]
21999
+ },
22000
+ "entityId": {
22001
+ "description": "Optional local federation entity id.",
22002
+ "type": "string"
22003
+ },
22004
+ "enforceSigningPolicy": {
22005
+ "description": "Enforce strict signing policy checks.",
22006
+ "type": "boolean"
22007
+ },
22008
+ "cacheTtlSeconds": {
22009
+ "description": "Cache time-to-live for federation metadata in seconds.",
22010
+ "type": "integer",
22011
+ "minimum": 1,
22012
+ "maximum": 9007199254740991
22013
+ },
22014
+ "trustAnchors": {
22015
+ "type": "array",
22016
+ "items": {
22017
+ "type": "object",
22018
+ "properties": {
22019
+ "entityId": {
22020
+ "type": "string",
22021
+ "minLength": 1,
22022
+ "description": "Federation trust anchor entity id."
22023
+ },
22024
+ "entityConfigurationUri": {
22025
+ "type": "string",
22026
+ "format": "uri",
22027
+ "description": "Entity configuration URI for the trust anchor."
22028
+ }
22029
+ },
22030
+ "required": [
22031
+ "entityId",
22032
+ "entityConfigurationUri"
22033
+ ],
22034
+ "additionalProperties": false
22035
+ },
22036
+ "description": "Federation trust anchors."
22037
+ }
22038
+ },
22039
+ "required": [
22040
+ "trustAnchors"
22041
+ ],
22042
+ "additionalProperties": false
22043
+ },
22044
+ {
22045
+ "type": "null"
22046
+ }
22047
+ ]
22048
+ },
22049
+ "registrationCertificate": {
22050
+ "description": "Optional registration certificate settings.",
22051
+ "anyOf": [
22052
+ {
22053
+ "type": "object",
22054
+ "properties": {
22055
+ "enabled": {
22056
+ "description": "Enable issuer registration certificate support.",
22057
+ "type": "boolean"
22058
+ },
22059
+ "mode": {
22060
+ "description": "How registration certificate data is provided.",
22061
+ "type": "string",
22062
+ "enum": [
22063
+ "import",
22064
+ "generate"
22065
+ ]
22066
+ },
22067
+ "jwt": {
22068
+ "description": "Optional registration certificate JWT when using import mode.",
22069
+ "type": "string"
22070
+ },
22071
+ "privacyPolicy": {
22072
+ "description": "Optional privacy policy URI.",
22073
+ "type": "string"
22074
+ },
22075
+ "supportUri": {
22076
+ "description": "Optional support URI.",
22077
+ "type": "string"
22078
+ }
22079
+ },
22080
+ "additionalProperties": false
22081
+ },
22082
+ {
22083
+ "type": "null"
22084
+ }
22085
+ ]
22086
+ },
22087
+ "display": {
22088
+ "description": "Localized issuer metadata shown to wallets.",
22089
+ "type": "array",
22090
+ "items": {
22091
+ "type": "object",
22092
+ "properties": {
22093
+ "name": {
22094
+ "description": "Issuer display name.",
22095
+ "type": "string"
22096
+ },
22097
+ "locale": {
22098
+ "description": "Locale tag for this display entry.",
22099
+ "type": "string"
22100
+ },
22101
+ "logo": {
22102
+ "description": "Optional issuer logo metadata.",
22103
+ "type": "object",
22104
+ "properties": {
22105
+ "uri": {
22106
+ "type": "string",
22107
+ "minLength": 1,
22108
+ "description": "Logo URI."
22109
+ },
22110
+ "alt_text": {
22111
+ "description": "Optional localized alternative text.",
22112
+ "type": "string"
22113
+ }
22114
+ },
22115
+ "required": [
22116
+ "uri"
22117
+ ],
22118
+ "additionalProperties": {}
22119
+ }
22120
+ },
22121
+ "additionalProperties": {}
22122
+ }
22123
+ },
22124
+ "notificationEndpointEnabled": {
22125
+ "description": "Whether the OID4VCI notification endpoint is exposed for this issuance configuration.",
22126
+ "type": "boolean"
22127
+ },
22128
+ "credentialResponseEncryption": {
22129
+ "description": "Enable encrypted credential responses.",
22130
+ "type": "boolean"
22131
+ },
22132
+ "credentialRequestEncryption": {
22133
+ "description": "Require encrypted credential requests.",
22134
+ "type": "boolean"
22135
+ },
22136
+ "txCodeMaxAttempts": {
22137
+ "description": "Maximum verification attempts for transaction codes. Null resets to defaults.",
22138
+ "anyOf": [
22139
+ {
22140
+ "type": "integer",
22141
+ "minimum": 1,
22142
+ "maximum": 9007199254740991
22143
+ },
22144
+ {
22145
+ "type": "null"
22146
+ }
22147
+ ]
22148
+ },
22149
+ "offerLifetimeSeconds": {
22150
+ "description": "Default lifetime of credential offers in seconds. Can be overridden per offer request. Null or unset: offers do not expire.",
22151
+ "anyOf": [
22152
+ {
22153
+ "type": "integer",
22154
+ "minimum": 1,
22155
+ "maximum": 9007199254740991
22156
+ },
22157
+ {
22158
+ "type": "null"
22159
+ }
22160
+ ]
22161
+ }
22162
+ },
22163
+ "required": [
22164
+ "authorizationServers"
22165
+ ],
22166
+ "additionalProperties": false,
22167
+ "title": "IssuanceConfig"
22168
+ }
22169
+ }
22170
+ },
22171
+ {
22172
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
22173
+ "$id": "https://eudiplo.dev/schemas/v3/PresentationConfigFile.schema.json",
22174
+ "title": "PresentationConfigFile",
22175
+ "type": "object",
22176
+ "properties": {
22177
+ "$schema": {
22178
+ "type": "string",
22179
+ "const": "https://eudiplo.dev/schemas/v3/PresentationConfigFile.schema.json"
22180
+ },
22181
+ "metadata": {
22182
+ "type": "object",
22183
+ "properties": {
22184
+ "generation": {
22185
+ "type": "integer",
22186
+ "minimum": 1,
22187
+ "description": "Monotonically increasing configuration generation."
22188
+ },
22189
+ "ownership": {
22190
+ "type": "string",
22191
+ "enum": [
22192
+ "unmanaged",
22193
+ "file-managed"
22194
+ ],
22195
+ "description": "Requested ownership recorded when the document is applied."
22196
+ }
22197
+ },
22198
+ "additionalProperties": false
22199
+ },
22200
+ "spec": {
22201
+ "allOf": [
22202
+ {
22203
+ "$ref": "#/$defs/PresentationConfigCreateDto"
22204
+ },
22205
+ {
22206
+ "type": "object",
22207
+ "required": [
22208
+ "id"
22209
+ ],
22210
+ "properties": {
22211
+ "id": {
22212
+ "type": "string",
22213
+ "minLength": 1
22214
+ }
22215
+ }
22216
+ }
22217
+ ]
22218
+ }
22219
+ },
22220
+ "required": [
22221
+ "$schema",
22222
+ "spec"
22223
+ ],
22224
+ "additionalProperties": false,
22225
+ "$defs": {
22226
+ "PresentationConfigCreateDto": {
22227
+ "type": "object",
22228
+ "properties": {
22229
+ "id": {
22230
+ "type": "string",
22231
+ "minLength": 1,
22232
+ "description": "Presentation configuration identifier."
22233
+ },
22234
+ "description": {
22235
+ "description": "Optional presentation configuration description.",
22236
+ "type": [
22237
+ "string",
22238
+ "null"
22239
+ ]
22240
+ },
22241
+ "lifeTime": {
22242
+ "description": "Presentation request lifetime in seconds.",
22243
+ "type": "integer",
22244
+ "minimum": 1,
22245
+ "maximum": 9007199254740991
22246
+ },
22247
+ "skewSeconds": {
22248
+ "description": "Clock skew tolerance in seconds.",
22249
+ "type": "integer",
22250
+ "minimum": 0,
22251
+ "maximum": 9007199254740991
22252
+ },
22253
+ "statusCheckMode": {
22254
+ "description": "Revocation/status check mode.",
22255
+ "type": "string",
22256
+ "enum": [
22257
+ "strict",
22258
+ "best_effort",
22259
+ "disabled"
22260
+ ]
22261
+ },
22262
+ "dcql_query": {
22263
+ "type": "object",
22264
+ "properties": {
22265
+ "credentials": {
22266
+ "minItems": 1,
22267
+ "type": "array",
22268
+ "items": {
22269
+ "oneOf": [
22270
+ {
22271
+ "type": "object",
22272
+ "properties": {
22273
+ "id": {
22274
+ "type": "string",
22275
+ "minLength": 1,
22276
+ "pattern": "^[A-Za-z0-9_-]+$",
22277
+ "description": "Credential query identifier."
22278
+ },
22279
+ "multiple": {
22280
+ "description": "Allow multiple matching credentials.",
22281
+ "type": "boolean"
22282
+ },
22283
+ "claim_sets": {
22284
+ "description": "Optional claim set constraints.",
22285
+ "type": "array",
22286
+ "items": {
22287
+ "type": "array",
22288
+ "items": {
22289
+ "type": "string"
22290
+ }
22291
+ }
22292
+ },
22293
+ "trusted_authorities": {
22294
+ "description": "Optional trusted authority constraints.",
22295
+ "type": "array",
21592
22296
  "items": {
21593
22297
  "oneOf": [
21594
22298
  {
@@ -23735,7 +24439,10 @@ function createTenantCommand(context, setExitCode) {
23735
24439
 
23736
24440
  // src/commands/config/validate/index.ts
23737
24441
  function createValidateCommand(context, setExitCode) {
23738
- return new Command("validate").description("Validate CLI or tenant config-import files").argument("[scope]").argument("[path]").addOption(
24442
+ return new Command("validate").description("Validate CLI or tenant config-import files").argument(
24443
+ "[scope]",
24444
+ '"tenant" for one tenant folder or "tenants" for a folder of tenant folders; omit it to validate the CLI config file'
24445
+ ).argument("[path]", "the folder to validate (required with a scope)").addOption(
23739
24446
  new Option("--format <text|json>", "tenant report format").choices(["text", "json"]).default("text")
23740
24447
  ).action(async (scope, path2, options) => {
23741
24448
  const state = await loadCliState(context);
@@ -23854,9 +24561,9 @@ function buildComposeLogsArgs(service, options = {}) {
23854
24561
  }
23855
24562
  return args;
23856
24563
  }
23857
- function buildComposePullArgs(service) {
24564
+ function buildComposePullArgs(services) {
23858
24565
  const args = ["pull"];
23859
- if (service !== void 0) {
24566
+ for (const service of typeof services === "string" ? [services] : services ?? []) {
23860
24567
  assertServiceName(service);
23861
24568
  args.push(service);
23862
24569
  }
@@ -23894,23 +24601,28 @@ function parseContainerStates(stdout) {
23894
24601
  return entries.map((entry) => {
23895
24602
  const record = entry;
23896
24603
  const names = record.Names;
24604
+ const status = String(record.Status ?? "");
24605
+ const exitCode2 = typeof record.ExitCode === "number" ? record.ExitCode : /^Exited \((\d+)\)/.exec(status)?.[1];
23897
24606
  return {
23898
24607
  name: Array.isArray(names) ? String(names[0] ?? "") : String(names ?? record.Name ?? ""),
23899
24608
  state: String(record.State ?? ""),
23900
- status: String(record.Status ?? "")
24609
+ status,
24610
+ exitCode: exitCode2 === void 0 ? void 0 : Number(exitCode2)
23901
24611
  };
23902
24612
  });
23903
24613
  }
23904
24614
  function summarizeContainerStates(containers, projectName) {
23905
24615
  const name = "service containers";
23906
- if (containers.length === 0) {
24616
+ const services = containers.filter((container) => !hasCompleted(container));
24617
+ const completed = containers.length - services.length;
24618
+ if (services.length === 0) {
23907
24619
  return {
23908
24620
  name,
23909
24621
  status: "warn",
23910
24622
  message: `No containers found for project ${projectName}. Start it with eudiplo up.`
23911
24623
  };
23912
24624
  }
23913
- const unhealthy = containers.filter(
24625
+ const unhealthy = services.filter(
23914
24626
  (container) => container.status.toLowerCase().includes("unhealthy")
23915
24627
  );
23916
24628
  if (unhealthy.length > 0) {
@@ -23920,25 +24632,28 @@ function summarizeContainerStates(containers, projectName) {
23920
24632
  message: `Unhealthy: ${describe(unhealthy)}`
23921
24633
  };
23922
24634
  }
23923
- const notRunning = containers.filter(
24635
+ const notRunning = services.filter(
23924
24636
  (container) => container.state.toLowerCase() !== "running"
23925
24637
  );
23926
24638
  if (notRunning.length > 0) {
23927
24639
  return {
23928
24640
  name,
23929
24641
  status: "warn",
23930
- message: `${containers.length - notRunning.length}/${containers.length} running. Not running: ${describe(notRunning)}`
24642
+ message: `${services.length - notRunning.length}/${services.length} running. Not running: ${describe(notRunning)}`
23931
24643
  };
23932
24644
  }
23933
- const starting = containers.filter(
24645
+ const starting = services.filter(
23934
24646
  (container) => container.status.toLowerCase().includes("starting")
23935
24647
  ).length;
23936
24648
  return {
23937
24649
  name,
23938
24650
  status: "pass",
23939
- message: `${containers.length} container(s) running${starting > 0 ? `, ${starting} still starting` : ""}.`
24651
+ message: `${services.length} container(s) running${starting > 0 ? `, ${starting} still starting` : ""}${completed > 0 ? `, ${completed} completed` : ""}.`
23940
24652
  };
23941
24653
  }
24654
+ function hasCompleted(container) {
24655
+ return container.state.toLowerCase() === "exited" && container.exitCode === 0;
24656
+ }
23942
24657
  function asArray(value) {
23943
24658
  return Array.isArray(value) ? value : [];
23944
24659
  }
@@ -24872,11 +25587,57 @@ async function runDriverCommand(config, command, parsed, context) {
24872
25587
  });
24873
25588
  }
24874
25589
 
25590
+ // src/commands/deployment/pass-through.ts
25591
+ function runtimeArguments(command, args) {
25592
+ const options = command.options.flatMap((option) => option.long ?? []);
25593
+ for (const arg of args) {
25594
+ if (!arg.startsWith("--") || arg === "--") {
25595
+ continue;
25596
+ }
25597
+ const flag = arg.split("=", 1)[0];
25598
+ const similar = options.filter(
25599
+ (option) => option !== flag && editDistance2(flag, option) <= 2
25600
+ );
25601
+ if (similar.length > 0) {
25602
+ const suggestion = similar.length === 1 ? similar[0] : `one of ${similar.join(", ")}`;
25603
+ command.error(
25604
+ `error: unknown option '${arg}'
25605
+ (Did you mean ${suggestion}?)`,
25606
+ { code: "commander.unknownOption" }
25607
+ );
25608
+ }
25609
+ }
25610
+ const separator = args.indexOf("--");
25611
+ return separator === -1 ? args : [...args.slice(0, separator), ...args.slice(separator + 1)];
25612
+ }
25613
+ function editDistance2(a, b) {
25614
+ const distances = Array.from(
25615
+ { length: a.length + 1 },
25616
+ (_, i2) => Array.from({ length: b.length + 1 }, (_2, j) => Math.max(i2, j))
25617
+ );
25618
+ for (let i2 = 1; i2 <= a.length; i2++) {
25619
+ for (let j = 1; j <= b.length; j++) {
25620
+ distances[i2][j] = Math.min(
25621
+ distances[i2 - 1][j] + 1,
25622
+ distances[i2][j - 1] + 1,
25623
+ distances[i2 - 1][j - 1] + (a[i2 - 1] === b[j - 1] ? 0 : 1)
25624
+ );
25625
+ if (i2 > 1 && j > 1 && a[i2 - 1] === b[j - 2] && a[i2 - 2] === b[j - 1]) {
25626
+ distances[i2][j] = Math.min(
25627
+ distances[i2][j],
25628
+ distances[i2 - 2][j - 2] + 1
25629
+ );
25630
+ }
25631
+ }
25632
+ }
25633
+ return distances[a.length][b.length];
25634
+ }
25635
+
24875
25636
  // src/commands/deployment/index.ts
24876
25637
  var descriptions = {
24877
25638
  up: "Start the selected Compose deployment",
24878
25639
  down: "Stop the selected Compose deployment",
24879
- logs: "Stream logs for the selected deployment",
25640
+ logs: "Print the logs of the selected deployment, or stream them with --follow",
24880
25641
  ps: "List the running containers or pods for the selected deployment",
24881
25642
  restart: "Restart the workloads of the selected deployment",
24882
25643
  pull: "Download the configured images without changing configuration"
@@ -24891,8 +25652,8 @@ function createDeploymentCommands(context, setExitCode) {
24891
25652
  (name) => {
24892
25653
  const command = new Command(name).description(descriptions[name]).argument(
24893
25654
  "[args...]",
24894
- "additional arguments passed to the deployment runtime"
24895
- ).option("--instance <name>", "select a configured instance");
25655
+ "additional arguments and options passed to the deployment runtime"
25656
+ ).allowUnknownOption().option("--instance <name>", "select a configured instance");
24896
25657
  if (serviceScoped.has(name)) {
24897
25658
  command.option(
24898
25659
  "--service <name>",
@@ -24912,12 +25673,13 @@ function createDeploymentCommands(context, setExitCode) {
24912
25673
  );
24913
25674
  }
24914
25675
  return command.action(async (args, options) => {
25676
+ const runtimeArgs = runtimeArguments(command, args);
24915
25677
  const { config } = await loadCliState(context);
24916
25678
  setExitCode(
24917
25679
  await runDriverCommand(
24918
25680
  config,
24919
25681
  name,
24920
- parsedArgs(name, void 0, args, options),
25682
+ parsedArgs(name, void 0, runtimeArgs, options),
24921
25683
  context
24922
25684
  )
24923
25685
  );
@@ -24929,7 +25691,7 @@ function createDeploymentCommands(context, setExitCode) {
24929
25691
  // package.json
24930
25692
  var package_default = {
24931
25693
  name: "@eudiplo/cli",
24932
- version: "9.0.0-main.1d44ec5",
25694
+ version: "9.0.0-main.22d3602",
24933
25695
  description: "Deployment-aware command line tools for EUDIPLO",
24934
25696
  private: false,
24935
25697
  type: "module",
@@ -25372,6 +26134,13 @@ var kmsHealthCheck = {
25372
26134
  message: "This backend does not expose the KMS provider health endpoint."
25373
26135
  };
25374
26136
  }
26137
+ if (response.status === 401 || response.status === 403) {
26138
+ return {
26139
+ name: "KMS providers",
26140
+ status: "skip",
26141
+ message: `Needs a tenant client with issuance:manage or presentation:manage (${response.reason}).`
26142
+ };
26143
+ }
25375
26144
  return {
25376
26145
  name: "KMS providers",
25377
26146
  status: "fail",
@@ -26282,6 +27051,10 @@ var managedImages = {
26282
27051
  EUDIPLO_IMAGE: "ghcr.io/eudiplo/eudiplo",
26283
27052
  EUDIPLO_CLIENT_IMAGE: "ghcr.io/eudiplo/eudiplo-client"
26284
27053
  };
27054
+ var managedServices = {
27055
+ EUDIPLO_IMAGE: "eudiplo",
27056
+ EUDIPLO_CLIENT_IMAGE: "eudiplo-client"
27057
+ };
26285
27058
  var legacyImages = {
26286
27059
  EUDIPLO_IMAGE: "ghcr.io/openwallet-foundation/eudiplo",
26287
27060
  EUDIPLO_CLIENT_IMAGE: "ghcr.io/openwallet-foundation/eudiplo-client"
@@ -26448,7 +27221,12 @@ async function runUpgradeCommand(config, parsed, context) {
26448
27221
  return 0;
26449
27222
  }
26450
27223
  await writeFile6(envPath, plan.content, "utf8");
26451
- const pulled = await runCompose(buildComposePullArgs(void 0), options);
27224
+ const pulled = await runCompose(
27225
+ buildComposePullArgs(
27226
+ plan.changes.map((change) => managedServices[change.key])
27227
+ ),
27228
+ options
27229
+ );
26452
27230
  if (pulled !== 0) {
26453
27231
  await writeFile6(envPath, original, "utf8");
26454
27232
  context.stderr.write(