@empire-builder-kit/runtime 1.0.0-beta.9 → 1.0.0-rc.2

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 (218) hide show
  1. package/NOTICE +6 -0
  2. package/package.json +93 -3
  3. package/src/api-contract/artifacts.d.ts +67 -0
  4. package/src/api-contract/artifacts.js +349 -0
  5. package/src/api-contract/artifacts.js.map +1 -0
  6. package/src/api-contract/client.d.ts +79 -0
  7. package/src/api-contract/client.js +561 -0
  8. package/src/api-contract/client.js.map +1 -0
  9. package/src/api-contract/errors.d.ts +7 -0
  10. package/src/api-contract/errors.js +11 -0
  11. package/src/api-contract/errors.js.map +1 -0
  12. package/src/api-contract/index.d.ts +9 -0
  13. package/src/api-contract/index.js +10 -0
  14. package/src/api-contract/index.js.map +1 -0
  15. package/src/api-contract/operation.d.ts +118 -0
  16. package/src/api-contract/operation.js +609 -0
  17. package/src/api-contract/operation.js.map +1 -0
  18. package/src/api-contract/schema.d.ts +81 -0
  19. package/src/api-contract/schema.js +313 -0
  20. package/src/api-contract/schema.js.map +1 -0
  21. package/src/api-contract/server.d.ts +77 -0
  22. package/src/api-contract/server.js +466 -0
  23. package/src/api-contract/server.js.map +1 -0
  24. package/src/async-work/contract.d.ts +17 -0
  25. package/src/async-work/contract.js +105 -0
  26. package/src/async-work/contract.js.map +1 -0
  27. package/src/async-work/idempotency.d.ts +123 -0
  28. package/src/async-work/idempotency.js +167 -0
  29. package/src/async-work/idempotency.js.map +1 -0
  30. package/src/async-work/index.d.ts +8 -0
  31. package/src/async-work/index.js +9 -0
  32. package/src/async-work/index.js.map +1 -0
  33. package/src/async-work/provider.d.ts +90 -0
  34. package/src/async-work/provider.js +155 -0
  35. package/src/async-work/provider.js.map +1 -0
  36. package/src/async-work/recovery.d.ts +103 -0
  37. package/src/async-work/recovery.js +291 -0
  38. package/src/async-work/recovery.js.map +1 -0
  39. package/src/async-work/schedule.d.ts +117 -0
  40. package/src/async-work/schedule.js +279 -0
  41. package/src/async-work/schedule.js.map +1 -0
  42. package/src/async-work/sqs.d.ts +133 -0
  43. package/src/async-work/sqs.js +280 -0
  44. package/src/async-work/sqs.js.map +1 -0
  45. package/src/async-work/webhook.d.ts +60 -0
  46. package/src/async-work/webhook.js +178 -0
  47. package/src/async-work/webhook.js.map +1 -0
  48. package/src/async-work/workflow.d.ts +98 -0
  49. package/src/async-work/workflow.js +225 -0
  50. package/src/async-work/workflow.js.map +1 -0
  51. package/src/auth-backend.d.ts +12 -2
  52. package/src/auth-backend.js +30 -18
  53. package/src/auth-backend.js.map +1 -1
  54. package/src/authorization/admission.d.ts +30 -0
  55. package/src/authorization/admission.js +87 -0
  56. package/src/authorization/admission.js.map +1 -0
  57. package/src/authorization/approval.d.ts +99 -0
  58. package/src/authorization/approval.js +249 -0
  59. package/src/authorization/approval.js.map +1 -0
  60. package/src/authorization/audit.d.ts +35 -0
  61. package/src/authorization/audit.js +35 -0
  62. package/src/authorization/audit.js.map +1 -0
  63. package/src/authorization/delegation.d.ts +149 -0
  64. package/src/authorization/delegation.js +401 -0
  65. package/src/authorization/delegation.js.map +1 -0
  66. package/src/authorization/errors.d.ts +32 -0
  67. package/src/authorization/errors.js +153 -0
  68. package/src/authorization/errors.js.map +1 -0
  69. package/src/authorization/evaluator.d.ts +39 -0
  70. package/src/authorization/evaluator.js +199 -0
  71. package/src/authorization/evaluator.js.map +1 -0
  72. package/src/authorization/index.d.ts +14 -0
  73. package/src/authorization/index.js +15 -0
  74. package/src/authorization/index.js.map +1 -0
  75. package/src/authorization/machine-token.d.ts +87 -0
  76. package/src/authorization/machine-token.js +201 -0
  77. package/src/authorization/machine-token.js.map +1 -0
  78. package/src/authorization/machine.d.ts +32 -0
  79. package/src/authorization/machine.js +41 -0
  80. package/src/authorization/machine.js.map +1 -0
  81. package/src/authorization/model.d.ts +112 -0
  82. package/src/authorization/model.js +112 -0
  83. package/src/authorization/model.js.map +1 -0
  84. package/src/canonical-json.cjs +157 -0
  85. package/src/canonical-json.d.cts +26 -0
  86. package/src/canonical-json.d.ts +18 -0
  87. package/src/canonical-json.js +125 -0
  88. package/src/canonical-json.js.map +1 -0
  89. package/src/configuration/contract.d.ts +107 -0
  90. package/src/configuration/contract.js +461 -0
  91. package/src/configuration/contract.js.map +1 -0
  92. package/src/configuration/index.d.ts +3 -0
  93. package/src/configuration/index.js +4 -0
  94. package/src/configuration/index.js.map +1 -0
  95. package/src/configuration/provider.d.ts +59 -0
  96. package/src/configuration/provider.js +198 -0
  97. package/src/configuration/provider.js.map +1 -0
  98. package/src/configuration/rollout-evaluator.cjs +54 -0
  99. package/src/configuration/rollout-evaluator.d.cts +26 -0
  100. package/src/configuration/rollout-evaluator.d.ts +18 -0
  101. package/src/configuration/rollout-evaluator.js +38 -0
  102. package/src/configuration/rollout-evaluator.js.map +1 -0
  103. package/src/configuration/rollout-key.cjs +38 -0
  104. package/src/configuration/rollout-key.d.cts +14 -0
  105. package/src/configuration/rollout-key.d.ts +10 -0
  106. package/src/configuration/rollout-key.js +26 -0
  107. package/src/configuration/rollout-key.js.map +1 -0
  108. package/src/configuration/rollout.d.ts +60 -0
  109. package/src/configuration/rollout.js +42 -0
  110. package/src/configuration/rollout.js.map +1 -0
  111. package/src/data-lifecycle/contract.d.ts +33 -0
  112. package/src/data-lifecycle/contract.js +118 -0
  113. package/src/data-lifecycle/contract.js.map +1 -0
  114. package/src/data-lifecycle/event.d.ts +28 -0
  115. package/src/data-lifecycle/event.js +76 -0
  116. package/src/data-lifecycle/event.js.map +1 -0
  117. package/src/data-lifecycle/evidence.d.ts +65 -0
  118. package/src/data-lifecycle/evidence.js +162 -0
  119. package/src/data-lifecycle/evidence.js.map +1 -0
  120. package/src/data-lifecycle/holds.d.ts +29 -0
  121. package/src/data-lifecycle/holds.js +124 -0
  122. package/src/data-lifecycle/holds.js.map +1 -0
  123. package/src/data-lifecycle/index.d.ts +8 -0
  124. package/src/data-lifecycle/index.js +9 -0
  125. package/src/data-lifecycle/index.js.map +1 -0
  126. package/src/data-lifecycle/policy.d.ts +16 -0
  127. package/src/data-lifecycle/policy.js +79 -0
  128. package/src/data-lifecycle/policy.js.map +1 -0
  129. package/src/data-lifecycle/restore.d.ts +90 -0
  130. package/src/data-lifecycle/restore.js +336 -0
  131. package/src/data-lifecycle/restore.js.map +1 -0
  132. package/src/data-lifecycle/retention.d.ts +57 -0
  133. package/src/data-lifecycle/retention.js +232 -0
  134. package/src/data-lifecycle/retention.js.map +1 -0
  135. package/src/data-lifecycle/rights.d.ts +171 -0
  136. package/src/data-lifecycle/rights.js +533 -0
  137. package/src/data-lifecycle/rights.js.map +1 -0
  138. package/src/database.d.ts +36 -0
  139. package/src/database.js +119 -0
  140. package/src/database.js.map +1 -0
  141. package/src/deterministic-order.cjs +16 -0
  142. package/src/deterministic-order.d.cts +9 -0
  143. package/src/deterministic-order.d.ts +7 -0
  144. package/src/deterministic-order.js +10 -0
  145. package/src/deterministic-order.js.map +1 -0
  146. package/src/events.d.ts +28 -19
  147. package/src/events.js +171 -66
  148. package/src/events.js.map +1 -1
  149. package/src/index.d.ts +7 -1
  150. package/src/index.js +24 -0
  151. package/src/index.js.map +1 -1
  152. package/src/lambda.d.ts +8 -2
  153. package/src/lambda.js +100 -39
  154. package/src/lambda.js.map +1 -1
  155. package/src/logging.d.ts +95 -36
  156. package/src/logging.js +460 -62
  157. package/src/logging.js.map +1 -1
  158. package/src/observability.d.ts +80 -18
  159. package/src/observability.js +252 -61
  160. package/src/observability.js.map +1 -1
  161. package/src/performance/index.d.ts +1 -0
  162. package/src/performance/index.js +2 -0
  163. package/src/performance/index.js.map +1 -0
  164. package/src/performance/protected-load-endpoint.d.ts +140 -0
  165. package/src/performance/protected-load-endpoint.js +462 -0
  166. package/src/performance/protected-load-endpoint.js.map +1 -0
  167. package/src/rds-global-ca-bundle.d.ts +1 -0
  168. package/src/rds-global-ca-bundle.js +2742 -0
  169. package/src/rds-global-ca-bundle.js.map +1 -0
  170. package/src/reliability/burn.d.ts +39 -0
  171. package/src/reliability/burn.js +102 -0
  172. package/src/reliability/burn.js.map +1 -0
  173. package/src/reliability/contract.d.ts +5 -0
  174. package/src/reliability/contract.js +317 -0
  175. package/src/reliability/contract.js.map +1 -0
  176. package/src/reliability/incident.d.ts +16 -0
  177. package/src/reliability/incident.js +562 -0
  178. package/src/reliability/incident.js.map +1 -0
  179. package/src/reliability/index.d.ts +5 -0
  180. package/src/reliability/index.js +6 -0
  181. package/src/reliability/index.js.map +1 -0
  182. package/src/reliability/model.d.ts +191 -0
  183. package/src/reliability/model.fixtures.d.ts +2 -0
  184. package/src/reliability/model.fixtures.js +57 -0
  185. package/src/reliability/model.fixtures.js.map +1 -0
  186. package/src/reliability/model.js +2 -0
  187. package/src/reliability/model.js.map +1 -0
  188. package/src/reliability/slo.d.ts +9 -0
  189. package/src/reliability/slo.js +74 -0
  190. package/src/reliability/slo.js.map +1 -0
  191. package/src/request-context.d.ts +57 -15
  192. package/src/request-context.js +116 -36
  193. package/src/request-context.js.map +1 -1
  194. package/src/safe-reference.cjs +57 -0
  195. package/src/safe-reference.d.cts +25 -0
  196. package/src/safe-reference.d.ts +11 -0
  197. package/src/safe-reference.js +46 -0
  198. package/src/safe-reference.js.map +1 -0
  199. package/src/secrets/contract.d.ts +99 -0
  200. package/src/secrets/contract.js +238 -0
  201. package/src/secrets/contract.js.map +1 -0
  202. package/src/secrets/index.d.ts +4 -0
  203. package/src/secrets/index.js +5 -0
  204. package/src/secrets/index.js.map +1 -0
  205. package/src/secrets/observability.d.ts +14 -0
  206. package/src/secrets/observability.js +100 -0
  207. package/src/secrets/observability.js.map +1 -0
  208. package/src/secrets/personal.d.ts +48 -0
  209. package/src/secrets/personal.js +332 -0
  210. package/src/secrets/personal.js.map +1 -0
  211. package/src/secrets/resolver.d.ts +125 -0
  212. package/src/secrets/resolver.js +602 -0
  213. package/src/secrets/resolver.js.map +1 -0
  214. package/src/secrets/sensitive-patterns.cjs +84 -0
  215. package/src/secrets/sensitive-patterns.d.cts +62 -0
  216. package/src/secrets/sensitive-patterns.d.ts +40 -0
  217. package/src/secrets/sensitive-patterns.js +60 -0
  218. package/src/secrets/sensitive-patterns.js.map +1 -0
@@ -0,0 +1,225 @@
1
+ import { createHmac, timingSafeEqual } from 'node:crypto';
2
+ import { asyncWorkDigest, asyncWorkIdentity, canonicalAsyncJson, compareAsyncStrings, failAsyncWork, requireAsyncIdentifier, requireAsyncInteger, requireAsyncNumber, requireCanonicalAsyncTimestamp, } from './contract.js';
3
+ export const ASYNC_WORKFLOW_DEFINITION_VERSION = 1;
4
+ export const ASYNC_WORKFLOW_CALLBACK_VERSION = 1;
5
+ export function createWorkflowDefinition(input) {
6
+ if (!Array.isArray(input.steps) ||
7
+ input.steps.length === 0 ||
8
+ input.steps.length > 1000) {
9
+ failAsyncWork('async-input-invalid', '/steps', 'must contain from one through 1000 workflow steps');
10
+ }
11
+ const identifiers = new Set();
12
+ const steps = input.steps.map((step, index) => {
13
+ const stepId = requireAsyncIdentifier(step.stepId, `/steps/${index}/stepId`);
14
+ if (identifiers.has(stepId)) {
15
+ failAsyncWork('async-input-invalid', `/steps/${index}/stepId`, 'must be unique');
16
+ }
17
+ identifiers.add(stepId);
18
+ return Object.assign(Object.assign({}, (step.compensationStepId
19
+ ? {
20
+ compensationStepId: requireAsyncIdentifier(step.compensationStepId, `/steps/${index}/compensationStepId`),
21
+ }
22
+ : {})), { estimatedCostUsd: requireAsyncNumber(step.estimatedCostUsd, `/steps/${index}/estimatedCostUsd`, 0, 1000000), maximumAttempts: requireAsyncInteger(step.maximumAttempts, `/steps/${index}/maximumAttempts`, 1, 100), stepId, timeoutSeconds: requireAsyncInteger(step.timeoutSeconds, `/steps/${index}/timeoutSeconds`, 1, 31536000) });
23
+ });
24
+ for (const [index, step] of steps.entries()) {
25
+ if (step.compensationStepId !== undefined &&
26
+ (step.compensationStepId === step.stepId ||
27
+ !identifiers.has(step.compensationStepId))) {
28
+ failAsyncWork('async-input-invalid', `/steps/${index}/compensationStepId`, 'must name a different declared workflow step');
29
+ }
30
+ }
31
+ return {
32
+ dataClassification: requireAsyncIdentifier(input.dataClassification, '/dataClassification'),
33
+ estimatedFailureCostUsd: requireAsyncNumber(input.estimatedFailureCostUsd, '/estimatedFailureCostUsd', 0, 10000000),
34
+ estimatedNormalCostUsd: requireAsyncNumber(input.estimatedNormalCostUsd, '/estimatedNormalCostUsd', 0, 10000000),
35
+ inputContract: requireAsyncIdentifier(input.inputContract, '/inputContract'),
36
+ retentionDays: requireAsyncInteger(input.retentionDays, '/retentionDays', 1, 3650),
37
+ steps,
38
+ version: ASYNC_WORKFLOW_DEFINITION_VERSION,
39
+ workflow: requireAsyncIdentifier(input.workflow, '/workflow'),
40
+ workflowVersion: requireAsyncInteger(input.workflowVersion, '/workflowVersion', 1, Number.MAX_SAFE_INTEGER),
41
+ };
42
+ }
43
+ /**
44
+ * In-flight executions always resolve their recorded workflow version. A new
45
+ * deployment cannot silently reinterpret old state using the newest handler.
46
+ */
47
+ export function selectWorkflowVersion(input) {
48
+ const workflow = requireAsyncIdentifier(input.execution.workflow, '/execution/workflow');
49
+ const workflowVersion = requireAsyncInteger(input.execution.workflowVersion, '/execution/workflowVersion', 1, Number.MAX_SAFE_INTEGER);
50
+ if (!Array.isArray(input.definitions) || input.definitions.length > 100) {
51
+ failAsyncWork('async-input-invalid', '/definitions', 'must contain at most 100 workflow versions');
52
+ }
53
+ const matches = input.definitions.filter((definition) => definition.workflow === workflow &&
54
+ definition.workflowVersion === workflowVersion);
55
+ if (matches.length !== 1) {
56
+ failAsyncWork('async-workflow-version-unsupported', '/execution/workflowVersion', matches.length === 0
57
+ ? 'has no exact deployed definition'
58
+ : 'has multiple deployed definitions');
59
+ }
60
+ return createWorkflowDefinition(matches[0]);
61
+ }
62
+ function callbackSignature(encodedClaims, secret) {
63
+ return createHmac('sha256', secret).update(encodedClaims, 'utf8').digest();
64
+ }
65
+ function requireCallbackSecret(value, pointer) {
66
+ const length = typeof value === 'string'
67
+ ? Buffer.byteLength(value, 'utf8')
68
+ : value instanceof Uint8Array
69
+ ? value.byteLength
70
+ : 0;
71
+ if (length < 16 || length > 4096) {
72
+ failAsyncWork('async-input-invalid', pointer, 'must contain from 16 through 4096 secret bytes');
73
+ }
74
+ return value;
75
+ }
76
+ export function createWorkflowCallbackToken(input) {
77
+ const claims = {
78
+ callbackId: requireAsyncIdentifier(input.claims.callbackId, '/claims/callbackId'),
79
+ executionId: requireAsyncIdentifier(input.claims.executionId, '/claims/executionId'),
80
+ expiresAt: requireCanonicalAsyncTimestamp(input.claims.expiresAt, '/claims/expiresAt'),
81
+ nonce: requireAsyncIdentifier(input.claims.nonce, '/claims/nonce'),
82
+ version: ASYNC_WORKFLOW_CALLBACK_VERSION,
83
+ workflow: requireAsyncIdentifier(input.claims.workflow, '/claims/workflow'),
84
+ workflowVersion: requireAsyncInteger(input.claims.workflowVersion, '/claims/workflowVersion', 1, Number.MAX_SAFE_INTEGER),
85
+ };
86
+ const encodedClaims = Buffer.from(canonicalAsyncJson(claims), 'utf8').toString('base64url');
87
+ const secret = requireCallbackSecret(input.secret, '/secret');
88
+ return `${encodedClaims}.${callbackSignature(encodedClaims, secret).toString('base64url')}`;
89
+ }
90
+ export function verifyWorkflowCallbackToken(input) {
91
+ const now = requireCanonicalAsyncTimestamp(input.now, '/now');
92
+ if (typeof input.token !== 'string' ||
93
+ input.token.length === 0 ||
94
+ input.token.length > 4096 ||
95
+ !/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(input.token)) {
96
+ failAsyncWork('async-workflow-callback-invalid', '/token', 'must be a bounded signed callback capability');
97
+ }
98
+ const [encodedClaims, encodedSignature] = input.token.split('.');
99
+ let signature;
100
+ let rawClaims;
101
+ try {
102
+ signature = Buffer.from(encodedSignature, 'base64url');
103
+ rawClaims = JSON.parse(Buffer.from(encodedClaims, 'base64url').toString('utf8'));
104
+ }
105
+ catch (_a) {
106
+ failAsyncWork('async-workflow-callback-invalid', '/token', 'contains malformed claims or signature');
107
+ }
108
+ const secret = requireCallbackSecret(input.secret, '/secret');
109
+ const expectedSignature = callbackSignature(encodedClaims, secret);
110
+ if (signature.length !== expectedSignature.length ||
111
+ !timingSafeEqual(signature, expectedSignature)) {
112
+ failAsyncWork('async-workflow-callback-invalid', '/token', 'signature is invalid');
113
+ }
114
+ if (!rawClaims || typeof rawClaims !== 'object' || Array.isArray(rawClaims)) {
115
+ failAsyncWork('async-workflow-callback-invalid', '/token/claims', 'must be an object');
116
+ }
117
+ const value = rawClaims;
118
+ if (value.version !== ASYNC_WORKFLOW_CALLBACK_VERSION) {
119
+ failAsyncWork('async-workflow-callback-invalid', '/token/claims/version', 'must be one');
120
+ }
121
+ const claims = {
122
+ callbackId: requireAsyncIdentifier(value.callbackId, '/token/claims/callbackId'),
123
+ executionId: requireAsyncIdentifier(value.executionId, '/token/claims/executionId'),
124
+ expiresAt: requireCanonicalAsyncTimestamp(value.expiresAt, '/token/claims/expiresAt'),
125
+ nonce: requireAsyncIdentifier(value.nonce, '/token/claims/nonce'),
126
+ version: ASYNC_WORKFLOW_CALLBACK_VERSION,
127
+ workflow: requireAsyncIdentifier(value.workflow, '/token/claims/workflow'),
128
+ workflowVersion: requireAsyncInteger(value.workflowVersion, '/token/claims/workflowVersion', 1, Number.MAX_SAFE_INTEGER),
129
+ };
130
+ if (canonicalAsyncJson(rawClaims) !== canonicalAsyncJson(claims)) {
131
+ failAsyncWork('async-workflow-callback-invalid', '/token/claims', 'contains unsupported or non-canonical claims');
132
+ }
133
+ const expected = {
134
+ callbackId: requireAsyncIdentifier(input.expected.callbackId, '/expected/callbackId'),
135
+ executionId: requireAsyncIdentifier(input.expected.executionId, '/expected/executionId'),
136
+ workflow: requireAsyncIdentifier(input.expected.workflow, '/expected/workflow'),
137
+ workflowVersion: requireAsyncInteger(input.expected.workflowVersion, '/expected/workflowVersion', 1, Number.MAX_SAFE_INTEGER),
138
+ };
139
+ if (claims.callbackId !== expected.callbackId ||
140
+ claims.executionId !== expected.executionId ||
141
+ claims.workflow !== expected.workflow ||
142
+ claims.workflowVersion !== expected.workflowVersion) {
143
+ failAsyncWork('async-workflow-callback-invalid', '/token/claims', 'does not bind the expected workflow execution and callback');
144
+ }
145
+ if (Date.parse(now) >= Date.parse(claims.expiresAt)) {
146
+ failAsyncWork('async-workflow-callback-invalid', '/token/claims/expiresAt', 'callback capability expired');
147
+ }
148
+ const tokenDigest = asyncWorkDigest(input.token);
149
+ return {
150
+ callbackClaimKey: asyncWorkIdentity('workflow-callback-claim-v1', [
151
+ claims.executionId,
152
+ claims.callbackId,
153
+ claims.nonce,
154
+ ]),
155
+ claims,
156
+ tokenDigest,
157
+ };
158
+ }
159
+ export function requestWorkflowCancellation(input) {
160
+ if (!['running', 'waiting', 'cancellation-requested'].includes(input.status)) {
161
+ failAsyncWork('async-input-invalid', '/status', 'only a running or waiting workflow can request cancellation');
162
+ }
163
+ return {
164
+ actor: requireAsyncIdentifier(input.actor, '/actor'),
165
+ executionId: requireAsyncIdentifier(input.executionId, '/executionId'),
166
+ reason: requireAsyncIdentifier(input.reason, '/reason'),
167
+ requestedAt: requireCanonicalAsyncTimestamp(input.requestedAt, '/requestedAt'),
168
+ status: 'cancellation-requested',
169
+ workflow: requireAsyncIdentifier(input.workflow, '/workflow'),
170
+ };
171
+ }
172
+ export function createCompensationPlan(input) {
173
+ const definition = createWorkflowDefinition(input.definition);
174
+ const executionId = requireAsyncIdentifier(input.executionId, '/executionId');
175
+ const authorizationId = requireAsyncIdentifier(input.authorizationId, '/authorizationId');
176
+ const reason = requireAsyncIdentifier(input.reason, '/reason');
177
+ if (!Array.isArray(input.completedStepIds) ||
178
+ input.completedStepIds.length > definition.steps.length) {
179
+ failAsyncWork('async-input-invalid', '/completedStepIds', 'cannot exceed the declared workflow steps');
180
+ }
181
+ const stepsById = new Map(definition.steps.map((step) => [step.stepId, step]));
182
+ const completed = input.completedStepIds.map((stepId, index) => {
183
+ const normalized = requireAsyncIdentifier(stepId, `/completedStepIds/${index}`);
184
+ if (!stepsById.has(normalized)) {
185
+ failAsyncWork('async-input-invalid', `/completedStepIds/${index}`, 'must name a declared workflow step');
186
+ }
187
+ return normalized;
188
+ });
189
+ if (new Set(completed).size !== completed.length) {
190
+ failAsyncWork('async-input-invalid', '/completedStepIds', 'must not contain duplicates');
191
+ }
192
+ const actions = [...completed]
193
+ .reverse()
194
+ .flatMap((stepId) => {
195
+ var _a;
196
+ const compensationStepId = (_a = stepsById.get(stepId)) === null || _a === void 0 ? void 0 : _a.compensationStepId;
197
+ if (!compensationStepId)
198
+ return [];
199
+ return [
200
+ {
201
+ compensationStepId,
202
+ idempotencyKey: asyncWorkIdentity('workflow-compensation-v1', [
203
+ executionId,
204
+ stepId,
205
+ compensationStepId,
206
+ ]),
207
+ originalStepId: stepId,
208
+ },
209
+ ];
210
+ });
211
+ const material = {
212
+ actions,
213
+ authorizationId,
214
+ executionId,
215
+ reason,
216
+ workflow: definition.workflow,
217
+ workflowVersion: definition.workflowVersion,
218
+ };
219
+ return Object.assign(Object.assign({}, material), { planDigest: asyncWorkDigest(material) });
220
+ }
221
+ export function workflowDefinitionDigest(definition) {
222
+ const normalized = createWorkflowDefinition(definition);
223
+ return asyncWorkDigest(Object.assign(Object.assign({}, normalized), { steps: [...normalized.steps].sort((left, right) => compareAsyncStrings(left.stepId, right.stepId)) }));
224
+ }
225
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/async-work/workflow.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { BetterAuthConfig, AuthenticatedSession, type AuthPolicy, type Principal, type PrincipalKind } from './auth.js';
2
2
  import { type JWTVerifyGetKey } from 'jose';
3
+ import type { Logger } from './logging.js';
3
4
  /**
4
5
  * Verifies a Cognito JWT token and returns a typed session.
5
6
  * Uses the Cognito JWKS endpoint for validation.
@@ -9,6 +10,12 @@ export interface CognitoJwtVerifier {
9
10
  }
10
11
  export type CognitoTokenUse = 'access' | 'any' | 'id';
11
12
  export interface CognitoJwtVerifierOptions {
13
+ /**
14
+ * Exact app-client IDs accepted by this API. Defaults to the configured
15
+ * primary web client. Add a generated confidential-client ID only on APIs
16
+ * that expose its M2M scopes.
17
+ */
18
+ acceptedClientIds?: readonly string[];
12
19
  clockToleranceSeconds?: number;
13
20
  jwks?: JWTVerifyGetKey;
14
21
  onJwksError?: (error: unknown) => void;
@@ -30,10 +37,13 @@ export interface AuthGuardEvent {
30
37
  * flow through the runtime response helpers unchanged.
31
38
  */
32
39
  export interface AuthGuard {
33
- authorize(event: AuthGuardEvent): Promise<Principal>;
34
- authorizeToken(token: string | null | undefined): Promise<Principal>;
40
+ authorize(event: AuthGuardEvent, observation?: AuthGuardObservation): Promise<Principal>;
41
+ authorizeToken(token: string | null | undefined, observation?: AuthGuardObservation): Promise<Principal>;
35
42
  verifier: CognitoJwtVerifier;
36
43
  }
44
+ export interface AuthGuardObservation {
45
+ logger?: Pick<Logger, 'error'>;
46
+ }
37
47
  export interface CreateAuthGuardOptions {
38
48
  allowedKinds?: PrincipalKind[];
39
49
  config: BetterAuthConfig;
@@ -1,8 +1,8 @@
1
1
  import { __awaiter } from "tslib";
2
2
  import { assertPrincipalKind, AuthError, authErrorCodes, isAuthError, sessionFromCognitoToken, toPrincipal, } from './auth.js';
3
3
  import { createRemoteJWKSet, jwtVerify, } from 'jose';
4
- function hasExpectedAudience(payload, clientId) {
5
- return (payload.aud === clientId ||
4
+ function hasExpectedAudience(payload, clientIds) {
5
+ return clientIds.some((clientId) => payload.aud === clientId ||
6
6
  (Array.isArray(payload.aud) && payload.aud.includes(clientId)) ||
7
7
  payload.client_id === clientId);
8
8
  }
@@ -27,12 +27,22 @@ function isJwksAvailabilityError(error) {
27
27
  ['ERR_JWKS_INVALID', 'ERR_JWKS_TIMEOUT'].includes((_a = joseErrorCode(error)) !== null && _a !== void 0 ? _a : ''));
28
28
  }
29
29
  export function createCognitoJwtVerifier(config, options = {}) {
30
- var _a, _b;
30
+ var _a, _b, _c;
31
31
  const clockToleranceSeconds = (_a = options.clockToleranceSeconds) !== null && _a !== void 0 ? _a : 30;
32
32
  if (!Number.isFinite(clockToleranceSeconds) || clockToleranceSeconds < 0) {
33
33
  throw new Error('JWT clock tolerance must be a non-negative number.');
34
34
  }
35
- const jwks = (_b = options.jwks) !== null && _b !== void 0 ? _b : createRemoteJWKSet(new URL(`${config.issuerUrl}/.well-known/jwks.json`));
35
+ const acceptedClientIds = (_b = options.acceptedClientIds) !== null && _b !== void 0 ? _b : [config.clientId];
36
+ if (acceptedClientIds.length === 0 ||
37
+ acceptedClientIds.some((clientId) => typeof clientId !== 'string' ||
38
+ clientId.trim() !== clientId ||
39
+ clientId.length === 0 ||
40
+ clientId.length > 256 ||
41
+ /[\r\n]/.test(clientId)) ||
42
+ new Set(acceptedClientIds).size !== acceptedClientIds.length) {
43
+ throw new Error('Accepted Cognito client IDs must be a non-empty unique bounded set.');
44
+ }
45
+ const jwks = (_c = options.jwks) !== null && _c !== void 0 ? _c : createRemoteJWKSet(new URL(`${config.issuerUrl}/.well-known/jwks.json`));
36
46
  return {
37
47
  verify(token) {
38
48
  return __awaiter(this, void 0, void 0, function* () {
@@ -51,18 +61,11 @@ export function createCognitoJwtVerifier(config, options = {}) {
51
61
  }
52
62
  catch (error) {
53
63
  if (isJwksAvailabilityError(error)) {
54
- const report = (_a = options.onJwksError) !== null && _a !== void 0 ? _a : ((cause) => {
55
- var _a;
56
- return console.error('[runtime/auth-backend] Cognito JWKS verification is unavailable.', {
57
- code: (_a = joseErrorCode(cause)) !== null && _a !== void 0 ? _a : 'ERR_JWKS_FETCH',
58
- issuer: config.issuerUrl,
59
- });
60
- });
61
- report(error);
64
+ (_a = options.onJwksError) === null || _a === void 0 ? void 0 : _a.call(options, error);
62
65
  }
63
66
  throw error;
64
67
  }
65
- if (!hasExpectedAudience(payload, config.clientId)) {
68
+ if (!hasExpectedAudience(payload, acceptedClientIds)) {
66
69
  throw new Error('Invalid audience');
67
70
  }
68
71
  if (!payload.sub) {
@@ -114,8 +117,9 @@ function getHeader(headers, name) {
114
117
  export function createAuthGuard(options) {
115
118
  var _a, _b, _c;
116
119
  const verifier = (_a = options.verifier) !== null && _a !== void 0 ? _a : createCognitoJwtVerifier(options.config, Object.assign(Object.assign({}, options.verifierOptions), { tokenUse: (_c = (_b = options.verifierOptions) === null || _b === void 0 ? void 0 : _b.tokenUse) !== null && _c !== void 0 ? _c : 'access' }));
117
- function authorizeToken(token) {
118
- return __awaiter(this, void 0, void 0, function* () {
120
+ function authorizeToken(token_1) {
121
+ return __awaiter(this, arguments, void 0, function* (token, observation = {}) {
122
+ var _a, _b;
119
123
  if (!token) {
120
124
  throw new AuthError({
121
125
  code: authErrorCodes.unauthenticated,
@@ -131,6 +135,14 @@ export function createAuthGuard(options) {
131
135
  if (isAuthError(error)) {
132
136
  throw error;
133
137
  }
138
+ if (isJwksAvailabilityError(error)) {
139
+ (_a = observation.logger) === null || _a === void 0 ? void 0 : _a.error('Cognito JWKS verification unavailable', {
140
+ attributes: {
141
+ errorCode: (_b = joseErrorCode(error)) !== null && _b !== void 0 ? _b : 'ERR_JWKS_FETCH',
142
+ },
143
+ outcome: 'failure',
144
+ });
145
+ }
134
146
  throw new AuthError({
135
147
  code: authErrorCodes.invalidToken,
136
148
  message: 'Invalid or expired token',
@@ -145,10 +157,10 @@ export function createAuthGuard(options) {
145
157
  });
146
158
  }
147
159
  return {
148
- authorize(event) {
149
- return __awaiter(this, void 0, void 0, function* () {
160
+ authorize(event_1) {
161
+ return __awaiter(this, arguments, void 0, function* (event, observation = {}) {
150
162
  const token = extractBearerToken(getHeader(event.headers, 'authorization'));
151
- return authorizeToken(token);
163
+ return authorizeToken(token, observation);
152
164
  });
153
165
  },
154
166
  authorizeToken,
@@ -1 +1 @@
1
- {"version":3,"file":"auth-backend.js","sourceRoot":"","sources":["../../../../packages/runtime/src/auth-backend.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,cAAc,EAEd,WAAW,EACX,uBAAuB,EACvB,WAAW,GAKZ,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,kBAAkB,EAClB,SAAS,GAGV,MAAM,MAAM,CAAC;AA4Bd,SAAS,mBAAmB,CAC1B,OAA0B,EAC1B,QAAgB;IAEhB,OAAO,CACL,OAAO,CAAC,GAAG,KAAK,QAAQ;QACxB,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9D,OAAO,CAAC,SAAS,KAAK,QAAQ,CAC/B,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAe;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAC9B,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CACtD,CAAC;IACF,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ;QAC9B,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,CAAC,CAAC,KAAK,CAAC,IAAI;QACZ,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc;;IAC7C,OAAO,CACL,KAAK,YAAY,SAAS;QAC1B,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAC/C,MAAA,aAAa,CAAC,KAAK,CAAC,mCAAI,EAAE,CAC3B,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,MAAwB,EACxB,UAAqC,EAAE;;IAEvC,MAAM,qBAAqB,GAAG,MAAA,OAAO,CAAC,qBAAqB,mCAAI,EAAE,CAAC;IAClE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,qBAAqB,GAAG,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,IAAI,GACR,MAAA,OAAO,CAAC,IAAI,mCACZ,kBAAkB,CAAC,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,wBAAwB,CAAC,CAAC,CAAC;IAE3E,OAAO;QACC,MAAM,CAAC,KAAa;;;gBACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBACxC,CAAC;gBAED,IAAI,OAA0B,CAAC;gBAC/B,IAAI,CAAC;oBACH,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAoB,KAAK,EAAE,IAAI,EAAE;wBAC7D,UAAU,EAAE,CAAC,OAAO,CAAC;wBACrB,cAAc,EAAE,qBAAqB;wBACrC,MAAM,EAAE,MAAM,CAAC,SAAS;qBACzB,CAAC,CAAC,CAAC;gBACN,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;wBACnC,MAAM,MAAM,GACV,MAAA,OAAO,CAAC,WAAW,mCACnB,CAAC,CAAC,KAAc,EAAE,EAAE;;4BAClB,OAAA,OAAO,CAAC,KAAK,CACX,kEAAkE,EAClE;gCACE,IAAI,EAAE,MAAA,aAAa,CAAC,KAAK,CAAC,mCAAI,gBAAgB;gCAC9C,MAAM,EAAE,MAAM,CAAC,SAAS;6BACzB,CACF,CAAA;yBAAA,CAAC,CAAC;wBACP,MAAM,CAAC,KAAK,CAAC,CAAC;oBAChB,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACnD,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBACtC,CAAC;gBAED,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBACrC,CAAC;gBAED,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;oBACpC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAC1C,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAA,OAAO,CAAC,QAAQ,mCAAI,KAAK,CAAC;gBAC3C,IAAI,QAAQ,KAAK,KAAK,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;oBACzD,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBACvC,CAAC;gBAED,OAAO,uBAAuB,CAAC;oBAC7B,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,CAAC;oBAC/C,gBAAgB,EAAE,eAAe,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;oBAC5D,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,SAAS,EAAE,OAAO,CAAC,SAAS;iBAC7B,CAAC,CAAC;YACL,CAAC;SAAA;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAA8B;IAE9B,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;AAClE,CAAC;AAyBD,SAAS,SAAS,CAChB,OAAkC,EAClC,IAAY;IAEZ,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CACxC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,SAAS,CAC3C,CAAC;IAEF,OAAO,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA+B;;IAC7D,MAAM,QAAQ,GACZ,MAAA,OAAO,CAAC,QAAQ,mCAChB,wBAAwB,CAAC,OAAO,CAAC,MAAM,kCAClC,OAAO,CAAC,eAAe,KAC1B,QAAQ,EAAE,MAAA,MAAA,OAAO,CAAC,eAAe,0CAAE,QAAQ,mCAAI,QAAQ,IACvD,CAAC;IAEL,SAAe,cAAc,CAC3B,KAAgC;;YAEhC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,SAAS,CAAC;oBAClB,IAAI,EAAE,cAAc,CAAC,eAAe;oBACpC,OAAO,EAAE,yBAAyB;oBAClC,MAAM,EAAE,GAAG;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,IAAI,OAA6B,CAAC;YAClC,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvB,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,IAAI,SAAS,CAAC;oBAClB,IAAI,EAAE,cAAc,CAAC,YAAY;oBACjC,OAAO,EAAE,0BAA0B;oBACnC,MAAM,EAAE,GAAG;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAEvD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YACvD,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAED,OAAO;QACC,SAAS,CAAC,KAAqB;;gBACnC,MAAM,KAAK,GAAG,kBAAkB,CAC9B,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAC1C,CAAC;gBACF,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;SAAA;QACD,cAAc;QACd,QAAQ;KACT,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"auth-backend.js","sourceRoot":"","sources":["../../../../packages/runtime/src/auth-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { PrincipalKind } from '../auth.js';
2
+ import type { RequestActor } from '../request-context.js';
3
+ import { type AuthorizationDecision, type AuthorizationPrincipal } from './model.js';
4
+ export interface CoarseAdmissionRule {
5
+ allRoles?: readonly string[];
6
+ allScopes?: readonly string[];
7
+ anyRole?: readonly string[];
8
+ anyScope?: readonly string[];
9
+ kinds: readonly PrincipalKind[];
10
+ subjectTypes?: readonly RequestActor['type'][];
11
+ }
12
+ export interface CoarseAdmission {
13
+ /**
14
+ * Alternatives let one operation explicitly admit the current human
15
+ * kind/role path or an OAuth-scoped M2M path. A missing or empty set denies.
16
+ */
17
+ anyOf: readonly CoarseAdmissionRule[];
18
+ }
19
+ export interface CoarseAdmissionAllow {
20
+ decision: 'allow';
21
+ }
22
+ export type CoarseAdmissionDecision = CoarseAdmissionAllow | Extract<AuthorizationDecision, {
23
+ decision: 'deny';
24
+ }>;
25
+ export declare function defineCoarseAdmission(admission: CoarseAdmission): CoarseAdmission;
26
+ /**
27
+ * Coarse admission never substitutes for domain policy. The result says only
28
+ * whether the principal may proceed to the Slice-owned evaluator.
29
+ */
30
+ export declare function evaluateCoarseAdmission(principal: AuthorizationPrincipal, admission: CoarseAdmission): CoarseAdmissionDecision;
@@ -0,0 +1,87 @@
1
+ import { denyAuthorization, } from './model.js';
2
+ const POLICY_VERSION = 'coarse-admission-v1';
3
+ function normalizeValues(values, label) {
4
+ if (values === undefined)
5
+ return undefined;
6
+ const normalized = values.map((value) => value.trim());
7
+ if (normalized.length === 0 ||
8
+ normalized.some((value) => !value || value.length > 256 || /[\r\n]/.test(value)) ||
9
+ new Set(normalized).size !== normalized.length) {
10
+ throw new Error(`[runtime/authorization] ${label} must contain unique bounded values.`);
11
+ }
12
+ return Object.freeze(normalized);
13
+ }
14
+ export function defineCoarseAdmission(admission) {
15
+ if (!Array.isArray(admission.anyOf) || admission.anyOf.length === 0) {
16
+ throw new Error('[runtime/authorization] Coarse admission requires at least one explicit alternative.');
17
+ }
18
+ const alternatives = admission.anyOf.map((rule, index) => {
19
+ if (!Array.isArray(rule.kinds) ||
20
+ rule.kinds.length === 0 ||
21
+ new Set(rule.kinds).size !== rule.kinds.length ||
22
+ rule.kinds.some((kind) => !['admin', 'agent', 'customer'].includes(kind))) {
23
+ throw new Error(`[runtime/authorization] Coarse admission alternative ${index} requires unique PrincipalKind values.`);
24
+ }
25
+ if (rule.subjectTypes !== undefined &&
26
+ (rule.subjectTypes.length === 0 ||
27
+ new Set(rule.subjectTypes).size !== rule.subjectTypes.length ||
28
+ rule.subjectTypes.some((type) => !['service', 'system', 'user'].includes(type)))) {
29
+ throw new Error(`[runtime/authorization] Coarse admission alternative ${index} has invalid subject types.`);
30
+ }
31
+ return Object.freeze({
32
+ allRoles: normalizeValues(rule.allRoles, 'allRoles'),
33
+ allScopes: normalizeValues(rule.allScopes, 'allScopes'),
34
+ anyRole: normalizeValues(rule.anyRole, 'anyRole'),
35
+ anyScope: normalizeValues(rule.anyScope, 'anyScope'),
36
+ kinds: Object.freeze([...rule.kinds]),
37
+ subjectTypes: rule.subjectTypes
38
+ ? Object.freeze([...rule.subjectTypes])
39
+ : undefined,
40
+ });
41
+ });
42
+ return Object.freeze({ anyOf: Object.freeze(alternatives) });
43
+ }
44
+ function evaluateRule(principal, rule) {
45
+ if (!rule.kinds.includes(principal.kind) ||
46
+ (rule.subjectTypes !== undefined &&
47
+ !rule.subjectTypes.includes(principal.actor.type))) {
48
+ return 'kind';
49
+ }
50
+ if ((rule.allRoles !== undefined &&
51
+ !rule.allRoles.every((role) => principal.roles.includes(role))) ||
52
+ (rule.anyRole !== undefined &&
53
+ !rule.anyRole.some((role) => principal.roles.includes(role)))) {
54
+ return 'role';
55
+ }
56
+ if ((rule.allScopes !== undefined &&
57
+ !rule.allScopes.every((scope) => principal.scopes.includes(scope))) ||
58
+ (rule.anyScope !== undefined &&
59
+ !rule.anyScope.some((scope) => principal.scopes.includes(scope)))) {
60
+ return 'scope';
61
+ }
62
+ return 'allow';
63
+ }
64
+ /**
65
+ * Coarse admission never substitutes for domain policy. The result says only
66
+ * whether the principal may proceed to the Slice-owned evaluator.
67
+ */
68
+ export function evaluateCoarseAdmission(principal, admission) {
69
+ let normalized;
70
+ try {
71
+ normalized = defineCoarseAdmission(admission);
72
+ }
73
+ catch (_a) {
74
+ return denyAuthorization('admission-kind-denied', POLICY_VERSION);
75
+ }
76
+ const progress = normalized.anyOf.map((rule) => evaluateRule(principal, rule));
77
+ if (progress.includes('allow'))
78
+ return { decision: 'allow' };
79
+ if (progress.includes('scope')) {
80
+ return denyAuthorization('admission-scope-denied', POLICY_VERSION);
81
+ }
82
+ if (progress.includes('role')) {
83
+ return denyAuthorization('admission-role-denied', POLICY_VERSION);
84
+ }
85
+ return denyAuthorization('admission-kind-denied', POLICY_VERSION);
86
+ }
87
+ //# sourceMappingURL=admission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admission.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/authorization/admission.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import type { RequestActor } from '../request-context.js';
2
+ import { type AuthorizationDecision, type AuthorizationPrincipal } from './model.js';
3
+ export declare const APPROVAL_REQUEST_SCHEMA_VERSION: 1;
4
+ export declare const DEFAULT_MAX_APPROVAL_TTL_SECONDS: number;
5
+ export interface ApprovalResourceReference {
6
+ id?: string;
7
+ type: string;
8
+ }
9
+ export interface ApprovalDigestInput<Action extends string = string> {
10
+ action: Action;
11
+ command: unknown;
12
+ resource: ApprovalResourceReference;
13
+ }
14
+ export interface ApprovalActorReference {
15
+ actorId: string;
16
+ authorityMode: 'delegated' | 'direct' | 'machine';
17
+ effectiveHumanId?: string;
18
+ subjectType: RequestActor['type'];
19
+ }
20
+ export interface ApprovalDecisionRecord {
21
+ at: string;
22
+ decidedBy: ApprovalActorReference;
23
+ outcome: 'approved' | 'rejected';
24
+ reasonReference: string;
25
+ }
26
+ export interface ApprovalExecutionRecord {
27
+ completedAt?: string;
28
+ executionId: string;
29
+ startedAt: string;
30
+ }
31
+ export interface ApprovalRequest<Action extends string = string> {
32
+ action: Action;
33
+ author: ApprovalActorReference;
34
+ decision?: ApprovalDecisionRecord;
35
+ execution?: ApprovalExecutionRecord;
36
+ expiresAt: string;
37
+ id: string;
38
+ policyVersion: string;
39
+ requestDigest: string;
40
+ requestedAt: string;
41
+ resource: ApprovalResourceReference;
42
+ revision: number;
43
+ schemaVersion: typeof APPROVAL_REQUEST_SCHEMA_VERSION;
44
+ slice: string;
45
+ status: 'approved' | 'executed' | 'executing' | 'expired' | 'pending' | 'rejected';
46
+ }
47
+ export interface CreateApprovalRequestInput<Action extends string = string> extends ApprovalDigestInput<Action> {
48
+ author: AuthorizationPrincipal;
49
+ expiresAt: string;
50
+ now: string;
51
+ policyVersion: string;
52
+ slice: string;
53
+ }
54
+ export interface DecideApprovalRequestInput {
55
+ approver: AuthorizationPrincipal;
56
+ expectedRequestDigest: string;
57
+ now: string;
58
+ outcome: 'approved' | 'rejected';
59
+ reasonReference: string;
60
+ requiredPolicyVersion: string;
61
+ }
62
+ export interface ApprovalTransitionResult<Action extends string = string> {
63
+ decision: AuthorizationDecision;
64
+ request: ApprovalRequest<Action>;
65
+ }
66
+ export interface BeginApprovalExecutionInput<Action extends string = string> extends ApprovalDigestInput<Action> {
67
+ executionId?: string;
68
+ now: string;
69
+ requiredPolicyVersion: string;
70
+ }
71
+ export interface CompleteApprovalExecutionInput {
72
+ executionId: string;
73
+ now: string;
74
+ requiredPolicyVersion: string;
75
+ }
76
+ /**
77
+ * Binds approval to the exact action, safe resource reference, and canonical
78
+ * command. The command itself is never retained on the approval record.
79
+ */
80
+ export declare function digestApprovalRequest<Action extends string>(input: ApprovalDigestInput<Action>): string;
81
+ export declare function toApprovalActorReference(principal: AuthorizationPrincipal): ApprovalActorReference;
82
+ export declare function createApprovalRequest<Action extends string>(input: CreateApprovalRequestInput<Action>): ApprovalRequest<Action>;
83
+ export declare function expireApprovalRequest<Action extends string>(request: ApprovalRequest<Action>, now: string): ApprovalRequest<Action>;
84
+ /**
85
+ * Enforces direct-human, non-author review. A human who authored through a
86
+ * delegated agent remains the effective author and cannot approve through a
87
+ * different session.
88
+ */
89
+ export declare function decideApprovalRequest<Action extends string>(request: ApprovalRequest<Action>, input: DecideApprovalRequestInput): ApprovalTransitionResult<Action>;
90
+ export declare function authorizeApprovalExecution<Action extends string>(request: ApprovalRequest<Action>, input: ApprovalDigestInput<Action> & {
91
+ now: string;
92
+ requiredPolicyVersion: string;
93
+ }): AuthorizationDecision;
94
+ /**
95
+ * Claims an approved command before its protected effect. Persist this
96
+ * revision with compare-and-set, then execute idempotently under executionId.
97
+ */
98
+ export declare function beginApprovalExecution<Action extends string>(request: ApprovalRequest<Action>, input: BeginApprovalExecutionInput<Action>): ApprovalTransitionResult<Action>;
99
+ export declare function completeApprovalExecution<Action extends string>(request: ApprovalRequest<Action>, input: CompleteApprovalExecutionInput): ApprovalTransitionResult<Action>;