@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,336 @@
1
+ import { __awaiter } from "tslib";
2
+ import { failDataLifecycleRuntime, lifecycleIdempotencyKey, requireBoundedInteger, requireCanonicalTimestamp, requireCursor, requireDataLifecycleId, requirePolicyVersion, requireSafeReference, } from './contract.js';
3
+ export const DATA_LIFECYCLE_LEDGER_ENTRY_VERSION = 1;
4
+ export const DATA_LIFECYCLE_RESTORE_CHECKPOINT_VERSION = 1;
5
+ export const DATA_LIFECYCLE_RESTORE_MAX_ITEMS = 100;
6
+ function ledgerIdentity(input) {
7
+ return lifecycleIdempotencyKey('restore-ledger-entry-v1', [
8
+ input.action,
9
+ input.categoryId,
10
+ input.pseudonymousKey,
11
+ input.policyVersion,
12
+ input.effectiveAt,
13
+ input.expiresAt,
14
+ ]);
15
+ }
16
+ /**
17
+ * The ledger deliberately stores no source record, correction value, subject
18
+ * profile, or human identifier—only a pseudonymous lookup key and action.
19
+ */
20
+ export function createDataLifecycleLedgerEntry(options) {
21
+ if (options.action !== 'correction' && options.action !== 'deletion') {
22
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/action', 'ledger action must be correction or deletion');
23
+ }
24
+ const categoryId = requireDataLifecycleId(options.categoryId, '/categoryId');
25
+ const pseudonymousKey = requireSafeReference(options.pseudonymousKey, '/pseudonymousKey');
26
+ const policyVersion = requirePolicyVersion(options.policyVersion, '/policyVersion');
27
+ const effectiveAt = requireCanonicalTimestamp(options.effectiveAt, '/effectiveAt');
28
+ const expiresAt = requireCanonicalTimestamp(options.expiresAt, '/expiresAt');
29
+ if (Date.parse(expiresAt) <= Date.parse(effectiveAt)) {
30
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/expiresAt', 'ledger expiry must follow the lifecycle action');
31
+ }
32
+ const identity = {
33
+ action: options.action,
34
+ categoryId,
35
+ effectiveAt,
36
+ expiresAt,
37
+ policyVersion,
38
+ pseudonymousKey,
39
+ };
40
+ return Object.assign(Object.assign({}, identity), { entryId: ledgerIdentity(identity), version: DATA_LIFECYCLE_LEDGER_ENTRY_VERSION });
41
+ }
42
+ function normalizeLedgerEntry(value, index, now) {
43
+ const pointer = `/page/entries/${index}`;
44
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
45
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, 'ledger entry must be an object');
46
+ }
47
+ if (value.version !== DATA_LIFECYCLE_LEDGER_ENTRY_VERSION) {
48
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', `${pointer}/version`, 'must be a v1 ledger entry');
49
+ }
50
+ const entry = createDataLifecycleLedgerEntry({
51
+ action: value.action,
52
+ categoryId: value.categoryId,
53
+ effectiveAt: value.effectiveAt,
54
+ expiresAt: value.expiresAt,
55
+ policyVersion: value.policyVersion,
56
+ pseudonymousKey: value.pseudonymousKey,
57
+ });
58
+ if (requireSafeReference(value.entryId, `${pointer}/entryId`) !== entry.entryId) {
59
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', `${pointer}/entryId`, 'does not bind the exact ledger action metadata');
60
+ }
61
+ if (Date.parse(entry.effectiveAt) > Date.parse(now)) {
62
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', `${pointer}/effectiveAt`, 'future lifecycle actions cannot be replayed');
63
+ }
64
+ if (Date.parse(entry.expiresAt) <= Date.parse(now)) {
65
+ failDataLifecycleRuntime('data-lifecycle-restore-reconciliation-failed', `${pointer}/expiresAt`, 'expired ledger action cannot authorize restored service cutover');
66
+ }
67
+ return entry;
68
+ }
69
+ export function createDataLifecycleRestoreCheckpoint(policyVersion) {
70
+ return {
71
+ complete: false,
72
+ policyVersion: requirePolicyVersion(policyVersion, '/policyVersion'),
73
+ version: DATA_LIFECYCLE_RESTORE_CHECKPOINT_VERSION,
74
+ };
75
+ }
76
+ function normalizeCheckpoint(value, policyVersion) {
77
+ if (!value)
78
+ return createDataLifecycleRestoreCheckpoint(policyVersion);
79
+ if (value.version !== DATA_LIFECYCLE_RESTORE_CHECKPOINT_VERSION ||
80
+ typeof value.complete !== 'boolean' ||
81
+ requirePolicyVersion(value.policyVersion, '/checkpoint/policyVersion') !==
82
+ policyVersion) {
83
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/checkpoint', 'must be a v1 restore checkpoint for the exact policy version');
84
+ }
85
+ const checkpoint = {
86
+ complete: value.complete,
87
+ policyVersion,
88
+ version: DATA_LIFECYCLE_RESTORE_CHECKPOINT_VERSION,
89
+ };
90
+ if (value.cursor !== undefined) {
91
+ checkpoint.cursor = requireCursor(value.cursor, '/checkpoint/cursor');
92
+ }
93
+ if (checkpoint.complete && checkpoint.cursor !== undefined) {
94
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/checkpoint', 'complete restore checkpoint cannot retain a cursor');
95
+ }
96
+ return checkpoint;
97
+ }
98
+ function requireRestoreControls(value) {
99
+ const fields = [
100
+ 'authorizationVerified',
101
+ 'integrityVerified',
102
+ 'isolatedTarget',
103
+ 'retentionJobsReady',
104
+ 'serviceTrafficBlocked',
105
+ ];
106
+ for (const field of fields) {
107
+ if ((value === null || value === void 0 ? void 0 : value[field]) !== true) {
108
+ failDataLifecycleRuntime('data-lifecycle-restore-controls-incomplete', `/controls/${field}`, 'must be proven before ledger replay');
109
+ }
110
+ }
111
+ return {
112
+ authorizationVerified: true,
113
+ integrityVerified: true,
114
+ isolatedTarget: true,
115
+ retentionJobsReady: true,
116
+ serviceTrafficBlocked: true,
117
+ };
118
+ }
119
+ function validatePage(value, options) {
120
+ if (!value || typeof value !== 'object' || !Array.isArray(value.entries)) {
121
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/page', 'ledger adapter must return an entry page');
122
+ }
123
+ if (value.entries.length > options.limit) {
124
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/page/entries', 'ledger adapter exceeded the requested page bound');
125
+ }
126
+ const entries = value.entries.map((entry, index) => normalizeLedgerEntry(entry, index, options.now));
127
+ const ids = new Set();
128
+ entries.forEach((entry, index) => {
129
+ if (ids.has(entry.entryId)) {
130
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', `/page/entries/${index}/entryId`, 'ledger page contains a duplicate entry');
131
+ }
132
+ ids.add(entry.entryId);
133
+ });
134
+ const page = {
135
+ entries,
136
+ };
137
+ if (value.nextCursor !== undefined) {
138
+ page.nextCursor = requireCursor(value.nextCursor, '/page/nextCursor');
139
+ if (page.nextCursor === options.currentCursor ||
140
+ page.entries.length === 0) {
141
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/page/nextCursor', 'must advance a non-empty ledger page');
142
+ }
143
+ }
144
+ return page;
145
+ }
146
+ function baseResult(options) {
147
+ return {
148
+ alreadyApplied: 0,
149
+ applied: 0,
150
+ checkpoint: options.checkpoint,
151
+ downstreamAlreadyReconciled: 0,
152
+ downstreamReconciled: 0,
153
+ notPresent: 0,
154
+ policyVersion: options.policyVersion,
155
+ processed: 0,
156
+ readyForCutover: options.checkpoint.complete,
157
+ status: options.checkpoint.complete ? 'complete' : 'more',
158
+ targetRef: options.targetRef,
159
+ };
160
+ }
161
+ /**
162
+ * Replays one bounded ledger page while traffic remains blocked. A failed
163
+ * primary/downstream page keeps its incoming checkpoint, so stable
164
+ * idempotency keys safely repeat all earlier actions on retry.
165
+ */
166
+ export function runDataLifecycleRestoreReconciliation(options) {
167
+ return __awaiter(this, void 0, void 0, function* () {
168
+ requireRestoreControls(options.controls);
169
+ const now = requireCanonicalTimestamp(options.now, '/now');
170
+ const policyVersion = requirePolicyVersion(options.policyVersion, '/policyVersion');
171
+ const targetRef = requireSafeReference(options.targetRef, '/targetRef');
172
+ const limit = requireBoundedInteger(options.limit, '/limit', 1, DATA_LIFECYCLE_RESTORE_MAX_ITEMS);
173
+ const checkpoint = normalizeCheckpoint(options.checkpoint, policyVersion);
174
+ if (checkpoint.complete) {
175
+ return baseResult({ checkpoint, policyVersion, targetRef });
176
+ }
177
+ let rawPage;
178
+ try {
179
+ rawPage = yield options.adapter.scanLedger({
180
+ cursor: checkpoint.cursor,
181
+ limit,
182
+ now,
183
+ policyVersion,
184
+ });
185
+ }
186
+ catch (_a) {
187
+ return Object.assign(Object.assign({}, baseResult({ checkpoint, policyVersion, targetRef })), { errorCode: 'ledger-scan-failed', status: 'retry-required' });
188
+ }
189
+ const page = validatePage(rawPage, {
190
+ currentCursor: checkpoint.cursor,
191
+ limit,
192
+ now,
193
+ });
194
+ let applied = 0;
195
+ let alreadyApplied = 0;
196
+ let notPresent = 0;
197
+ let downstreamReconciled = 0;
198
+ let downstreamAlreadyReconciled = 0;
199
+ let processed = 0;
200
+ for (const entry of page.entries) {
201
+ const primaryKey = lifecycleIdempotencyKey('restore-primary-v1', [
202
+ policyVersion,
203
+ targetRef,
204
+ entry.entryId,
205
+ ]);
206
+ let primaryOutcome;
207
+ try {
208
+ primaryOutcome = yield options.adapter.applyPrimary({
209
+ entry,
210
+ idempotencyKey: primaryKey,
211
+ targetRef,
212
+ });
213
+ }
214
+ catch (_b) {
215
+ return {
216
+ alreadyApplied,
217
+ applied,
218
+ checkpoint,
219
+ downstreamAlreadyReconciled,
220
+ downstreamReconciled,
221
+ errorCode: 'primary-reconciliation-failed',
222
+ notPresent,
223
+ policyVersion,
224
+ processed,
225
+ readyForCutover: false,
226
+ status: 'retry-required',
227
+ targetRef,
228
+ };
229
+ }
230
+ if (primaryOutcome === 'applied')
231
+ applied += 1;
232
+ else if (primaryOutcome === 'already-applied')
233
+ alreadyApplied += 1;
234
+ else if (primaryOutcome === 'not-present')
235
+ notPresent += 1;
236
+ else {
237
+ return {
238
+ alreadyApplied,
239
+ applied,
240
+ checkpoint,
241
+ downstreamAlreadyReconciled,
242
+ downstreamReconciled,
243
+ errorCode: 'invalid-adapter-outcome',
244
+ notPresent,
245
+ policyVersion,
246
+ processed,
247
+ readyForCutover: false,
248
+ status: 'retry-required',
249
+ targetRef,
250
+ };
251
+ }
252
+ let downstreamOutcome;
253
+ try {
254
+ downstreamOutcome = yield options.adapter.reconcileDownstream({
255
+ entry,
256
+ idempotencyKey: lifecycleIdempotencyKey('restore-downstream-v1', [
257
+ policyVersion,
258
+ entry.entryId,
259
+ ]),
260
+ });
261
+ }
262
+ catch (_c) {
263
+ return {
264
+ alreadyApplied,
265
+ applied,
266
+ checkpoint,
267
+ downstreamAlreadyReconciled,
268
+ downstreamReconciled,
269
+ errorCode: 'downstream-reconciliation-failed',
270
+ notPresent,
271
+ policyVersion,
272
+ processed,
273
+ readyForCutover: false,
274
+ status: 'retry-required',
275
+ targetRef,
276
+ };
277
+ }
278
+ if (downstreamOutcome === 'reconciled')
279
+ downstreamReconciled += 1;
280
+ else if (downstreamOutcome === 'already-reconciled') {
281
+ downstreamAlreadyReconciled += 1;
282
+ }
283
+ else {
284
+ return {
285
+ alreadyApplied,
286
+ applied,
287
+ checkpoint,
288
+ downstreamAlreadyReconciled,
289
+ downstreamReconciled,
290
+ errorCode: 'invalid-adapter-outcome',
291
+ notPresent,
292
+ policyVersion,
293
+ processed,
294
+ readyForCutover: false,
295
+ status: 'retry-required',
296
+ targetRef,
297
+ };
298
+ }
299
+ processed += 1;
300
+ }
301
+ const nextCheckpoint = page.nextCursor
302
+ ? {
303
+ complete: false,
304
+ cursor: page.nextCursor,
305
+ policyVersion,
306
+ version: DATA_LIFECYCLE_RESTORE_CHECKPOINT_VERSION,
307
+ }
308
+ : {
309
+ complete: true,
310
+ policyVersion,
311
+ version: DATA_LIFECYCLE_RESTORE_CHECKPOINT_VERSION,
312
+ };
313
+ return {
314
+ alreadyApplied,
315
+ applied,
316
+ checkpoint: nextCheckpoint,
317
+ downstreamAlreadyReconciled,
318
+ downstreamReconciled,
319
+ notPresent,
320
+ policyVersion,
321
+ processed,
322
+ readyForCutover: nextCheckpoint.complete,
323
+ status: page.nextCursor ? 'more' : 'complete',
324
+ targetRef,
325
+ };
326
+ });
327
+ }
328
+ export function requireDataLifecycleRestoreCutover(result) {
329
+ if (result.status !== 'complete' ||
330
+ !result.readyForCutover ||
331
+ !result.checkpoint.complete) {
332
+ failDataLifecycleRuntime('data-lifecycle-restore-controls-incomplete', '/restoreResult', 'service cannot resume before all restore reconciliation completes');
333
+ }
334
+ return result;
335
+ }
336
+ //# sourceMappingURL=restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/data-lifecycle/restore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ export declare const DATA_LIFECYCLE_RETENTION_CHECKPOINT_VERSION: 1;
2
+ export declare const DATA_LIFECYCLE_RETENTION_MAX_ITEMS = 100;
3
+ export type DataLifecycleRetentionMode = 'report' | 'apply';
4
+ export interface DataLifecycleRetentionCandidateV1 {
5
+ categoryId: string;
6
+ dueAt: string;
7
+ locationId: string;
8
+ recordRef: string;
9
+ }
10
+ export interface DataLifecycleRetentionPageV1 {
11
+ items: readonly DataLifecycleRetentionCandidateV1[];
12
+ nextCursor?: string;
13
+ }
14
+ export interface DataLifecycleRetentionCheckpointV1 {
15
+ complete: boolean;
16
+ cursor?: string;
17
+ policyVersion: string;
18
+ version: typeof DATA_LIFECYCLE_RETENTION_CHECKPOINT_VERSION;
19
+ }
20
+ export interface DataLifecycleRetentionAdapter {
21
+ apply(input: {
22
+ candidate: DataLifecycleRetentionCandidateV1;
23
+ idempotencyKey: string;
24
+ }): Promise<'applied' | 'already-applied'>;
25
+ scan(input: {
26
+ asOf: string;
27
+ cursor?: string;
28
+ limit: number;
29
+ policyVersion: string;
30
+ }): Promise<DataLifecycleRetentionPageV1>;
31
+ }
32
+ export interface DataLifecycleRetentionRunResultV1 {
33
+ alreadyApplied: number;
34
+ applied: number;
35
+ asOf: string;
36
+ attemptedLocationIds: readonly string[];
37
+ checkpoint: DataLifecycleRetentionCheckpointV1;
38
+ due: number;
39
+ errorCode?: 'adapter-failure' | 'invalid-adapter-outcome';
40
+ mode: DataLifecycleRetentionMode;
41
+ policyVersion: string;
42
+ scanned: number;
43
+ status: 'complete' | 'more' | 'retry-required';
44
+ }
45
+ export declare function createDataLifecycleRetentionCheckpoint(policyVersion: string): DataLifecycleRetentionCheckpointV1;
46
+ /**
47
+ * Runs one bounded page. Failed apply pages retain their incoming checkpoint;
48
+ * retrying repeats stable idempotency keys and cannot skip the failed item.
49
+ */
50
+ export declare function runDataLifecycleRetention(options: {
51
+ adapter: DataLifecycleRetentionAdapter;
52
+ asOf: string;
53
+ checkpoint?: DataLifecycleRetentionCheckpointV1;
54
+ limit: number;
55
+ mode: DataLifecycleRetentionMode;
56
+ policyVersion: string;
57
+ }): Promise<DataLifecycleRetentionRunResultV1>;
@@ -0,0 +1,232 @@
1
+ import { __awaiter } from "tslib";
2
+ import { DataLifecycleRuntimeError, failDataLifecycleRuntime, lifecycleIdempotencyKey, requireBoundedInteger, requireCanonicalTimestamp, requireCursor, requireDataLifecycleId, requirePolicyVersion, requireSafeReference, } from './contract.js';
3
+ export const DATA_LIFECYCLE_RETENTION_CHECKPOINT_VERSION = 1;
4
+ export const DATA_LIFECYCLE_RETENTION_MAX_ITEMS = 100;
5
+ export function createDataLifecycleRetentionCheckpoint(policyVersion) {
6
+ return {
7
+ complete: false,
8
+ policyVersion: requirePolicyVersion(policyVersion, '/policyVersion'),
9
+ version: DATA_LIFECYCLE_RETENTION_CHECKPOINT_VERSION,
10
+ };
11
+ }
12
+ function normalizeCheckpoint(value, policyVersion) {
13
+ if (!value)
14
+ return createDataLifecycleRetentionCheckpoint(policyVersion);
15
+ if (value.version !== DATA_LIFECYCLE_RETENTION_CHECKPOINT_VERSION ||
16
+ typeof value.complete !== 'boolean' ||
17
+ requirePolicyVersion(value.policyVersion, '/checkpoint/policyVersion') !==
18
+ policyVersion) {
19
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/checkpoint', 'must be a v1 checkpoint for the exact policy version');
20
+ }
21
+ const checkpoint = {
22
+ complete: value.complete,
23
+ policyVersion,
24
+ version: DATA_LIFECYCLE_RETENTION_CHECKPOINT_VERSION,
25
+ };
26
+ if (value.cursor !== undefined) {
27
+ checkpoint.cursor = requireCursor(value.cursor, '/checkpoint/cursor');
28
+ }
29
+ if (checkpoint.complete && checkpoint.cursor !== undefined) {
30
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/checkpoint', 'a complete checkpoint cannot retain a cursor');
31
+ }
32
+ return checkpoint;
33
+ }
34
+ function normalizeCandidate(value, index, asOf) {
35
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
36
+ failDataLifecycleRuntime('data-lifecycle-retention-page-invalid', `/page/items/${index}`, 'retention candidate must be an object');
37
+ }
38
+ const candidate = {
39
+ categoryId: requireDataLifecycleId(value.categoryId, `/page/items/${index}/categoryId`),
40
+ dueAt: requireCanonicalTimestamp(value.dueAt, `/page/items/${index}/dueAt`),
41
+ locationId: requireDataLifecycleId(value.locationId, `/page/items/${index}/locationId`),
42
+ recordRef: requireSafeReference(value.recordRef, `/page/items/${index}/recordRef`),
43
+ };
44
+ if (Date.parse(candidate.dueAt) > Date.parse(asOf)) {
45
+ failDataLifecycleRuntime('data-lifecycle-retention-page-invalid', `/page/items/${index}/dueAt`, 'retention adapters may return only records due as of the requested time');
46
+ }
47
+ return candidate;
48
+ }
49
+ function validatePage(value, options) {
50
+ if (!value || typeof value !== 'object' || !Array.isArray(value.items)) {
51
+ failDataLifecycleRuntime('data-lifecycle-retention-page-invalid', '/page', 'retention adapter must return an item page');
52
+ }
53
+ if (value.items.length > options.limit) {
54
+ failDataLifecycleRuntime('data-lifecycle-retention-page-invalid', '/page/items', 'adapter exceeded the requested page bound');
55
+ }
56
+ const items = value.items.map((item, index) => normalizeCandidate(item, index, options.asOf));
57
+ const seen = new Set();
58
+ for (const [index, item] of items.entries()) {
59
+ const identity = `${item.locationId}\0${item.recordRef}`;
60
+ if (seen.has(identity)) {
61
+ failDataLifecycleRuntime('data-lifecycle-retention-page-invalid', `/page/items/${index}`, 'page contains a duplicate retention candidate');
62
+ }
63
+ seen.add(identity);
64
+ }
65
+ const page = { items };
66
+ if (value.nextCursor !== undefined) {
67
+ page.nextCursor = requireCursor(value.nextCursor, '/page/nextCursor');
68
+ if (page.nextCursor === options.currentCursor || page.items.length === 0) {
69
+ failDataLifecycleRuntime('data-lifecycle-retention-page-invalid', '/page/nextCursor', 'must advance a non-empty page');
70
+ }
71
+ }
72
+ return page;
73
+ }
74
+ function resultForCompleteCheckpoint(options) {
75
+ return {
76
+ alreadyApplied: 0,
77
+ applied: 0,
78
+ asOf: options.asOf,
79
+ attemptedLocationIds: [],
80
+ checkpoint: options.checkpoint,
81
+ due: 0,
82
+ mode: options.mode,
83
+ policyVersion: options.policyVersion,
84
+ scanned: 0,
85
+ status: 'complete',
86
+ };
87
+ }
88
+ /**
89
+ * Runs one bounded page. Failed apply pages retain their incoming checkpoint;
90
+ * retrying repeats stable idempotency keys and cannot skip the failed item.
91
+ */
92
+ export function runDataLifecycleRetention(options) {
93
+ return __awaiter(this, void 0, void 0, function* () {
94
+ const asOf = requireCanonicalTimestamp(options.asOf, '/asOf');
95
+ const policyVersion = requirePolicyVersion(options.policyVersion, '/policyVersion');
96
+ const limit = requireBoundedInteger(options.limit, '/limit', 1, DATA_LIFECYCLE_RETENTION_MAX_ITEMS);
97
+ if (options.mode !== 'report' && options.mode !== 'apply') {
98
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/mode', 'must be report or apply');
99
+ }
100
+ const checkpoint = normalizeCheckpoint(options.checkpoint, policyVersion);
101
+ if (checkpoint.complete) {
102
+ return resultForCompleteCheckpoint({
103
+ asOf,
104
+ checkpoint,
105
+ mode: options.mode,
106
+ policyVersion,
107
+ });
108
+ }
109
+ let rawPage;
110
+ try {
111
+ rawPage = yield options.adapter.scan({
112
+ asOf,
113
+ cursor: checkpoint.cursor,
114
+ limit,
115
+ policyVersion,
116
+ });
117
+ }
118
+ catch (_a) {
119
+ throw new DataLifecycleRuntimeError('data-lifecycle-retention-scan-failed', '/adapter/scan', 'retention scan failed without exposing adapter output');
120
+ }
121
+ const page = validatePage(rawPage, {
122
+ asOf,
123
+ currentCursor: checkpoint.cursor,
124
+ limit,
125
+ });
126
+ const attemptedLocationIds = [
127
+ ...new Set(page.items.map(({ locationId }) => locationId)),
128
+ ].sort();
129
+ if (options.mode === 'report') {
130
+ return {
131
+ alreadyApplied: 0,
132
+ applied: 0,
133
+ asOf,
134
+ attemptedLocationIds,
135
+ checkpoint: page.nextCursor
136
+ ? {
137
+ complete: false,
138
+ cursor: page.nextCursor,
139
+ policyVersion,
140
+ version: DATA_LIFECYCLE_RETENTION_CHECKPOINT_VERSION,
141
+ }
142
+ : {
143
+ complete: true,
144
+ policyVersion,
145
+ version: DATA_LIFECYCLE_RETENTION_CHECKPOINT_VERSION,
146
+ },
147
+ due: page.items.length,
148
+ mode: options.mode,
149
+ policyVersion,
150
+ scanned: page.items.length,
151
+ status: page.nextCursor ? 'more' : 'complete',
152
+ };
153
+ }
154
+ let applied = 0;
155
+ let alreadyApplied = 0;
156
+ for (const candidate of page.items) {
157
+ let outcome;
158
+ try {
159
+ outcome = yield options.adapter.apply({
160
+ candidate,
161
+ idempotencyKey: lifecycleIdempotencyKey('retention-v1', [
162
+ policyVersion,
163
+ candidate.categoryId,
164
+ candidate.locationId,
165
+ candidate.recordRef,
166
+ candidate.dueAt,
167
+ ]),
168
+ });
169
+ }
170
+ catch (_b) {
171
+ return {
172
+ alreadyApplied,
173
+ applied,
174
+ asOf,
175
+ attemptedLocationIds,
176
+ checkpoint,
177
+ due: page.items.length,
178
+ errorCode: 'adapter-failure',
179
+ mode: options.mode,
180
+ policyVersion,
181
+ scanned: page.items.length,
182
+ status: 'retry-required',
183
+ };
184
+ }
185
+ if (outcome === 'applied') {
186
+ applied += 1;
187
+ }
188
+ else if (outcome === 'already-applied') {
189
+ alreadyApplied += 1;
190
+ }
191
+ else {
192
+ return {
193
+ alreadyApplied,
194
+ applied,
195
+ asOf,
196
+ attemptedLocationIds,
197
+ checkpoint,
198
+ due: page.items.length,
199
+ errorCode: 'invalid-adapter-outcome',
200
+ mode: options.mode,
201
+ policyVersion,
202
+ scanned: page.items.length,
203
+ status: 'retry-required',
204
+ };
205
+ }
206
+ }
207
+ return {
208
+ alreadyApplied,
209
+ applied,
210
+ asOf,
211
+ attemptedLocationIds,
212
+ checkpoint: page.nextCursor
213
+ ? {
214
+ complete: false,
215
+ cursor: page.nextCursor,
216
+ policyVersion,
217
+ version: DATA_LIFECYCLE_RETENTION_CHECKPOINT_VERSION,
218
+ }
219
+ : {
220
+ complete: true,
221
+ policyVersion,
222
+ version: DATA_LIFECYCLE_RETENTION_CHECKPOINT_VERSION,
223
+ },
224
+ due: page.items.length,
225
+ mode: options.mode,
226
+ policyVersion,
227
+ scanned: page.items.length,
228
+ status: page.nextCursor ? 'more' : 'complete',
229
+ };
230
+ });
231
+ }
232
+ //# sourceMappingURL=retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/data-lifecycle/retention.ts"],"names":[],"mappings":"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"}