@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,199 @@
1
+ import { __awaiter } from "tslib";
2
+ import { evaluateCoarseAdmission } from './admission.js';
3
+ import { assertAuthorizationAllowed } from './errors.js';
4
+ import { allowAuthorization, denyAuthorization, } from './model.js';
5
+ const UNAVAILABLE_POLICY_VERSION = 'unavailable';
6
+ const POLICY_VERSION_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
7
+ function isPolicyVersion(value) {
8
+ return (typeof value === 'string' &&
9
+ POLICY_VERSION_PATTERN.test(value) &&
10
+ value.trim() === value);
11
+ }
12
+ const PRINCIPAL_KINDS = ['admin', 'agent', 'customer'];
13
+ const SUBJECT_TYPES = ['service', 'system', 'user'];
14
+ const MAX_PRINCIPAL_VALUES = 128;
15
+ function isBoundedText(value, maximumLength = 256) {
16
+ return (typeof value === 'string' &&
17
+ value.length > 0 &&
18
+ value.length <= maximumLength &&
19
+ value.trim() === value &&
20
+ !/[\r\n]/.test(value));
21
+ }
22
+ function isBoundedUniqueTextList(value) {
23
+ return (Array.isArray(value) &&
24
+ value.length <= MAX_PRINCIPAL_VALUES &&
25
+ value.every((entry) => isBoundedText(entry)) &&
26
+ new Set(value).size === value.length);
27
+ }
28
+ function validPrincipal(value) {
29
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
30
+ return false;
31
+ }
32
+ const principal = value;
33
+ if (principal.actor === null ||
34
+ typeof principal.actor !== 'object' ||
35
+ !isBoundedText(principal.actor.id) ||
36
+ !SUBJECT_TYPES.includes(principal.actor.type) ||
37
+ principal.subject === null ||
38
+ typeof principal.subject !== 'object' ||
39
+ !isBoundedText(principal.subject.id) ||
40
+ !SUBJECT_TYPES.includes(principal.subject.type) ||
41
+ principal.actor.id !== principal.subject.id ||
42
+ principal.actor.type !== principal.subject.type ||
43
+ !PRINCIPAL_KINDS.includes(principal.kind) ||
44
+ !isBoundedUniqueTextList(principal.roles) ||
45
+ !isBoundedUniqueTextList(principal.scopes) ||
46
+ (principal.audience !== undefined && !isBoundedText(principal.audience)) ||
47
+ principal.authority === null ||
48
+ typeof principal.authority !== 'object') {
49
+ return false;
50
+ }
51
+ const authority = principal.authority;
52
+ if (authority.mode === 'direct') {
53
+ return principal.actor.type === 'user';
54
+ }
55
+ if (authority.mode === 'machine') {
56
+ return (principal.kind === 'agent' &&
57
+ principal.actor.type === 'service' &&
58
+ isBoundedText(principal.audience) &&
59
+ principal.audience === principal.actor.id &&
60
+ isBoundedText(authority.machineIdentityId));
61
+ }
62
+ if (authority.mode === 'delegated') {
63
+ return (principal.kind === 'agent' &&
64
+ principal.actor.type === 'service' &&
65
+ isBoundedText(principal.audience) &&
66
+ principal.audience === principal.actor.id &&
67
+ isBoundedText(authority.delegationId) &&
68
+ authority.delegatedBy !== null &&
69
+ typeof authority.delegatedBy === 'object' &&
70
+ authority.delegatedBy.type === 'user' &&
71
+ isBoundedText(authority.delegatedBy.id));
72
+ }
73
+ return false;
74
+ }
75
+ function validInput(input) {
76
+ return (input !== null &&
77
+ typeof input === 'object' &&
78
+ isBoundedText(input.action) &&
79
+ validPrincipal(input.principal) &&
80
+ input.resource !== null &&
81
+ typeof input.resource === 'object' &&
82
+ !Array.isArray(input.resource) &&
83
+ isBoundedText(input.resource.type, 128) &&
84
+ (input.resource.id === undefined || isBoundedText(input.resource.id)) &&
85
+ input.resource.attributes !== null &&
86
+ typeof input.resource.attributes === 'object' &&
87
+ !Array.isArray(input.resource.attributes) &&
88
+ input.context !== null &&
89
+ typeof input.context === 'object' &&
90
+ !Array.isArray(input.context) &&
91
+ typeof input.context.now === 'string' &&
92
+ Number.isFinite(Date.parse(input.context.now)) &&
93
+ isBoundedText(input.context.stage, 63) &&
94
+ input.context.facts !== null &&
95
+ typeof input.context.facts === 'object' &&
96
+ !Array.isArray(input.context.facts));
97
+ }
98
+ function validObligation(value) {
99
+ if (value === null ||
100
+ typeof value !== 'object' ||
101
+ typeof value.kind !== 'string') {
102
+ return false;
103
+ }
104
+ const obligation = value;
105
+ return (obligation.kind.trim() === obligation.kind &&
106
+ obligation.kind.length > 0 &&
107
+ obligation.kind.length <= 128 &&
108
+ !/[\r\n]/.test(obligation.kind) &&
109
+ (obligation.reference === undefined ||
110
+ (typeof obligation.reference === 'string' &&
111
+ obligation.reference.trim() === obligation.reference &&
112
+ obligation.reference.length > 0 &&
113
+ obligation.reference.length <= 256 &&
114
+ !/[\r\n]/.test(obligation.reference))));
115
+ }
116
+ function projectPolicyResult(result, policyVersion) {
117
+ var _a;
118
+ if ((result === null || result === void 0 ? void 0 : result.decision) === 'allow' &&
119
+ (result.obligations === undefined ||
120
+ (Array.isArray(result.obligations) &&
121
+ result.obligations.every(validObligation)))) {
122
+ return allowAuthorization(policyVersion, (_a = result.obligations) !== null && _a !== void 0 ? _a : []);
123
+ }
124
+ if ((result === null || result === void 0 ? void 0 : result.decision) === 'deny') {
125
+ return denyAuthorization('domain-authorization-denied', policyVersion);
126
+ }
127
+ return denyAuthorization('authorization-unavailable', policyVersion);
128
+ }
129
+ export function defineAuthorizationPolicy(policy) {
130
+ if (!isPolicyVersion(policy.version) ||
131
+ typeof policy.evaluate !== 'function') {
132
+ throw new Error('[runtime/authorization] Authorization policy requires a bounded version and evaluator.');
133
+ }
134
+ return Object.freeze({
135
+ evaluate: policy.evaluate,
136
+ version: policy.version,
137
+ });
138
+ }
139
+ /**
140
+ * Wraps Slice-owned policy with explicit admission and fail-closed behavior.
141
+ * Only the literal typed allow result authorizes; falsey, ambiguous, thrown,
142
+ * stale, or unavailable evaluation returns a stable denial.
143
+ */
144
+ export function createAuthorizationEvaluator(options) {
145
+ var _a;
146
+ const version = isPolicyVersion((_a = options.policy) === null || _a === void 0 ? void 0 : _a.version)
147
+ ? options.policy.version
148
+ : UNAVAILABLE_POLICY_VERSION;
149
+ const evaluate = (input) => __awaiter(this, void 0, void 0, function* () {
150
+ let decision;
151
+ if (!validInput(input)) {
152
+ decision = denyAuthorization('policy-input-invalid', version);
153
+ }
154
+ else {
155
+ const admission = evaluateCoarseAdmission(input.principal, options.admission);
156
+ if (admission.decision === 'deny') {
157
+ decision = Object.assign(Object.assign({}, admission), { policyVersion: version });
158
+ }
159
+ else if (options.requiredPolicyVersion !== undefined &&
160
+ options.requiredPolicyVersion !== version) {
161
+ decision = denyAuthorization('policy-stale', version);
162
+ }
163
+ else if (options.policy === undefined ||
164
+ !isPolicyVersion(options.policy.version) ||
165
+ typeof options.policy.evaluate !== 'function') {
166
+ decision = denyAuthorization('authorization-unavailable', version);
167
+ }
168
+ else {
169
+ try {
170
+ decision = projectPolicyResult(yield options.policy.evaluate(input), version);
171
+ }
172
+ catch (_a) {
173
+ decision = denyAuthorization('authorization-unavailable', version);
174
+ }
175
+ }
176
+ }
177
+ if (options.decisionSink) {
178
+ try {
179
+ yield options.decisionSink({ decision, input });
180
+ }
181
+ catch (_b) {
182
+ return denyAuthorization('authorization-unavailable', version);
183
+ }
184
+ }
185
+ return decision;
186
+ });
187
+ return Object.freeze({
188
+ authorize(input) {
189
+ return __awaiter(this, void 0, void 0, function* () {
190
+ const decision = yield evaluate(input);
191
+ assertAuthorizationAllowed(decision);
192
+ return decision;
193
+ });
194
+ },
195
+ evaluate,
196
+ policyVersion: version,
197
+ });
198
+ }
199
+ //# sourceMappingURL=evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/authorization/evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export * from './admission.js';
2
+ export * from './approval.js';
3
+ export * from './audit.js';
4
+ export * from './delegation.js';
5
+ export * from './errors.js';
6
+ export * from './evaluator.js';
7
+ export * from './machine.js';
8
+ export * from './machine-token.js';
9
+ export * from './model.js';
10
+ export declare const authorizationContract: {
11
+ readonly exportPath: "@empire-builder-kit/runtime/authorization";
12
+ readonly packageName: "@empire-builder-kit/runtime";
13
+ readonly responseProfile: "ebk-app-v1";
14
+ };
@@ -0,0 +1,15 @@
1
+ export * from './admission.js';
2
+ export * from './approval.js';
3
+ export * from './audit.js';
4
+ export * from './delegation.js';
5
+ export * from './errors.js';
6
+ export * from './evaluator.js';
7
+ export * from './machine.js';
8
+ export * from './machine-token.js';
9
+ export * from './model.js';
10
+ export const authorizationContract = {
11
+ exportPath: '@empire-builder-kit/runtime/authorization',
12
+ packageName: '@empire-builder-kit/runtime',
13
+ responseProfile: 'ebk-app-v1',
14
+ };
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/authorization/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAE3B,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,2CAA2C;IACvD,WAAW,EAAE,6BAA6B;IAC1C,eAAe,EAAE,YAAY;CACrB,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { RuntimeError } from '../response.js';
2
+ export declare const MACHINE_TOKEN_ERROR_CODES: {
3
+ readonly invalid: "machine_token_invalid";
4
+ readonly invalidated: "machine_token_invalidated";
5
+ readonly unavailable: "machine_token_unavailable";
6
+ };
7
+ export type MachineTokenErrorCode = (typeof MACHINE_TOKEN_ERROR_CODES)[keyof typeof MACHINE_TOKEN_ERROR_CODES];
8
+ export interface MachineClientSecret {
9
+ /**
10
+ * Secret material exists only in the resolver/exchange call frame. The
11
+ * provider never caches it or includes it in snapshots and errors.
12
+ */
13
+ value: string;
14
+ }
15
+ export type MachineClientSecretResolver = () => Promise<MachineClientSecret>;
16
+ export interface MachineTokenExchangeInput {
17
+ audience: string;
18
+ clientId: string;
19
+ clientSecret: string;
20
+ scopes: readonly string[];
21
+ }
22
+ export interface MachineTokenExchangeResult {
23
+ accessToken: string;
24
+ audience: string;
25
+ expiresAt: number;
26
+ scopes: readonly string[];
27
+ tokenType: 'Bearer';
28
+ }
29
+ export type MachineTokenExchange = (input: MachineTokenExchangeInput) => Promise<MachineTokenExchangeResult>;
30
+ export interface MachineAccessToken {
31
+ accessToken: string;
32
+ audience: string;
33
+ expiresAt: number;
34
+ scopes: readonly string[];
35
+ tokenType: 'Bearer';
36
+ }
37
+ export interface MachineTokenAuditSnapshot {
38
+ audience: string;
39
+ cacheState: 'empty' | 'expired' | 'ready' | 'refresh-required' | 'refreshing';
40
+ cachedExpiresAt?: number;
41
+ generation: number;
42
+ invalidationCount: number;
43
+ lastErrorCode?: MachineTokenErrorCode;
44
+ lastInvalidatedAt?: number;
45
+ lastRefreshedAt?: number;
46
+ machineIdentityId: string;
47
+ scopes: readonly string[];
48
+ }
49
+ export interface MachineTokenProviderOptions {
50
+ audience: string;
51
+ clientId: string;
52
+ exchange: MachineTokenExchange;
53
+ machineIdentityId: string;
54
+ /**
55
+ * Testable epoch-seconds clock. Defaults to Date.now().
56
+ */
57
+ now?: () => number;
58
+ refreshBeforeSeconds?: number;
59
+ resolveClientSecret: MachineClientSecretResolver;
60
+ scopes: readonly string[];
61
+ }
62
+ export interface MachineTokenProvider {
63
+ auditSnapshot(): MachineTokenAuditSnapshot;
64
+ getToken(): Promise<MachineAccessToken>;
65
+ /**
66
+ * Invalidates the cache and any in-flight generation. A subsequent getToken
67
+ * resolves the secret again.
68
+ */
69
+ invalidate(): void;
70
+ /**
71
+ * Secret rotation is an explicit invalidation boundary. The next getToken
72
+ * obtains the rotated value through resolveClientSecret.
73
+ */
74
+ rotate(): void;
75
+ }
76
+ export declare class MachineTokenProviderError extends RuntimeError {
77
+ readonly machineTokenCode: MachineTokenErrorCode;
78
+ constructor(machineTokenCode: MachineTokenErrorCode);
79
+ }
80
+ export declare function isMachineTokenProviderError(error: unknown): error is MachineTokenProviderError;
81
+ /**
82
+ * Creates a client-credentials token cache with an exact audience/scope
83
+ * contract. Only a literal, validated exchange result is cached. Missing,
84
+ * malformed, thrown, expired, rotated, or generation-stale results fail
85
+ * closed with response-safe errors.
86
+ */
87
+ export declare function createMachineTokenProvider(options: MachineTokenProviderOptions): MachineTokenProvider;
@@ -0,0 +1,201 @@
1
+ import { __awaiter } from "tslib";
2
+ import { RuntimeError } from '../response.js';
3
+ import { isBoundedSafeReference } from '../safe-reference.js';
4
+ export const MACHINE_TOKEN_ERROR_CODES = {
5
+ invalid: 'machine_token_invalid',
6
+ invalidated: 'machine_token_invalidated',
7
+ unavailable: 'machine_token_unavailable',
8
+ };
9
+ const TOKEN_MAX_BYTES = 64 * 1024;
10
+ const DEFAULT_REFRESH_BEFORE_SECONDS = 60;
11
+ const MAX_REFRESH_BEFORE_SECONDS = 60 * 60;
12
+ export class MachineTokenProviderError extends RuntimeError {
13
+ constructor(machineTokenCode) {
14
+ super({
15
+ code: machineTokenCode,
16
+ expose: true,
17
+ message: machineTokenCode === MACHINE_TOKEN_ERROR_CODES.invalidated
18
+ ? 'Machine access token refresh was invalidated'
19
+ : machineTokenCode === MACHINE_TOKEN_ERROR_CODES.invalid
20
+ ? 'Machine access token response is invalid'
21
+ : 'Machine access token is temporarily unavailable',
22
+ retryable: true,
23
+ status: 503,
24
+ });
25
+ this.machineTokenCode = machineTokenCode;
26
+ this.name = 'MachineTokenProviderError';
27
+ }
28
+ }
29
+ export function isMachineTokenProviderError(error) {
30
+ return error instanceof MachineTokenProviderError;
31
+ }
32
+ function safeReference(value, label) {
33
+ const normalized = value.trim();
34
+ if (!isBoundedSafeReference(normalized)) {
35
+ throw new Error(`[runtime/authorization] Machine token ${label} must be a bounded safe reference.`);
36
+ }
37
+ return normalized;
38
+ }
39
+ function normalizeScopes(scopes) {
40
+ if (!Array.isArray(scopes) || scopes.length === 0) {
41
+ throw new Error('[runtime/authorization] Machine token scopes must be a non-empty exact set.');
42
+ }
43
+ const normalized = scopes.map((scope) => safeReference(scope, 'scope'));
44
+ if (new Set(normalized).size !== normalized.length) {
45
+ throw new Error('[runtime/authorization] Machine token scopes must be a non-empty exact set.');
46
+ }
47
+ return Object.freeze(normalized.sort((left, right) => left < right ? -1 : left > right ? 1 : 0));
48
+ }
49
+ function sameScopes(expected, actual) {
50
+ if (!Array.isArray(actual) ||
51
+ actual.length !== expected.length ||
52
+ new Set(actual).size !== actual.length) {
53
+ return false;
54
+ }
55
+ const normalized = [...actual].sort((left, right) => left < right ? -1 : left > right ? 1 : 0);
56
+ return expected.every((scope, index) => scope === normalized[index]);
57
+ }
58
+ function accessTokenIsValid(value) {
59
+ return (typeof value === 'string' &&
60
+ value.length > 0 &&
61
+ Buffer.byteLength(value, 'utf8') <= TOKEN_MAX_BYTES &&
62
+ /^[A-Za-z0-9._~+/-]+=*$/.test(value));
63
+ }
64
+ function finiteNow(now) {
65
+ const value = now();
66
+ if (!Number.isFinite(value) || value < 0) {
67
+ throw new MachineTokenProviderError(MACHINE_TOKEN_ERROR_CODES.unavailable);
68
+ }
69
+ return value;
70
+ }
71
+ /**
72
+ * Creates a client-credentials token cache with an exact audience/scope
73
+ * contract. Only a literal, validated exchange result is cached. Missing,
74
+ * malformed, thrown, expired, rotated, or generation-stale results fail
75
+ * closed with response-safe errors.
76
+ */
77
+ export function createMachineTokenProvider(options) {
78
+ var _a, _b;
79
+ const audience = safeReference(options.audience, 'audience');
80
+ const clientId = safeReference(options.clientId, 'client id');
81
+ const machineIdentityId = safeReference(options.machineIdentityId, 'machine identity id');
82
+ const scopes = normalizeScopes(options.scopes);
83
+ const refreshBeforeSeconds = (_a = options.refreshBeforeSeconds) !== null && _a !== void 0 ? _a : DEFAULT_REFRESH_BEFORE_SECONDS;
84
+ if (!Number.isSafeInteger(refreshBeforeSeconds) ||
85
+ refreshBeforeSeconds < 0 ||
86
+ refreshBeforeSeconds > MAX_REFRESH_BEFORE_SECONDS ||
87
+ typeof options.resolveClientSecret !== 'function' ||
88
+ typeof options.exchange !== 'function') {
89
+ throw new Error(`[runtime/authorization] Machine token refresh window must be from 0 through ${MAX_REFRESH_BEFORE_SECONDS} seconds and callbacks are required.`);
90
+ }
91
+ const now = (_b = options.now) !== null && _b !== void 0 ? _b : (() => Date.now() / 1000);
92
+ let cached;
93
+ let generation = 0;
94
+ let invalidationCount = 0;
95
+ let lastErrorCode;
96
+ let lastInvalidatedAt;
97
+ let lastRefreshedAt;
98
+ let inFlight;
99
+ const requiresRefresh = (token, at) => at + refreshBeforeSeconds >= token.expiresAt;
100
+ const fail = (code) => {
101
+ lastErrorCode = code;
102
+ throw new MachineTokenProviderError(code);
103
+ };
104
+ const refresh = (refreshGeneration) => __awaiter(this, void 0, void 0, function* () {
105
+ let secretValue;
106
+ let result;
107
+ try {
108
+ const secret = yield options.resolveClientSecret();
109
+ if (!secret ||
110
+ typeof secret.value !== 'string' ||
111
+ secret.value.length === 0) {
112
+ return fail(MACHINE_TOKEN_ERROR_CODES.unavailable);
113
+ }
114
+ secretValue = secret.value;
115
+ result = yield options.exchange({
116
+ audience,
117
+ clientId,
118
+ clientSecret: secretValue,
119
+ scopes,
120
+ });
121
+ }
122
+ catch (error) {
123
+ if (isMachineTokenProviderError(error))
124
+ throw error;
125
+ return fail(MACHINE_TOKEN_ERROR_CODES.unavailable);
126
+ }
127
+ finally {
128
+ secretValue = undefined;
129
+ }
130
+ const refreshedAt = finiteNow(now);
131
+ if (refreshGeneration !== generation) {
132
+ return fail(MACHINE_TOKEN_ERROR_CODES.invalidated);
133
+ }
134
+ if (!result ||
135
+ result.audience !== audience ||
136
+ result.tokenType !== 'Bearer' ||
137
+ !sameScopes(scopes, result.scopes) ||
138
+ !accessTokenIsValid(result.accessToken) ||
139
+ !Number.isFinite(result.expiresAt) ||
140
+ result.expiresAt <= refreshedAt) {
141
+ return fail(MACHINE_TOKEN_ERROR_CODES.invalid);
142
+ }
143
+ const token = Object.freeze({
144
+ accessToken: result.accessToken,
145
+ audience,
146
+ expiresAt: result.expiresAt,
147
+ scopes,
148
+ tokenType: 'Bearer',
149
+ });
150
+ cached = token;
151
+ lastErrorCode = undefined;
152
+ lastRefreshedAt = refreshedAt;
153
+ return token;
154
+ });
155
+ const invalidate = () => {
156
+ generation += 1;
157
+ invalidationCount += 1;
158
+ cached = undefined;
159
+ inFlight = undefined;
160
+ lastInvalidatedAt = finiteNow(now);
161
+ };
162
+ return Object.freeze({
163
+ auditSnapshot() {
164
+ const at = finiteNow(now);
165
+ const cacheState = inFlight
166
+ ? 'refreshing'
167
+ : !cached
168
+ ? 'empty'
169
+ : cached.expiresAt <= at
170
+ ? 'expired'
171
+ : requiresRefresh(cached, at)
172
+ ? 'refresh-required'
173
+ : 'ready';
174
+ return Object.freeze(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ audience,
175
+ cacheState }, (cached ? { cachedExpiresAt: cached.expiresAt } : {})), { generation,
176
+ invalidationCount }), (lastErrorCode ? { lastErrorCode } : {})), (lastInvalidatedAt !== undefined ? { lastInvalidatedAt } : {})), (lastRefreshedAt !== undefined ? { lastRefreshedAt } : {})), { machineIdentityId,
177
+ scopes }));
178
+ },
179
+ getToken() {
180
+ const at = finiteNow(now);
181
+ if (cached && !requiresRefresh(cached, at)) {
182
+ return Promise.resolve(cached);
183
+ }
184
+ if ((inFlight === null || inFlight === void 0 ? void 0 : inFlight.generation) === generation)
185
+ return inFlight.promise;
186
+ const refreshGeneration = generation;
187
+ const promise = refresh(refreshGeneration);
188
+ const flight = { generation: refreshGeneration, promise };
189
+ inFlight = flight;
190
+ const clear = () => {
191
+ if (inFlight === flight)
192
+ inFlight = undefined;
193
+ };
194
+ void promise.then(clear, clear);
195
+ return promise;
196
+ },
197
+ invalidate,
198
+ rotate: invalidate,
199
+ });
200
+ }
201
+ //# sourceMappingURL=machine-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machine-token.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/authorization/machine-token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Principal } from '../auth.js';
2
+ import { type AuthorizationPrincipal } from './model.js';
3
+ export interface MachineIdentityDefinition {
4
+ /**
5
+ * The exact confidential-client audience registered for this capability.
6
+ */
7
+ audience: string;
8
+ capability: string;
9
+ machineIdentityId: string;
10
+ requiredScopes: readonly string[];
11
+ slice: string;
12
+ }
13
+ export interface MachineIdentity {
14
+ audience: string;
15
+ capability: string;
16
+ machineIdentityId: string;
17
+ principal: AuthorizationPrincipal & {
18
+ authority: {
19
+ machineIdentityId: string;
20
+ mode: 'machine';
21
+ };
22
+ kind: 'agent';
23
+ };
24
+ scopes: readonly string[];
25
+ slice: string;
26
+ }
27
+ /**
28
+ * Binds an authenticated Cognito client-credentials Principal to one
29
+ * application capability. No client secret or access token enters the result.
30
+ */
31
+ export declare function createMachineIdentity(principal: Principal, definition: MachineIdentityDefinition): MachineIdentity;
32
+ export declare function createMachineAuthorizationPrincipal(principal: Principal, definition: MachineIdentityDefinition): MachineIdentity['principal'];
@@ -0,0 +1,41 @@
1
+ import { isBoundedSafeReference } from '../safe-reference.js';
2
+ import { composeAuthorizationPrincipal, } from './model.js';
3
+ const SAFE_NAME = /^[a-z][a-z0-9-]{0,62}$/;
4
+ /**
5
+ * Binds an authenticated Cognito client-credentials Principal to one
6
+ * application capability. No client secret or access token enters the result.
7
+ */
8
+ export function createMachineIdentity(principal, definition) {
9
+ const requiredScopes = definition.requiredScopes.map((scope) => scope.trim());
10
+ if (principal.kind !== 'agent' ||
11
+ principal.session.subject.type !== 'service' ||
12
+ !principal.audience ||
13
+ principal.id !== principal.audience ||
14
+ principal.audience !== definition.audience ||
15
+ !isBoundedSafeReference(definition.machineIdentityId) ||
16
+ !isBoundedSafeReference(definition.capability) ||
17
+ !SAFE_NAME.test(definition.slice) ||
18
+ requiredScopes.length === 0 ||
19
+ requiredScopes.some((scope) => !isBoundedSafeReference(scope) ||
20
+ !principal.scopes.includes(scope) ||
21
+ scope.length > 256) ||
22
+ new Set(requiredScopes).size !== requiredScopes.length) {
23
+ throw new Error('[runtime/authorization] Machine identity must be a distinct agent service principal with exact audience and required scopes.');
24
+ }
25
+ const authorizationPrincipal = composeAuthorizationPrincipal(principal, {
26
+ machineIdentityId: definition.machineIdentityId,
27
+ mode: 'machine',
28
+ });
29
+ return Object.freeze({
30
+ audience: definition.audience,
31
+ capability: definition.capability,
32
+ machineIdentityId: definition.machineIdentityId,
33
+ principal: authorizationPrincipal,
34
+ scopes: Object.freeze([...requiredScopes]),
35
+ slice: definition.slice,
36
+ });
37
+ }
38
+ export function createMachineAuthorizationPrincipal(principal, definition) {
39
+ return createMachineIdentity(principal, definition).principal;
40
+ }
41
+ //# sourceMappingURL=machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machine.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/authorization/machine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EACL,6BAA6B,GAE9B,MAAM,YAAY,CAAC;AA4BpB,MAAM,SAAS,GAAG,wBAAwB,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAoB,EACpB,UAAqC;IAErC,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9E,IACE,SAAS,CAAC,IAAI,KAAK,OAAO;QAC1B,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS;QAC5C,CAAC,SAAS,CAAC,QAAQ;QACnB,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,QAAQ;QACnC,SAAS,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ;QAC1C,CAAC,sBAAsB,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACrD,CAAC,sBAAsB,CAAC,UAAU,CAAC,UAAU,CAAC;QAC9C,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACjC,cAAc,CAAC,MAAM,KAAK,CAAC;QAC3B,cAAc,CAAC,IAAI,CACjB,CAAC,KAAK,EAAE,EAAE,CACR,CAAC,sBAAsB,CAAC,KAAK,CAAC;YAC9B,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YACjC,KAAK,CAAC,MAAM,GAAG,GAAG,CACrB;QACD,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,MAAM,EACtD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,8HAA8H,CAC/H,CAAC;IACJ,CAAC;IAED,MAAM,sBAAsB,GAAG,6BAA6B,CAAC,SAAS,EAAE;QACtE,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;QAC/C,IAAI,EAAE,SAAS;KAChB,CAAiC,CAAC;IAEnC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;QAC/C,SAAS,EAAE,sBAAsB;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC;QAC1C,KAAK,EAAE,UAAU,CAAC,KAAK;KACxB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,SAAoB,EACpB,UAAqC;IAErC,OAAO,qBAAqB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,SAAS,CAAC;AAChE,CAAC"}