@cosmicdrift/kumiko-bundled-features 0.386.0 → 0.388.0

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 (643) hide show
  1. package/LICENSE +21 -57
  2. package/dist/agent-tools/tool-catalog.js +1 -1
  3. package/dist/agent-tools/tool-dispatch.d.ts +7 -7
  4. package/dist/agent-tools/tool-dispatch.js +9 -9
  5. package/dist/audit/handlers/audit-events.js +1 -1
  6. package/dist/audit/screens.js +1 -1
  7. package/dist/auth-email-password/feature.js +1 -1
  8. package/dist/auth-email-password/handlers/change-password.write.js +3 -3
  9. package/dist/auth-email-password/handlers/confirm-token-flow.js +5 -5
  10. package/dist/auth-email-password/handlers/invite-accept-with-login.write.js +1 -1
  11. package/dist/auth-email-password/handlers/invite-accept.write.js +18 -18
  12. package/dist/auth-email-password/handlers/invite-create.write.d.ts +2 -2
  13. package/dist/auth-email-password/handlers/invite-create.write.js +10 -10
  14. package/dist/auth-email-password/handlers/invite-info.query.js +1 -1
  15. package/dist/auth-email-password/handlers/invite-signup-complete.write.js +24 -26
  16. package/dist/auth-email-password/handlers/login.write.d.ts +1 -1
  17. package/dist/auth-email-password/handlers/login.write.js +1 -1
  18. package/dist/auth-email-password/handlers/self-registration-status.query.js +1 -1
  19. package/dist/auth-email-password/handlers/signup-confirm.write.js +34 -37
  20. package/dist/auth-email-password/handlers/signup-request.write.js +6 -7
  21. package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.d.ts +1 -1
  22. package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.js +1 -4
  23. package/dist/auth-email-password/index.js +5 -5
  24. package/dist/auth-email-password/lockout-store.js +1 -1
  25. package/dist/auth-email-password/seeding.d.ts +42 -45
  26. package/dist/auth-email-password/seeding.js +51 -53
  27. package/dist/auth-email-password/signup-token-store.js +8 -8
  28. package/dist/auth-email-password/testing.js +3 -3
  29. package/dist/auth-email-password/web/auth-client.d.ts +2 -2
  30. package/dist/auth-email-password/web/auth-client.js +36 -37
  31. package/dist/auth-email-password/web/auth-form-primitives.js +10 -10
  32. package/dist/auth-email-password/web/auth-gate.js +15 -16
  33. package/dist/auth-email-password/web/client-plugin.d.ts +7 -7
  34. package/dist/auth-email-password/web/client-plugin.js +4 -5
  35. package/dist/auth-email-password/web/confirm-account-unlock-screen.js +1 -1
  36. package/dist/auth-email-password/web/constants.js +3 -3
  37. package/dist/auth-email-password/web/default-topbar-actions.d.ts +8 -8
  38. package/dist/auth-email-password/web/default-topbar-actions.js +6 -6
  39. package/dist/auth-email-password/web/forgot-password-screen.d.ts +2 -2
  40. package/dist/auth-email-password/web/forgot-password-screen.js +9 -9
  41. package/dist/auth-email-password/web/index.js +5 -5
  42. package/dist/auth-email-password/web/invite-accept-screen.d.ts +1 -1
  43. package/dist/auth-email-password/web/invite-accept-screen.js +16 -16
  44. package/dist/auth-email-password/web/login-screen.d.ts +1 -1
  45. package/dist/auth-email-password/web/login-screen.js +2 -3
  46. package/dist/auth-email-password/web/reset-password-screen.d.ts +4 -4
  47. package/dist/auth-email-password/web/reset-password-screen.js +12 -13
  48. package/dist/auth-email-password/web/session.d.ts +10 -9
  49. package/dist/auth-email-password/web/session.js +28 -29
  50. package/dist/auth-email-password/web/signup-complete-screen.js +3 -3
  51. package/dist/auth-email-password/web/signup-screen.d.ts +1 -1
  52. package/dist/auth-email-password/web/signup-screen.js +13 -13
  53. package/dist/auth-email-password/web/tenant-switcher.d.ts +4 -4
  54. package/dist/auth-email-password/web/tenant-switcher.js +21 -22
  55. package/dist/auth-email-password/web/use-shell-user.js +12 -13
  56. package/dist/auth-email-password/web/user-menu.d.ts +4 -4
  57. package/dist/auth-email-password/web/user-menu.js +12 -13
  58. package/dist/auth-email-password/web/verify-email-screen.d.ts +2 -2
  59. package/dist/auth-email-password/web/verify-email-screen.js +9 -10
  60. package/dist/auth-foundation/boot-checks.js +4 -4
  61. package/dist/auth-foundation/resolve-anonymous-access.d.ts +1 -1
  62. package/dist/auth-foundation/resolve-anonymous-access.js +3 -3
  63. package/dist/auth-foundation/types.js +2 -2
  64. package/dist/auth-mfa/feature-exports.d.ts +2 -2
  65. package/dist/auth-mfa/feature.js +8 -0
  66. package/dist/auth-mfa/handlers/disable.write.js +3 -3
  67. package/dist/auth-mfa/handlers/enable-confirm-preauth.write.js +4 -4
  68. package/dist/auth-mfa/handlers/enable-confirm.write.js +2 -2
  69. package/dist/auth-mfa/handlers/enable-start-preauth.write.js +1 -1
  70. package/dist/auth-mfa/handlers/reencrypt.job.js +1 -1
  71. package/dist/auth-mfa/handlers/regenerate-recovery.write.js +5 -5
  72. package/dist/auth-mfa/handlers/verify.write.js +1 -1
  73. package/dist/auth-mfa/token-secrets.js +1 -1
  74. package/dist/auth-mfa/web/client-plugin.d.ts +1 -1
  75. package/dist/auth-mfa/web/client-plugin.js +1 -1
  76. package/dist/auth-mfa/web/i18n.js +8 -4
  77. package/dist/auth-mfa/web/index.js +4 -4
  78. package/dist/auth-mfa/web/mfa-client.js +17 -16
  79. package/dist/auth-mfa/web/mfa-code-or-recovery-field.d.ts +11 -0
  80. package/dist/auth-mfa/web/mfa-code-or-recovery-field.js +12 -0
  81. package/dist/auth-mfa/web/mfa-disable-dialog.js +14 -3
  82. package/dist/auth-mfa/web/mfa-regenerate-recovery-dialog.js +14 -3
  83. package/dist/auth-mfa/web/mfa-setup-preauth-screen.js +10 -5
  84. package/dist/auth-mfa/web/mfa-verify-screen.js +32 -11
  85. package/dist/billing-foundation/aggregate-id.d.ts +5 -5
  86. package/dist/billing-foundation/aggregate-id.js +10 -11
  87. package/dist/billing-foundation/checkout-core.d.ts +9 -14
  88. package/dist/billing-foundation/checkout-core.js +24 -39
  89. package/dist/billing-foundation/consumer-protection/confirmation-mail.js +8 -2
  90. package/dist/billing-foundation/consumer-protection/consent-gate.d.ts +1 -0
  91. package/dist/billing-foundation/consumer-protection/consent-gate.js +1 -0
  92. package/dist/billing-foundation/consumer-protection/issue-confirmation.js +9 -3
  93. package/dist/billing-foundation/consumer-protection/mail-notifications.js +3 -1
  94. package/dist/billing-foundation/consumer-protection/termination-receipt-limit.d.ts +4 -2
  95. package/dist/billing-foundation/consumer-protection/termination-receipt-limit.js +6 -5
  96. package/dist/billing-foundation/consumer-protection/termination-record.d.ts +5 -1
  97. package/dist/billing-foundation/consumer-protection/termination-record.js +27 -17
  98. package/dist/billing-foundation/consumer-protection/termination-request.js +12 -7
  99. package/dist/billing-foundation/consumer-protection/termination-revoke.js +12 -7
  100. package/dist/billing-foundation/consumer-protection/termination-texts.d.ts +1 -1
  101. package/dist/billing-foundation/consumer-protection/termination-texts.js +3 -0
  102. package/dist/billing-foundation/consumer-protection/withdrawal-period.d.ts +5 -2
  103. package/dist/billing-foundation/consumer-protection/withdrawal-period.js +8 -9
  104. package/dist/billing-foundation/entities.js +27 -27
  105. package/dist/billing-foundation/events.d.ts +1 -0
  106. package/dist/billing-foundation/events.js +19 -17
  107. package/dist/billing-foundation/feature.js +45 -44
  108. package/dist/billing-foundation/get-subscription-for-tenant.d.ts +3 -3
  109. package/dist/billing-foundation/get-subscription-for-tenant.js +3 -5
  110. package/dist/billing-foundation/handlers/billing-plans.query.js +35 -5
  111. package/dist/billing-foundation/handlers/create-checkout-session.write.js +19 -17
  112. package/dist/billing-foundation/handlers/create-portal-session.write.js +11 -12
  113. package/dist/billing-foundation/handlers/list-subscriptions.query.js +4 -4
  114. package/dist/billing-foundation/handlers/plan-switch-preview.query.d.ts +13 -0
  115. package/dist/billing-foundation/handlers/plan-switch-preview.query.js +48 -0
  116. package/dist/billing-foundation/handlers/process-event.write.d.ts +6 -0
  117. package/dist/billing-foundation/handlers/process-event.write.js +28 -22
  118. package/dist/billing-foundation/handlers/start-plan-checkout.write.js +32 -5
  119. package/dist/billing-foundation/handlers/switch-plan.write.d.ts +2 -2
  120. package/dist/billing-foundation/handlers/switch-plan.write.js +56 -64
  121. package/dist/billing-foundation/handlers/sync-subscription.write.js +12 -1
  122. package/dist/billing-foundation/i18n.js +22 -0
  123. package/dist/billing-foundation/index.d.ts +1 -1
  124. package/dist/billing-foundation/plan-catalog.d.ts +21 -5
  125. package/dist/billing-foundation/plan-catalog.js +25 -16
  126. package/dist/billing-foundation/plan-switch.d.ts +12 -0
  127. package/dist/billing-foundation/plan-switch.js +60 -0
  128. package/dist/billing-foundation/projection.d.ts +15 -11
  129. package/dist/billing-foundation/projection.js +38 -37
  130. package/dist/billing-foundation/subscription-tier-sync.js +3 -3
  131. package/dist/billing-foundation/tenant-destroy-hook.d.ts +2 -2
  132. package/dist/billing-foundation/tenant-destroy-hook.js +7 -7
  133. package/dist/billing-foundation/types.d.ts +97 -42
  134. package/dist/billing-foundation/types.js +29 -20
  135. package/dist/billing-foundation/validate-options.js +17 -0
  136. package/dist/billing-foundation/web/billing-plans-panel.js +82 -36
  137. package/dist/billing-foundation/web/checkout-consent-dialog.d.ts +17 -3
  138. package/dist/billing-foundation/web/checkout-consent-dialog.js +14 -10
  139. package/dist/billing-foundation/web/constants.d.ts +4 -0
  140. package/dist/billing-foundation/web/constants.js +4 -0
  141. package/dist/billing-foundation/web/plan-price.d.ts +15 -0
  142. package/dist/billing-foundation/web/plan-price.js +32 -0
  143. package/dist/billing-foundation/web/plan-switch-confirm-dialog.d.ts +15 -0
  144. package/dist/billing-foundation/web/plan-switch-confirm-dialog.js +66 -0
  145. package/dist/cap-counter/aggregate-id.js +8 -9
  146. package/dist/cap-counter/cap-reservation.js +5 -1
  147. package/dist/cap-counter/constants.js +11 -12
  148. package/dist/cap-counter/enforce-cap.d.ts +59 -62
  149. package/dist/cap-counter/enforce-cap.js +49 -49
  150. package/dist/cap-counter/entity.js +29 -29
  151. package/dist/cap-counter/feature.js +34 -35
  152. package/dist/cap-counter/handlers/increment-rolling.write.d.ts +2 -2
  153. package/dist/cap-counter/handlers/increment-rolling.write.js +31 -31
  154. package/dist/cap-counter/handlers/mark-soft-warned.write.js +4 -5
  155. package/dist/cap-counter/stock-cap-guard.js +8 -2
  156. package/dist/cap-counter/with-cap-enforcement.d.ts +3 -5
  157. package/dist/channel-email/feature.js +1 -1
  158. package/dist/channel-email/smtp-transport.d.ts +18 -17
  159. package/dist/channel-email/smtp-transport.js +24 -21
  160. package/dist/channel-in-app/handlers/unread-count.query.js +3 -4
  161. package/dist/compliance-profiles/feature.js +4 -4
  162. package/dist/compliance-profiles/handlers/for-tenant.query.js +3 -6
  163. package/dist/compliance-profiles/handlers/list-profiles.query.js +5 -5
  164. package/dist/compliance-profiles/handlers/needs-profile.query.js +4 -4
  165. package/dist/compliance-profiles/handlers/set-profile.write.js +13 -14
  166. package/dist/compliance-profiles/handlers/sub-processors.query.js +9 -11
  167. package/dist/compliance-profiles/resolve-for-tenant.js +7 -7
  168. package/dist/compliance-profiles/schema/profile-selection.js +18 -23
  169. package/dist/compliance-profiles/seeding.js +14 -15
  170. package/dist/compliance-profiles-ops/handlers/tenants-missing-profile.query.js +3 -3
  171. package/dist/compliance-profiles-ops/index.js +2 -2
  172. package/dist/config/handlers/cascade.query.d.ts +5 -0
  173. package/dist/config/handlers/cascade.query.js +4 -3
  174. package/dist/config/handlers/readiness.query.d.ts +4 -4
  175. package/dist/config/handlers/readiness.query.js +1 -1
  176. package/dist/config/handlers/reencrypt.job.js +4 -5
  177. package/dist/config/handlers/set.write.js +4 -4
  178. package/dist/config/handlers/values.query.d.ts +5 -0
  179. package/dist/config/handlers/values.query.js +4 -3
  180. package/dist/config/resolver.js +4 -4
  181. package/dist/config/table.js +10 -10
  182. package/dist/config/write-helpers.d.ts +1 -0
  183. package/dist/config/write-helpers.js +19 -10
  184. package/dist/crypto-shredding/handlers/forget-subject.write.d.ts +2 -2
  185. package/dist/crypto-shredding/handlers/forget-subject.write.js +25 -21
  186. package/dist/custom-fields/aggregate-id.d.ts +12 -13
  187. package/dist/custom-fields/aggregate-id.js +16 -17
  188. package/dist/custom-fields/entity.js +49 -47
  189. package/dist/custom-fields/events.js +7 -8
  190. package/dist/custom-fields/feature.d.ts +14 -14
  191. package/dist/custom-fields/feature.js +53 -54
  192. package/dist/custom-fields/handlers/clear-custom-field.write.d.ts +3 -2
  193. package/dist/custom-fields/handlers/clear-custom-field.write.js +9 -8
  194. package/dist/custom-fields/handlers/define-tenant-field.write.d.ts +1 -1
  195. package/dist/custom-fields/handlers/define-tenant-field.write.js +2 -2
  196. package/dist/custom-fields/handlers/delete-system-field.write.js +6 -7
  197. package/dist/custom-fields/handlers/delete-tenant-field.write.d.ts +1 -1
  198. package/dist/custom-fields/handlers/delete-tenant-field.write.js +3 -3
  199. package/dist/custom-fields/handlers/set-custom-field.write.d.ts +3 -3
  200. package/dist/custom-fields/handlers/set-custom-field.write.js +25 -28
  201. package/dist/custom-fields/handlers/update-tenant-field.write.d.ts +1 -1
  202. package/dist/custom-fields/handlers/update-tenant-field.write.js +1 -1
  203. package/dist/custom-fields/lib/field-access.js +2 -2
  204. package/dist/custom-fields/lib/parse-serialized-field.js +1 -1
  205. package/dist/custom-fields/lib/quota.js +1 -1
  206. package/dist/custom-fields/lib/value-schema.js +10 -12
  207. package/dist/custom-fields/run-retention.js +3 -3
  208. package/dist/custom-fields/schemas.js +14 -14
  209. package/dist/custom-fields/web/client-plugin.js +2 -5
  210. package/dist/custom-fields/web/constants.js +2 -2
  211. package/dist/custom-fields/web/custom-fields-form-section.d.ts +4 -4
  212. package/dist/custom-fields/web/custom-fields-form-section.js +22 -22
  213. package/dist/custom-fields/wire-for-entity.js +65 -67
  214. package/dist/custom-fields/wire-user-data-rights.js +3 -3
  215. package/dist/data-retention/_internal/parse-override.js +2 -3
  216. package/dist/data-retention/feature.js +11 -18
  217. package/dist/data-retention/handlers/policy-for.query.js +6 -6
  218. package/dist/data-retention/keep-for.d.ts +7 -7
  219. package/dist/data-retention/keep-for.js +15 -15
  220. package/dist/data-retention/override-schema.d.ts +3 -4
  221. package/dist/data-retention/override-schema.js +13 -15
  222. package/dist/data-retention/presets.d.ts +4 -5
  223. package/dist/data-retention/presets.js +18 -23
  224. package/dist/data-retention/resolve-tenant-preset.js +17 -16
  225. package/dist/data-retention/resolver.d.ts +12 -12
  226. package/dist/data-retention/resolver.js +24 -23
  227. package/dist/data-retention/run-retention-cleanup.d.ts +8 -3
  228. package/dist/data-retention/run-retention-cleanup.js +61 -51
  229. package/dist/data-retention/schema/tenant-retention-override.js +13 -11
  230. package/dist/delivery/channel-context.js +6 -3
  231. package/dist/delivery/db/queries/preferences.js +2 -2
  232. package/dist/delivery/delivery-service.js +22 -7
  233. package/dist/delivery/feature.js +2 -2
  234. package/dist/delivery/handlers/log.query.js +1 -1
  235. package/dist/delivery/handlers/preferences.query.d.ts +1 -1
  236. package/dist/delivery/handlers/preferences.query.js +20 -1
  237. package/dist/delivery/handlers/unsubscribe-page-chrome.query.js +1 -1
  238. package/dist/delivery/tables.js +9 -8
  239. package/dist/delivery/unsubscribe-link.d.ts +3 -1
  240. package/dist/delivery/unsubscribe-page-strings.d.ts +1 -0
  241. package/dist/delivery/unsubscribe-page-strings.js +1 -0
  242. package/dist/delivery/unsubscribe-page.d.ts +2 -0
  243. package/dist/delivery/unsubscribe-page.js +5 -0
  244. package/dist/delivery/unsubscribe.js +29 -11
  245. package/dist/document-ingest-foundation/entity.js +4 -4
  246. package/dist/document-ingest-foundation/events.js +2 -2
  247. package/dist/document-ingest-foundation/feature.js +2 -2
  248. package/dist/document-ingest-foundation/pages.js +1 -1
  249. package/dist/document-ingest-foundation/tenant-destroy-hook.js +4 -4
  250. package/dist/feature-toggles/compose-tier-resolver.js +1 -1
  251. package/dist/feature-toggles/feature.js +1 -1
  252. package/dist/feature-toggles/global-feature-state-table.js +1 -1
  253. package/dist/feature-toggles/handlers/registered.query.js +5 -5
  254. package/dist/feature-toggles/toggle-sync-signal.js +1 -1
  255. package/dist/feature-toggles/web/constants.js +1 -1
  256. package/dist/file-derivatives/feature.d.ts +1 -1
  257. package/dist/file-derivatives/feature.js +1 -1
  258. package/dist/file-derivatives/handlers/public-variant.query.js +1 -1
  259. package/dist/file-derivatives/presets.js +1 -1
  260. package/dist/file-foundation/feature.js +6 -6
  261. package/dist/file-foundation/index.d.ts +1 -1
  262. package/dist/file-foundation/index.js +1 -1
  263. package/dist/file-foundation/read-file-ref-content.d.ts +3 -0
  264. package/dist/file-foundation/read-file-ref-content.js +6 -1
  265. package/dist/file-provider-inmemory/feature.d.ts +1 -1
  266. package/dist/file-provider-inmemory/feature.js +16 -16
  267. package/dist/file-provider-s3/env-named-feature.d.ts +0 -2
  268. package/dist/file-provider-s3/feature.js +16 -16
  269. package/dist/file-provider-s3/lib/s3-provider.js +6 -6
  270. package/dist/files/feature.js +6 -6
  271. package/dist/files-tenant-data/handlers/sweep-orphaned-derivatives.job.js +4 -4
  272. package/dist/files-tenant-data/hooks.js +24 -26
  273. package/dist/files-tenant-data/index.js +1 -1
  274. package/dist/folders/feature.d.ts +1 -1
  275. package/dist/folders/web/folder-manager.js +2 -2
  276. package/dist/folders/web/tree.js +5 -5
  277. package/dist/form-draft/db/queries/cleanup.js +3 -3
  278. package/dist/form-draft/db/queries/owned-file-refs.js +1 -1
  279. package/dist/form-draft/decrypt-draft.js +5 -1
  280. package/dist/form-draft/entity.js +3 -3
  281. package/dist/form-draft/feature.js +4 -5
  282. package/dist/form-draft/handlers/discard.write.js +1 -1
  283. package/dist/form-draft/release-file-refs.js +6 -6
  284. package/dist/form-draft/schemas.js +3 -3
  285. package/dist/form-draft/web/constants.js +0 -2
  286. package/dist/host-routing/dispatch.js +11 -20
  287. package/dist/inbound-mail-foundation/aggregate-id.d.ts +13 -13
  288. package/dist/inbound-mail-foundation/aggregate-id.js +19 -19
  289. package/dist/inbound-mail-foundation/connect-routes.js +4 -3
  290. package/dist/inbound-mail-foundation/constants.d.ts +22 -24
  291. package/dist/inbound-mail-foundation/constants.js +30 -33
  292. package/dist/inbound-mail-foundation/entities.d.ts +12 -12
  293. package/dist/inbound-mail-foundation/entities.js +47 -48
  294. package/dist/inbound-mail-foundation/events.d.ts +4 -3
  295. package/dist/inbound-mail-foundation/events.js +50 -47
  296. package/dist/inbound-mail-foundation/feature.js +39 -39
  297. package/dist/inbound-mail-foundation/handlers/account-state.js +8 -8
  298. package/dist/inbound-mail-foundation/handlers/connect-account.write.js +25 -26
  299. package/dist/inbound-mail-foundation/handlers/disconnect-account.write.js +7 -7
  300. package/dist/inbound-mail-foundation/handlers/ingest-message.write.js +50 -51
  301. package/dist/inbound-mail-foundation/handlers/list-accounts.query.js +8 -8
  302. package/dist/inbound-mail-foundation/handlers/list-messages.query.js +10 -10
  303. package/dist/inbound-mail-foundation/handlers/scope-visibility.js +3 -4
  304. package/dist/inbound-mail-foundation/handlers/update-account.write.d.ts +2 -2
  305. package/dist/inbound-mail-foundation/handlers/update-account.write.js +22 -14
  306. package/dist/inbound-mail-foundation/i18n.js +0 -1
  307. package/dist/inbound-mail-foundation/oauth-state.d.ts +5 -5
  308. package/dist/inbound-mail-foundation/oauth-state.js +11 -10
  309. package/dist/inbound-mail-foundation/projection.d.ts +4 -4
  310. package/dist/inbound-mail-foundation/projection.js +31 -29
  311. package/dist/inbound-mail-foundation/provider-factory.d.ts +4 -4
  312. package/dist/inbound-mail-foundation/provider-factory.js +9 -9
  313. package/dist/inbound-mail-foundation/retention-sweep.d.ts +5 -3
  314. package/dist/inbound-mail-foundation/retention-sweep.js +38 -36
  315. package/dist/inbound-mail-foundation/screens.js +0 -3
  316. package/dist/inbound-mail-foundation/tenant-destroy-hook.js +14 -16
  317. package/dist/inbound-mail-foundation/types.d.ts +49 -49
  318. package/dist/inbound-mail-foundation/types.js +21 -21
  319. package/dist/inbound-mail-foundation/watch-supervisor.d.ts +10 -10
  320. package/dist/inbound-mail-foundation/watch-supervisor.js +85 -67
  321. package/dist/inbound-provider-imap/credential-document.js +13 -13
  322. package/dist/inbound-provider-imap/feature.d.ts +2 -2
  323. package/dist/inbound-provider-imap/feature.js +42 -40
  324. package/dist/inbound-provider-imap/imap-client.d.ts +12 -11
  325. package/dist/inbound-provider-imap/imap-client.js +20 -19
  326. package/dist/inbound-provider-inmemory/feature.d.ts +9 -9
  327. package/dist/inbound-provider-inmemory/feature.js +19 -19
  328. package/dist/jobs/db/queries/retention.js +2 -2
  329. package/dist/jobs/db/queries/stale-run-sweep.js +3 -3
  330. package/dist/jobs/events.js +1 -1
  331. package/dist/jobs/feature.d.ts +1 -0
  332. package/dist/jobs/feature.js +13 -10
  333. package/dist/jobs/handlers/detail.query.js +4 -4
  334. package/dist/jobs/handlers/list.query.js +1 -1
  335. package/dist/jobs/handlers/projection-rebuild.job.js +1 -1
  336. package/dist/jobs/handlers/reindex-entity.job.js +1 -1
  337. package/dist/jobs/handlers/retry.write.js +1 -1
  338. package/dist/jobs/handlers/tenant-failures.query.d.ts +1 -1
  339. package/dist/jobs/handlers/tenant-failures.query.js +45 -41
  340. package/dist/jobs/handlers/tenant-runs.query.d.ts +1 -1
  341. package/dist/jobs/handlers/tenant-runs.query.js +54 -50
  342. package/dist/jobs/job-instant.js +1 -1
  343. package/dist/jobs/job-run-logger.js +15 -15
  344. package/dist/jobs/job-run-table.js +3 -3
  345. package/dist/jobs/screens.js +1 -1
  346. package/dist/jobs/tenant-job-failure-table.js +1 -1
  347. package/dist/jobs/tenant-job-run-table.js +1 -1
  348. package/dist/ledger/entity.js +5 -5
  349. package/dist/ledger/feature.js +3 -3
  350. package/dist/ledger/handlers/confirm-schedule-period.write.js +3 -3
  351. package/dist/ledger/recurring.js +12 -12
  352. package/dist/ledger/schemas.js +1 -1
  353. package/dist/ledger/web/constants.js +2 -2
  354. package/dist/ledger/web/index.js +7 -7
  355. package/dist/legal-pages/feature.d.ts +4 -4
  356. package/dist/legal-pages/feature.js +25 -26
  357. package/dist/legal-pages/markdown.js +3 -3
  358. package/dist/legal-pages/web/client-plugin.js +23 -24
  359. package/dist/legal-pages/web/index.js +0 -1
  360. package/dist/mail-foundation/feature.d.ts +5 -5
  361. package/dist/mail-foundation/feature.js +27 -25
  362. package/dist/mail-transport-inmemory/feature.d.ts +4 -4
  363. package/dist/mail-transport-inmemory/feature.js +27 -28
  364. package/dist/mail-transport-smtp/feature.js +20 -20
  365. package/dist/managed-pages/branding.js +6 -6
  366. package/dist/managed-pages/feature.d.ts +26 -26
  367. package/dist/managed-pages/feature.js +34 -34
  368. package/dist/managed-pages/handlers/by-slug.query.js +5 -6
  369. package/dist/managed-pages/handlers/by-tenant-published.query.js +2 -2
  370. package/dist/managed-pages/handlers/set.write.js +5 -7
  371. package/dist/managed-pages/screens/page-screens.js +11 -11
  372. package/dist/managed-pages/seeding.js +8 -8
  373. package/dist/managed-pages/table.js +13 -12
  374. package/dist/managed-pages/web/client-plugin.d.ts +1 -1
  375. package/dist/managed-pages/web/client-plugin.js +5 -5
  376. package/dist/managed-pages/web/i18n.js +1 -1
  377. package/dist/notes-history/entity.js +4 -4
  378. package/dist/notes-history/feature.d.ts +2 -2
  379. package/dist/notes-history-user-data/hooks.js +1 -1
  380. package/dist/page-render/layout.js +9 -9
  381. package/dist/page-render/markdown.js +11 -11
  382. package/dist/page-render/security-headers.js +7 -6
  383. package/dist/personal-access-tokens/feature.d.ts +1 -1
  384. package/dist/personal-access-tokens/feature.js +9 -5
  385. package/dist/personal-access-tokens/roles.js +2 -2
  386. package/dist/readiness/handlers/status.query.js +3 -3
  387. package/dist/renderer-foundation/api.js +12 -13
  388. package/dist/renderer-foundation/constants.js +2 -2
  389. package/dist/renderer-foundation/feature.js +7 -7
  390. package/dist/renderer-pdf/render-table-pdf.d.ts +1 -1
  391. package/dist/renderer-pdf/render-table-pdf.js +22 -10
  392. package/dist/secrets/feature.js +9 -9
  393. package/dist/secrets/web/constants.js +2 -2
  394. package/dist/seo/feature.js +3 -3
  395. package/dist/sessions/constants.d.ts +1 -1
  396. package/dist/sessions/constants.js +1 -1
  397. package/dist/sessions/feature.d.ts +2 -2
  398. package/dist/sessions/feature.js +12 -8
  399. package/dist/sessions/handlers/revoke-all-for-user.write.js +2 -2
  400. package/dist/sessions/handlers/revoke-all-others.write.js +2 -2
  401. package/dist/sessions/handlers/revoke.write.js +1 -1
  402. package/dist/sessions/schema/user-session.js +4 -4
  403. package/dist/sessions/screens.js +2 -2
  404. package/dist/sessions/session-callbacks.js +2 -2
  405. package/dist/sessions/session-revoked-event.js +2 -2
  406. package/dist/shared/assert-no-where-rule-in-ownership-write.js +1 -1
  407. package/dist/shared/decrypt-stored-pii.d.ts +1 -0
  408. package/dist/shared/decrypt-stored-pii.js +7 -2
  409. package/dist/shared/encrypt-for-direct-write.js +1 -1
  410. package/dist/shared/index.d.ts +1 -1
  411. package/dist/shared/index.js +1 -1
  412. package/dist/shared/mail-template-body.d.ts +6 -2
  413. package/dist/shared/mail-template-body.js +7 -4
  414. package/dist/shared/map-with-concurrency.js +5 -4
  415. package/dist/shared/parent-visibility.js +2 -2
  416. package/dist/shared/password-hashing.js +1 -1
  417. package/dist/shared/signup-handover.js +1 -2
  418. package/dist/shared/single-use-token-store.js +1 -1
  419. package/dist/step-dispatcher/feature.js +1 -0
  420. package/dist/subscription-dodo/client.d.ts +17 -0
  421. package/dist/subscription-dodo/client.js +31 -0
  422. package/dist/subscription-dodo/constants.d.ts +12 -0
  423. package/dist/subscription-dodo/constants.js +19 -0
  424. package/dist/subscription-dodo/feature.d.ts +37 -0
  425. package/dist/subscription-dodo/feature.js +144 -0
  426. package/dist/subscription-dodo/index.d.ts +2 -0
  427. package/dist/subscription-dodo/index.js +4 -0
  428. package/dist/subscription-dodo/plugin-methods.d.ts +23 -0
  429. package/dist/subscription-dodo/plugin-methods.js +260 -0
  430. package/dist/subscription-dodo/runtime.d.ts +27 -0
  431. package/dist/subscription-dodo/runtime.js +89 -0
  432. package/dist/subscription-dodo/verify-webhook.d.ts +37 -0
  433. package/dist/subscription-dodo/verify-webhook.js +189 -0
  434. package/dist/subscription-mollie/constants.js +15 -17
  435. package/dist/subscription-mollie/feature.d.ts +17 -18
  436. package/dist/subscription-mollie/feature.js +24 -24
  437. package/dist/subscription-mollie/index.js +3 -3
  438. package/dist/subscription-mollie/plugin-methods.d.ts +2 -2
  439. package/dist/subscription-mollie/plugin-methods.js +15 -14
  440. package/dist/subscription-mollie/verify-webhook.d.ts +10 -10
  441. package/dist/subscription-mollie/verify-webhook.js +27 -27
  442. package/dist/subscription-stripe/constants.js +4 -6
  443. package/dist/subscription-stripe/feature.d.ts +14 -14
  444. package/dist/subscription-stripe/feature.js +36 -34
  445. package/dist/subscription-stripe/index.js +6 -6
  446. package/dist/subscription-stripe/plugin-methods.js +18 -18
  447. package/dist/subscription-stripe/runtime.d.ts +1 -1
  448. package/dist/subscription-stripe/runtime.js +8 -7
  449. package/dist/subscription-stripe/verify-webhook.d.ts +11 -11
  450. package/dist/subscription-stripe/verify-webhook.js +59 -61
  451. package/dist/tags/feature.d.ts +3 -3
  452. package/dist/tags/screens.js +1 -1
  453. package/dist/template-resolver/api.d.ts +3 -2
  454. package/dist/template-resolver/api.js +34 -12
  455. package/dist/template-resolver/compile-document-body.js +1 -0
  456. package/dist/template-resolver/feature.js +2 -2
  457. package/dist/template-resolver/handlers/bundle-import.js +3 -3
  458. package/dist/template-resolver/handlers/copy-locale.write.d.ts +5 -1
  459. package/dist/template-resolver/handlers/copy-locale.write.js +22 -7
  460. package/dist/template-resolver/handlers/diff-to-system.query.js +3 -2
  461. package/dist/template-resolver/handlers/document-base.js +3 -2
  462. package/dist/template-resolver/handlers/find-by-id.query.js +8 -7
  463. package/dist/template-resolver/handlers/list.query.js +6 -7
  464. package/dist/template-resolver/handlers/overview.query.d.ts +3 -0
  465. package/dist/template-resolver/handlers/overview.query.js +6 -3
  466. package/dist/template-resolver/handlers/shared.js +2 -2
  467. package/dist/template-resolver/handlers/template-write.js +3 -3
  468. package/dist/template-resolver/handlers/tenant-override-counts.query.js +1 -3
  469. package/dist/template-resolver/handlers/tenant-override-selection.d.ts +2 -1
  470. package/dist/template-resolver/handlers/tenant-overrides.query.js +28 -5
  471. package/dist/template-resolver/handlers/upsert-system.write.js +3 -4
  472. package/dist/template-resolver/handlers/upsert-tenant.write.js +4 -5
  473. package/dist/template-resolver/handlers/usage.query.d.ts +2 -1
  474. package/dist/template-resolver/handlers/usage.query.js +26 -16
  475. package/dist/template-resolver/handlers/validate.query.js +7 -2
  476. package/dist/template-resolver/seeding.js +30 -14
  477. package/dist/template-resolver/store-template-resource.d.ts +1 -0
  478. package/dist/template-resolver/store-template-resource.js +19 -4
  479. package/dist/template-resolver/table.js +10 -11
  480. package/dist/template-resolver/template-delivery-policy.d.ts +0 -5
  481. package/dist/template-resolver/template-delivery-policy.js +0 -6
  482. package/dist/template-resolver/template-meta.js +7 -4
  483. package/dist/template-resolver/template-preview.js +4 -3
  484. package/dist/template-resolver/web/client-plugin.js +2 -2
  485. package/dist/template-resolver/web/constants.d.ts +2 -2
  486. package/dist/template-resolver/web/constants.js +3 -3
  487. package/dist/template-resolver/web/index.d.ts +1 -0
  488. package/dist/template-resolver/web/index.js +1 -0
  489. package/dist/template-resolver/web/mail-layout-constants.d.ts +5 -0
  490. package/dist/template-resolver/web/mail-layout-constants.js +7 -0
  491. package/dist/tenant/feature.js +7 -7
  492. package/dist/tenant/handlers/member-directory.query.d.ts +1 -0
  493. package/dist/tenant/handlers/member-directory.query.js +11 -4
  494. package/dist/tenant/handlers/members.query.js +1 -1
  495. package/dist/tenant/handlers/team-list.query.js +1 -1
  496. package/dist/tenant/handlers/tenant-directory.query.d.ts +1 -0
  497. package/dist/tenant/handlers/tenant-directory.query.js +9 -5
  498. package/dist/tenant/invitation-table.js +37 -40
  499. package/dist/tenant/membership-table.js +3 -3
  500. package/dist/tenant/schema/tenant.js +7 -9
  501. package/dist/tenant/screens.js +1 -1
  502. package/dist/tenant/seeding.d.ts +6 -5
  503. package/dist/tenant/seeding.js +12 -12
  504. package/dist/tenant/testing.js +5 -6
  505. package/dist/tenant/web/constants.js +2 -2
  506. package/dist/tenant-handover/events.js +5 -7
  507. package/dist/tenant-handover/feature.js +1 -1
  508. package/dist/tenant-handover/grant.js +1 -1
  509. package/dist/tenant-handover/handlers/claim.write.js +1 -1
  510. package/dist/tenant-handover/move-entity-graph.js +8 -9
  511. package/dist/tenant-handover/signup-handover-provider.js +1 -2
  512. package/dist/tenant-handover/transfer-graph.js +4 -5
  513. package/dist/tenant-lifecycle/boot-checks.js +1 -1
  514. package/dist/tenant-lifecycle/constants.d.ts +1 -0
  515. package/dist/tenant-lifecycle/constants.js +4 -0
  516. package/dist/tenant-lifecycle/feature.js +1 -1
  517. package/dist/tenant-lifecycle/run-tenant-destroy.js +2 -2
  518. package/dist/tenant-settings/constants.js +1 -1
  519. package/dist/tenant-settings/tenant-defaults.d.ts +1 -1
  520. package/dist/tenant-settings/tenant-defaults.js +9 -2
  521. package/dist/tier-engine/aggregate-id.d.ts +11 -11
  522. package/dist/tier-engine/aggregate-id.js +15 -16
  523. package/dist/tier-engine/compose-app.d.ts +14 -14
  524. package/dist/tier-engine/compose-app.js +1 -1
  525. package/dist/tier-engine/entity.js +18 -19
  526. package/dist/tier-engine/feature.d.ts +19 -17
  527. package/dist/tier-engine/feature.js +68 -69
  528. package/dist/tier-engine/handlers/active-tier.query.js +6 -7
  529. package/dist/tier-engine/handlers/get-tenant-tier.query.js +4 -4
  530. package/dist/tier-engine/handlers/set-tenant-tier.write.d.ts +7 -8
  531. package/dist/tier-engine/handlers/set-tenant-tier.write.js +7 -4
  532. package/dist/tier-engine/tier-resolver.js +2 -2
  533. package/dist/tier-engine/trial.js +8 -8
  534. package/dist/tier-engine/web/constants.js +2 -2
  535. package/dist/tier-engine/web/index.js +4 -4
  536. package/dist/user/db/queries/stream-tenant-backfill.js +8 -8
  537. package/dist/user/handlers/create.write.js +4 -4
  538. package/dist/user/schema/user.d.ts +11 -11
  539. package/dist/user/schema/user.js +45 -44
  540. package/dist/user/seeding.d.ts +15 -15
  541. package/dist/user/seeding.js +28 -28
  542. package/dist/user/testing.js +3 -3
  543. package/dist/user-data-rights/audit-download.d.ts +8 -8
  544. package/dist/user-data-rights/audit-download.js +19 -20
  545. package/dist/user-data-rights/boot-checks.js +1 -1
  546. package/dist/user-data-rights/deletion-token.js +1 -1
  547. package/dist/user-data-rights/feature.d.ts +49 -50
  548. package/dist/user-data-rights/feature.js +54 -53
  549. package/dist/user-data-rights/handlers/cancel-deletion.write.js +9 -9
  550. package/dist/user-data-rights/handlers/confirm-deletion-by-token.write.js +8 -8
  551. package/dist/user-data-rights/handlers/download-by-job.query.js +29 -30
  552. package/dist/user-data-rights/handlers/download-by-token.query.js +40 -42
  553. package/dist/user-data-rights/handlers/export-status.query.js +8 -9
  554. package/dist/user-data-rights/handlers/lift-restriction.write.js +7 -8
  555. package/dist/user-data-rights/handlers/list-download-attempts.query.js +2 -2
  556. package/dist/user-data-rights/handlers/my-audit-log.query.js +4 -4
  557. package/dist/user-data-rights/handlers/request-deletion-by-email.write.d.ts +5 -5
  558. package/dist/user-data-rights/handlers/request-deletion-by-email.write.js +16 -15
  559. package/dist/user-data-rights/handlers/request-deletion.write.d.ts +2 -2
  560. package/dist/user-data-rights/handlers/request-deletion.write.js +7 -9
  561. package/dist/user-data-rights/handlers/request-export.write.js +42 -41
  562. package/dist/user-data-rights/handlers/restrict-account.write.js +22 -19
  563. package/dist/user-data-rights/handlers/run-forget-cleanup.write.js +8 -8
  564. package/dist/user-data-rights/index.js +8 -10
  565. package/dist/user-data-rights/lib/default-mailers.js +3 -3
  566. package/dist/user-data-rights/lib/update-user-lifecycle.js +14 -17
  567. package/dist/user-data-rights/run-export-jobs.d.ts +38 -42
  568. package/dist/user-data-rights/run-export-jobs.js +130 -237
  569. package/dist/user-data-rights/run-forget-cleanup.d.ts +16 -20
  570. package/dist/user-data-rights/run-forget-cleanup.js +65 -83
  571. package/dist/user-data-rights/run-user-export.d.ts +34 -33
  572. package/dist/user-data-rights/run-user-export.js +55 -57
  573. package/dist/user-data-rights/schema/download-attempt.js +11 -11
  574. package/dist/user-data-rights/schema/download-token.js +37 -41
  575. package/dist/user-data-rights/schema/export-job.d.ts +4 -4
  576. package/dist/user-data-rights/schema/export-job.js +65 -67
  577. package/dist/user-data-rights/token-helpers.d.ts +8 -9
  578. package/dist/user-data-rights/token-helpers.js +21 -25
  579. package/dist/user-data-rights/web/client-plugin.d.ts +5 -5
  580. package/dist/user-data-rights/web/client-plugin.js +1 -1
  581. package/dist/user-data-rights/web/confirm-deletion-screen.js +6 -5
  582. package/dist/user-data-rights/web/constants.js +1 -1
  583. package/dist/user-data-rights/web/index.js +5 -5
  584. package/dist/user-data-rights/web/privacy-center-screen.js +14 -13
  585. package/dist/user-data-rights/web/public-deletion-gate.d.ts +4 -4
  586. package/dist/user-data-rights/web/request-deletion-screen.js +6 -6
  587. package/dist/user-data-rights/zip-path.d.ts +15 -15
  588. package/dist/user-data-rights/zip-path.js +41 -40
  589. package/dist/user-data-rights-defaults/feature.js +15 -15
  590. package/dist/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.js +3 -5
  591. package/dist/user-data-rights-defaults/hooks/file-ref.userdata-hook.js +45 -51
  592. package/dist/user-data-rights-defaults/hooks/job-run.userdata-hook.js +2 -2
  593. package/dist/user-data-rights-defaults/hooks/notification-preference.userdata-hook.js +1 -1
  594. package/dist/user-data-rights-defaults/hooks/user-session.userdata-hook.js +3 -3
  595. package/dist/user-data-rights-defaults/hooks/user.userdata-hook.js +32 -31
  596. package/dist/user-profile/handlers/change-email.write.js +13 -13
  597. package/dist/user-profile/index.js +3 -3
  598. package/dist/user-profile/web/client-plugin.js +1 -1
  599. package/dist/user-profile/web/constants.js +1 -1
  600. package/dist/user-profile/web/profile-screen.js +1 -1
  601. package/dist/waitlist/handlers/export-purge.write.js +2 -1
  602. package/dist/waitlist/handlers/submit.write.js +5 -5
  603. package/dist/waitlist/import.d.ts +1 -0
  604. package/dist/waitlist/import.js +4 -0
  605. package/dist/waitlist/legacy-migrate.js +17 -6
  606. package/dist/waitlist/link-on-signup.js +18 -6
  607. package/dist/waitlist/options.d.ts +3 -0
  608. package/dist/workflow-runner/aggregate-id.d.ts +1 -1
  609. package/dist/workflow-runner/aggregate-id.js +1 -1
  610. package/dist/workflow-runner/event-subscriber.js +4 -5
  611. package/dist/workflow-runner/event-trigger.js +4 -17
  612. package/dist/workflow-runner/feature.js +2 -2
  613. package/dist/workflow-runner/handlers/resume-run.write.js +4 -4
  614. package/dist/workflow-runner/pending-projection.js +6 -7
  615. package/dist/workflow-runner/runner.js +6 -6
  616. package/dist/workflow-runner/tables.js +6 -6
  617. package/dist/workflow-runner/workflow-registry.js +1 -1
  618. package/package.json +20 -10
  619. package/src/agent-tools/changes.json +6 -0
  620. package/src/audit/changes.json +12 -0
  621. package/src/auth-mfa/changes.json +6 -0
  622. package/src/billing-foundation/changes.json +55 -0
  623. package/src/cap-counter/changes.json +18 -0
  624. package/src/channel-email/changes.json +6 -0
  625. package/src/config/changes.json +12 -0
  626. package/src/crypto-shredding/changes.json +6 -0
  627. package/src/delivery/changes.json +30 -0
  628. package/src/form-draft/changes.json +6 -0
  629. package/src/host-routing/changes.json +6 -0
  630. package/src/inbound-mail-foundation/changes.json +18 -0
  631. package/src/jobs/changes.json +13 -0
  632. package/src/mail-foundation/changes.json +6 -0
  633. package/src/renderer-pdf/changes.json +6 -0
  634. package/src/step-dispatcher/changes.json +6 -0
  635. package/src/subscription-dodo/changes.json +14 -0
  636. package/src/subscription-stripe/changes.json +12 -0
  637. package/src/template-resolver/changes.json +48 -0
  638. package/src/tenant/changes.json +6 -0
  639. package/src/tenant-lifecycle/changes.json +6 -0
  640. package/src/tier-engine/changes.json +6 -0
  641. package/src/waitlist/changes.json +18 -0
  642. package/dist/billing-foundation/consumer-protection/stored-user-email.d.ts +0 -1
  643. package/dist/billing-foundation/consumer-protection/stored-user-email.js +0 -8
@@ -10,25 +10,18 @@ export { resolveTenantRetentionPreset, } from "./resolve-tenant-preset.js";
10
10
  export { resolveRetentionPolicy, } from "./resolver.js";
11
11
  export { runRetentionCleanup, } from "./run-retention-cleanup.js";
12
12
  export { tenantRetentionOverrideEntity, tenantRetentionOverrideTable, } from "./schema/tenant-retention-override.js";
13
- // data-retention — automatisierte Aufbewahrung + Löschung pro Entity.
13
+ // data-retention — automated retention and deletion per entity.
14
14
  //
15
- // Sprint 2.D1 (this commit):
16
- // - 3-Schicht-Resolver (Entity-Default → Tenant-Preset → Tenant-Override)
17
- // - Retention-Presets (dsgvo-basic, dsgvo-hgb, swiss-dsg, default)
18
- // - tenantRetentionOverride-Entity für per-Tenant Edge-Cases
15
+ // Retention is resolved through three layers: entity default → tenant preset →
16
+ // tenant override stored in `tenantRetentionOverride`.
19
17
  //
20
- // Sprint 2.D2b (this commit):
21
- // - retention-cleanup-Cron (perTenant) — hardDelete (batched) + softDelete
22
- // - Layer-2-Preset aus dem Compliance-Profile abgeleitet (soft-dep)
23
- // - anonymize deferred (Idempotenz-Marker, siehe run-retention-cleanup.ts)
18
+ // The retention-cleanup cron performs batched hard deletes and soft deletes per
19
+ // tenant. The tenant preset can be derived from the compliance profile, while
20
+ // anonymization is deferred and uses an idempotency marker; see
21
+ // `run-retention-cleanup.ts`.
24
22
  //
25
- // Sprint 2.D3 (done):
26
- // - r.exposesApi("retention.policyFor") für user-data-rights
27
- //
28
- // Cross-Feature-Hinweis: Plan-Roadmap docs/plans/datenschutz/
29
- // core-data-retention.md — Forget-Flow konsultiert blockDelete via
30
- // retention.policyFor → anonymize statt hardDelete bei Aufbewahrungs-
31
- // pflicht. Das Wiring kommt in Sprint 2.U5.
23
+ // The forget flow consults `retention.policyFor` and anonymizes records instead
24
+ // of hard-deleting them while a mandatory retention period applies.
32
25
  export function createDataRetentionFeature() {
33
26
  return defineFeature("data-retention", (r) => {
34
27
  r.describe("Resolves the effective retention policy for any entity using a 3-layer stack: entity-level default \u2192 tenant preset (`dsgvo-basic`, `dsgvo-hgb`, `swiss-dsg`) \u2192 per-tenant override stored in `tenantRetentionOverride`. Other features query the resolved policy via the `retention.policyFor` cross-feature API \u2014 most notably `user-data-rights`, which uses it to decide whether to anonymize instead of hard-delete a record that is still within a mandatory retention window.");
@@ -38,10 +31,10 @@ export function createDataRetentionFeature() {
38
31
  recommended: false,
39
32
  });
40
33
  r.entity({ name: "tenant-retention-override", ...tenantRetentionOverrideEntity });
41
- // S2.D3: Cross-Feature-API fuer Forget-Flow + Cleanup-Job
34
+ // Cross-feature API for the forget flow and cleanup job
42
35
  r.exposesApi("retention.policyFor");
43
36
  r.queryHandler(policyForQuery);
44
- // S2.D2b — autonomous retention cleanup. perTenant fan-out (one run per
37
+ // Autonomous retention cleanup. perTenant fan-out (one run per
45
38
  // active tenant, like soft-delete-cleanup): runRetentionCleanup's raw
46
39
  // query helpers need the unfiltered runner, so the handler declares
47
40
  // escapeHatch and reaches for ctx.db.unsafeRaw(). Without this cron,
@@ -1,18 +1,18 @@
1
1
  import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import * as z from "zod";
3
3
  import { resolveRetentionPolicyForTenant } from "../resolve-for-tenant.js";
4
- // retention:query:policy-for — Cross-Feature-API fuer den Forget-Flow.
4
+ // retention:query:policy-for — Cross-feature API for the forget flow.
5
5
  //
6
- // user-data-rights-Sprint-2.U5 ruft das pro Entity um zu wissen ob ein
7
- // Forget mit "delete" oder "anonymize" oder "blockDelete-bis-Frist"
8
- // laufen soll. Plus Cleanup-Job-Sprint-2.D2b fuer das gleiche.
6
+ // The forget flow calls this for each entity to determine whether it should
7
+ // use "delete", "anonymize", or "blockDelete-bis-Frist". The cleanup job uses
8
+ // it for the same purpose.
9
9
  //
10
10
  // Delegates to resolveRetentionPolicyForTenant so forget, the cleanup cron and
11
11
  // this query can never disagree about the tenant preset. Letting the resolver
12
12
  // load the preset itself costs one read per call, fine for a single lookup.
13
13
  //
14
- // access: openToAll — andere Features im selben Tenant duerfen das
15
- // abrufen. Keine PII im Result, nur Policy-Metadata.
14
+ // access: openToAll — other features in the same tenant may retrieve this.
15
+ // The result contains no PII, only policy metadata.
16
16
  export const policyForQuery = defineQueryHandler({
17
17
  name: "policy-for",
18
18
  schema: z.object({
@@ -4,17 +4,17 @@ export declare class InvalidKeepForError extends Error {
4
4
  }
5
5
  export type Instant = InstanceType<ReturnType<typeof getTemporal>["Instant"]>;
6
6
  /**
7
- * Berechnet den Cutoff-Instant — Rows mit reference < cutoff sind
8
- * abgelaufen und werden vom Cleanup-Job geraeumt.
7
+ * Computes the cutoff instant — rows with reference < cutoff are expired
8
+ * and removed by the cleanup job.
9
9
  *
10
- * @param spec keepFor-String wie "30d", "10y", "6m", "1w", "24h"
11
- * @param now Aktueller Zeitpunkt (advisor-Pattern: injection-Parameter
12
- * fuer Time-Travel-Tests, kein global Temporal.Now)
10
+ * @param spec keepFor string such as "30d", "10y", "6m", "1w", "24h"
11
+ * @param now Current point in time (injection parameter for time-travel tests;
12
+ * not global Temporal.Now)
13
13
  */
14
14
  export declare function computeCutoff(spec: string, now: Instant): Instant;
15
15
  /**
16
- * Ist referenceTimestamp aelter als der keepFor-Cutoff bei now?
17
- * Cleanup-Job nutzt das pro Row.
16
+ * Determines whether referenceTimestamp is older than the keepFor cutoff at now.
17
+ * The cleanup job uses this for each row.
18
18
  */
19
19
  export declare function isPastCutoff(args: {
20
20
  readonly referenceTimestamp: Instant;
@@ -1,14 +1,14 @@
1
- // keepFor-Format-Parser: "30d" / "10y" / "6m" / "1w" / "24h" → Cutoff-Instant.
1
+ // keepFor format parser: "30d" / "10y" / "6m" / "1w" / "24h" → cutoff instant.
2
2
  //
3
- // Nicht millisekunden-praezise — DSGVO-Aufbewahrungspflichten haben
4
- // Tag-/Monat-Granularitaet. "6m" = 6×30d, "10y" = 10×365d. Cleanup-Job
5
- // laeuft taeglich, ein paar Tage Differenz beim Cutoff sind akzeptabel.
3
+ // Not millisecond-precise — GDPR retention requirements use day/month
4
+ // granularity. "6m" = 6×30d, "10y" = 10×365d. The cleanup job runs daily,
5
+ // so a difference of a few days at the cutoff is acceptable.
6
6
  //
7
- // Boot-Validator (S0.2) hat das Format schon gegen /^\d+[hdwmy]$/
8
- // gecheckt — hier defensiv nochmal validiert fuer Migration-Edge-Cases.
7
+ // The boot validator already checked the format against /^\d+[hdwmy]$/
8
+ // — validate defensively again here for migration edge cases.
9
9
  //
10
- // Temporal kommt via globalThis (Polyfill in framework-Boot installiert).
11
- // `getTemporal()` aus framework/time gibt typed Zugriff.
10
+ // Temporal is provided via globalThis (the polyfill is installed during framework boot).
11
+ // `getTemporal()` from framework/time provides typed access.
12
12
  import { getTemporal } from "@cosmicdrift/kumiko-framework/time";
13
13
  const KEEP_FOR_PATTERN = /^(\d+)([hdwmy])$/;
14
14
  const UNIT_TO_DAYS = {
@@ -23,12 +23,12 @@ export class InvalidKeepForError extends Error {
23
23
  }
24
24
  }
25
25
  /**
26
- * Berechnet den Cutoff-Instant — Rows mit reference < cutoff sind
27
- * abgelaufen und werden vom Cleanup-Job geraeumt.
26
+ * Computes the cutoff instant — rows with reference < cutoff are expired
27
+ * and removed by the cleanup job.
28
28
  *
29
- * @param spec keepFor-String wie "30d", "10y", "6m", "1w", "24h"
30
- * @param now Aktueller Zeitpunkt (advisor-Pattern: injection-Parameter
31
- * fuer Time-Travel-Tests, kein global Temporal.Now)
29
+ * @param spec keepFor string such as "30d", "10y", "6m", "1w", "24h"
30
+ * @param now Current point in time (injection parameter for time-travel tests;
31
+ * not global Temporal.Now)
32
32
  */
33
33
  export function computeCutoff(spec, now) {
34
34
  const match = KEEP_FOR_PATTERN.exec(spec);
@@ -47,8 +47,8 @@ export function computeCutoff(spec, now) {
47
47
  return now.subtract({ hours: amount * daysFactor * 24 });
48
48
  }
49
49
  /**
50
- * Ist referenceTimestamp aelter als der keepFor-Cutoff bei now?
51
- * Cleanup-Job nutzt das pro Row.
50
+ * Determines whether referenceTimestamp is older than the keepFor cutoff at now.
51
+ * The cleanup job uses this for each row.
52
52
  */
53
53
  export function isPastCutoff(args) {
54
54
  const T = getTemporal();
@@ -1,9 +1,8 @@
1
1
  import * as z from "zod";
2
2
  /**
3
- * RetentionOverride-Zod-Schema mit .strict() — fuer (a) set-override-
4
- * Handler-Validation (S2.D3) und (b) DB-Loader im Cleanup-Job (S2.D2b)
5
- * der invalides JSON aus der config-Spalte loggt + skipt statt mit
6
- * undefined behavior weiterzumachen.
3
+ * Strict Zod schema for RetentionOverride, used by the set-override handler
4
+ * and the cleanup job's DB loader. The loader logs invalid JSON from the
5
+ * config column and skips it instead of continuing with undefined behavior.
7
6
  */
8
7
  export declare const retentionOverrideSchema: z.ZodObject<{
9
8
  keepFor: z.ZodOptional<z.ZodString>;
@@ -1,25 +1,23 @@
1
- // Zod-Schema fuer RetentionOverride mit .strict() — Sprint 2.D2.5 (M2+M3).
1
+ // Strict Zod schema for RetentionOverride.
2
2
  //
3
- // Symmetrisch zu compliance-profiles override-schema.ts (S1.9 Z3).
4
- // Sub-Sprint-Pattern (advisor-pinned): bei jedem User-konfigurierbarem
5
- // JSON-Override → strict-Zod + enum-validated.
3
+ // Symmetric with compliance-profiles override-schema.ts.
4
+ // Every user-configurable JSON override uses strict Zod validation
5
+ // with enum validation.
6
6
  //
7
- // Schuetzt vor:
8
- // - Top-Level-Tippfehler ("keepfor" statt "keepFor") — strict()-Reject
9
- // - Strategy-Enum-Drift ("delete" statt "hardDelete") — z.enum-Reject
10
- // - keepFor-Format-Drift ("30days" statt "30d") — regex-Reject
7
+ // Protects against:
8
+ // - Top-level typos ("keepfor" instead of "keepFor") — strict() rejects them
9
+ // - Strategy enum drift ("delete" instead of "hardDelete") — z.enum rejects it
10
+ // - keepFor format drift ("30days" instead of "30d") — regex rejects it
11
11
  //
12
- // Tenant-Override darf alle drei Properties weglassen (Resolver
13
- // fallback auf Preset/Entity-Default), aber WAS gesetzt ist muss
14
- // gueltig sein.
12
+ // A tenant override may omit all three properties (the resolver falls back
13
+ // to the preset/entity default), but every property that is set must be valid.
15
14
  import * as z from "zod";
16
15
  const KEEP_FOR_PATTERN = /^\d+[hdwmy]$/;
17
16
  const retentionStrategySchema = z.enum(["hardDelete", "softDelete", "anonymize", "blockDelete"]);
18
17
  /**
19
- * RetentionOverride-Zod-Schema mit .strict() — fuer (a) set-override-
20
- * Handler-Validation (S2.D3) und (b) DB-Loader im Cleanup-Job (S2.D2b)
21
- * der invalides JSON aus der config-Spalte loggt + skipt statt mit
22
- * undefined behavior weiterzumachen.
18
+ * Strict Zod schema for RetentionOverride, used by the set-override handler
19
+ * and the cleanup job's DB loader. The loader logs invalid JSON from the
20
+ * config column and skips it instead of continuing with undefined behavior.
23
21
  */
24
22
  export const retentionOverrideSchema = z
25
23
  .object({
@@ -8,13 +8,12 @@ import type { RetentionDef } from "@cosmicdrift/kumiko-framework/engine";
8
8
  export type RetentionPreset = Readonly<Record<string, RetentionDef>>;
9
9
  export type RetentionPresetKey = "default" | "dsgvo-basic" | "dsgvo-hgb" | "swiss-dsg";
10
10
  /**
11
- * MVP-Set für Sprint 2. Erweiterungen (hipaa, ccpa, aggressive-gdpr,
12
- * pipeda-default, ca-quebec-l25) kommen on-demand.
11
+ * Available presets. Additional options (hipaa, ccpa, aggressive-gdpr,
12
+ * pipeda-default, ca-quebec-l25) can be added on demand.
13
13
  */
14
14
  export declare const RETENTION_PRESETS: Readonly<Record<RetentionPresetKey, RetentionPreset>>;
15
15
  /**
16
- * Auswählbare Presets für den Onboarding-Banner. "default" ist Migration-
17
- * Edge-Case und wird nicht angezeigt — Production-Tenants wählen ein
18
- * echtes Preset.
16
+ * Presets available in the onboarding banner. `default` is a migration edge
17
+ * case and is not displayed; production tenants must choose an actual preset.
19
18
  */
20
19
  export declare const SELECTABLE_RETENTION_PRESETS: readonly RetentionPresetKey[];
@@ -1,32 +1,28 @@
1
- // Retention-Presets — vorgefertigte Bündel von per-Entity-Aufbewahrungs-
2
- // Konfigurationen pro Compliance-Regime. Tenant-Admin wählt EINES (analog
3
- // zu compliance-profiles); Entity-Default + Tenant-Override liegen als
4
- // Schichten 1+3 darüber (siehe resolver.ts).
1
+ // Retention presets — predefined bundles of per-entity retention
2
+ // configurations for each compliance regime. The tenant admin selects ONE
3
+ // (analogous to compliance profiles); the entity default and tenant override
4
+ // are layered above it as layers 1 and 3 (see resolver.ts).
5
5
  //
6
- // Plan-Roadmap docs/plans/datenschutz/core-data-retention.md hat 8 Presets
7
- // vorgeschlagen. Sprint-2-MVP: 3 Production-Presets + 1 dev-Default,
8
- // rest folgt on-demand wenn Customer fragt.
9
- //
10
- // Presets sind pure Daten — keine Logik. Erweitern = Constant erweitern,
11
- // kein Code-Eingriff.
6
+ // The presets are pure data with no logic. Extending them means extending the
7
+ // constant; no code changes are required.
12
8
  /**
13
- * MVP-Set für Sprint 2. Erweiterungen (hipaa, ccpa, aggressive-gdpr,
14
- * pipeda-default, ca-quebec-l25) kommen on-demand.
9
+ * Available presets. Additional options (hipaa, ccpa, aggressive-gdpr,
10
+ * pipeda-default, ca-quebec-l25) can be added on demand.
15
11
  */
16
12
  export const RETENTION_PRESETS = {
17
- // Default — keine Auto-Aktion. Nur sinnvoll für Dev/Staging.
18
- // Production-Tenant der "default" stehen lässt → Cleanup-Job
19
- // schreibt Audit-Eintrag "skipped: no preset selected".
13
+ // Default — no automatic action; intended only for Dev/Staging.
14
+ // A production tenant that leaves `default` selected causes the cleanup job
15
+ // to write the audit entry "skipped: no preset selected".
20
16
  default: {},
21
- // DSGVO Basic — Datenminimierung ohne Buchhaltungspflichten.
17
+ // DSGVO Basic — data minimization without accounting retention obligations.
22
18
  "dsgvo-basic": {
23
19
  "audit-log": { keepFor: "1y", strategy: "hardDelete", reference: "createdAt" },
24
20
  session: { keepFor: "30d", strategy: "hardDelete", reference: "lastSeenAt" },
25
21
  "http-log": { keepFor: "90d", strategy: "hardDelete", reference: "createdAt" },
26
22
  },
27
- // DSGVO + HGB — deutsche Aufbewahrungspflichten überlagert. Order
28
- // wird anonymisiert (PII raus, Geschäftsdaten bleiben), Invoice +
29
- // Booking sind blockDelete bis 10 Jahre, dann Anonymize.
23
+ // DSGVO + HGB — German statutory retention obligations take precedence.
24
+ // Orders are anonymized (PII removed while business data remains); invoices
25
+ // and bookings are blockDelete for up to 10 years, then anonymized.
30
26
  "dsgvo-hgb": {
31
27
  "audit-log": { keepFor: "1y", strategy: "hardDelete", reference: "createdAt" },
32
28
  session: { keepFor: "30d", strategy: "hardDelete", reference: "lastSeenAt" },
@@ -36,7 +32,7 @@ export const RETENTION_PRESETS = {
36
32
  contract: { keepFor: "6y", strategy: "blockDelete", reference: "createdAt" },
37
33
  order: { keepFor: "6y", strategy: "anonymize", reference: "completedAt" },
38
34
  },
39
- // Schweizer DSG — ähnlich DSGVO mit OR Art. 958f Aufbewahrung.
35
+ // Swiss DSG — similar to DSGVO, with retention under OR Art. 958f.
40
36
  "swiss-dsg": {
41
37
  "audit-log": { keepFor: "1y", strategy: "hardDelete", reference: "createdAt" },
42
38
  session: { keepFor: "30d", strategy: "hardDelete", reference: "lastSeenAt" },
@@ -44,9 +40,8 @@ export const RETENTION_PRESETS = {
44
40
  },
45
41
  };
46
42
  /**
47
- * Auswählbare Presets für den Onboarding-Banner. "default" ist Migration-
48
- * Edge-Case und wird nicht angezeigt — Production-Tenants wählen ein
49
- * echtes Preset.
43
+ * Presets available in the onboarding banner. `default` is a migration edge
44
+ * case and is not displayed; production tenants must choose an actual preset.
50
45
  */
51
46
  export const SELECTABLE_RETENTION_PRESETS = [
52
47
  "dsgvo-basic",
@@ -1,18 +1,19 @@
1
- // Leitet den Layer-2 Retention-Preset eines Tenants aus seinem Compliance-
2
- // Profile ab. Der retention-cleanup-Cron ruft das pro fan-out-Tenant.
1
+ // Derives a tenant's Layer-2 retention preset from its compliance profile.
2
+ // The retention-cleanup cron calls this once per fan-out tenant.
3
3
  //
4
- // **Soft-Dependency:** data-retention bleibt standalone-mountbar. Nur wenn
5
- // compliance-profiles mit-gemountet ist (seine Entity registriert), wird ein
6
- // Preset abgeleitet — sonst null, dann greifen ausschliesslich Entity-Defaults
7
- // (Layer 1) + per-Entity Tenant-Overrides (Layer 3). Kein r.requires, damit
8
- // eine App data-retention auch ohne Compliance-Profiles nutzen kann.
4
+ // **Soft dependency:** data-retention remains mountable standalone. A preset is
5
+ // derived only when compliance-profiles is mounted as well (its entity is
6
+ // registered); otherwise this returns null, leaving only entity defaults
7
+ // (Layer 1) and per-entity tenant overrides (Layer 3). No r.requires is used,
8
+ // so an app can use data-retention without compliance-profiles.
9
9
  //
10
- // Die Map ist intentional: Compliance-Profile (Region) und Retention-Preset
11
- // sind beide um dieselben drei Regimes gebaut (EU/CH/DE-HGB). swiss-dsg ist
12
- // sogar namensgleich. minimal-no-region → "default" (No-Op-Preset).
10
+ // The mapping is intentional: compliance profiles (regions) and retention
11
+ // presets are both built around the same three regimes (EU/CH/DE-HGB).
12
+ // swiss-dsg even has the same name. minimal-no-region maps to "default"
13
+ // (a no-op preset).
13
14
  import { resolveProfileForTenant } from "../compliance-profiles/index.js";
14
- // r.entity-Name aus compliance-profiles/feature.ts — Probe ob das Feature
15
- // gemountet ist, bevor wir seine Tabelle lesen (sonst wirft fetchOne).
15
+ // Entity name from compliance-profiles/feature.ts — check that the feature is
16
+ // mounted before reading its table; otherwise fetchOne throws.
16
17
  const COMPLIANCE_PROFILE_ENTITY = "tenant-compliance-profile";
17
18
  const PROFILE_TO_PRESET = {
18
19
  "eu-dsgvo": "dsgvo-basic",
@@ -24,11 +25,11 @@ export async function resolveTenantRetentionPreset(args) {
24
25
  if (!args.registry.getEntity(COMPLIANCE_PROFILE_ENTITY)) {
25
26
  return null;
26
27
  }
27
- // resolveProfileForTenant liest die 1:1-Profile-Row des Tenants (boot-DB,
28
- // by tenantId gefiltert) und faellt auf minimal-no-region zurueck wenn der
29
- // Tenant noch kein Profile gewaehlt hat.
28
+ // resolveProfileForTenant reads the tenant's 1:1 profile row from the boot DB,
29
+ // filtered by tenantId, and falls back to minimal-no-region when the tenant
30
+ // has not selected a profile yet.
30
31
  const effective = await resolveProfileForTenant({ db: args.db, tenantId: args.tenantId });
31
32
  return PROFILE_TO_PRESET[effective.profile.key] ?? null;
32
33
  }
33
- // Exportiert fuer den Unit-Test (Map-Vollstaendigkeit gegen ComplianceProfileKey).
34
+ // Exported for the unit test that checks completeness against ComplianceProfileKey.
34
35
  export { PROFILE_TO_PRESET };
@@ -1,9 +1,9 @@
1
1
  import type { EntityDefinition, RetentionDef } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import { type RetentionPresetKey } from "./presets.ts";
3
3
  /**
4
- * Roh-Override aus der DB-Tabelle (config-Spalte als JSON-String).
5
- * Nicht das gleiche wie RetentionDef weil hier alles optional ist —
6
- * Override darf einzelne Properties überschreiben.
4
+ * Raw override from the database table (the config column as a JSON string).
5
+ * Unlike RetentionDef, every property is optional because an override may
6
+ * replace individual properties.
7
7
  */
8
8
  export interface RetentionOverride {
9
9
  readonly keepFor?: string;
@@ -11,13 +11,13 @@ export interface RetentionOverride {
11
11
  readonly reference?: string;
12
12
  }
13
13
  /**
14
- * Effektive Policy nach Resolver-Lauf. Source dokumentiert WELCHE
15
- * Schicht den Wert geliefert hat — Audit-Trail für DPO.
14
+ * Effective policy after the resolver ran. `source` records WHICH layer
15
+ * supplied the value, as an audit trail for the DPO.
16
16
  *
17
- * `override-incomplete` bedeutet: Tenant-Override ist gesetzt, aber
18
- * füllt keepFor weder selbst noch via Preset-/Entity-Fallback.
19
- * Cleanup-Job logt eine Warning + skippt — anstatt mit Default-"0d"
20
- * sofort alles zu löschen.
17
+ * `override-incomplete` means a tenant override is set but fills keepFor
18
+ * neither itself nor through the preset/entity fallback. The cleanup job
19
+ * logs a warning and skips instead of deleting everything at once with a
20
+ * default "0d".
21
21
  */
22
22
  export interface EffectiveRetentionPolicy {
23
23
  readonly entityName: string;
@@ -31,8 +31,8 @@ export interface ResolveRetentionPolicyArgs {
31
31
  readonly tenantOverride: RetentionOverride | null;
32
32
  }
33
33
  /**
34
- * Auswertung der drei Schichten. Pure Function — kein DB-Access, alle
35
- * Inputs werden vom Caller besorgt (Cleanup-Job aggregiert pro Tenant
36
- * vorher).
34
+ * Resolves the three layers. This is a pure function with no database
35
+ * access; the caller supplies all inputs (the cleanup job aggregates them
36
+ * per tenant beforehand).
37
37
  */
38
38
  export declare function resolveRetentionPolicy(args: ResolveRetentionPolicyArgs): EffectiveRetentionPolicy;
@@ -1,42 +1,43 @@
1
- // 3-Schicht-Retention-Resolver.
1
+ // Three-layer retention resolver.
2
2
  //
3
- // Layer 1: Entity-Default — Feature-Author setzt r.entity({retention})
4
- // Layer 2: Tenant-Preset — Tenant-Admin wählt Bundle (RETENTION_PRESETS)
5
- // Layer 3: Tenant-Override — per (tenantId, entityName) JSON-Override
3
+ // Layer 1: Entity default — Feature author sets r.entity({retention})
4
+ // Layer 2: Tenant preset — Tenant admin selects a bundle (RETENTION_PRESETS)
5
+ // Layer 3: Tenant override — per (tenantId, entityName) JSON override
6
6
  //
7
- // Resolver-Reihenfolge:
7
+ // Resolution order:
8
8
  // effective = override(tenantId, entityName)
9
9
  // ?? preset[tenant.retentionPreset][entityName]
10
- // ?? entity.retention (Code-Default aus EntityDefinition)
11
- // ?? null (keine Auto-Aktion)
10
+ // ?? entity.retention (code default from EntityDefinition)
11
+ // ?? null (no automatic action)
12
12
  //
13
- // Cleanup-Job in S2.D2 ruft das pro (tenantId, entityName) und
14
- // entscheidet was zu tun ist (hardDelete / softDelete / anonymize /
15
- // blockDelete-mit-Frist-Check).
13
+ // The cleanup job resolves this for each (tenantId, entityName) and
14
+ // decides what to do (hardDelete / softDelete / anonymize /
15
+ // blockDelete with a grace-period check).
16
16
  //
17
- // Cross-Feature-API r.exposesApi("retention.policyFor") (S2.D3)
18
- // macht das aus user-data-rights heraus konsumierbar — Forget-Flow
19
- // fragt blockDelete-Felder ab + anonymisiert sie statt zu löschen.
17
+ // The cross-feature API r.exposesApi("retention.policyFor")
18
+ // makes this consumable by user-data-rights — the forget flow
19
+ // queries blockDelete fields and anonymizes them instead of deleting them.
20
20
  import { RETENTION_PRESETS } from "./presets.js";
21
21
  /**
22
- * Auswertung der drei Schichten. Pure Function — kein DB-Access, alle
23
- * Inputs werden vom Caller besorgt (Cleanup-Job aggregiert pro Tenant
24
- * vorher).
22
+ * Resolves the three layers. This is a pure function with no database
23
+ * access; the caller supplies all inputs (the cleanup job aggregates them
24
+ * per tenant beforehand).
25
25
  */
26
26
  export function resolveRetentionPolicy(args) {
27
27
  const { entityName, entityDef, tenantPreset, tenantOverride } = args;
28
- // Layer 3: Override wins, aber Override darf Felder weglassen — dann
29
- // fallen die einzelnen Properties auf Layer 2/1 zurück.
28
+ // Layer 3: Override wins, but it may omit fields, which then
29
+ // fall back to the individual properties from Layer 2 or 1.
30
30
  if (tenantOverride !== null) {
31
31
  const baseFromPreset = tenantPreset !== null ? (RETENTION_PRESETS[tenantPreset]?.[entityName] ?? null) : null;
32
32
  const baseFromEntity = entityDef?.retention ?? null;
33
33
  const base = baseFromPreset ?? baseFromEntity;
34
34
  const keepFor = tenantOverride.keepFor ?? base?.keepFor;
35
35
  const strategy = tenantOverride.strategy ?? base?.strategy;
36
- // keepFor + strategy sind Pflicht für jede aktive Policy. Wenn
37
- // weder Override noch Base sie liefert, ist das Override semantisch
38
- // unvollständig — Cleanup-Job soll WARNEN statt mit Default-"0d"
39
- // sofort alles löschen. Source-Marker dokumentiert das.
36
+ // keepFor + strategy are required for every active policy. If
37
+ // neither the override nor the base supplies them, the override is
38
+ // semantically incomplete — the cleanup job must warn instead of
39
+ // immediately deleting everything with the default "0d". The source
40
+ // marker documents this.
40
41
  if (keepFor === undefined || strategy === undefined) {
41
42
  return { entityName, policy: null, source: "override-incomplete" };
42
43
  }
@@ -58,6 +59,6 @@ export function resolveRetentionPolicy(args) {
58
59
  if (entityDef?.retention) {
59
60
  return { entityName, policy: entityDef.retention, source: "entity-default" };
60
61
  }
61
- // Nichts da — Cleanup-Job überspringt diese Entity für diesen Tenant.
62
+ // No policy is defined, so the cleanup job skips this entity for this tenant.
62
63
  return { entityName, policy: null, source: "none" };
63
64
  }
@@ -11,14 +11,16 @@ export interface RunRetentionCleanupArgs {
11
11
  /** Layer-2 preset from resolveTenantRetentionPreset, resolved once per tenant
12
12
  * by the caller rather than per entity here. null = layers 1 and 3 only. */
13
13
  readonly preloadedTenantPreset: RetentionPresetKey | null;
14
- /** Now-Injection — Tests pinnen den Wert ohne Date-Mock (Pattern keep-for.ts). */
14
+ /**
15
+ * Injects the current time so tests can pin it without mocking the date (pattern keep-for.ts).
16
+ */
15
17
  readonly now: Instant;
16
18
  readonly batchLimit?: number;
17
19
  /** Storage access for hardDelete entities with file/image/files/images fields.
18
20
  * Missing while fileRefs are due → the row stays (skipped "missing_file_storage"),
19
21
  * fail-closed instead of orphaning bytes. */
20
22
  readonly files?: FileContext;
21
- /** KMS for erasing a hardDeleted row's own subject key (Refs #2057). Defaults
23
+ /** KMS for erasing a hardDeleted row's own subject key. Defaults
22
24
  * to configuredPiiSubjectKms() (same fallback as run-forget-cleanup.ts);
23
25
  * undefined/no-KMS-configured skips erasure entirely — the row is still
24
26
  * hard-deleted, only crypto-shredding of its DEK is not attempted. */
@@ -33,7 +35,10 @@ export interface RunRetentionCleanupResult {
33
35
  readonly softDeleted: number;
34
36
  /** Rows deren anonymize-Feld-Funktionen angewendet wurden (anonymize + abgelaufene blockDelete). */
35
37
  readonly anonymized: number;
36
- /** Anomalien: Policy referenziert eine Spalte die die Tabelle nicht hat, oder anonymize ohne anonymize-Felder. */
38
+ /**
39
+ * Anomalies where the policy references a missing table column or anonymize has no anonymize
40
+ * fields.
41
+ */
37
42
  readonly skipped: readonly RetentionCleanupSkip[];
38
43
  }
39
44
  export declare function runRetentionCleanup(args: RunRetentionCleanupArgs): Promise<RunRetentionCleanupResult>;