@empire-builder-kit/runtime 1.0.0-beta.9 → 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,33 @@
1
+ export type DataLifecycleRuntimeFailureClassification = 'data-lifecycle-input-invalid' | 'data-lifecycle-retention-page-invalid' | 'data-lifecycle-retention-scan-failed' | 'data-lifecycle-hold-expired' | 'data-lifecycle-rights-transition-invalid' | 'data-lifecycle-restore-controls-incomplete' | 'data-lifecycle-restore-reconciliation-failed' | 'data-lifecycle-evidence-unsafe';
2
+ export declare class DataLifecycleRuntimeError extends Error {
3
+ readonly classification: DataLifecycleRuntimeFailureClassification;
4
+ readonly pointer: string;
5
+ constructor(classification: DataLifecycleRuntimeFailureClassification, pointer: string, message: string);
6
+ }
7
+ export declare const DATA_LIFECYCLE_ID_PATTERN: RegExp;
8
+ export declare const DATA_LIFECYCLE_CODE_PATTERN: RegExp;
9
+ export declare const DATA_LIFECYCLE_POLICY_VERSION_PATTERN: RegExp;
10
+ export declare const DATA_LIFECYCLE_SAFE_REFERENCE_PATTERN: RegExp;
11
+ export declare const DATA_LIFECYCLE_CURSOR_PATTERN: RegExp;
12
+ export declare function failDataLifecycleRuntime(classification: DataLifecycleRuntimeFailureClassification, pointer: string, message: string): never;
13
+ export declare function requireCanonicalTimestamp(value: unknown, pointer: string): string;
14
+ export declare function requireBoundedString(value: unknown, pointer: string, pattern?: RegExp, maximumLength?: number): string;
15
+ export declare function requireDataLifecycleId(value: unknown, pointer: string): string;
16
+ /**
17
+ * Produces the one opaque identity used for a protected value across holds,
18
+ * lifecycle ledgers, retention work, and cross-Slice lifecycle events.
19
+ */
20
+ export declare function createDataLifecyclePseudonymousReference(input: {
21
+ categoryId: string;
22
+ slice: string;
23
+ value: string;
24
+ }): string;
25
+ export declare function requireDataLifecycleCode(value: unknown, pointer: string): string;
26
+ export declare function requirePolicyVersion(value: unknown, pointer: string): string;
27
+ export declare function requireSafeReference(value: unknown, pointer: string): string;
28
+ export declare function requireCursor(value: unknown, pointer: string): string;
29
+ export declare function requireBoundedInteger(value: unknown, pointer: string, minimum: number, maximum: number): number;
30
+ export declare function compareLifecycleStrings(left: string, right: string): number;
31
+ export declare function requireUniqueLifecycleIds(values: readonly string[], pointer: string): string[];
32
+ export declare function lifecycleIdempotencyKey(namespace: string, parts: readonly string[]): string;
33
+ export declare function requireChronologicalTransition(previous: string, next: unknown, pointer: string): string;
@@ -0,0 +1,118 @@
1
+ import { createHash } from 'node:crypto';
2
+ export class DataLifecycleRuntimeError extends Error {
3
+ constructor(classification, pointer, message) {
4
+ super(`${pointer}: ${message}`);
5
+ this.classification = classification;
6
+ this.pointer = pointer;
7
+ this.name = 'DataLifecycleRuntimeError';
8
+ }
9
+ }
10
+ export const DATA_LIFECYCLE_ID_PATTERN = /^[a-z][a-z0-9]*(?:[.-][a-z0-9]+){0,15}$/;
11
+ export const DATA_LIFECYCLE_CODE_PATTERN = /^[a-z][a-z0-9]*(?:[-_.:][a-z0-9]+){0,15}$/;
12
+ export const DATA_LIFECYCLE_POLICY_VERSION_PATTERN = /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)$/;
13
+ export const DATA_LIFECYCLE_SAFE_REFERENCE_PATTERN = /^(?:sha256:[a-f0-9]{64}|opaque:[A-Za-z0-9_-]{16,128})$/;
14
+ export const DATA_LIFECYCLE_CURSOR_PATTERN = /^[A-Za-z0-9_-]{1,256}$/;
15
+ const DATA_LIFECYCLE_SLICE_PATTERN = /^[a-z][a-z0-9-]{0,62}$/;
16
+ export function failDataLifecycleRuntime(classification, pointer, message) {
17
+ throw new DataLifecycleRuntimeError(classification, pointer, message);
18
+ }
19
+ export function requireCanonicalTimestamp(value, pointer) {
20
+ if (typeof value !== 'string' ||
21
+ value.length > 40 ||
22
+ !Number.isFinite(Date.parse(value)) ||
23
+ new Date(value).toISOString() !== value) {
24
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, 'must be a canonical ISO-8601 timestamp');
25
+ }
26
+ return value;
27
+ }
28
+ export function requireBoundedString(value, pointer, pattern = DATA_LIFECYCLE_CODE_PATTERN, maximumLength = 256) {
29
+ const containsControlCharacter = typeof value === 'string' &&
30
+ Array.from(value).some((character) => {
31
+ var _a;
32
+ const codePoint = (_a = character.codePointAt(0)) !== null && _a !== void 0 ? _a : 0;
33
+ return ((codePoint >= 0 && codePoint <= 0x1f) ||
34
+ (codePoint >= 0x7f && codePoint <= 0x9f) ||
35
+ codePoint === 0x2028 ||
36
+ codePoint === 0x2029);
37
+ });
38
+ if (typeof value !== 'string' ||
39
+ value.length === 0 ||
40
+ value.length > maximumLength ||
41
+ value.trim() !== value ||
42
+ containsControlCharacter ||
43
+ !pattern.test(value)) {
44
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, 'must be a bounded normalized value');
45
+ }
46
+ return value;
47
+ }
48
+ export function requireDataLifecycleId(value, pointer) {
49
+ return requireBoundedString(value, pointer, DATA_LIFECYCLE_ID_PATTERN, 256);
50
+ }
51
+ /**
52
+ * Produces the one opaque identity used for a protected value across holds,
53
+ * lifecycle ledgers, retention work, and cross-Slice lifecycle events.
54
+ */
55
+ export function createDataLifecyclePseudonymousReference(input) {
56
+ const slice = requireBoundedString(input.slice, '/slice', DATA_LIFECYCLE_SLICE_PATTERN, 63);
57
+ const categoryId = requireDataLifecycleId(input.categoryId, '/categoryId');
58
+ const value = requireBoundedString(input.value, '/value', /^[^\p{Cc}\p{Zl}\p{Zp}]+$/u, 256);
59
+ return ('opaque:' +
60
+ createHash('sha256')
61
+ .update(slice, 'utf8')
62
+ .update('\0', 'utf8')
63
+ .update(categoryId, 'utf8')
64
+ .update('\0', 'utf8')
65
+ .update(value, 'utf8')
66
+ .digest('base64url'));
67
+ }
68
+ export function requireDataLifecycleCode(value, pointer) {
69
+ return requireBoundedString(value, pointer, DATA_LIFECYCLE_CODE_PATTERN, 256);
70
+ }
71
+ export function requirePolicyVersion(value, pointer) {
72
+ return requireBoundedString(value, pointer, DATA_LIFECYCLE_POLICY_VERSION_PATTERN, 64);
73
+ }
74
+ export function requireSafeReference(value, pointer) {
75
+ return requireBoundedString(value, pointer, DATA_LIFECYCLE_SAFE_REFERENCE_PATTERN, 136);
76
+ }
77
+ export function requireCursor(value, pointer) {
78
+ return requireBoundedString(value, pointer, DATA_LIFECYCLE_CURSOR_PATTERN, 256);
79
+ }
80
+ export function requireBoundedInteger(value, pointer, minimum, maximum) {
81
+ if (typeof value !== 'number' ||
82
+ !Number.isSafeInteger(value) ||
83
+ value < minimum ||
84
+ value > maximum) {
85
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, `must be a safe integer from ${minimum} through ${maximum}`);
86
+ }
87
+ return value;
88
+ }
89
+ export function compareLifecycleStrings(left, right) {
90
+ return left < right ? -1 : left > right ? 1 : 0;
91
+ }
92
+ export function requireUniqueLifecycleIds(values, pointer) {
93
+ if (!Array.isArray(values) || values.length > 1000) {
94
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, 'must be an array with at most 1000 entries');
95
+ }
96
+ const result = values
97
+ .map((value, index) => requireDataLifecycleId(value, `${pointer}/${index}`))
98
+ .sort(compareLifecycleStrings);
99
+ for (let index = 1; index < result.length; index += 1) {
100
+ if (result[index] === result[index - 1]) {
101
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, `contains duplicate ${result[index]}`);
102
+ }
103
+ }
104
+ return result;
105
+ }
106
+ export function lifecycleIdempotencyKey(namespace, parts) {
107
+ return `sha256:${createHash('sha256')
108
+ .update([namespace, ...parts].join('\0'), 'utf8')
109
+ .digest('hex')}`;
110
+ }
111
+ export function requireChronologicalTransition(previous, next, pointer) {
112
+ const timestamp = requireCanonicalTimestamp(next, pointer);
113
+ if (Date.parse(timestamp) < Date.parse(previous)) {
114
+ failDataLifecycleRuntime('data-lifecycle-rights-transition-invalid', pointer, 'must not precede the current workflow timestamp');
115
+ }
116
+ return timestamp;
117
+ }
118
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/data-lifecycle/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export declare const DATA_LIFECYCLE_CHANGE_EVENT_KIND: "ebk-data-lifecycle-change";
2
+ export declare const DATA_LIFECYCLE_CHANGE_EVENT_SCHEMA_VERSION: 1;
3
+ export interface DataLifecycleChangeEventV1 {
4
+ action: 'correction' | 'deletion';
5
+ categoryId: string;
6
+ kind: typeof DATA_LIFECYCLE_CHANGE_EVENT_KIND;
7
+ occurredAt: string;
8
+ policyVersion: string;
9
+ pseudonymousKey: string;
10
+ requestRef: string;
11
+ schemaVersion: typeof DATA_LIFECYCLE_CHANGE_EVENT_SCHEMA_VERSION;
12
+ sourceSlice: string;
13
+ }
14
+ export interface CreateDataLifecycleChangeEventInput {
15
+ action: DataLifecycleChangeEventV1['action'];
16
+ categoryId: string;
17
+ occurredAt: string;
18
+ policyVersion: string;
19
+ pseudonymousKey: string;
20
+ requestRef: string;
21
+ sourceSlice: string;
22
+ }
23
+ /**
24
+ * Creates the minimized event used to propagate deletion/correction across
25
+ * Slice boundaries. It carries no subject identity or record content.
26
+ */
27
+ export declare function createDataLifecycleChangeEvent(input: CreateDataLifecycleChangeEventInput): DataLifecycleChangeEventV1;
28
+ export declare function parseDataLifecycleChangeEvent(value: unknown): DataLifecycleChangeEventV1;
@@ -0,0 +1,76 @@
1
+ import { isBoundedSafeReference } from '../safe-reference.js';
2
+ export const DATA_LIFECYCLE_CHANGE_EVENT_KIND = 'ebk-data-lifecycle-change';
3
+ export const DATA_LIFECYCLE_CHANGE_EVENT_SCHEMA_VERSION = 1;
4
+ const SAFE_NAME = /^[a-z][a-z0-9-]{0,62}$/;
5
+ const PSEUDONYMOUS_REFERENCE = /^(?:opaque:[A-Za-z0-9_-]{16,128}|sha256:[a-f0-9]{64})$/;
6
+ function exactRecord(value) {
7
+ if (value === null ||
8
+ typeof value !== 'object' ||
9
+ Array.isArray(value) ||
10
+ Object.getPrototypeOf(value) !== Object.prototype) {
11
+ throw new Error('[runtime/data-lifecycle] Lifecycle change event must be a plain object.');
12
+ }
13
+ const record = value;
14
+ const expected = [
15
+ 'action',
16
+ 'categoryId',
17
+ 'kind',
18
+ 'occurredAt',
19
+ 'policyVersion',
20
+ 'pseudonymousKey',
21
+ 'requestRef',
22
+ 'schemaVersion',
23
+ 'sourceSlice',
24
+ ];
25
+ if (Object.keys(record).sort().join('\0') !== expected.sort().join('\0')) {
26
+ throw new Error('[runtime/data-lifecycle] Lifecycle change event fields are invalid.');
27
+ }
28
+ return record;
29
+ }
30
+ function safeToken(value, label) {
31
+ if (!isBoundedSafeReference(value)) {
32
+ throw new Error(`[runtime/data-lifecycle] Lifecycle change ${label} must be a bounded safe reference.`);
33
+ }
34
+ return value;
35
+ }
36
+ /**
37
+ * Creates the minimized event used to propagate deletion/correction across
38
+ * Slice boundaries. It carries no subject identity or record content.
39
+ */
40
+ export function createDataLifecycleChangeEvent(input) {
41
+ if (!['correction', 'deletion'].includes(input.action) ||
42
+ !SAFE_NAME.test(input.sourceSlice) ||
43
+ !PSEUDONYMOUS_REFERENCE.test(input.pseudonymousKey) ||
44
+ !PSEUDONYMOUS_REFERENCE.test(input.requestRef) ||
45
+ !Number.isFinite(Date.parse(input.occurredAt))) {
46
+ throw new Error('[runtime/data-lifecycle] Lifecycle change event input is invalid.');
47
+ }
48
+ return Object.freeze({
49
+ action: input.action,
50
+ categoryId: safeToken(input.categoryId, 'category'),
51
+ kind: DATA_LIFECYCLE_CHANGE_EVENT_KIND,
52
+ occurredAt: new Date(input.occurredAt).toISOString(),
53
+ policyVersion: safeToken(input.policyVersion, 'policy version'),
54
+ pseudonymousKey: input.pseudonymousKey,
55
+ requestRef: input.requestRef,
56
+ schemaVersion: DATA_LIFECYCLE_CHANGE_EVENT_SCHEMA_VERSION,
57
+ sourceSlice: input.sourceSlice,
58
+ });
59
+ }
60
+ export function parseDataLifecycleChangeEvent(value) {
61
+ const record = exactRecord(value);
62
+ if (record['kind'] !== DATA_LIFECYCLE_CHANGE_EVENT_KIND ||
63
+ record['schemaVersion'] !== DATA_LIFECYCLE_CHANGE_EVENT_SCHEMA_VERSION) {
64
+ throw new Error('[runtime/data-lifecycle] Lifecycle change event version is unsupported.');
65
+ }
66
+ return createDataLifecycleChangeEvent({
67
+ action: record['action'],
68
+ categoryId: record['categoryId'],
69
+ occurredAt: record['occurredAt'],
70
+ policyVersion: record['policyVersion'],
71
+ pseudonymousKey: record['pseudonymousKey'],
72
+ requestRef: record['requestRef'],
73
+ sourceSlice: record['sourceSlice'],
74
+ });
75
+ }
76
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/data-lifecycle/event.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ export declare const DATA_LIFECYCLE_EVIDENCE_SCHEMA_VERSION: 1;
2
+ export declare const DATA_LIFECYCLE_EVIDENCE_SUMMARY_MAX_LENGTH = 240;
3
+ export declare const DATA_LIFECYCLE_EVIDENCE_SUMMARY_INSPECTION_MAX_BYTES = 4096;
4
+ export declare const DATA_LIFECYCLE_AUDIT_ACTIONS: readonly ["retention-report", "retention-apply", "export", "deletion", "correction", "hold", "restore-reconciliation", "privileged-read", "policy-change"];
5
+ export type DataLifecycleAuditAction = (typeof DATA_LIFECYCLE_AUDIT_ACTIONS)[number];
6
+ export type DataLifecycleEvidenceOutcome = 'succeeded' | 'failed' | 'held' | 'rejected' | 'retry-required';
7
+ export interface DataLifecycleAuditRecordV1 {
8
+ action: DataLifecycleAuditAction;
9
+ actorRef: string;
10
+ authorityCode: string;
11
+ correlationRef: string;
12
+ kind: 'data-lifecycle-audit';
13
+ outcome: DataLifecycleEvidenceOutcome;
14
+ policyVersion: string;
15
+ purposeCode: string;
16
+ schemaVersion: typeof DATA_LIFECYCLE_EVIDENCE_SCHEMA_VERSION;
17
+ summary: string;
18
+ targetCategoryId: string;
19
+ timestamp: string;
20
+ }
21
+ export interface DataLifecycleEvidenceV1 {
22
+ categoryId: string;
23
+ completedAt: string;
24
+ counts: Readonly<Record<string, number>>;
25
+ errorCodes: readonly string[];
26
+ kind: 'data-lifecycle-evidence';
27
+ operation: DataLifecycleAuditAction;
28
+ outcome: DataLifecycleEvidenceOutcome;
29
+ policyVersion: string;
30
+ requestRef?: string;
31
+ schemaVersion: typeof DATA_LIFECYCLE_EVIDENCE_SCHEMA_VERSION;
32
+ startedAt: string;
33
+ summary: string;
34
+ systemIds: readonly string[];
35
+ }
36
+ /**
37
+ * Evidence diagnostics are metadata-only. Unsafe or oversized caller text is
38
+ * replaced wholesale rather than partially redacted.
39
+ */
40
+ export declare function sanitizeDataLifecycleSummary(value: unknown): string;
41
+ export declare function createDataLifecycleAuditRecord(options: {
42
+ action: DataLifecycleAuditAction;
43
+ actorRef: string;
44
+ authorityCode: string;
45
+ correlationRef: string;
46
+ outcome: DataLifecycleEvidenceOutcome;
47
+ policyVersion: string;
48
+ purposeCode: string;
49
+ summary?: unknown;
50
+ targetCategoryId: string;
51
+ timestamp: string;
52
+ }): DataLifecycleAuditRecordV1;
53
+ export declare function createDataLifecycleEvidence(options: {
54
+ categoryId: string;
55
+ completedAt: string;
56
+ counts: Readonly<Record<string, number>>;
57
+ errorCodes?: readonly string[];
58
+ operation: DataLifecycleAuditAction;
59
+ outcome: DataLifecycleEvidenceOutcome;
60
+ policyVersion: string;
61
+ requestRef?: string;
62
+ startedAt: string;
63
+ summary?: unknown;
64
+ systemIds: readonly string[];
65
+ }): DataLifecycleEvidenceV1;
@@ -0,0 +1,162 @@
1
+ import { CREDENTIAL_SHAPE_DEFINITIONS } from '../secrets/sensitive-patterns.js';
2
+ import { compareLifecycleStrings, failDataLifecycleRuntime, requireBoundedInteger, requireBoundedString, requireCanonicalTimestamp, requireDataLifecycleCode, requireDataLifecycleId, requirePolicyVersion, requireSafeReference, } from './contract.js';
3
+ export const DATA_LIFECYCLE_EVIDENCE_SCHEMA_VERSION = 1;
4
+ export const DATA_LIFECYCLE_EVIDENCE_SUMMARY_MAX_LENGTH = 240;
5
+ export const DATA_LIFECYCLE_EVIDENCE_SUMMARY_INSPECTION_MAX_BYTES = 4096;
6
+ export const DATA_LIFECYCLE_AUDIT_ACTIONS = [
7
+ 'retention-report',
8
+ 'retention-apply',
9
+ 'export',
10
+ 'deletion',
11
+ 'correction',
12
+ 'hold',
13
+ 'restore-reconciliation',
14
+ 'privileged-read',
15
+ 'policy-change',
16
+ ];
17
+ const UNSAFE_SUMMARY_PATTERNS = [
18
+ ...CREDENTIAL_SHAPE_DEFINITIONS.map(({ pattern }) => pattern),
19
+ /\b\d{3}-\d{2}-\d{4}\b/,
20
+ /["']?(?:customerId|userId|subjectId|accountId)["']?\s*[:=]\s*["']?(?!sha256:|opaque:)\S+/i,
21
+ ];
22
+ const EMAIL_PATTERN = /\b[A-Z0-9._%+-]+@([A-Z0-9.-]+\.[A-Z]{2,})\b/gi;
23
+ const SAFE_EMAIL_DOMAINS = new Set([
24
+ 'example.com',
25
+ 'example.net',
26
+ 'example.org',
27
+ 'example.test',
28
+ ]);
29
+ const EVIDENCE_COUNT_KEY_PATTERN = /^[a-z][A-Za-z0-9]*(?:[-_.][A-Za-z0-9]+){0,15}$/;
30
+ function containsUnsafeEmail(value) {
31
+ var _a;
32
+ EMAIL_PATTERN.lastIndex = 0;
33
+ for (const match of value.matchAll(EMAIL_PATTERN)) {
34
+ const domain = (_a = match[1]) === null || _a === void 0 ? void 0 : _a.toLowerCase();
35
+ if (domain && !SAFE_EMAIL_DOMAINS.has(domain))
36
+ return true;
37
+ }
38
+ return false;
39
+ }
40
+ /**
41
+ * Evidence diagnostics are metadata-only. Unsafe or oversized caller text is
42
+ * replaced wholesale rather than partially redacted.
43
+ */
44
+ export function sanitizeDataLifecycleSummary(value) {
45
+ if (typeof value !== 'string' ||
46
+ Buffer.byteLength(value, 'utf8') >
47
+ DATA_LIFECYCLE_EVIDENCE_SUMMARY_INSPECTION_MAX_BYTES) {
48
+ return 'Lifecycle diagnostic removed because safe metadata was unavailable.';
49
+ }
50
+ const normalized = Array.from(value, (character) => {
51
+ var _a;
52
+ const codePoint = (_a = character.codePointAt(0)) !== null && _a !== void 0 ? _a : 0;
53
+ return (codePoint >= 0 && codePoint <= 0x1f) ||
54
+ (codePoint >= 0x7f && codePoint <= 0x9f) ||
55
+ codePoint === 0x2028 ||
56
+ codePoint === 0x2029
57
+ ? ' '
58
+ : character;
59
+ })
60
+ .join('')
61
+ .replace(/\s+/g, ' ')
62
+ .trim();
63
+ if (normalized.length === 0) {
64
+ return 'Lifecycle diagnostic was unavailable.';
65
+ }
66
+ if (containsUnsafeEmail(normalized) ||
67
+ UNSAFE_SUMMARY_PATTERNS.some((pattern) => pattern.test(normalized))) {
68
+ return 'Lifecycle diagnostic removed because it contained protected data.';
69
+ }
70
+ return normalized.slice(0, DATA_LIFECYCLE_EVIDENCE_SUMMARY_MAX_LENGTH);
71
+ }
72
+ function requireAuditAction(value, pointer) {
73
+ if (!DATA_LIFECYCLE_AUDIT_ACTIONS.includes(value)) {
74
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, 'audit action is unsupported');
75
+ }
76
+ return value;
77
+ }
78
+ function requireOutcome(value, pointer) {
79
+ const outcomes = [
80
+ 'succeeded',
81
+ 'failed',
82
+ 'held',
83
+ 'rejected',
84
+ 'retry-required',
85
+ ];
86
+ if (!outcomes.includes(value)) {
87
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, 'evidence outcome is unsupported');
88
+ }
89
+ return value;
90
+ }
91
+ function uniqueCodes(values, pointer, maximum) {
92
+ if (!Array.isArray(values) || values.length > maximum) {
93
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, `must contain at most ${maximum} entries`);
94
+ }
95
+ const codes = values
96
+ .map((value, index) => requireDataLifecycleCode(value, `${pointer}/${index}`))
97
+ .sort(compareLifecycleStrings);
98
+ for (let index = 1; index < codes.length; index += 1) {
99
+ if (codes[index] === codes[index - 1]) {
100
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', pointer, `contains duplicate ${codes[index]}`);
101
+ }
102
+ }
103
+ return codes;
104
+ }
105
+ function normalizeCounts(value) {
106
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
107
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/counts', 'must be a bounded metadata count record');
108
+ }
109
+ const entries = Object.entries(value);
110
+ if (entries.length > 32) {
111
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/counts', 'must contain at most 32 count fields');
112
+ }
113
+ const result = {};
114
+ for (const [key, count] of entries.sort(([left], [right]) => compareLifecycleStrings(left, right))) {
115
+ const normalizedKey = requireBoundedString(key, `/counts/${key}`, EVIDENCE_COUNT_KEY_PATTERN, 128);
116
+ result[normalizedKey] = requireBoundedInteger(count, `/counts/${key}`, 0, Number.MAX_SAFE_INTEGER);
117
+ }
118
+ return result;
119
+ }
120
+ export function createDataLifecycleAuditRecord(options) {
121
+ return {
122
+ action: requireAuditAction(options.action, '/action'),
123
+ actorRef: requireSafeReference(options.actorRef, '/actorRef'),
124
+ authorityCode: requireDataLifecycleCode(options.authorityCode, '/authorityCode'),
125
+ correlationRef: requireSafeReference(options.correlationRef, '/correlationRef'),
126
+ kind: 'data-lifecycle-audit',
127
+ outcome: requireOutcome(options.outcome, '/outcome'),
128
+ policyVersion: requirePolicyVersion(options.policyVersion, '/policyVersion'),
129
+ purposeCode: requireDataLifecycleCode(options.purposeCode, '/purposeCode'),
130
+ schemaVersion: DATA_LIFECYCLE_EVIDENCE_SCHEMA_VERSION,
131
+ summary: sanitizeDataLifecycleSummary(options.summary),
132
+ targetCategoryId: requireDataLifecycleId(options.targetCategoryId, '/targetCategoryId'),
133
+ timestamp: requireCanonicalTimestamp(options.timestamp, '/timestamp'),
134
+ };
135
+ }
136
+ export function createDataLifecycleEvidence(options) {
137
+ var _a;
138
+ const startedAt = requireCanonicalTimestamp(options.startedAt, '/startedAt');
139
+ const completedAt = requireCanonicalTimestamp(options.completedAt, '/completedAt');
140
+ if (Date.parse(completedAt) < Date.parse(startedAt)) {
141
+ failDataLifecycleRuntime('data-lifecycle-input-invalid', '/completedAt', 'cannot precede evidence start');
142
+ }
143
+ const evidence = {
144
+ categoryId: requireDataLifecycleId(options.categoryId, '/categoryId'),
145
+ completedAt,
146
+ counts: normalizeCounts(options.counts),
147
+ errorCodes: uniqueCodes((_a = options.errorCodes) !== null && _a !== void 0 ? _a : [], '/errorCodes', 32),
148
+ kind: 'data-lifecycle-evidence',
149
+ operation: requireAuditAction(options.operation, '/operation'),
150
+ outcome: requireOutcome(options.outcome, '/outcome'),
151
+ policyVersion: requirePolicyVersion(options.policyVersion, '/policyVersion'),
152
+ schemaVersion: DATA_LIFECYCLE_EVIDENCE_SCHEMA_VERSION,
153
+ startedAt,
154
+ summary: sanitizeDataLifecycleSummary(options.summary),
155
+ systemIds: uniqueCodes(options.systemIds, '/systemIds', 100),
156
+ };
157
+ if (options.requestRef !== undefined) {
158
+ evidence.requestRef = requireSafeReference(options.requestRef, '/requestRef');
159
+ }
160
+ return evidence;
161
+ }
162
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/data-lifecycle/evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export declare const DATA_LIFECYCLE_RUNTIME_HOLD_PURPOSES: readonly ["legal", "security", "fraud", "support", "incident"];
2
+ export type DataLifecycleRuntimeHoldPurpose = (typeof DATA_LIFECYCLE_RUNTIME_HOLD_PURPOSES)[number];
3
+ export type DataLifecycleRuntimeHoldEffect = 'block-deletion' | 'block-export';
4
+ export interface DataLifecycleRuntimeHoldV1 {
5
+ categoryId: string;
6
+ effects: readonly DataLifecycleRuntimeHoldEffect[];
7
+ expiresAt: string;
8
+ holdId: string;
9
+ issuerCode: string;
10
+ purpose: DataLifecycleRuntimeHoldPurpose;
11
+ releasedAt?: string;
12
+ reviewAt: string;
13
+ scopeRef: string;
14
+ startsAt: string;
15
+ status: 'active' | 'released';
16
+ }
17
+ export interface DataLifecycleHoldEvaluationV1 {
18
+ blocked: boolean;
19
+ holdIds: readonly string[];
20
+ operation: 'deletion' | 'export';
21
+ }
22
+ export declare function normalizeDataLifecycleRuntimeHold(value: DataLifecycleRuntimeHoldV1, index: number): DataLifecycleRuntimeHoldV1;
23
+ export declare function evaluateDataLifecycleHolds(options: {
24
+ categoryId: string;
25
+ holds: readonly DataLifecycleRuntimeHoldV1[];
26
+ now: string;
27
+ operation: 'deletion' | 'export';
28
+ scopeRef: string;
29
+ }): DataLifecycleHoldEvaluationV1;