@empire-builder-kit/runtime 1.0.0-beta.8 → 1.0.0-rc.1

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,124 @@
1
+ import { compareLifecycleStrings, failDataLifecycleRuntime, requireCanonicalTimestamp, requireDataLifecycleCode, requireDataLifecycleId, requireSafeReference, } from './contract.js';
2
+ export const DATA_LIFECYCLE_RUNTIME_HOLD_PURPOSES = [
3
+ 'legal',
4
+ 'security',
5
+ 'fraud',
6
+ 'support',
7
+ 'incident',
8
+ ];
9
+ export function normalizeDataLifecycleRuntimeHold(value, index) {
10
+ const pointer = `/holds/${index}`;
11
+ if (!value ||
12
+ typeof value !== 'object' ||
13
+ Array.isArray(value) ||
14
+ (Object.getPrototypeOf(value) !== Object.prototype &&
15
+ Object.getPrototypeOf(value) !== null)) {
16
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, 'hold must be a plain object');
17
+ }
18
+ const allowedFields = new Set([
19
+ 'categoryId',
20
+ 'effects',
21
+ 'expiresAt',
22
+ 'holdId',
23
+ 'issuerCode',
24
+ 'purpose',
25
+ 'releasedAt',
26
+ 'reviewAt',
27
+ 'scopeRef',
28
+ 'startsAt',
29
+ 'status',
30
+ ]);
31
+ const unknownFields = Reflect.ownKeys(value).filter((key) => typeof key !== 'string' || !allowedFields.has(key));
32
+ if (unknownFields.length > 0) {
33
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, 'hold contains undeclared fields');
34
+ }
35
+ const startsAt = requireCanonicalTimestamp(value.startsAt, `${pointer}/startsAt`);
36
+ const reviewAt = requireCanonicalTimestamp(value.reviewAt, `${pointer}/reviewAt`);
37
+ const expiresAt = requireCanonicalTimestamp(value.expiresAt, `${pointer}/expiresAt`);
38
+ if (Date.parse(startsAt) >= Date.parse(reviewAt) ||
39
+ Date.parse(reviewAt) > Date.parse(expiresAt)) {
40
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, 'hold start, review, and expiry must form a bounded interval');
41
+ }
42
+ if (value.status !== 'active' && value.status !== 'released') {
43
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', `${pointer}/status`, 'hold status must be active or released');
44
+ }
45
+ if (!Array.isArray(value.effects) ||
46
+ value.effects.length === 0 ||
47
+ value.effects.some((effect) => effect !== 'block-deletion' && effect !== 'block-export') ||
48
+ new Set(value.effects).size !== value.effects.length) {
49
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', `${pointer}/effects`, 'hold effects must be unique deletion/export blocks');
50
+ }
51
+ if (!DATA_LIFECYCLE_RUNTIME_HOLD_PURPOSES.includes(value.purpose)) {
52
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', `${pointer}/purpose`, 'hold purpose is unsupported');
53
+ }
54
+ const hold = {
55
+ categoryId: requireDataLifecycleId(value.categoryId, `${pointer}/categoryId`),
56
+ effects: [...value.effects].sort(compareLifecycleStrings),
57
+ expiresAt,
58
+ holdId: requireDataLifecycleId(value.holdId, `${pointer}/holdId`),
59
+ issuerCode: requireDataLifecycleCode(value.issuerCode, `${pointer}/issuerCode`),
60
+ purpose: value.purpose,
61
+ reviewAt,
62
+ scopeRef: requireSafeReference(value.scopeRef, `${pointer}/scopeRef`),
63
+ startsAt,
64
+ status: value.status,
65
+ };
66
+ if (value.releasedAt !== undefined) {
67
+ hold.releasedAt = requireCanonicalTimestamp(value.releasedAt, `${pointer}/releasedAt`);
68
+ }
69
+ if (hold.status === 'released' && !hold.releasedAt) {
70
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', `${pointer}/releasedAt`, 'released hold must record its release timestamp');
71
+ }
72
+ if (hold.status === 'active' && hold.releasedAt) {
73
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', `${pointer}/releasedAt`, 'active hold cannot have a release timestamp');
74
+ }
75
+ if (hold.releasedAt &&
76
+ (Date.parse(hold.releasedAt) < Date.parse(startsAt) ||
77
+ Date.parse(hold.releasedAt) > Date.parse(expiresAt))) {
78
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', `${pointer}/releasedAt`, 'release must occur within the hold interval');
79
+ }
80
+ return hold;
81
+ }
82
+ export function evaluateDataLifecycleHolds(options) {
83
+ const categoryId = requireDataLifecycleId(options.categoryId, '/categoryId');
84
+ const scopeRef = requireSafeReference(options.scopeRef, '/scopeRef');
85
+ const now = requireCanonicalTimestamp(options.now, '/now');
86
+ if (options.operation !== 'deletion' && options.operation !== 'export') {
87
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/operation', 'must be deletion or export');
88
+ }
89
+ if (!Array.isArray(options.holds)) {
90
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/holds', 'holds must be a bounded array');
91
+ }
92
+ const effect = options.operation === 'deletion' ? 'block-deletion' : 'block-export';
93
+ const blocked = [];
94
+ const ids = new Set();
95
+ options.holds.forEach((value, index) => {
96
+ const hold = normalizeDataLifecycleRuntimeHold(value, index);
97
+ if (ids.has(hold.holdId)) {
98
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', `/holds/${index}/holdId`, 'hold identifier is duplicated');
99
+ }
100
+ ids.add(hold.holdId);
101
+ if (hold.status === 'released') {
102
+ if (!hold.releasedAt || Date.parse(hold.releasedAt) > Date.parse(now)) {
103
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', `/holds/${index}/releasedAt`, 'hold cannot be treated as released before its release timestamp');
104
+ }
105
+ return;
106
+ }
107
+ if (Date.parse(hold.reviewAt) <= Date.parse(now) ||
108
+ Date.parse(hold.expiresAt) <= Date.parse(now)) {
109
+ failDataLifecycleRuntime('data-lifecycle-hold-expired', `/holds/${index}`, 'active hold review or expiry is due');
110
+ }
111
+ if (Date.parse(hold.startsAt) <= Date.parse(now) &&
112
+ hold.categoryId === categoryId &&
113
+ hold.scopeRef === scopeRef &&
114
+ hold.effects.includes(effect)) {
115
+ blocked.push(hold.holdId);
116
+ }
117
+ });
118
+ return {
119
+ blocked: blocked.length > 0,
120
+ holdIds: blocked.sort(compareLifecycleStrings),
121
+ operation: options.operation,
122
+ };
123
+ }
124
+ //# sourceMappingURL=holds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"holds.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/data-lifecycle/holds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from './contract.js';
2
+ export * from './evidence.js';
3
+ export * from './event.js';
4
+ export * from './holds.js';
5
+ export * from './policy.js';
6
+ export * from './retention.js';
7
+ export * from './restore.js';
8
+ export * from './rights.js';
@@ -0,0 +1,9 @@
1
+ export * from './contract.js';
2
+ export * from './evidence.js';
3
+ export * from './event.js';
4
+ export * from './holds.js';
5
+ export * from './policy.js';
6
+ export * from './retention.js';
7
+ export * from './restore.js';
8
+ export * from './rights.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/data-lifecycle/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type DataLifecycleRuntimeHoldV1 } from './holds.js';
2
+ export interface DataLifecycleRuntimePolicyV1 {
3
+ declaredHolds: readonly DataLifecycleRuntimeHoldV1[];
4
+ policyVersion: string;
5
+ retentionDays: number;
6
+ }
7
+ /**
8
+ * Binds one generated runtime enforcement path directly to the adopter-owned
9
+ * descriptor shipped in the same Slice artifact. Policy drift therefore fails
10
+ * at process initialization instead of leaving deletion behavior on stale
11
+ * generated constants.
12
+ */
13
+ export declare function resolveDataLifecycleRuntimePolicy(descriptorValue: unknown, selection: {
14
+ categoryId: string;
15
+ locationId: string;
16
+ }): DataLifecycleRuntimePolicyV1;
@@ -0,0 +1,79 @@
1
+ import { failDataLifecycleRuntime, requireBoundedInteger, requireDataLifecycleCode, requireDataLifecycleId, requirePolicyVersion, requireSafeReference, } from './contract.js';
2
+ import { normalizeDataLifecycleRuntimeHold, } from './holds.js';
3
+ function record(value, pointer) {
4
+ if (!value ||
5
+ typeof value !== 'object' ||
6
+ Array.isArray(value) ||
7
+ (Object.getPrototypeOf(value) !== Object.prototype &&
8
+ Object.getPrototypeOf(value) !== null)) {
9
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, 'must be a plain object');
10
+ }
11
+ return value;
12
+ }
13
+ function values(value, pointer) {
14
+ if (!Array.isArray(value) || value.length > 1000) {
15
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, 'must be a bounded array');
16
+ }
17
+ return value;
18
+ }
19
+ function holdEffects(value, pointer) {
20
+ const effects = values(value, pointer);
21
+ if (effects.some((effect) => effect !== 'block-deletion' && effect !== 'block-export')) {
22
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, 'contains an unsupported hold effect');
23
+ }
24
+ return effects;
25
+ }
26
+ function holdPurpose(value, pointer) {
27
+ if (value !== 'legal' &&
28
+ value !== 'security' &&
29
+ value !== 'fraud' &&
30
+ value !== 'support' &&
31
+ value !== 'incident') {
32
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, 'contains an unsupported hold purpose');
33
+ }
34
+ return value;
35
+ }
36
+ /**
37
+ * Binds one generated runtime enforcement path directly to the adopter-owned
38
+ * descriptor shipped in the same Slice artifact. Policy drift therefore fails
39
+ * at process initialization instead of leaving deletion behavior on stale
40
+ * generated constants.
41
+ */
42
+ export function resolveDataLifecycleRuntimePolicy(descriptorValue, selection) {
43
+ var _a, _b, _c;
44
+ const descriptor = record(descriptorValue, '/policy');
45
+ const categoryId = requireDataLifecycleId(selection.categoryId, '/selection/categoryId');
46
+ const locationId = requireDataLifecycleId(selection.locationId, '/selection/locationId');
47
+ const stores = values(descriptor['stores'], '/policy/stores');
48
+ const matchingStores = stores
49
+ .map((value, index) => ({
50
+ index,
51
+ value: record(value, `/policy/stores/${index}`),
52
+ }))
53
+ .filter(({ value }) => value['id'] === locationId);
54
+ if (matchingStores.length !== 1) {
55
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/policy/stores', 'must contain the selected runtime location exactly once');
56
+ }
57
+ const retention = record((_a = matchingStores[0]) === null || _a === void 0 ? void 0 : _a.value['retention'], `/policy/stores/${(_b = matchingStores[0]) === null || _b === void 0 ? void 0 : _b.index}/retention`);
58
+ const holds = values(descriptor['holds'], '/policy/holds').flatMap((value, index) => {
59
+ var _a, _b, _c;
60
+ const source = record(value, `/policy/holds/${index}`);
61
+ const categoryIds = values(source['categoryIds'], `/policy/holds/${index}/categoryIds`);
62
+ if (!categoryIds.includes(categoryId))
63
+ return [];
64
+ const status = source['status'];
65
+ if (status !== 'active' && status !== 'released') {
66
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', `/policy/holds/${index}/status`, 'must be active or released');
67
+ }
68
+ const runtimeHold = Object.assign({ categoryId, effects: holdEffects(source['effects'], `/policy/holds/${index}/effects`), expiresAt: String((_a = source['expiresAt']) !== null && _a !== void 0 ? _a : ''), holdId: requireDataLifecycleId(source['id'], `/policy/holds/${index}/id`), issuerCode: requireDataLifecycleCode(source['issuerRef'], `/policy/holds/${index}/issuerRef`), purpose: holdPurpose(source['purpose'], `/policy/holds/${index}/purpose`), reviewAt: String((_b = source['reviewAt']) !== null && _b !== void 0 ? _b : ''), scopeRef: requireSafeReference(source['scopeRef'], `/policy/holds/${index}/scopeRef`), startsAt: String((_c = source['startsAt']) !== null && _c !== void 0 ? _c : ''), status }, (source['releasedAt'] === undefined
69
+ ? {}
70
+ : { releasedAt: String(source['releasedAt']) }));
71
+ return [normalizeDataLifecycleRuntimeHold(runtimeHold, index)];
72
+ });
73
+ return Object.freeze({
74
+ declaredHolds: Object.freeze(holds),
75
+ policyVersion: requirePolicyVersion(descriptor['policyVersion'], '/policy/policyVersion'),
76
+ retentionDays: requireBoundedInteger(retention['durationDays'], `/policy/stores/${(_c = matchingStores[0]) === null || _c === void 0 ? void 0 : _c.index}/retention/durationDays`, 1, 36500),
77
+ });
78
+ }
79
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/data-lifecycle/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ export declare const DATA_LIFECYCLE_LEDGER_ENTRY_VERSION: 1;
2
+ export declare const DATA_LIFECYCLE_RESTORE_CHECKPOINT_VERSION: 1;
3
+ export declare const DATA_LIFECYCLE_RESTORE_MAX_ITEMS = 100;
4
+ export type DataLifecycleLedgerAction = 'correction' | 'deletion';
5
+ export interface DataLifecycleLedgerEntryV1 {
6
+ action: DataLifecycleLedgerAction;
7
+ categoryId: string;
8
+ effectiveAt: string;
9
+ entryId: string;
10
+ expiresAt: string;
11
+ policyVersion: string;
12
+ pseudonymousKey: string;
13
+ version: typeof DATA_LIFECYCLE_LEDGER_ENTRY_VERSION;
14
+ }
15
+ export interface DataLifecycleRestoreControlsV1 {
16
+ authorizationVerified: true;
17
+ integrityVerified: true;
18
+ isolatedTarget: true;
19
+ retentionJobsReady: true;
20
+ serviceTrafficBlocked: true;
21
+ }
22
+ export interface DataLifecycleRestoreCheckpointV1 {
23
+ complete: boolean;
24
+ cursor?: string;
25
+ policyVersion: string;
26
+ version: typeof DATA_LIFECYCLE_RESTORE_CHECKPOINT_VERSION;
27
+ }
28
+ export interface DataLifecycleLedgerPageV1 {
29
+ entries: readonly DataLifecycleLedgerEntryV1[];
30
+ nextCursor?: string;
31
+ }
32
+ export interface DataLifecycleRestoreAdapter {
33
+ applyPrimary(input: {
34
+ entry: DataLifecycleLedgerEntryV1;
35
+ idempotencyKey: string;
36
+ targetRef: string;
37
+ }): Promise<'applied' | 'already-applied' | 'not-present'>;
38
+ reconcileDownstream(input: {
39
+ entry: DataLifecycleLedgerEntryV1;
40
+ idempotencyKey: string;
41
+ }): Promise<'reconciled' | 'already-reconciled'>;
42
+ scanLedger(input: {
43
+ cursor?: string;
44
+ limit: number;
45
+ now: string;
46
+ policyVersion: string;
47
+ }): Promise<DataLifecycleLedgerPageV1>;
48
+ }
49
+ export interface DataLifecycleRestoreRunResultV1 {
50
+ alreadyApplied: number;
51
+ applied: number;
52
+ checkpoint: DataLifecycleRestoreCheckpointV1;
53
+ downstreamAlreadyReconciled: number;
54
+ downstreamReconciled: number;
55
+ errorCode?: 'ledger-scan-failed' | 'primary-reconciliation-failed' | 'downstream-reconciliation-failed' | 'invalid-adapter-outcome';
56
+ notPresent: number;
57
+ policyVersion: string;
58
+ processed: number;
59
+ readyForCutover: boolean;
60
+ status: 'complete' | 'more' | 'retry-required';
61
+ targetRef: string;
62
+ }
63
+ /**
64
+ * The ledger deliberately stores no source record, correction value, subject
65
+ * profile, or human identifier—only a pseudonymous lookup key and action.
66
+ */
67
+ export declare function createDataLifecycleLedgerEntry(options: {
68
+ action: DataLifecycleLedgerAction;
69
+ categoryId: string;
70
+ effectiveAt: string;
71
+ expiresAt: string;
72
+ policyVersion: string;
73
+ pseudonymousKey: string;
74
+ }): DataLifecycleLedgerEntryV1;
75
+ export declare function createDataLifecycleRestoreCheckpoint(policyVersion: string): DataLifecycleRestoreCheckpointV1;
76
+ /**
77
+ * Replays one bounded ledger page while traffic remains blocked. A failed
78
+ * primary/downstream page keeps its incoming checkpoint, so stable
79
+ * idempotency keys safely repeat all earlier actions on retry.
80
+ */
81
+ export declare function runDataLifecycleRestoreReconciliation(options: {
82
+ adapter: DataLifecycleRestoreAdapter;
83
+ checkpoint?: DataLifecycleRestoreCheckpointV1;
84
+ controls: DataLifecycleRestoreControlsV1;
85
+ limit: number;
86
+ now: string;
87
+ policyVersion: string;
88
+ targetRef: string;
89
+ }): Promise<DataLifecycleRestoreRunResultV1>;
90
+ export declare function requireDataLifecycleRestoreCutover(result: DataLifecycleRestoreRunResultV1): DataLifecycleRestoreRunResultV1;