@atlasauth/backend 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +42 -1
  2. package/dist/client/abac.d.ts +454 -0
  3. package/dist/client/abac.js +123 -0
  4. package/dist/client/abac.js.map +1 -1
  5. package/dist/client/access-policies.d.ts +84 -2
  6. package/dist/client/access-policies.js +8 -0
  7. package/dist/client/access-policies.js.map +1 -1
  8. package/dist/client/actions.d.ts +1 -1
  9. package/dist/client/actions.js.map +1 -1
  10. package/dist/client/agent-platform.d.ts +294 -0
  11. package/dist/client/agent-platform.js +132 -0
  12. package/dist/client/agent-platform.js.map +1 -0
  13. package/dist/client/analytics-reports.d.ts +1 -1
  14. package/dist/client/app-catalog.d.ts +60 -1
  15. package/dist/client/app-catalog.js +32 -2
  16. package/dist/client/app-catalog.js.map +1 -1
  17. package/dist/client/authz-decisions.d.ts +154 -0
  18. package/dist/client/authz-decisions.js +53 -0
  19. package/dist/client/authz-decisions.js.map +1 -0
  20. package/dist/client/connections.d.ts +519 -0
  21. package/dist/client/connections.js +171 -0
  22. package/dist/client/connections.js.map +1 -0
  23. package/dist/client/custom-oauth-providers.d.ts +15 -0
  24. package/dist/client/custom-oauth-providers.js.map +1 -1
  25. package/dist/client/desktop-mfa.d.ts +141 -0
  26. package/dist/client/desktop-mfa.js +58 -0
  27. package/dist/client/desktop-mfa.js.map +1 -0
  28. package/dist/client/devices.d.ts +130 -0
  29. package/dist/client/devices.js +54 -0
  30. package/dist/client/devices.js.map +1 -1
  31. package/dist/client/email-templates.d.ts +1 -1
  32. package/dist/client/email-templates.js.map +1 -1
  33. package/dist/client/fga.d.ts +301 -5
  34. package/dist/client/fga.js +81 -1
  35. package/dist/client/fga.js.map +1 -1
  36. package/dist/client/iga.d.ts +436 -0
  37. package/dist/client/iga.js +82 -0
  38. package/dist/client/iga.js.map +1 -0
  39. package/dist/client/index.d.ts +3767 -2443
  40. package/dist/client/index.js +51 -0
  41. package/dist/client/index.js.map +1 -1
  42. package/dist/client/least-privilege.d.ts +95 -0
  43. package/dist/client/least-privilege.js +28 -0
  44. package/dist/client/least-privilege.js.map +1 -0
  45. package/dist/client/log-streams.d.ts +1 -1
  46. package/dist/client/managed-grants.d.ts +52 -0
  47. package/dist/client/managed-grants.js +28 -0
  48. package/dist/client/managed-grants.js.map +1 -0
  49. package/dist/client/mcp-gateways.d.ts +220 -2
  50. package/dist/client/mcp-gateways.js +74 -0
  51. package/dist/client/mcp-gateways.js.map +1 -1
  52. package/dist/client/messaging.d.ts +11 -2
  53. package/dist/client/messaging.js.map +1 -1
  54. package/dist/client/oauth-clients.d.ts +4 -0
  55. package/dist/client/oauth-clients.js.map +1 -1
  56. package/dist/client/oauth-protocols.d.ts +116 -0
  57. package/dist/client/oauth-protocols.js +54 -0
  58. package/dist/client/oauth-protocols.js.map +1 -0
  59. package/dist/client/oauth-providers.d.ts +4 -4
  60. package/dist/client/openfga.d.ts +90 -3
  61. package/dist/client/openfga.js +27 -1
  62. package/dist/client/openfga.js.map +1 -1
  63. package/dist/client/org-ldap-connections.d.ts +3 -0
  64. package/dist/client/org-ldap-connections.js.map +1 -1
  65. package/dist/client/organizations.d.ts +14 -0
  66. package/dist/client/organizations.js.map +1 -1
  67. package/dist/client/policy-bundles.d.ts +105 -0
  68. package/dist/client/policy-bundles.js +38 -0
  69. package/dist/client/policy-bundles.js.map +1 -0
  70. package/dist/client/resources.d.ts +1 -0
  71. package/dist/client/resources.js.map +1 -1
  72. package/dist/client/risk-containment.d.ts +244 -0
  73. package/dist/client/risk-containment.js +120 -0
  74. package/dist/client/risk-containment.js.map +1 -0
  75. package/dist/client/saml-idp.d.ts +183 -0
  76. package/dist/client/saml-idp.js +71 -0
  77. package/dist/client/saml-idp.js.map +1 -0
  78. package/dist/client/scim-provisioning.d.ts +100 -4
  79. package/dist/client/scim-provisioning.js +30 -0
  80. package/dist/client/scim-provisioning.js.map +1 -1
  81. package/dist/client/scim-tokens.d.ts +34 -0
  82. package/dist/client/scim-tokens.js +17 -0
  83. package/dist/client/scim-tokens.js.map +1 -1
  84. package/dist/client/service-connectors.d.ts +1 -1
  85. package/dist/client/ssf.d.ts +31 -1
  86. package/dist/client/ssf.js +17 -0
  87. package/dist/client/ssf.js.map +1 -1
  88. package/dist/client/users.d.ts +9 -0
  89. package/dist/client/users.js +9 -0
  90. package/dist/client/users.js.map +1 -1
  91. package/dist/client/vault.d.ts +54 -0
  92. package/dist/client/vault.js +30 -0
  93. package/dist/client/vault.js.map +1 -1
  94. package/dist/client/vc.d.ts +62 -2
  95. package/dist/client/vc.js +15 -0
  96. package/dist/client/vc.js.map +1 -1
  97. package/dist/client/workflows.d.ts +182 -3
  98. package/dist/client/workflows.js +34 -0
  99. package/dist/client/workflows.js.map +1 -1
  100. package/dist/index.d.ts +5 -2
  101. package/dist/index.js +6 -1
  102. package/dist/index.js.map +1 -1
  103. package/dist/oauth-resource.d.ts +30 -3
  104. package/dist/oauth-resource.js +43 -2
  105. package/dist/oauth-resource.js.map +1 -1
  106. package/dist/policy-bundle.d.ts +110 -0
  107. package/dist/policy-bundle.js +289 -0
  108. package/dist/policy-bundle.js.map +1 -0
  109. package/dist/txn-token.d.ts +36 -0
  110. package/dist/txn-token.js +30 -0
  111. package/dist/txn-token.js.map +1 -0
  112. package/dist/uma.d.ts +77 -0
  113. package/dist/uma.js +95 -0
  114. package/dist/uma.js.map +1 -0
  115. package/package.json +2 -2
@@ -18,6 +18,8 @@ export interface VcCredentialType {
18
18
  namespace: string | null;
19
19
  /** mdoc: PEM IACA roots a presentation must chain to. */
20
20
  iaca_roots: string[];
21
+ /** mdoc: issuer revocation checks (certificate CRL / OCSP, MSO status list). */
22
+ revocation_policy: VcRevocationPolicy;
21
23
  /** mdoc: PEM Document Signer chain published as x5chain. */
22
24
  signer_chain: string[];
23
25
  name: string;
@@ -27,6 +29,7 @@ export interface VcCredentialType {
27
29
  created_at: number;
28
30
  }
29
31
  export type VcFormat = 'dc+sd-jwt' | 'mso_mdoc';
32
+ export type VcRevocationPolicy = 'off' | 'best_effort' | 'required';
30
33
  export interface CreateVcCredentialTypeBody {
31
34
  /** The vct, or the docType for mso_mdoc (for example org.iso.18013.5.1.mDL). */
32
35
  vct: string;
@@ -35,6 +38,8 @@ export interface CreateVcCredentialTypeBody {
35
38
  namespace?: string;
36
39
  /** mso_mdoc: PEM IACA roots (ISO 18013-5 Annex B); with roots set only a certificate chain is accepted. */
37
40
  iaca_roots?: string[];
41
+ /** mso_mdoc: off, best_effort (default) or required. */
42
+ revocation_policy?: VcRevocationPolicy;
38
43
  /** mso_mdoc: PEM Document Signer certificate (then intermediates) for the instance's mdoc signing key. */
39
44
  signer_chain?: string[];
40
45
  name: string;
@@ -69,6 +74,7 @@ export interface VcPresentationRequest {
69
74
  vct: string;
70
75
  format: VcFormat;
71
76
  iaca_roots: string[];
77
+ revocation_policy: VcRevocationPolicy | null;
72
78
  claims: string[];
73
79
  status: 'pending' | 'verified' | 'failed';
74
80
  result: {
@@ -81,8 +87,33 @@ export interface VcPresentationRequest {
81
87
  user_id: string | null;
82
88
  expires_at: number;
83
89
  request_uri: string;
84
- /** The openid4vp:// link for a QR code. */
85
- authorization_request_uri: string;
90
+ /** The openid4vp:// link for a QR code; null for a Digital Credentials API request (use dcApiRequest). */
91
+ authorization_request_uri: string | null;
92
+ client_id_prefix?: VcClientIdPrefix;
93
+ response_mode?: VcResponseMode;
94
+ dcql_query?: Record<string, unknown> | null;
95
+ expected_origins?: string[];
96
+ }
97
+ export type VcClientIdPrefix = 'redirect_uri' | 'x509_san_dns' | 'x509_hash';
98
+ export type VcResponseMode = 'direct_post' | 'direct_post.jwt' | 'dc_api' | 'dc_api.jwt';
99
+ /** A credential issuance waiting for an operator decision (OpenID4VCI deferred issuance). */
100
+ export interface VcDeferredIssuance {
101
+ object: 'vc_deferred_issuance';
102
+ id: string;
103
+ credential_type_id: string;
104
+ user_id: string;
105
+ credentials_requested: number;
106
+ status: 'pending' | 'approved' | 'denied' | 'issued';
107
+ reason: string | null;
108
+ expires_at: number;
109
+ created_at: number;
110
+ }
111
+ /** What `navigator.credentials.get({ digital: ... })` takes for a Digital Credentials API request. */
112
+ export interface VcDcApiRequest {
113
+ object: 'vc_dc_api_request';
114
+ protocol: 'openid4vp-v1-signed' | 'openid4vp-v1-unsigned';
115
+ data: Record<string, unknown>;
116
+ response_endpoint: string;
86
117
  }
87
118
  /** Issue verifiable credentials to wallets (OpenID4VCI) and verify presentations (OpenID4VP), SD-JWT VC. */
88
119
  export declare function vcResource(request: RequestFn): {
@@ -99,7 +130,13 @@ export declare function vcResource(request: RequestFn): {
99
130
  createOffer(body: {
100
131
  credential_type_id: string;
101
132
  user_id: string;
133
+ /** pre-authorized_code (default) or authorization_code (the wallet signs in first). */
134
+ grant?: "pre-authorized_code" | "authorization_code";
135
+ /** Transaction code the user types in the wallet (pre-authorized_code only). */
102
136
  tx_code?: string;
137
+ tx_code_description?: string;
138
+ /** Hand the wallet a credential_offer_uri instead of the offer itself. */
139
+ by_reference?: boolean;
103
140
  expires_in_seconds?: number;
104
141
  }): Promise<VcOffer>;
105
142
  credentials: {
@@ -114,6 +151,8 @@ export declare function vcResource(request: RequestFn): {
114
151
  format?: VcFormat;
115
152
  /** mso_mdoc: PEM IACA roots for this request. */
116
153
  iaca_roots?: string[];
154
+ /** mso_mdoc: overrides the credential type's revocation policy. */
155
+ revocation_policy?: VcRevocationPolicy;
117
156
  claims?: string[];
118
157
  trusted_issuers?: Array<{
119
158
  issuer: string;
@@ -121,8 +160,29 @@ export declare function vcResource(request: RequestFn): {
121
160
  keys: Record<string, unknown>[];
122
161
  };
123
162
  }>;
163
+ /** A DCQL query; replaces vct and claims. */
164
+ dcql_query?: Record<string, unknown>;
165
+ client_id_prefix?: VcClientIdPrefix;
166
+ /** PEM certificate chain for the x509 client id prefixes; must match the instance ES256 key. */
167
+ verifier_chain?: string[];
168
+ response_mode?: VcResponseMode;
169
+ /** Web origins allowed to post a Digital Credentials API response. */
170
+ expected_origins?: string[];
124
171
  expires_in_seconds?: number;
125
172
  }): Promise<VcPresentationRequest>;
126
173
  get(id: string): Promise<VcPresentationRequest>;
174
+ /** The request for the Digital Credentials API, for a request created with a dc_api response mode. */
175
+ dcApiRequest(id: string): Promise<VcDcApiRequest>;
176
+ };
177
+ deferred: {
178
+ list(query?: {
179
+ status?: VcDeferredIssuance["status"];
180
+ }): Promise<ListPage<VcDeferredIssuance>>;
181
+ approve(id: string, body?: {
182
+ reason?: string;
183
+ }): Promise<VcDeferredIssuance>;
184
+ deny(id: string, body?: {
185
+ reason?: string;
186
+ }): Promise<VcDeferredIssuance>;
127
187
  };
128
188
  };
package/dist/client/vc.js CHANGED
@@ -37,6 +37,21 @@ function vcResource(request) {
37
37
  get(id) {
38
38
  return request({ method: 'GET', path: `/v1/vc/presentation_requests/${(0, request_1.enc)(id)}` });
39
39
  },
40
+ /** The request for the Digital Credentials API, for a request created with a dc_api response mode. */
41
+ dcApiRequest(id) {
42
+ return request({ method: 'GET', path: `/v1/vc/presentation_requests/${(0, request_1.enc)(id)}/dc_api_request` });
43
+ },
44
+ },
45
+ deferred: {
46
+ list(query = {}) {
47
+ return request({ method: 'GET', path: '/v1/vc/deferred', query });
48
+ },
49
+ approve(id, body = {}) {
50
+ return request({ method: 'POST', path: `/v1/vc/deferred/${(0, request_1.enc)(id)}/approve`, body });
51
+ },
52
+ deny(id, body = {}) {
53
+ return request({ method: 'POST', path: `/v1/vc/deferred/${(0, request_1.enc)(id)}/deny`, body });
54
+ },
40
55
  },
41
56
  };
42
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"vc.js","sourceRoot":"","sources":["../../src/client/vc.ts"],"names":[],"mappings":";;AAyFA,gCA4CC;AArID,uCAAgD;AAwFhD,4GAA4G;AAC5G,SAAgB,UAAU,CAAC,OAAkB;IAC3C,OAAO;QACL,eAAe,EAAE;YACf,IAAI;gBACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,CAAC,IAAgC;gBACrC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,GAAG,CAAC,EAAU;gBACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,MAAM,CAAC,EAAU;gBACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACnF,CAAC;SACF;QACD,WAAW,CAAC,IAAoG;YAC9G,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,WAAW,EAAE;YACX,IAAI,CAAC,QAA8B,EAAE;gBACnC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;YACrF,CAAC;YACD,MAAM,CAAC,EAAU;gBACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,IAAA,aAAG,EAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;YACnF,CAAC;SACF;QACD,oBAAoB,EAAE;YACpB,MAAM,CAAC,IAQN;gBACC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE,CAAC,CAAC;YACjF,CAAC;YACD,GAAG,CAAC,EAAU;gBACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gCAAgC,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACrF,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"vc.js","sourceRoot":"","sources":["../../src/client/vc.ts"],"names":[],"mappings":";;AA2HA,gCAgFC;AA3MD,uCAAgD;AA0HhD,4GAA4G;AAC5G,SAAgB,UAAU,CAAC,OAAkB;IAC3C,OAAO;QACL,eAAe,EAAE;YACf,IAAI;gBACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,CAAC,IAAgC;gBACrC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,GAAG,CAAC,EAAU;gBACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,MAAM,CAAC,EAAU;gBACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACnF,CAAC;SACF;QACD,WAAW,CAAC,IAWX;YACC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,WAAW,EAAE;YACX,IAAI,CAAC,QAA8B,EAAE;gBACnC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;YACrF,CAAC;YACD,MAAM,CAAC,EAAU;gBACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,IAAA,aAAG,EAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;YACnF,CAAC;SACF;QACD,oBAAoB,EAAE;YACpB,MAAM,CAAC,IAkBN;gBACC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE,CAAC,CAAC;YACjF,CAAC;YACD,GAAG,CAAC,EAAU;gBACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gCAAgC,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACrF,CAAC;YACD,sGAAsG;YACtG,YAAY,CAAC,EAAU;gBACrB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gCAAgC,IAAA,aAAG,EAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACpG,CAAC;SACF;QACD,QAAQ,EAAE;YACR,IAAI,CAAC,QAAmD,EAAE;gBACxD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,CAAC,EAAU,EAAE,OAA4B,EAAE;gBAChD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,IAAA,aAAG,EAAC,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;YACvF,CAAC;YACD,IAAI,CAAC,EAAU,EAAE,OAA4B,EAAE;gBAC7C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,IAAA,aAAG,EAAC,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -20,9 +20,98 @@ export type WorkflowTrigger = {
20
20
  } | {
21
21
  type: 'webhook_event';
22
22
  event_type: string;
23
+ filter?: string;
24
+ }
25
+ /** Started by `invoke` with an input object. */
26
+ | {
27
+ type: 'manual';
23
28
  };
29
+ /** Fields every step may carry. */
30
+ export interface WorkflowStepBase {
31
+ /** Names the output: `steps.<id>.output` in later expressions. */
32
+ id?: string;
33
+ retry?: {
34
+ max: number;
35
+ backoff_seconds?: number;
36
+ };
37
+ on_error?: 'fail' | 'continue';
38
+ }
39
+ /** Control flow and integration steps. Expressions: `{{ user.email }}`, `event.*`, `input.*`, `vars.*`, `steps.<id>.output`. */
40
+ export type WorkflowGraphStep = WorkflowStepBase & ({
41
+ type: 'if';
42
+ condition: string;
43
+ then: WorkflowStep[];
44
+ else?: WorkflowStep[];
45
+ } | {
46
+ type: 'switch';
47
+ value: string;
48
+ cases: Array<{
49
+ equals: string | number | boolean;
50
+ steps: WorkflowStep[];
51
+ }>;
52
+ default?: WorkflowStep[];
53
+ } | {
54
+ type: 'for_each';
55
+ items: string;
56
+ as?: string;
57
+ steps: WorkflowStep[];
58
+ max_iterations?: number;
59
+ } | {
60
+ type: 'wait';
61
+ seconds?: number;
62
+ until?: string;
63
+ } | {
64
+ type: 'set_variable';
65
+ name: string;
66
+ value: unknown;
67
+ } | {
68
+ type: 'http_request';
69
+ method?: 'GET' | 'POST';
70
+ url: string;
71
+ headers?: Record<string, string>;
72
+ secret_headers?: Record<string, string>;
73
+ body?: unknown;
74
+ } | {
75
+ type: 'call_connector';
76
+ connector: string;
77
+ operation: string;
78
+ input?: Record<string, unknown>;
79
+ } | {
80
+ type: 'create_ticket';
81
+ connector: string;
82
+ summary: string;
83
+ description?: string;
84
+ fields?: Record<string, unknown>;
85
+ } | {
86
+ type: 'create_iga_request';
87
+ entitlement: string;
88
+ justification?: string;
89
+ duration_seconds?: number;
90
+ } | {
91
+ type: 'start_campaign';
92
+ campaign_id: string;
93
+ } | {
94
+ type: 'revoke_grant';
95
+ entitlement: string;
96
+ reason?: string;
97
+ } | {
98
+ type: 'approval';
99
+ approvers: {
100
+ type: 'users' | 'manager' | 'group';
101
+ ids?: string[];
102
+ };
103
+ message: string;
104
+ timeout_seconds?: number;
105
+ on_deny?: 'fail' | 'continue';
106
+ on_timeout?: 'fail' | 'continue' | 'approve';
107
+ } | {
108
+ type: 'kv';
109
+ op: 'get' | 'set' | 'delete' | 'incr';
110
+ key: string;
111
+ value?: unknown;
112
+ });
24
113
  /** One step. A step that acts on an organization takes `organization_id`, or uses the membership's own for `membership_age`. */
25
- export type WorkflowStep = {
114
+ export type WorkflowStep = WorkflowGraphStep | {
26
115
  type: 'notify';
27
116
  subject: string;
28
117
  body: string;
@@ -61,6 +150,42 @@ export type WorkflowStep = {
61
150
  type: 'call_action';
62
151
  action_id: string;
63
152
  };
153
+ export interface WorkflowTriggerInfo {
154
+ object: 'workflow_trigger';
155
+ name: string;
156
+ description: string;
157
+ subject: 'user' | 'none';
158
+ payload: string[];
159
+ emitter: string;
160
+ }
161
+ export interface WorkflowTemplate {
162
+ object: 'workflow_template';
163
+ key: string;
164
+ name: string;
165
+ description: string;
166
+ parameters: Array<{
167
+ key: string;
168
+ label: string;
169
+ type: 'string' | 'number';
170
+ default?: string | number;
171
+ }>;
172
+ trigger: WorkflowTrigger;
173
+ steps: WorkflowStep[];
174
+ }
175
+ export interface WorkflowApproval {
176
+ object: 'workflow_approval';
177
+ id: string;
178
+ workflow_id: string;
179
+ run_id: string;
180
+ approver_user_ids: string[];
181
+ message: string;
182
+ status: 'pending' | 'approved' | 'denied' | 'timed_out';
183
+ decided_by: string | null;
184
+ comment: string | null;
185
+ expires_at: number | null;
186
+ decided_at: number | null;
187
+ created_at: number;
188
+ }
64
189
  export interface Workflow {
65
190
  object: 'workflow';
66
191
  id: string;
@@ -77,8 +202,13 @@ export interface Workflow {
77
202
  export interface WorkflowRunStep {
78
203
  index: number;
79
204
  type: string;
80
- status: 'ok' | 'failed' | 'would_run' | 'skipped';
205
+ status: 'ok' | 'failed' | 'would_run' | 'skipped' | 'retrying' | 'waiting';
206
+ /** Position in the step tree, e.g. `2.then.0`. */
207
+ path?: string;
208
+ attempt?: number;
209
+ at?: number;
81
210
  detail?: string;
211
+ output?: unknown;
82
212
  }
83
213
  export interface WorkflowRun {
84
214
  object: 'workflow_run';
@@ -87,7 +217,11 @@ export interface WorkflowRun {
87
217
  subject: string;
88
218
  user_id: string | null;
89
219
  dry_run: boolean;
90
- status: 'running' | 'succeeded' | 'failed';
220
+ status: 'running' | 'waiting' | 'succeeded' | 'failed';
221
+ /** While waiting on a timer or retry: when the run continues (Unix ms). */
222
+ resume_at?: number | null;
223
+ /** While waiting on people: `approval:<id>`. */
224
+ waiting_on?: string | null;
91
225
  steps: WorkflowRunStep[];
92
226
  error: string | null;
93
227
  started_at: number;
@@ -128,4 +262,49 @@ export declare function workflowsResource(request: RequestFn): {
128
262
  }): Promise<ListPage<WorkflowRun> & {
129
263
  next_cursor: string | null;
130
264
  }>;
265
+ /** One run with its per-step log. */
266
+ getRun(id: string, runId: string): Promise<WorkflowRun>;
267
+ /** Start a `manual` workflow with an input object. */
268
+ invoke(id: string, body?: {
269
+ user_id?: string;
270
+ organization_id?: string;
271
+ input?: Record<string, unknown>;
272
+ }, idempotencyKey?: string): Promise<WorkflowRun>;
273
+ /** Retry a failed run from the step that failed. */
274
+ resume(id: string, runId: string): Promise<WorkflowRun>;
275
+ /** The events a workflow can start on. */
276
+ triggers(): Promise<ListPage<WorkflowTriggerInfo>>;
277
+ templates(): Promise<ListPage<WorkflowTemplate>>;
278
+ createFromTemplate(body: {
279
+ template: string;
280
+ parameters?: Record<string, unknown>;
281
+ name?: string;
282
+ enabled?: boolean;
283
+ }, idempotencyKey?: string): Promise<Workflow>;
284
+ approvals(query?: {
285
+ status?: WorkflowApproval["status"];
286
+ }): Promise<ListPage<WorkflowApproval>>;
287
+ decideApproval(id: string, body: {
288
+ decision: "approve" | "deny";
289
+ comment?: string;
290
+ user_id?: string;
291
+ }, idempotencyKey?: string): Promise<WorkflowApproval>;
292
+ /** The workflow's key-value table. */
293
+ kv: {
294
+ list: (id: string) => Promise<ListPage<{
295
+ object: "workflow_kv";
296
+ key: string;
297
+ value: unknown;
298
+ }>>;
299
+ set: (id: string, key: string, value: unknown) => Promise<{
300
+ object: "workflow_kv";
301
+ key: string;
302
+ value: unknown;
303
+ }>;
304
+ delete: (id: string, key: string) => Promise<{
305
+ object: "workflow_kv";
306
+ key: string;
307
+ deleted: true;
308
+ }>;
309
+ };
131
310
  };
@@ -31,6 +31,40 @@ function workflowsResource(request) {
31
31
  runs(id, query = {}) {
32
32
  return request({ method: 'GET', path: `/v1/workflows/${(0, request_1.enc)(id)}/runs`, query });
33
33
  },
34
+ /** One run with its per-step log. */
35
+ getRun(id, runId) {
36
+ return request({ method: 'GET', path: `/v1/workflows/${(0, request_1.enc)(id)}/runs/${(0, request_1.enc)(runId)}` });
37
+ },
38
+ /** Start a `manual` workflow with an input object. */
39
+ invoke(id, body = {}, idempotencyKey) {
40
+ return request({ method: 'POST', path: `/v1/workflows/${(0, request_1.enc)(id)}/invoke`, body, idempotencyKey });
41
+ },
42
+ /** Retry a failed run from the step that failed. */
43
+ resume(id, runId) {
44
+ return request({ method: 'POST', path: `/v1/workflows/${(0, request_1.enc)(id)}/runs/${(0, request_1.enc)(runId)}/resume`, body: {} });
45
+ },
46
+ /** The events a workflow can start on. */
47
+ triggers() {
48
+ return request({ method: 'GET', path: '/v1/workflow_triggers' });
49
+ },
50
+ templates() {
51
+ return request({ method: 'GET', path: '/v1/workflow_templates' });
52
+ },
53
+ createFromTemplate(body, idempotencyKey) {
54
+ return request({ method: 'POST', path: '/v1/workflows/from_template', body, idempotencyKey });
55
+ },
56
+ approvals(query = {}) {
57
+ return request({ method: 'GET', path: '/v1/workflow_approvals', query });
58
+ },
59
+ decideApproval(id, body, idempotencyKey) {
60
+ return request({ method: 'POST', path: `/v1/workflow_approvals/${(0, request_1.enc)(id)}/decide`, body, idempotencyKey });
61
+ },
62
+ /** The workflow's key-value table. */
63
+ kv: {
64
+ list: (id) => request({ method: 'GET', path: `/v1/workflows/${(0, request_1.enc)(id)}/kv` }),
65
+ set: (id, key, value) => request({ method: 'PUT', path: `/v1/workflows/${(0, request_1.enc)(id)}/kv/${(0, request_1.enc)(key)}`, body: { value } }),
66
+ delete: (id, key) => request({ method: 'DELETE', path: `/v1/workflows/${(0, request_1.enc)(id)}/kv/${(0, request_1.enc)(key)}` }),
67
+ },
34
68
  };
35
69
  }
36
70
  //# sourceMappingURL=workflows.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/client/workflows.ts"],"names":[],"mappings":";;AAuEA,8CA8BC;AArGD,uCAAgD;AAuEhD,SAAgB,iBAAiB,CAAC,OAAkB;IAClD,OAAO;QACL,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,CAAC,IAAwB,EAAE,cAAuB;YACtD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,GAAG,CAAC,EAAU;YACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,CAAC,EAAU,EAAE,IAAwB;YACzC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,CAAC,EAAU;YACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,sHAAsH;QACtH,MAAM,CAAC,EAAU,EAAE,SAAyD,EAAE;YAC5E,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,IAAA,aAAG,EAAC,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,iEAAiE;QACjE,GAAG,CAAC,EAAU,EAAE,SAAyD,EAAE,EAAE,cAAuB;YAClG,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,IAAA,aAAG,EAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QACzG,CAAC;QACD,iCAAiC;QACjC,IAAI,CAAC,EAAU,EAAE,QAAqD,EAAE;YACtE,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,IAAA,aAAG,EAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/client/workflows.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,6 +3,7 @@ export { DiscoveryError, JwksDiscovery, discoveryUrlFor, instanceIdFromPublishab
3
3
  export * from './verify';
4
4
  export * from './request-auth';
5
5
  export * from './recent-auth';
6
+ export * from './txn-token';
6
7
  export * from './access-control';
7
8
  export * from './handshake';
8
9
  export * from './better-auth';
@@ -16,6 +17,7 @@ export type { LegacyIssuer, LegacyIssuerKind } from './legacy-issuers';
16
17
  export * from './legacy-issuer-presets';
17
18
  export * from './framework-sessions';
18
19
  export * from './framework-bridge';
20
+ export * from './policy-bundle';
19
21
  export { BACKCHANNEL_LOGOUT_EVENT, LOGOUT_TOKEN_CLOCK_SKEW_SECONDS, LOGOUT_TOKEN_MAX_AGE_SECONDS, LogoutTokenVerifier, memoryLogoutReplayStore, verifyLogoutToken, } from './logout-token';
20
22
  export type { LogoutReplayStore, LogoutTokenCheckOptions, LogoutTokenClaims, LogoutTokenResult, LogoutTokenVerifierOptions, } from './logout-token';
21
23
  export { expressBackchannelLogout, fastifyBackchannelLogout, fastifyBackchannelLogoutPlugin, fetchBackchannelLogout, handleBackchannelLogout, nextBackchannelLogout, readLogoutToken, } from './backchannel-handlers';
@@ -37,6 +39,7 @@ export { verifyPCActn } from './pca/verify';
37
39
  export type { PcaVerdict, PcaContext, VerifyPCActnOptions } from './pca/verify';
38
40
  export { requirePCA, defaultExtract, memoryPcaStore } from './pca/require-pca';
39
41
  export type { RequirePcaOptions, PcaGuardResult, PcaRequestLike, PcaStateStore } from './pca/require-pca';
40
- export { ACCESS_TOKEN_CLOCK_SKEW_SECONDS, DPOP_PROOF_MAX_AGE_SECONDS, buildWwwAuthenticate, createAccessTokenVerifier, createIntrospector, hmacDpopNonceSource, memoryDpopNonceSource, memoryDpopReplayStore, protectedResourceMetadata, protectedResourceMetadataPath, verifyAccessToken, } from './oauth-resource';
41
- export type { AccessTokenClaims, AccessTokenErrorCode, AccessTokenResult, AccessTokenVerifierOptions, DpopNonceSource, DpopReplayStore, IntrospectionOptions, ResourceRequestLike, } from './oauth-resource';
42
+ export { ACCESS_TOKEN_CLOCK_SKEW_SECONDS, DPOP_PROOF_MAX_AGE_SECONDS, buildWwwAuthenticate, createAccessTokenVerifier, createIntrospector, hmacDpopNonceSource, memoryDpopNonceSource, memoryDpopReplayStore, protectedResourceMetadata, protectedResourceMetadataPath, requireAcr, verifyAccessToken, } from './oauth-resource';
43
+ export type { AccessTokenCallOptions, AccessTokenClaims, AccessTokenErrorCode, AccessTokenResult, AccessTokenVerifierOptions, DpopNonceSource, DpopReplayStore, IntrospectionOptions, ResourceRequestLike, } from './oauth-resource';
42
44
  export * from './legacy-verify';
45
+ export * from './uma';
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.memoryPcaStore = exports.defaultExtract = exports.requirePCA = exports.verifyPCActn = exports.REFERALLI_API_VERSION = exports.referralEmailHash = exports.referalliSignatureV2 = exports.referalliSignature = exports.signReferralUpdatedEvent = exports.signReferalliCall = exports.signAtlasReferralCall = exports.testTenantClaims = exports.TEST_TOKEN_TAMPERS = exports.createTestIssuer = exports.createAtlasClient = exports.resetOidcCaches = exports.oidcSsoOf = exports.oidcOrganizationsOf = exports.oidcOrganizationOf = exports.oidcVerifyIdToken = exports.oidcStart = exports.oidcLogoutUrl = exports.oidcClearCookie = exports.oidcCallback = exports.oidc = exports.OIDC_FLOW_MAX_AGE_SECONDS = exports.OIDC_FLOW_COOKIE = exports.AtlasOidcError = exports.readLogoutToken = exports.nextBackchannelLogout = exports.handleBackchannelLogout = exports.fetchBackchannelLogout = exports.fastifyBackchannelLogoutPlugin = exports.fastifyBackchannelLogout = exports.expressBackchannelLogout = exports.verifyLogoutToken = exports.memoryLogoutReplayStore = exports.LogoutTokenVerifier = exports.LOGOUT_TOKEN_MAX_AGE_SECONDS = exports.LOGOUT_TOKEN_CLOCK_SKEW_SECONDS = exports.BACKCHANNEL_LOGOUT_EVENT = exports.peekIssuer = exports.BETTER_AUTH_JWT_ALGS = exports.workosSessionTokenExtractor = exports.magicDidTokenExtractor = exports.looksLikeMagicDidToken = exports.instanceIdFromPublishableKey = exports.discoveryUrlFor = exports.JwksDiscovery = exports.DiscoveryError = void 0;
18
- exports.verifyAccessToken = exports.protectedResourceMetadataPath = exports.protectedResourceMetadata = exports.memoryDpopReplayStore = exports.memoryDpopNonceSource = exports.hmacDpopNonceSource = exports.createIntrospector = exports.createAccessTokenVerifier = exports.buildWwwAuthenticate = exports.DPOP_PROOF_MAX_AGE_SECONDS = exports.ACCESS_TOKEN_CLOCK_SKEW_SECONDS = void 0;
18
+ exports.verifyAccessToken = exports.requireAcr = exports.protectedResourceMetadataPath = exports.protectedResourceMetadata = exports.memoryDpopReplayStore = exports.memoryDpopNonceSource = exports.hmacDpopNonceSource = exports.createIntrospector = exports.createAccessTokenVerifier = exports.buildWwwAuthenticate = exports.DPOP_PROOF_MAX_AGE_SECONDS = exports.ACCESS_TOKEN_CLOCK_SKEW_SECONDS = void 0;
19
19
  // §7.3 token verification — the original surface, unchanged.
20
20
  __exportStar(require("./jwks-cache"), exports);
21
21
  // OIDC discovery of the JWKS URL when only `issuer` is configured.
@@ -27,6 +27,7 @@ Object.defineProperty(exports, "instanceIdFromPublishableKey", { enumerable: tru
27
27
  __exportStar(require("./verify"), exports);
28
28
  __exportStar(require("./request-auth"), exports);
29
29
  __exportStar(require("./recent-auth"), exports);
30
+ __exportStar(require("./txn-token"), exports);
30
31
  __exportStar(require("./access-control"), exports);
31
32
  __exportStar(require("./handshake"), exports);
32
33
  // Moving from Better Auth: exchange its session cookie once, accept its JWTs for a window.
@@ -49,6 +50,8 @@ __exportStar(require("./legacy-issuer-presets"), exports);
49
50
  __exportStar(require("./framework-sessions"), exports);
50
51
  // …and their bridge presets + token extractors (registers the presets on load).
51
52
  __exportStar(require("./framework-bridge"), exports);
53
+ // Verify a signed policy bundle offline (no call to Atlas).
54
+ __exportStar(require("./policy-bundle"), exports);
52
55
  // OIDC Back-Channel Logout: verify the logout_token Atlas POSTs to your app.
53
56
  var logout_token_1 = require("./logout-token");
54
57
  Object.defineProperty(exports, "BACKCHANNEL_LOGOUT_EVENT", { enumerable: true, get: function () { return logout_token_1.BACKCHANNEL_LOGOUT_EVENT; } });
@@ -129,6 +132,8 @@ Object.defineProperty(exports, "memoryDpopNonceSource", { enumerable: true, get:
129
132
  Object.defineProperty(exports, "memoryDpopReplayStore", { enumerable: true, get: function () { return oauth_resource_1.memoryDpopReplayStore; } });
130
133
  Object.defineProperty(exports, "protectedResourceMetadata", { enumerable: true, get: function () { return oauth_resource_1.protectedResourceMetadata; } });
131
134
  Object.defineProperty(exports, "protectedResourceMetadataPath", { enumerable: true, get: function () { return oauth_resource_1.protectedResourceMetadataPath; } });
135
+ Object.defineProperty(exports, "requireAcr", { enumerable: true, get: function () { return oauth_resource_1.requireAcr; } });
132
136
  Object.defineProperty(exports, "verifyAccessToken", { enumerable: true, get: function () { return oauth_resource_1.verifyAccessToken; } });
133
137
  __exportStar(require("./legacy-verify"), exports);
138
+ __exportStar(require("./uma"), exports);
134
139
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,6DAA6D;AAC7D,+CAA6B;AAC7B,mEAAmE;AACnE,yCAA2G;AAAlG,2GAAA,cAAc,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,yHAAA,4BAA4B,OAAA;AACrF,2CAAyB;AACzB,iDAA+B;AAC/B,gDAA8B;AAC9B,8CAA4B;AAC5B,mDAAiC;AACjC,8CAA4B;AAC5B,2FAA2F;AAC3F,gDAA8B;AAC9B,qFAAqF;AACrF,sDAAoC;AACpC,qDAAmC;AACnC,kDAAgC;AAChC,yCAA6E;AAApE,mHAAA,sBAAsB,OAAA;AAAE,mHAAA,sBAAsB,OAAA;AACvD,mDAA+D;AAAtD,6HAAA,2BAA2B,OAAA;AACpC,mDAAoE;AAA3D,sHAAA,oBAAoB,OAAA;AAAE,4GAAA,UAAU,OAAA;AAEzC,0DAAwC;AACxC,+EAA+E;AAC/E,4DAA4D;AAC5D,uDAAqC;AACrC,gFAAgF;AAChF,qDAAmC;AAEnC,4DAA4D;AAC5D,kDAAgC;AAEhC,6EAA6E;AAC7E,+CAOwB;AANtB,wHAAA,wBAAwB,OAAA;AACxB,+HAAA,+BAA+B,OAAA;AAC/B,4HAAA,4BAA4B,OAAA;AAC5B,mHAAA,mBAAmB,OAAA;AACnB,uHAAA,uBAAuB,OAAA;AACvB,iHAAA,iBAAiB,OAAA;AASnB,+EAA+E;AAC/E,+DAQgC;AAP9B,gIAAA,wBAAwB,OAAA;AACxB,gIAAA,wBAAwB,OAAA;AACxB,sIAAA,8BAA8B,OAAA;AAC9B,8HAAA,sBAAsB,OAAA;AACtB,+HAAA,uBAAuB,OAAA;AACvB,6HAAA,qBAAqB,OAAA;AACrB,uHAAA,eAAe,OAAA;AAIjB,sEAAsE;AACtE,iFAAiF;AACjF,+BAcgB;AAbd,sGAAA,cAAc,OAAA;AACd,wGAAA,gBAAgB,OAAA;AAChB,iHAAA,yBAAyB,OAAA;AACzB,4FAAA,IAAI,OAAA;AACJ,oGAAA,YAAY,OAAA;AACZ,uGAAA,eAAe,OAAA;AACf,qGAAA,aAAa,OAAA;AACb,iGAAA,SAAS,OAAA;AACT,yGAAA,iBAAiB,OAAA;AACjB,0GAAA,kBAAkB,OAAA;AAClB,2GAAA,mBAAmB,OAAA;AACnB,iGAAA,SAAS,OAAA;AACT,uGAAA,eAAe,OAAA;AAkBjB,oDAAoD;AACpD,6CAA2B;AAE3B,uFAAuF;AACvF,8CAA4B;AAC5B,kDAAgC;AAEhC,0FAA0F;AAC1F,0CAAwB;AAExB,8DAA8D;AAC9D,mCAA6C;AAApC,2GAAA,iBAAiB,OAAA;AAE1B,2CAAyB;AAEzB,yEAAyE;AACzE,2EAA2E;AAC3E,iEAAiE;AACjE,qCAAmF;AAA1E,2GAAA,gBAAgB,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAU/D,6DAQ+B;AAP7B,4HAAA,qBAAqB,OAAA;AACrB,wHAAA,iBAAiB,OAAA;AACjB,+HAAA,wBAAwB,OAAA;AACxB,yHAAA,kBAAkB,OAAA;AAClB,2HAAA,oBAAoB,OAAA;AACpB,wHAAA,iBAAiB,OAAA;AACjB,4HAAA,qBAAqB,OAAA;AAWvB,wFAAwF;AACxF,2CAA2C;AAC3C,uCAA4C;AAAnC,sGAAA,YAAY,OAAA;AAErB,iDAA+E;AAAtE,yGAAA,UAAU,OAAA;AAAE,6GAAA,cAAc,OAAA;AAAE,6GAAA,cAAc,OAAA;AAGnD,8EAA8E;AAC9E,gFAAgF;AAChF,mDAa0B;AAZxB,iIAAA,+BAA+B,OAAA;AAC/B,4HAAA,0BAA0B,OAAA;AAC1B,sHAAA,oBAAoB,OAAA;AACpB,2HAAA,yBAAyB,OAAA;AACzB,oHAAA,kBAAkB,OAAA;AAClB,qHAAA,mBAAmB,OAAA;AACnB,uHAAA,qBAAqB,OAAA;AACrB,uHAAA,qBAAqB,OAAA;AACrB,2HAAA,yBAAyB,OAAA;AACzB,+HAAA,6BAA6B,OAAA;AAC7B,4GAAA,UAAU,OAAA;AACV,mHAAA,iBAAiB,OAAA;AAanB,kDAAgC;AAChC,wCAAsB"}
@@ -160,7 +160,7 @@ export declare function createIntrospector(issuer: string, options: Introspectio
160
160
  fetchImpl?: typeof fetch;
161
161
  now?: () => number;
162
162
  }): (token: string) => Promise<AccessTokenClaims | null>;
163
- export type AccessTokenErrorCode = 'invalid_request' | 'invalid_token' | 'insufficient_scope' | 'invalid_dpop_proof' | 'use_dpop_nonce';
163
+ export type AccessTokenErrorCode = 'invalid_request' | 'invalid_token' | 'insufficient_scope' | 'invalid_dpop_proof' | 'use_dpop_nonce' | 'insufficient_user_authentication';
164
164
  export type AccessTokenResult = {
165
165
  ok: true;
166
166
  claims: AccessTokenClaims;
@@ -193,14 +193,41 @@ export declare function buildWwwAuthenticate(opts: {
193
193
  scope?: readonly string[];
194
194
  resourceMetadataUrl?: string;
195
195
  dpopAlgs?: readonly string[];
196
+ /** RFC 9470: the acr values the resource will accept (step-up challenge). */
197
+ acrValues?: readonly string[];
198
+ /** RFC 9470: the maximum age, in seconds, of the user authentication. */
199
+ maxAge?: number;
196
200
  }): string;
197
201
  /**
198
202
  * A reusable verifier (one JWKS cache for the life of the process). Call it per
199
203
  * request; it never throws for a bad token — it returns the status + challenge.
200
204
  */
201
- export declare function createAccessTokenVerifier(options: AccessTokenVerifierOptions): (request: ResourceRequestLike, extra?: {
205
+ /** Per-call extras for the verifier: scopes plus the RFC 9470 step-up requirements. */
206
+ export interface AccessTokenCallOptions {
202
207
  requiredScopes?: readonly string[];
203
- }) => Promise<AccessTokenResult>;
208
+ /** Accept only these `acr` values; otherwise answer `insufficient_user_authentication`. */
209
+ requireAcr?: readonly string[];
210
+ /** Require `auth_time` within this many seconds; otherwise answer `insufficient_user_authentication`. */
211
+ maxAge?: number;
212
+ }
213
+ /**
214
+ * RFC 9470 check on verified claims. Returns null when satisfied, else the
215
+ * `insufficient_user_authentication` challenge to send (HTTP 401).
216
+ */
217
+ export declare function requireAcr(claims: Readonly<Record<string, unknown>>, req: {
218
+ acrValues?: readonly string[];
219
+ maxAge?: number;
220
+ scheme?: 'Bearer' | 'DPoP';
221
+ realm?: string;
222
+ resourceMetadataUrl?: string;
223
+ nowMs?: number;
224
+ }): {
225
+ status: 401;
226
+ error: 'insufficient_user_authentication';
227
+ description: string;
228
+ wwwAuthenticate: string;
229
+ } | null;
230
+ export declare function createAccessTokenVerifier(options: AccessTokenVerifierOptions): (request: ResourceRequestLike, extra?: AccessTokenCallOptions) => Promise<AccessTokenResult>;
204
231
  /** One-shot form of {@link createAccessTokenVerifier} (builds a fresh JWKS cache each call — prefer the factory). */
205
232
  export declare function verifyAccessToken(request: ResourceRequestLike, options: AccessTokenVerifierOptions): Promise<AccessTokenResult>;
206
233
  /**
@@ -6,6 +6,7 @@ exports.hmacDpopNonceSource = hmacDpopNonceSource;
6
6
  exports.memoryDpopReplayStore = memoryDpopReplayStore;
7
7
  exports.createIntrospector = createIntrospector;
8
8
  exports.buildWwwAuthenticate = buildWwwAuthenticate;
9
+ exports.requireAcr = requireAcr;
9
10
  exports.createAccessTokenVerifier = createAccessTokenVerifier;
10
11
  exports.verifyAccessToken = verifyAccessToken;
11
12
  exports.protectedResourceMetadata = protectedResourceMetadata;
@@ -215,6 +216,10 @@ function buildWwwAuthenticate(opts) {
215
216
  parts.push(`scope=${quote(opts.scope.join(' '))}`);
216
217
  if (opts.resourceMetadataUrl)
217
218
  parts.push(`resource_metadata=${quote(opts.resourceMetadataUrl)}`);
219
+ if (opts.acrValues && opts.acrValues.length > 0)
220
+ parts.push(`acr_values=${quote(opts.acrValues.join(' '))}`);
221
+ if (opts.maxAge !== undefined)
222
+ parts.push(`max_age=${Math.max(0, Math.floor(opts.maxAge))}`);
218
223
  if (opts.scheme === 'DPoP' && opts.dpopAlgs)
219
224
  parts.push(`algs=${quote(opts.dpopAlgs.join(' '))}`);
220
225
  return `${opts.scheme ?? 'Bearer'}${parts.length ? ` ${parts.join(', ')}` : ''}`;
@@ -237,9 +242,32 @@ function htuOf(url) {
237
242
  }
238
243
  }
239
244
  /**
240
- * A reusable verifier (one JWKS cache for the life of the process). Call it per
241
- * request; it never throws for a bad token — it returns the status + challenge.
245
+ * RFC 9470 check on verified claims. Returns null when satisfied, else the
246
+ * `insufficient_user_authentication` challenge to send (HTTP 401).
242
247
  */
248
+ function requireAcr(claims, req) {
249
+ const acrOk = !req.acrValues?.length || (typeof claims.acr === 'string' && req.acrValues.includes(claims.acr));
250
+ const at = claims.auth_time;
251
+ const ageOk = req.maxAge === undefined ||
252
+ (typeof at === 'number' && Number.isFinite(at) && (req.nowMs ?? Date.now()) / 1000 - at <= req.maxAge);
253
+ if (acrOk && ageOk)
254
+ return null;
255
+ const description = 'A stronger or more recent user authentication is required.';
256
+ return {
257
+ status: 401,
258
+ error: 'insufficient_user_authentication',
259
+ description,
260
+ wwwAuthenticate: buildWwwAuthenticate({
261
+ scheme: req.scheme,
262
+ realm: req.realm,
263
+ error: 'insufficient_user_authentication',
264
+ description,
265
+ acrValues: req.acrValues,
266
+ maxAge: req.maxAge,
267
+ resourceMetadataUrl: req.resourceMetadataUrl,
268
+ }),
269
+ };
270
+ }
243
271
  function createAccessTokenVerifier(options) {
244
272
  if (!options.issuer)
245
273
  throw new Error('createAccessTokenVerifier needs `issuer`.');
@@ -367,6 +395,19 @@ function createAccessTokenVerifier(options) {
367
395
  if (missing.length > 0) {
368
396
  return fail(403, 'insufficient_scope', `The access token is missing the required scope(s): ${missing.join(' ')}.`);
369
397
  }
398
+ if (extra?.requireAcr?.length || extra?.maxAge !== undefined) {
399
+ const step = requireAcr(claims, {
400
+ acrValues: extra.requireAcr,
401
+ maxAge: extra.maxAge,
402
+ scheme: presentedScheme === 'DPoP' ? 'DPoP' : 'Bearer',
403
+ realm: options.realm,
404
+ resourceMetadataUrl: options.resourceMetadataUrl,
405
+ nowMs: now(),
406
+ });
407
+ if (step) {
408
+ return { ok: false, status: 401, error: step.error, description: step.description, wwwAuthenticate: step.wwwAuthenticate };
409
+ }
410
+ }
370
411
  return {
371
412
  ok: true,
372
413
  claims,