@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
@@ -2,10 +2,9 @@ import { buildEntityTable } from "@cosmicdrift/kumiko-framework/db";
2
2
  import { access, createBooleanField, createDerivedField, createEntity, createMultiSelectField, createSelectField, createTextField, createTimestampField, createTzField, } from "@cosmicdrift/kumiko-framework/engine";
3
3
  import { GLOBAL_ROLE_OPTIONS } from "../web/constants.js";
4
4
  /**
5
- * User-Lifecycle-Status (S2.U1). Single source of truth — Auth-Middleware
6
- * (S2.U6), Forget-Job (S2.U5) und Restriction-Handler nutzen diese
7
- * Constants statt Magic-Strings (Memory feedback_role_naming_drift —
8
- * gleiches Pattern wie ROLES.SystemAdmin).
5
+ * User lifecycle status. This is the single source of truth used by the
6
+ * auth middleware, forget job, and restriction handler instead of duplicated
7
+ * magic strings, following the same pattern as ROLES.SystemAdmin.
9
8
  */
10
9
  export const USER_STATUS = {
11
10
  Active: "active",
@@ -14,24 +13,25 @@ export const USER_STATUS = {
14
13
  Deleted: "deleted",
15
14
  };
16
15
  /**
17
- * Anonymize-Display-Strings fuer userDeleteHook (S2.H1). Constants statt
18
- * Magic-Strings damit i18n-Mapping moeglich + drift-fest. Default-DE,
19
- * App-Author kann via i18n-System uebersetzen wenn gewuenscht.
16
+ * Display strings anonymized by userDeleteHook. Constants keep i18n mapping
17
+ * possible and prevent drift. The default is German; app authors can
18
+ * translate it through the i18n system if desired.
20
19
  */
21
20
  export const USER_DELETED_DISPLAY_NAME = "[Geloescht]";
22
21
  export const USER_ANONYMIZED_DISPLAY_NAME = "[Anonymisiert]";
23
22
  /**
24
- * Email-Pseudonyme nach Forget. `<prefix>-<userId>@anonymized.invalid`
25
- * — der userId-Suffix ist als Pseudo-Audit-Marker fuer Operator
26
- * (Tracing-fall) erlaubt; user-id selbst ist UUID, kein PII.
27
- * `.invalid`-TLD ist RFC2606-reserviert — niemals deliverbare Email.
23
+ * Email pseudonyms used after forgetting. `<prefix>-<userId>@anonymized.invalid`
24
+ * — the userId suffix is permitted as a pseudo-audit marker for operator
25
+ * tracing; the user ID itself is a UUID, not PII.
26
+ * The `.invalid` TLD is reserved by RFC2606, so the address can never be
27
+ * delivered.
28
28
  */
29
29
  export const USER_DELETED_EMAIL_PREFIX = "deleted";
30
30
  export const USER_ANONYMIZED_EMAIL_PREFIX = "anonymized";
31
31
  export const USER_ANONYMIZED_EMAIL_DOMAIN = "anonymized.invalid";
32
- // Tuple form fuer createSelectField (erfordert non-empty readonly tuple).
33
- // Object.values(USER_STATUS) waere string[] — statisches Tuple ist
34
- // type-sicher.
32
+ // Tuple form for createSelectField (requires a non-empty readonly tuple).
33
+ // Object.values(USER_STATUS) would be string[]; the static tuple preserves
34
+ // type safety.
35
35
  const USER_STATUS_OPTIONS = [
36
36
  USER_STATUS.Active,
37
37
  USER_STATUS.Restricted,
@@ -45,10 +45,10 @@ export const userEntity = createEntity({
45
45
  table: "read_users",
46
46
  softDelete: true,
47
47
  // Tenant-independent identity aggregate — its event stream lives on
48
- // SYSTEM_TENANT_ID instead of whichever tenant happened to create it (#497).
48
+ // SYSTEM_TENANT_ID instead of whichever tenant happened to create it.
49
49
  systemStream: true,
50
50
  // Every row lives on SYSTEM_TENANT_ID; writes with another tenantId are
51
- // rejected (fw#2858).
51
+ // rejected.
52
52
  tenancy: "global",
53
53
  fields: {
54
54
  // Identity — anyone who can see the user can read the email, but only
@@ -81,17 +81,17 @@ export const userEntity = createEntity({
81
81
  reason: "credential_hash_read_without_decrypt",
82
82
  }),
83
83
  // Profile — user-editable. Real name in most apps → PII. Searchable via
84
- // the derived Meili index; events/projection stay ciphertext (#1610).
84
+ // the derived Meili index; events/projection stay ciphertext.
85
85
  displayName: createTextField({
86
86
  required: true,
87
87
  maxLength: 100,
88
88
  personal: "self",
89
89
  find: "fuzzy",
90
90
  }),
91
- // No default here — tenant-settings owns the app-wide locale default; see #1637.
91
+ // No default here — tenant-settings owns the app-wide locale default.
92
92
  locale: createTextField({ maxLength: 10, personal: false, reason: "technical_reference" }),
93
93
  // No default here — mirrors locale: ctx.tz falls back to tenant.timezone
94
- // (then "UTC") when unset, see buildHandlerContext (fw#1636).
94
+ // (then "UTC") when unset, see buildHandlerContext.
95
95
  timezone: createTzField(),
96
96
  // Which tenant should this user land in on next login. Set by the login
97
97
  // handler (SYSTEM), read by the login flow + UI for deep-linking.
@@ -121,21 +121,22 @@ export const userEntity = createEntity({
121
121
  default: [],
122
122
  access: { write: access.privileged },
123
123
  }),
124
- // S2.U1: User-Lifecycle-Status für user-data-rights (Sprint 2).
125
- // - "active": Normaler State, alle Operationen erlaubt
126
- // - "restricted": Art. 18 Restriction — Login blockiert + jede
127
- // Live-Session wird vom sessionChecker abgewiesen
124
+ // User lifecycle status for user-data-rights.
125
+ // - "active": Normal state; all operations are allowed.
126
+ // - "restricted": Art. 18 restriction — login is blocked and every
127
+ // live session is rejected by sessionChecker
128
128
  // ("blocked"). Recovery via lift-restriction
129
- // (openToAll, session-unabhängig).
130
- // - "deletionRequested": delete-account aufgerufen, gracePeriodEnd gesetzt,
131
- // Login blockiert. Bestehende Session bleibt LIVE
132
- // (reversibel) — User kann via cancel-deletion
133
- // zurück auf "active".
134
- // - "deleted": Forget executed nach Grace, Row anonymisiert via
135
- // softDelete. Login blockiert + Session "blocked".
129
+ // (openToAll, independent of the session).
130
+ // - "deletionRequested": delete-account was called and gracePeriodEnd set;
131
+ // login is blocked. Existing sessions remain LIVE
132
+ // (reversible), so the user can return to "active"
133
+ // via cancel-deletion.
134
+ // - "deleted": Forget was executed after the grace period; the row
135
+ // was anonymized via softDelete. Login is blocked and
136
+ // the session is "blocked".
136
137
  //
137
- // Schreibrecht privileged: nur die request-deletion / restrict / lift /
138
- // execute-forget-Handler (alle SYSTEM-context) duerfen status flippen.
138
+ // Write access is privileged: only the request-deletion / restrict / lift /
139
+ // execute-forget handlers (all in SYSTEM context) may change the status.
139
140
  status: createSelectField({
140
141
  required: true,
141
142
  default: USER_STATUS.Active,
@@ -143,21 +144,21 @@ export const userEntity = createEntity({
143
144
  sortable: true,
144
145
  access: { write: access.privileged },
145
146
  }),
146
- // Wann darf der pending-Forget tatsaechlich ausgefuehrt werden?
147
- // Cron-Job in user-data-rights checkt taeglich gracePeriodEnd < now()
148
- // und triggert dann die EXT_USER_DATA-Hooks. NULL solange kein
149
- // Forget pending — wird beim delete-account-Call gesetzt
150
- // (= now() + Compliance-Profile.userRights.gracePeriod), beim
151
- // cancel-deletion zurueckgesetzt.
147
+ // When a pending forget may actually be executed.
148
+ // The user-data-rights cron job checks daily whether gracePeriodEnd < now()
149
+ // and then triggers the EXT_USER_DATA hooks. NULL means no forget is pending;
150
+ // delete-account sets it to
151
+ // (= now() + Compliance-Profile.userRights.gracePeriod), and
152
+ // cancel-deletion resets it.
152
153
  gracePeriodEnd: createTimestampField({
153
154
  access: { write: access.privileged },
154
155
  }),
155
- // Replay-Schutz für den anonymen email-Token-Deletion-Flow (#354/1).
156
- // Gesetzt von request-deletion-by-email (eine UUID pro Mail-Antrag),
157
- // genullt von cancel-deletion. confirm-deletion-by-token faltet diese ID
158
- // in die HMAC-Purpose des Tokens — ein nach einem Cancel nachgespieltes
159
- // (noch TTL-gültiges) Token verifiziert gegen die genullte/erneuerte ID
160
- // nicht mehr. NULL solange kein email-Antrag offen ist.
156
+ // Replay protection for the anonymous email-token deletion flow.
157
+ // request-deletion-by-email sets one UUID per email request, and
158
+ // cancel-deletion clears it. confirm-deletion-by-token incorporates this ID
159
+ // into the token's HMAC purpose, so a token replayed after cancellation
160
+ // (while still within its TTL) no longer verifies against the cleared or
161
+ // renewed ID. NULL means no email request is pending.
161
162
  pendingDeletionRequestId: createTextField({
162
163
  maxLength: 36,
163
164
  access: { write: access.privileged },
@@ -4,28 +4,28 @@ import { type SeedTenantHooks } from "../tenant/seeding.ts";
4
4
  export type SeedUserOptions = {
5
5
  readonly email: string;
6
6
  readonly displayName: string;
7
- /** Optional bereits-gehashtes Passwort. Für plain-password-Tests
8
- * besser den Convenience-Wrapper aus
9
- * `@cosmicdrift/kumiko-bundled-features/auth-email-password/seeding` nutzen,
10
- * der argon2-Hashing übernimmt. */
7
+ /** Optional pre-hashed password. For plain-password tests, prefer the
8
+ * convenience wrapper from
9
+ * `@cosmicdrift/kumiko-bundled-features/auth-email-password/seeding`,
10
+ * which performs argon2 hashing. */
11
11
  readonly passwordHash?: string;
12
12
  readonly locale?: string;
13
- /** Global roles — land in users.roles as jsonb string[].
14
- * Werden vom login-handler in die Session-Roles parallel zu tenant-
15
- * membership-roles gemerged. Default: leer-array. Typisches Beispiel:
16
- * `["SystemAdmin"]` für den Plattform-Operator. */
13
+ /** Global roles—stored in users.roles as jsonb string[].
14
+ * The login handler merges them into the session roles alongside tenant-
15
+ * membership roles. Default: empty array. Typical example:
16
+ * `["SystemAdmin"]` for the platform operator. */
17
17
  readonly roles?: readonly string[];
18
- /** Initial-State für emailVerified. Default false (Pflicht-Verify-Flow
19
- * muss explizit "true" setzen wenn Email-Ownership schon bewiesen ist —
20
- * z.B. Magic-Link-Signup, wo der User den Mail-Link klicken musste
21
- * bevor sein Account überhaupt entsteht). */
18
+ /** Initial state for emailVerified. Default: false. The required
19
+ * verification flow must explicitly set "true" when email ownership has
20
+ * already been proven—for example, in a Magic-Link signup where the user
21
+ * clicked the email link before the account was created. */
22
22
  readonly emailVerified?: boolean;
23
23
  readonly by?: SessionUser;
24
24
  };
25
25
  /**
26
- * Seed a user. Returns the userId (existing oder neu angelegt).
27
- * Idempotent add-only über die `email`-Spalte: wenn ein User mit dieser
28
- * Email existiert, kommt seine ID zurück ohne neuen Insert.
26
+ * Seeds a user. Returns the userId (existing or newly created).
27
+ * Idempotent and add-only via the `email` column: if a user with this
28
+ * email exists, its ID is returned without a new insert.
29
29
  */
30
30
  export declare function seedUser(db: DbConnection, options: SeedUserOptions, hooks?: SeedTenantHooks): Promise<{
31
31
  id: string;
@@ -1,40 +1,40 @@
1
- // Testing-Helper fürs user-Feature. `seedUser` legt einen User direkt
2
- // über den Event-Store-Executor an — gleicher Pfad wie der echte
3
- // `UserHandlers.create`, aber ohne Access-Check und ohne ConflictError
4
- // bei Duplikaten. Idempotent add-only über die `email`-Spalte: ein
5
- // existierender User → return ohne Event. Kein update-Pfad — Profilfelder
6
- // ändern läuft über den regulären Handler.
1
+ // Testing helper for the user feature. `seedUser` creates a user directly
2
+ // through the event-store executor—the same path as the real
3
+ // `UserHandlers.create`, but without access checks or ConflictError on
4
+ // duplicates. It is idempotent and add-only via the `email` column: an
5
+ // existing user returns without emitting an event. There is no update path;
6
+ // profile changes go through the regular handler.
7
7
  //
8
- // Warum nicht direkt `db.insert(userTable)`: das würde den Event-Store
9
- // umgehen, also kein `user.created`-Event und keine MSP-Konsumenten
10
- // (audit, search-index) sehen den Seed. Der Executor-Pfad emittiert
11
- // das Event UND schreibt die Projection-Zeile in einer TX.
8
+ // Directly calling `db.insert(userTable)` would bypass the event store, so no
9
+ // `user.created` event would be emitted and no MSP consumers (audit,
10
+ // search-index) would see the seed. The executor path emits the event and
11
+ // writes the projection row in one transaction.
12
12
  import { computeBlindIndex, configuredBlindIndexKey } from "@cosmicdrift/kumiko-framework/crypto";
13
13
  import { createEventStoreExecutor, createTenantDb, fetchOne, } from "@cosmicdrift/kumiko-framework/db";
14
14
  import { TestUsers } from "@cosmicdrift/kumiko-framework/seeding";
15
- // kumiko-lint-ignore cross-feature-import shares the postSave-hooks fixture contract with tenant/seeding (#1478)
15
+ // kumiko-lint-ignore cross-feature-import shares the postSave-hooks fixture contract with tenant/seeding
16
16
  import { fireEntityPostSave } from "../tenant/seeding.js";
17
17
  import { userEntity, userTable } from "./schema/user.js";
18
18
  const userExecutor = createEventStoreExecutor(userTable, userEntity, { entityName: "user" });
19
19
  /**
20
- * Seed a user. Returns the userId (existing oder neu angelegt).
21
- * Idempotent add-only über die `email`-Spalte: wenn ein User mit dieser
22
- * Email existiert, kommt seine ID zurück ohne neuen Insert.
20
+ * Seeds a user. Returns the userId (existing or newly created).
21
+ * Idempotent and add-only via the `email` column: if a user with this
22
+ * email exists, its ID is returned without a new insert.
23
23
  */
24
24
  export async function seedUser(db, options,
25
25
  // Optional, append-only — same rationale as tenant/seeding's seedTenant
26
- // hooks param (#1478): fires user's postSave hooks (e.g. a Welcome-
26
+ // hooks param: fires user's postSave hooks (e.g. a Welcome-
27
27
  // notification hook keyed off `allOf: "user"`) for fixtures/self-signup
28
28
  // that opt in. Omit to keep today's hook-less behavior.
29
29
  hooks) {
30
30
  const by = options.by ?? TestUsers.systemAdmin;
31
- // executor.create erwartet eine TenantDb (mit .insert()-API). User
32
- // ist zwar tenant-agnostic (kein tenant_id-Spalte), aber das runtime-
33
- // Interface braucht den Wrap.
31
+ // executor.create expects a TenantDb (with an .insert() API). Although
32
+ // User is tenant-agnostic (it has no tenant_id column), the runtime
33
+ // interface requires this wrapper.
34
34
  const tdb = createTenantDb({ db, tenantId: by.tenantId, mode: "system" });
35
35
  const existing = await fetchOne(db, userTable, { email: options.email, isDeleted: false });
36
- // @cast-boundary db-row: users.id ist uuid-Spalte (string), fetchOne
37
- // liefert die Projection-Row als Record<string, unknown>.
36
+ // @cast-boundary db-row: users.id is a uuid column (string), and fetchOne
37
+ // returns the projection row as Record<string, unknown>.
38
38
  if (existing) {
39
39
  const id = existing["id"];
40
40
  if (options.emailVerified === true) {
@@ -57,13 +57,13 @@ hooks) {
57
57
  return { id: extractId(result.data, "seedUser") };
58
58
  }
59
59
  // A re-run seed onto a row created before emailVerified flipped to true must
60
- // still set it (#1687) — via the executor, so it lands as a real `.updated` event.
60
+ // still set it — via the executor, so it lands as a real `.updated` event.
61
61
  export async function reconcileSeededUserEmailVerified(db, existingRow, by) {
62
62
  // skip: already verified, nothing to reconcile
63
63
  if (existingRow["emailVerified"] === true)
64
64
  return;
65
- // @cast-boundary db-row: users.id ist uuid-Spalte (string), fetchOne
66
- // liefert die Projection-Row als Record<string, unknown>.
65
+ // @cast-boundary db-row: users.id is a uuid column (string), and fetchOne
66
+ // returns the projection row as Record<string, unknown>.
67
67
  const id = existingRow["id"];
68
68
  const tdb = createTenantDb({ db, tenantId: by.tenantId, mode: "system" });
69
69
  const result = await userExecutor.update({ id, version: existingRow["version"], changes: { emailVerified: true } }, by, tdb);
@@ -111,11 +111,11 @@ export async function rewriteSeededUserEmail(db, existingRow, email, by) {
111
111
  throw new Error(`rewriteSeededUserEmail failed: ${result.error.code} — ${JSON.stringify(result.error.details ?? {})}`);
112
112
  }
113
113
  }
114
- // Extrahiert die `id`-Spalte aus dem executor.create-Result. Der
115
- // Executor liefert ein Record<string, unknown> (die Projection-Row), in
116
- // das die DB die Aggregat-id reinschreibt — wir prüfen runtime statt
117
- // blindem `as { id: string }`-Cast, damit ein API-Vertragsbruch sofort
118
- // als ehrlicher Throw rauskommt statt downstream als undefined-Bug.
114
+ // Extracts the `id` column from the executor.create result. The executor
115
+ // returns a Record<string, unknown> (the projection row), into which the DB
116
+ // writes the aggregate ID. We validate it at runtime instead of using a
117
+ // blind `as { id: string }` cast, so an API contract violation throws an
118
+ // explicit error rather than surfacing downstream as an undefined-value bug.
119
119
  function extractId(data, who) {
120
120
  if (typeof data === "object" && data !== null && "id" in data) {
121
121
  const id = data.id; // @cast-boundary engine-bridge
@@ -1,4 +1,4 @@
1
- // /testing re-exportiert /seeding. Siehe ../tenant/testing.ts für die
2
- // Begründung — Helpers sind shared zwischen Tests und Dev-Server-
3
- // Bootstrap, /seeding ist die stabile Heimat.
1
+ // /testing re-exports /seeding. See ../tenant/testing.ts for the
2
+ // reason: helpers are shared between tests and Dev-Server bootstrap,
3
+ // and /seeding is the stable home.
4
4
  export * from "./seeding.js";
@@ -8,11 +8,11 @@ export interface RecordDownloadUseArgs {
8
8
  readonly tokenVersion: number;
9
9
  readonly tokenUseCount: number;
10
10
  /**
11
- * Tenant fuer die system-mode-TenantDb. ExportDownloadToken ist
12
- * tenant-agnostisch (1:1 zum tenant-agnostic Job), aber der event-
13
- * store-Stream-Lookup braucht einen Tenant-Context. Wir nutzen
14
- * job.requestedFromTenantId — dieselbe Identitaet wie beim
15
- * Token-Create im Worker (Atom 4a).
11
+ * Tenant for the system-mode TenantDb. ExportDownloadToken is
12
+ * tenant-agnostic (1:1 with the tenant-agnostic job), but the event-store
13
+ * stream lookup requires a tenant context. We use
14
+ * job.requestedFromTenantId — the same identity used when creating the
15
+ * token in the worker.
16
16
  */
17
17
  readonly tenantId: TenantId;
18
18
  readonly now: Instant;
@@ -20,9 +20,9 @@ export interface RecordDownloadUseArgs {
20
20
  readonly userAgent: string | null;
21
21
  }
22
22
  /**
23
- * Audit-Update: useCount, lastUsedAt, IP, UA. Best-effort —
24
- * version-conflicts (parallel-downloads) werden swallowed, Download
25
- * succeeded trotzdem.
23
+ * Audit update: useCount, lastUsedAt, IP, and UA. Best-effort —
24
+ * version conflicts (parallel downloads) are swallowed, so the download
25
+ * still succeeds.
26
26
  */
27
27
  export declare function recordDownloadUse(args: RecordDownloadUseArgs): Promise<void>;
28
28
  export type DownloadAttemptResult = "notFound" | "expired" | "failed" | "signedUrlNotSupported";
@@ -1,19 +1,18 @@
1
- // Audit-Helper fuer Download-Endpoint (S2.U3 Atom 4b).
1
+ // Audit helper for the download endpoint.
2
2
  //
3
- // Beim Download (Token-Pfad oder Job-Pfad) werden Audit-Felder am
4
- // Token-Row aktualisiert:
3
+ // During a download (token path or job path), audit fields on the token row
4
+ // are updated:
5
5
  // - useCount + 1
6
6
  // - lastUsedAt = now
7
- // - lastUsedFromIp = caller-IP (X-Forwarded-For oder Connection-IP)
8
- // - lastUsedUserAgent = UA-Header
7
+ // - lastUsedFromIp = caller IP (X-Forwarded-For or connection IP)
8
+ // - lastUsedUserAgent = UA header
9
9
  //
10
- // **Best-Effort-Update:** version-conflicts (zwei parallel-Downloads
11
- // raceen um den update) werden silent geswallowt — Audit ist "letzter
12
- // Use", nicht "alle Uses". Der zweite Download succeeded trotzdem
13
- // (kein download-block bei race).
10
+ // **Best-effort update:** version conflicts (two downloads racing to update)
11
+ // are silently swallowed — the audit records the "last use", not "all uses".
12
+ // The second download still succeeds (a race does not block the download).
14
13
  //
15
- // **ES via tokenCrud.update:** kein direct-UPDATE. Memory
16
- // `feedback_no_fake_dispatcher` + `feedback_event_store_tenant_consistency`.
14
+ // **ES via tokenCrud.update:** no direct UPDATE, so the event-store and tenant
15
+ // consistency rules remain in effect.
17
16
  import { createEventStoreExecutor, createTenantDb } from "@cosmicdrift/kumiko-framework/db";
18
17
  import { createSystemUser } from "@cosmicdrift/kumiko-framework/engine";
19
18
  import { tokenCrud } from "./run-export-jobs.js";
@@ -22,9 +21,9 @@ const attemptCrud = createEventStoreExecutor(downloadAttemptsTable, downloadAtte
22
21
  entityName: "download-attempt",
23
22
  });
24
23
  /**
25
- * Audit-Update: useCount, lastUsedAt, IP, UA. Best-effort —
26
- * version-conflicts (parallel-downloads) werden swallowed, Download
27
- * succeeded trotzdem.
24
+ * Audit update: useCount, lastUsedAt, IP, and UA. Best-effort —
25
+ * version conflicts (parallel downloads) are swallowed, so the download
26
+ * still succeeds.
28
27
  */
29
28
  export async function recordDownloadUse(args) {
30
29
  const { db, tokenId, tokenVersion, tokenUseCount, tenantId, now, ip, userAgent } = args;
@@ -42,14 +41,14 @@ export async function recordDownloadUse(args) {
42
41
  },
43
42
  }, executor, tdb)
44
43
  .catch(() => {
45
- // version-conflict bei parallelen Downloads → der erste hat
46
- // bereits useCount inkrementiert. Wir behalten den Audit-Eintrag
47
- // des ersten Downloads (lastUsedAt etc.). Kein download-block.
44
+ // A version conflict means a parallel download already incremented
45
+ // useCount. Keep the first download's audit entry (lastUsedAt, etc.);
46
+ // do not block the download.
48
47
  });
49
48
  }
50
- // Best-effort INSERT in read_download_attempts. Throws im Audit-Pfad
51
- // duerfen den Download-Endpoint nicht killen (User soll seinen 404
52
- // bekommen, nicht 500); failures werden silent geswallowt.
49
+ // Best-effort INSERT into read_download_attempts. Errors in the audit path
50
+ // must not kill the download endpoint: the user should receive their 404,
51
+ // not a 500; failures are silently swallowed.
53
52
  export async function recordInvalidAttempt(args) {
54
53
  const { db, tenantId, now } = args;
55
54
  const executor = createSystemUser(tenantId);
@@ -7,7 +7,7 @@ import { entitiesOf } from "../shared/index.js";
7
7
  // only; runtime no-ops (a delete hook that silently skips) are not detectable
8
8
  // here — those are covered by the export/forget integration tests.
9
9
  //
10
- // Registered as an `r.bootCheck()` by this feature (#1314) — EXT_USER_DATA is
10
+ // Registered as an `r.bootCheck()` by this feature — EXT_USER_DATA is
11
11
  // owned by user-data-rights (r.extendsRegistrar(EXT_USER_DATA, {})), so any
12
12
  // r.useExtension(EXT_USER_DATA, ...) usage across the app already requires
13
13
  // user-data-rights to be mounted (boot-validator's extension-provider check
@@ -2,7 +2,7 @@
2
2
  // subject is the user, the anchor is the pending request id stored on the
3
3
  // user row. Minting and verification both run through
4
4
  // shared/row-bound-grant, so a token from a cancelled cycle (id nulled) or a
5
- // superseded one (row holds a newer id) fails verification — see #354/1.
5
+ // superseded one (row holds a newer id) fails verification.
6
6
  //
7
7
  // The purpose string and the anchoring are unchanged from the hand-rolled
8
8
  // version this replaced, so tokens stay byte-compatible.
@@ -5,75 +5,74 @@ import { type GdprMailDefaults } from "./lib/default-mailers.ts";
5
5
  import { type SendExportFailedEmailFn, type SendExportReadyEmailFn } from "./run-export-jobs.ts";
6
6
  import { type SendDeletionExecutedEmailFn } from "./run-forget-cleanup.ts";
7
7
  /**
8
- * Options fuer createUserDataRightsFeature. Notification-Callbacks
9
- * (Atom 5) folgen dem password-reset-Pattern aus auth-routes.ts.
8
+ * Options for createUserDataRightsFeature. Notification callbacks follow
9
+ * the password-reset pattern in auth-routes.ts.
10
10
  *
11
- * Plain-Token landet NIE in DB/event-store/jobRunsTable — Worker reicht
12
- * ihn ephemeral via Callback-arg an die App-Author-Implementation
13
- * (typisch: `delivery.notify(...)` mit `r.notification`-Templates,
14
- * `mailFoundation.send` direkt, oder Custom Resend/SES).
11
+ * The plain token is never stored in the DB, event store, or jobRunsTable.
12
+ * The worker passes it ephemerally as a callback argument to the app-author
13
+ * implementation (typically `delivery.notify(...)` with `r.notification`
14
+ * templates, `mailFoundation.send` directly, or custom Resend/SES).
15
15
  *
16
- * Worker-Run-Tracking + Retry kommt automatisch via existing
17
- * `jobs`-Feature (siehe CLAUDE.md "Bundled-Features by Concern").
16
+ * Worker-run tracking and retries are provided automatically by the existing
17
+ * `jobs` feature.
18
18
  */
19
19
  export type UserDataRightsOptions = {
20
- /** Email-Notification beim Export-done. App-Author wired das an seinen
21
- * Email-Provider. Best-effort (Atom 5.fix3): send-Throw fuer Job A
22
- * killt den Batch nicht — restliche pending-Jobs werden weiter
23
- * verarbeitet, Failure wird via console.warn sichtbar. (Vorher
24
- * bubbelte der Throw zum r.job-Wrap, was bei mehreren pending Jobs
25
- * zum silent-miss fuehrte: Job A done committed, B/C/D nie
26
- * verarbeitet, retry findet niemand.) */
20
+ /** Email notification when the export completes. The app author connects it
21
+ * to an email provider. Best effort: a send failure for Job A does not stop
22
+ * the batch; remaining pending jobs continue, and the failure is exposed via
23
+ * console.warn. Previously, the error reached the r.job wrapper, so with
24
+ * multiple pending jobs A could commit while B/C/D were never processed and
25
+ * no retry could find them. */
27
26
  readonly sendExportReadyEmail?: SendExportReadyEmailFn;
28
27
  /** Email-Notification beim Export-failed. Best-effort analog
29
28
  * sendExportReadyEmail. */
30
29
  readonly sendExportFailedEmail?: SendExportFailedEmailFn;
31
- /** Base-URL fuer den Magic-Link, z.B.
32
- * "https://app.example.com/user-export/by-token". Worker bauen
33
- * a URL fragment (`#token=<plain>`, issue #1271). Required wenn
34
- * sendExportReadyEmail gesetzt. Per-Tenant via reverse-proxy host
35
- * routing — nicht via per-Tenant-config-key (App-Author-Decision). */
30
+ /** Base URL for the magic link, e.g.
31
+ * "https://app.example.com/user-export/by-token". The worker builds
32
+ * a URL fragment (`#token=<plain>`). Required when
33
+ * sendExportReadyEmail is set. Routing uses the reverse-proxy host per
34
+ * tenant rather than a per-tenant config key. */
36
35
  readonly appExportDownloadUrl?: string;
37
- /** Atom 5b — Email-Notification beim deletion-requested-flip
38
- * ("Account-Loeschung in 30 Tagen"). Best-effort: send-failure killt
39
- * den Status-Flip nicht (siehe handlers/request-deletion.write.ts). */
36
+ /** Email notification when deletion is requested ("account deletion in
37
+ * 30 days"). Best effort: a send failure does not abort the status flip
38
+ * (see handlers/request-deletion.write.ts). */
40
39
  readonly sendDeletionRequestedEmail?: SendDeletionRequestedEmailFn;
41
- /** Atom 5b — Email-Notification beim Cleanup-Runner-done-Pfad
42
- * ("Account wurde geloescht"). Best-effort. Der Versand passiert NACH
43
- * dem User-Hook-Anonymisieren, deshalb cached der Worker
44
- * userEmail+tenantIds PRE-tx und reicht sie ephemeral an die
45
- * Callback-Implementation (siehe run-forget-cleanup.ts). */
40
+ /** Email notification after the cleanup runner completes ("account deleted").
41
+ * Best effort. Delivery occurs after the user hook anonymizes the user, so
42
+ * the worker caches userEmail+tenantIds before the transaction and passes
43
+ * them ephemerally to the callback implementation (see
44
+ * run-forget-cleanup.ts). */
46
45
  readonly sendDeletionExecutedEmail?: SendDeletionExecutedEmailFn;
47
- /** Anonymer, email-verifizierter Apex-Deletion-Flow (Lockout-sicher).
48
- * HMAC-Secret zum Signieren des Verify-Tokens. Ohne Secret bleibt der
49
- * Flow deaktiviert (request-by-email antwortet still success, confirm-
50
- * by-token weist generisch ab). */
46
+ /** Anonymous, email-verified apex deletion flow that is safe against lockout.
47
+ * HMAC secret for signing the verification token. Without a secret, the
48
+ * flow remains disabled: request-by-email returns success silently, while
49
+ * confirm-by-token rejects generically. */
51
50
  readonly deletionTokenSecret?: string;
52
- /** Basis-URL des Apex-Confirm-Screens, z.B.
53
- * "https://app.example.com/delete-account/confirm". Der Handler hängt das
54
- * Token als URL-Fragment an (`#token=<token>`, fw#1554). Required wenn
55
- * deletionTokenSecret gesetzt. */
51
+ /** Base URL of the apex confirmation screen, e.g.
52
+ * "https://app.example.com/delete-account/confirm". The handler appends
53
+ * the token as a URL fragment (`#token=<token>`). Required when
54
+ * deletionTokenSecret is set. */
56
55
  readonly deletionVerifyUrl?: string;
57
- /** Versand des Verify-Magic-Links (Schritt 1 des anonymen Flows).
58
- * Best-effort, app-author-wired. MUSS non-blocking sein (enqueue, z.B.
59
- * delivery.notify) — ein synchroner Send reintroduziert ein Timing-Oracle
60
- * für Account-Enumeration (siehe SendDeletionVerificationEmailFn-Doc).
61
- * Bewusst KEINE mail-foundation-Default: ein synchroner Default-Send
62
- * brächte genau dieses Enumeration-Oracle zurück, deshalb app-wired. */
56
+ /** Sends the verification magic link (step 1 of the anonymous flow).
57
+ * Best effort and wired by the app author. It MUST be non-blocking (enqueue,
58
+ * e.g. via delivery.notify): a synchronous send would reintroduce a timing
59
+ * oracle for account enumeration (see SendDeletionVerificationEmailFn-doc).
60
+ * There is deliberately no mail-foundation default because a synchronous
61
+ * default send would restore that enumeration oracle. */
63
62
  readonly sendDeletionVerificationEmail?: SendDeletionVerificationEmailFn;
64
- /** C6 — Zero-Callback-GDPR-Mails: ist mail-foundation + ein mail-transport-*
65
- * gemountet, versendet user-data-rights die Export-/Loesch-Notifications
66
- * selbst (Export-ready/-failed, Deletion-requested/-executed) ueber die
67
- * Default-Templates (email-templates.ts) — die App schreibt keinen Callback.
68
- * `mailDefaults` brandet diese Default-Mails (Locale + App-Name). Greift NUR
69
- * wenn der jeweilige send*Email-Opt NICHT gesetzt ist; Export-ready braucht
70
- * zusaetzlich appExportDownloadUrl. */
63
+ /** Zero-callback GDPR mail: when mail-foundation and a mail-transport-* are
64
+ * mounted, user-data-rights sends export and deletion notifications itself
65
+ * (export-ready/-failed, deletion-requested/-executed) using the default
66
+ * templates (email-templates.ts), without an app callback.
67
+ * `mailDefaults` brands these default messages (locale and app name). It
68
+ * applies only when the relevant send*Email option is unset; export-ready
69
+ * also requires appExportDownloadUrl. */
71
70
  readonly mailDefaults?: GdprMailDefaults;
72
71
  /** Hides the Art. 17 deletion section + its request-deletion/cancel-deletion
73
72
  * actions on the privacy-center screen — for apps that already offer
74
73
  * account deletion elsewhere (e.g. a profile danger-zone), against
75
74
  * duplication. Default `true` (deletion section shown).
76
- * BREAKING (fw#2312): replaces the removed client-side
75
+ * BREAKING: replaces the removed client-side
77
76
  * `userDataRightsClient({ privacyCenter: { showDeletion } })` option —
78
77
  * the screen is now declared once, server-side (`type: "projectionDetail"`),
79
78
  * so per-app visibility can only be a boot-time option, not a client-side