@cosmicdrift/kumiko-samples 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 (530) hide show
  1. package/LICENSE +21 -57
  2. package/README.md +1 -1
  3. package/package.json +2 -2
  4. package/packages/bundled-features/package.json +9 -2
  5. package/packages/bundled-features/src/agent-tools/changes.json +6 -0
  6. package/packages/bundled-features/src/agent-tools/tool-catalog.ts +1 -1
  7. package/packages/bundled-features/src/agent-tools/tool-dispatch.ts +9 -9
  8. package/packages/bundled-features/src/audit/changes.json +12 -0
  9. package/packages/bundled-features/src/audit/handlers/audit-events.ts +1 -1
  10. package/packages/bundled-features/src/audit/screens.ts +1 -1
  11. package/packages/bundled-features/src/auth-email-password/auth-user-row.ts +10 -10
  12. package/packages/bundled-features/src/auth-email-password/feature.ts +6 -6
  13. package/packages/bundled-features/src/auth-email-password/handlers/change-password.write.ts +3 -3
  14. package/packages/bundled-features/src/auth-email-password/handlers/confirm-token-flow.ts +5 -5
  15. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +1 -1
  16. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept.write.ts +18 -18
  17. package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +12 -12
  18. package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +1 -1
  19. package/packages/bundled-features/src/auth-email-password/handlers/invite-signup-complete.write.ts +24 -26
  20. package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +1 -1
  21. package/packages/bundled-features/src/auth-email-password/handlers/self-registration-status.query.ts +1 -1
  22. package/packages/bundled-features/src/auth-email-password/handlers/signup-confirm.write.ts +34 -37
  23. package/packages/bundled-features/src/auth-email-password/handlers/signup-request.write.ts +6 -7
  24. package/packages/bundled-features/src/auth-email-password/handlers/switch-tenant-mfa-gate.write.ts +1 -5
  25. package/packages/bundled-features/src/auth-email-password/index.ts +5 -5
  26. package/packages/bundled-features/src/auth-email-password/lockout-store.ts +1 -1
  27. package/packages/bundled-features/src/auth-email-password/seeding.ts +63 -66
  28. package/packages/bundled-features/src/auth-email-password/signup-token-store.ts +8 -8
  29. package/packages/bundled-features/src/auth-email-password/testing.ts +3 -3
  30. package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +57 -57
  31. package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +14 -14
  32. package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +15 -16
  33. package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +11 -12
  34. package/packages/bundled-features/src/auth-email-password/web/confirm-account-unlock-screen.tsx +1 -1
  35. package/packages/bundled-features/src/auth-email-password/web/constants.ts +3 -3
  36. package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +14 -14
  37. package/packages/bundled-features/src/auth-email-password/web/forgot-password-screen.tsx +11 -11
  38. package/packages/bundled-features/src/auth-email-password/web/index.ts +5 -5
  39. package/packages/bundled-features/src/auth-email-password/web/invite-accept-screen.tsx +17 -17
  40. package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +3 -4
  41. package/packages/bundled-features/src/auth-email-password/web/reset-password-screen.tsx +16 -17
  42. package/packages/bundled-features/src/auth-email-password/web/session.tsx +34 -34
  43. package/packages/bundled-features/src/auth-email-password/web/signup-complete-screen.tsx +3 -3
  44. package/packages/bundled-features/src/auth-email-password/web/signup-screen.tsx +14 -14
  45. package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +26 -27
  46. package/packages/bundled-features/src/auth-email-password/web/use-shell-user.ts +12 -13
  47. package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +17 -18
  48. package/packages/bundled-features/src/auth-email-password/web/verify-email-screen.tsx +11 -12
  49. package/packages/bundled-features/src/auth-foundation/boot-checks.ts +4 -4
  50. package/packages/bundled-features/src/auth-foundation/resolve-anonymous-access.ts +4 -4
  51. package/packages/bundled-features/src/auth-foundation/types.ts +2 -2
  52. package/packages/bundled-features/src/auth-mfa/changes.json +6 -0
  53. package/packages/bundled-features/src/auth-mfa/feature-exports.ts +2 -2
  54. package/packages/bundled-features/src/auth-mfa/feature.ts +6 -0
  55. package/packages/bundled-features/src/auth-mfa/handlers/disable.write.ts +3 -3
  56. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +4 -4
  57. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm.write.ts +2 -2
  58. package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +1 -1
  59. package/packages/bundled-features/src/auth-mfa/handlers/reencrypt.job.ts +1 -1
  60. package/packages/bundled-features/src/auth-mfa/handlers/regenerate-recovery.write.ts +5 -5
  61. package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +1 -1
  62. package/packages/bundled-features/src/auth-mfa/token-secrets.ts +1 -1
  63. package/packages/bundled-features/src/auth-mfa/web/client-plugin.ts +2 -2
  64. package/packages/bundled-features/src/auth-mfa/web/i18n.ts +9 -4
  65. package/packages/bundled-features/src/auth-mfa/web/index.ts +4 -4
  66. package/packages/bundled-features/src/auth-mfa/web/mfa-client.ts +17 -16
  67. package/packages/bundled-features/src/auth-mfa/web/mfa-code-or-recovery-field.tsx +68 -0
  68. package/packages/bundled-features/src/auth-mfa/web/mfa-disable-dialog.tsx +23 -13
  69. package/packages/bundled-features/src/auth-mfa/web/mfa-regenerate-recovery-dialog.tsx +23 -13
  70. package/packages/bundled-features/src/auth-mfa/web/mfa-setup-preauth-screen.tsx +15 -6
  71. package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +71 -24
  72. package/packages/bundled-features/src/billing-foundation/aggregate-id.ts +10 -11
  73. package/packages/bundled-features/src/billing-foundation/changes.json +55 -0
  74. package/packages/bundled-features/src/billing-foundation/checkout-core.ts +32 -42
  75. package/packages/bundled-features/src/billing-foundation/consumer-protection/confirmation-mail.ts +8 -2
  76. package/packages/bundled-features/src/billing-foundation/consumer-protection/consent-gate.ts +2 -0
  77. package/packages/bundled-features/src/billing-foundation/consumer-protection/issue-confirmation.ts +14 -3
  78. package/packages/bundled-features/src/billing-foundation/consumer-protection/mail-notifications.ts +3 -4
  79. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-receipt-limit.ts +12 -6
  80. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-record.ts +35 -19
  81. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-request.ts +12 -8
  82. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-revoke.ts +14 -8
  83. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-texts.ts +5 -0
  84. package/packages/bundled-features/src/billing-foundation/consumer-protection/withdrawal-period.ts +8 -10
  85. package/packages/bundled-features/src/billing-foundation/entities.ts +27 -27
  86. package/packages/bundled-features/src/billing-foundation/events.ts +23 -21
  87. package/packages/bundled-features/src/billing-foundation/feature.ts +45 -44
  88. package/packages/bundled-features/src/billing-foundation/get-subscription-for-tenant.ts +3 -5
  89. package/packages/bundled-features/src/billing-foundation/handlers/billing-plans.query.ts +71 -6
  90. package/packages/bundled-features/src/billing-foundation/handlers/create-checkout-session.write.ts +19 -17
  91. package/packages/bundled-features/src/billing-foundation/handlers/create-portal-session.write.ts +11 -12
  92. package/packages/bundled-features/src/billing-foundation/handlers/list-subscriptions.query.ts +4 -4
  93. package/packages/bundled-features/src/billing-foundation/handlers/plan-switch-preview.query.ts +65 -0
  94. package/packages/bundled-features/src/billing-foundation/handlers/process-event.write.ts +29 -22
  95. package/packages/bundled-features/src/billing-foundation/handlers/start-plan-checkout.write.ts +44 -8
  96. package/packages/bundled-features/src/billing-foundation/handlers/switch-plan.write.ts +72 -82
  97. package/packages/bundled-features/src/billing-foundation/handlers/sync-subscription.write.ts +14 -1
  98. package/packages/bundled-features/src/billing-foundation/i18n.ts +22 -0
  99. package/packages/bundled-features/src/billing-foundation/index.ts +2 -0
  100. package/packages/bundled-features/src/billing-foundation/plan-catalog.ts +62 -27
  101. package/packages/bundled-features/src/billing-foundation/plan-switch.ts +84 -0
  102. package/packages/bundled-features/src/billing-foundation/projection.ts +38 -37
  103. package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +3 -3
  104. package/packages/bundled-features/src/billing-foundation/tenant-destroy-hook.ts +7 -8
  105. package/packages/bundled-features/src/billing-foundation/types.ts +144 -66
  106. package/packages/bundled-features/src/billing-foundation/validate-options.ts +19 -0
  107. package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +123 -51
  108. package/packages/bundled-features/src/billing-foundation/web/checkout-consent-dialog.tsx +89 -42
  109. package/packages/bundled-features/src/billing-foundation/web/constants.ts +4 -0
  110. package/packages/bundled-features/src/billing-foundation/web/plan-price.ts +55 -0
  111. package/packages/bundled-features/src/billing-foundation/web/plan-switch-confirm-dialog.tsx +224 -0
  112. package/packages/bundled-features/src/billing-foundation/webhook-handler.ts +1 -1
  113. package/packages/bundled-features/src/cap-counter/aggregate-id.ts +8 -9
  114. package/packages/bundled-features/src/cap-counter/cap-reservation.ts +5 -1
  115. package/packages/bundled-features/src/cap-counter/changes.json +18 -0
  116. package/packages/bundled-features/src/cap-counter/constants.ts +11 -12
  117. package/packages/bundled-features/src/cap-counter/enforce-cap.ts +66 -68
  118. package/packages/bundled-features/src/cap-counter/entity.ts +29 -29
  119. package/packages/bundled-features/src/cap-counter/feature.ts +34 -35
  120. package/packages/bundled-features/src/cap-counter/handlers/increment-rolling.write.ts +31 -31
  121. package/packages/bundled-features/src/cap-counter/handlers/mark-soft-warned.write.ts +4 -5
  122. package/packages/bundled-features/src/cap-counter/stock-cap-guard.ts +9 -2
  123. package/packages/bundled-features/src/cap-counter/with-cap-enforcement.ts +3 -5
  124. package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +1 -3
  125. package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +1 -1
  126. package/packages/bundled-features/src/channel-email/changes.json +6 -0
  127. package/packages/bundled-features/src/channel-email/feature.ts +1 -1
  128. package/packages/bundled-features/src/channel-email/smtp-transport.ts +34 -31
  129. package/packages/bundled-features/src/channel-in-app/handlers/unread-count.query.ts +3 -4
  130. package/packages/bundled-features/src/compliance-profiles/feature.ts +15 -16
  131. package/packages/bundled-features/src/compliance-profiles/handlers/for-tenant.query.ts +3 -6
  132. package/packages/bundled-features/src/compliance-profiles/handlers/list-profiles.query.ts +5 -5
  133. package/packages/bundled-features/src/compliance-profiles/handlers/needs-profile.query.ts +4 -4
  134. package/packages/bundled-features/src/compliance-profiles/handlers/set-profile.write.ts +13 -14
  135. package/packages/bundled-features/src/compliance-profiles/handlers/sub-processors.query.ts +9 -11
  136. package/packages/bundled-features/src/compliance-profiles/resolve-for-tenant.ts +7 -7
  137. package/packages/bundled-features/src/compliance-profiles/schema/profile-selection.ts +18 -23
  138. package/packages/bundled-features/src/compliance-profiles/seeding.ts +14 -15
  139. package/packages/bundled-features/src/compliance-profiles-ops/handlers/tenants-missing-profile.query.ts +3 -3
  140. package/packages/bundled-features/src/compliance-profiles-ops/index.ts +2 -2
  141. package/packages/bundled-features/src/config/changes.json +12 -0
  142. package/packages/bundled-features/src/config/handlers/cascade.query.ts +4 -2
  143. package/packages/bundled-features/src/config/handlers/readiness.query.ts +7 -7
  144. package/packages/bundled-features/src/config/handlers/reencrypt.job.ts +4 -5
  145. package/packages/bundled-features/src/config/handlers/set.write.ts +4 -4
  146. package/packages/bundled-features/src/config/handlers/values.query.ts +4 -2
  147. package/packages/bundled-features/src/config/resolver.ts +4 -4
  148. package/packages/bundled-features/src/config/table.ts +10 -10
  149. package/packages/bundled-features/src/config/write-helpers.ts +28 -9
  150. package/packages/bundled-features/src/crypto-shredding/changes.json +6 -0
  151. package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +23 -21
  152. package/packages/bundled-features/src/custom-fields/aggregate-id.ts +16 -17
  153. package/packages/bundled-features/src/custom-fields/entity.ts +49 -47
  154. package/packages/bundled-features/src/custom-fields/events.ts +7 -8
  155. package/packages/bundled-features/src/custom-fields/feature.ts +70 -72
  156. package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +9 -8
  157. package/packages/bundled-features/src/custom-fields/handlers/define-tenant-field.write.ts +28 -26
  158. package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +6 -7
  159. package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +12 -13
  160. package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +25 -28
  161. package/packages/bundled-features/src/custom-fields/handlers/update-tenant-field.write.ts +6 -6
  162. package/packages/bundled-features/src/custom-fields/lib/field-access.ts +2 -2
  163. package/packages/bundled-features/src/custom-fields/lib/parse-serialized-field.ts +1 -1
  164. package/packages/bundled-features/src/custom-fields/lib/quota.ts +1 -1
  165. package/packages/bundled-features/src/custom-fields/lib/value-schema.ts +10 -12
  166. package/packages/bundled-features/src/custom-fields/run-retention.ts +3 -3
  167. package/packages/bundled-features/src/custom-fields/schemas.ts +14 -14
  168. package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +2 -5
  169. package/packages/bundled-features/src/custom-fields/web/constants.ts +2 -2
  170. package/packages/bundled-features/src/custom-fields/web/custom-fields-form-section.tsx +26 -26
  171. package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +65 -67
  172. package/packages/bundled-features/src/custom-fields/wire-user-data-rights.ts +3 -3
  173. package/packages/bundled-features/src/data-retention/_internal/parse-override.ts +2 -3
  174. package/packages/bundled-features/src/data-retention/feature.ts +11 -18
  175. package/packages/bundled-features/src/data-retention/handlers/policy-for.query.ts +6 -6
  176. package/packages/bundled-features/src/data-retention/keep-for.ts +17 -17
  177. package/packages/bundled-features/src/data-retention/override-schema.ts +13 -15
  178. package/packages/bundled-features/src/data-retention/presets.ts +18 -23
  179. package/packages/bundled-features/src/data-retention/resolve-for-tenant.ts +1 -1
  180. package/packages/bundled-features/src/data-retention/resolve-tenant-preset.ts +17 -16
  181. package/packages/bundled-features/src/data-retention/resolver.ts +33 -32
  182. package/packages/bundled-features/src/data-retention/run-retention-cleanup.ts +71 -58
  183. package/packages/bundled-features/src/data-retention/schema/tenant-retention-override.ts +13 -11
  184. package/packages/bundled-features/src/delivery/changes.json +30 -0
  185. package/packages/bundled-features/src/delivery/channel-context.ts +9 -3
  186. package/packages/bundled-features/src/delivery/db/queries/preferences.ts +2 -2
  187. package/packages/bundled-features/src/delivery/delivery-service.ts +35 -5
  188. package/packages/bundled-features/src/delivery/feature.ts +3 -3
  189. package/packages/bundled-features/src/delivery/handlers/log.query.ts +1 -1
  190. package/packages/bundled-features/src/delivery/handlers/preferences.query.ts +20 -1
  191. package/packages/bundled-features/src/delivery/handlers/unsubscribe-page-chrome.query.ts +1 -1
  192. package/packages/bundled-features/src/delivery/tables.ts +9 -8
  193. package/packages/bundled-features/src/delivery/unsubscribe-link.ts +3 -1
  194. package/packages/bundled-features/src/delivery/unsubscribe-page-strings.ts +1 -0
  195. package/packages/bundled-features/src/delivery/unsubscribe-page.ts +6 -0
  196. package/packages/bundled-features/src/delivery/unsubscribe.ts +40 -19
  197. package/packages/bundled-features/src/delivery/upsert-preference.ts +3 -4
  198. package/packages/bundled-features/src/document-ingest-foundation/entity.ts +5 -5
  199. package/packages/bundled-features/src/document-ingest-foundation/events.ts +2 -2
  200. package/packages/bundled-features/src/document-ingest-foundation/feature.ts +2 -2
  201. package/packages/bundled-features/src/document-ingest-foundation/pages.ts +1 -1
  202. package/packages/bundled-features/src/document-ingest-foundation/tenant-destroy-hook.ts +4 -4
  203. package/packages/bundled-features/src/feature-toggles/compose-tier-resolver.ts +1 -1
  204. package/packages/bundled-features/src/feature-toggles/feature.ts +1 -1
  205. package/packages/bundled-features/src/feature-toggles/global-feature-state-table.ts +1 -1
  206. package/packages/bundled-features/src/feature-toggles/handlers/registered.query.ts +5 -5
  207. package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +1 -1
  208. package/packages/bundled-features/src/feature-toggles/toggle-sync-signal.ts +1 -1
  209. package/packages/bundled-features/src/feature-toggles/web/constants.ts +1 -1
  210. package/packages/bundled-features/src/file-derivatives/feature.ts +2 -2
  211. package/packages/bundled-features/src/file-derivatives/handlers/public-variant.query.ts +1 -1
  212. package/packages/bundled-features/src/file-derivatives/presets.ts +1 -1
  213. package/packages/bundled-features/src/file-foundation/feature.ts +6 -6
  214. package/packages/bundled-features/src/file-foundation/index.ts +1 -0
  215. package/packages/bundled-features/src/file-foundation/read-file-ref-content.ts +7 -1
  216. package/packages/bundled-features/src/file-provider-inmemory/feature.ts +16 -16
  217. package/packages/bundled-features/src/file-provider-s3/env-named-feature.ts +0 -2
  218. package/packages/bundled-features/src/file-provider-s3/feature.ts +16 -16
  219. package/packages/bundled-features/src/file-provider-s3/lib/s3-provider.ts +6 -6
  220. package/packages/bundled-features/src/files/README.md +1 -1
  221. package/packages/bundled-features/src/files/feature.ts +6 -6
  222. package/packages/bundled-features/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +5 -5
  223. package/packages/bundled-features/src/files-tenant-data/hooks.ts +24 -26
  224. package/packages/bundled-features/src/files-tenant-data/index.ts +1 -1
  225. package/packages/bundled-features/src/folders/feature.ts +1 -1
  226. package/packages/bundled-features/src/folders/web/folder-manager.tsx +2 -2
  227. package/packages/bundled-features/src/folders/web/tree.ts +5 -5
  228. package/packages/bundled-features/src/form-draft/changes.json +6 -0
  229. package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +3 -3
  230. package/packages/bundled-features/src/form-draft/db/queries/owned-file-refs.ts +1 -1
  231. package/packages/bundled-features/src/form-draft/decrypt-draft.ts +4 -1
  232. package/packages/bundled-features/src/form-draft/entity.ts +3 -3
  233. package/packages/bundled-features/src/form-draft/feature.ts +4 -5
  234. package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +1 -1
  235. package/packages/bundled-features/src/form-draft/release-file-refs.ts +6 -6
  236. package/packages/bundled-features/src/form-draft/schemas.ts +3 -3
  237. package/packages/bundled-features/src/form-draft/web/constants.ts +0 -2
  238. package/packages/bundled-features/src/host-routing/README.md +1 -1
  239. package/packages/bundled-features/src/host-routing/changes.json +6 -0
  240. package/packages/bundled-features/src/host-routing/dispatch.ts +16 -17
  241. package/packages/bundled-features/src/host-routing/options.ts +2 -1
  242. package/packages/bundled-features/src/inbound-mail-foundation/aggregate-id.ts +19 -19
  243. package/packages/bundled-features/src/inbound-mail-foundation/changes.json +18 -0
  244. package/packages/bundled-features/src/inbound-mail-foundation/connect-routes.ts +4 -3
  245. package/packages/bundled-features/src/inbound-mail-foundation/constants.ts +30 -33
  246. package/packages/bundled-features/src/inbound-mail-foundation/entities.ts +47 -48
  247. package/packages/bundled-features/src/inbound-mail-foundation/events.ts +54 -50
  248. package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +39 -39
  249. package/packages/bundled-features/src/inbound-mail-foundation/handlers/account-state.ts +8 -8
  250. package/packages/bundled-features/src/inbound-mail-foundation/handlers/connect-account.write.ts +25 -26
  251. package/packages/bundled-features/src/inbound-mail-foundation/handlers/disconnect-account.write.ts +7 -7
  252. package/packages/bundled-features/src/inbound-mail-foundation/handlers/ingest-message.write.ts +50 -51
  253. package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-accounts.query.ts +8 -8
  254. package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-messages.query.ts +10 -10
  255. package/packages/bundled-features/src/inbound-mail-foundation/handlers/scope-visibility.ts +3 -4
  256. package/packages/bundled-features/src/inbound-mail-foundation/handlers/update-account.write.ts +27 -15
  257. package/packages/bundled-features/src/inbound-mail-foundation/i18n.ts +0 -1
  258. package/packages/bundled-features/src/inbound-mail-foundation/oauth-state.ts +16 -15
  259. package/packages/bundled-features/src/inbound-mail-foundation/projection.ts +31 -29
  260. package/packages/bundled-features/src/inbound-mail-foundation/provider-factory.ts +9 -9
  261. package/packages/bundled-features/src/inbound-mail-foundation/retention-sweep.ts +45 -41
  262. package/packages/bundled-features/src/inbound-mail-foundation/screens.ts +0 -3
  263. package/packages/bundled-features/src/inbound-mail-foundation/tenant-destroy-hook.ts +14 -16
  264. package/packages/bundled-features/src/inbound-mail-foundation/types.ts +70 -70
  265. package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor.ts +101 -84
  266. package/packages/bundled-features/src/inbound-provider-imap/credential-document.ts +13 -13
  267. package/packages/bundled-features/src/inbound-provider-imap/feature.ts +42 -40
  268. package/packages/bundled-features/src/inbound-provider-imap/imap-client.ts +20 -19
  269. package/packages/bundled-features/src/inbound-provider-inmemory/feature.ts +21 -21
  270. package/packages/bundled-features/src/jobs/changes.json +13 -0
  271. package/packages/bundled-features/src/jobs/db/queries/retention.ts +2 -2
  272. package/packages/bundled-features/src/jobs/db/queries/stale-run-sweep.ts +3 -3
  273. package/packages/bundled-features/src/jobs/events.ts +1 -1
  274. package/packages/bundled-features/src/jobs/feature.ts +20 -11
  275. package/packages/bundled-features/src/jobs/handlers/detail.query.ts +4 -4
  276. package/packages/bundled-features/src/jobs/handlers/list.query.ts +1 -1
  277. package/packages/bundled-features/src/jobs/handlers/projection-rebuild.job.ts +1 -1
  278. package/packages/bundled-features/src/jobs/handlers/reindex-entity.job.ts +1 -1
  279. package/packages/bundled-features/src/jobs/handlers/retry.write.ts +1 -1
  280. package/packages/bundled-features/src/jobs/handlers/tenant-failures.query.ts +45 -40
  281. package/packages/bundled-features/src/jobs/handlers/tenant-runs.query.ts +63 -59
  282. package/packages/bundled-features/src/jobs/job-instant.ts +1 -1
  283. package/packages/bundled-features/src/jobs/job-run-logger.ts +19 -19
  284. package/packages/bundled-features/src/jobs/job-run-table.ts +3 -3
  285. package/packages/bundled-features/src/jobs/screens.ts +1 -1
  286. package/packages/bundled-features/src/jobs/tenant-job-failure-table.ts +1 -1
  287. package/packages/bundled-features/src/jobs/tenant-job-run-table.ts +1 -1
  288. package/packages/bundled-features/src/ledger/entity.ts +5 -5
  289. package/packages/bundled-features/src/ledger/feature.ts +3 -3
  290. package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +3 -3
  291. package/packages/bundled-features/src/ledger/recurring.ts +12 -12
  292. package/packages/bundled-features/src/ledger/schemas.ts +1 -1
  293. package/packages/bundled-features/src/ledger/web/constants.ts +2 -2
  294. package/packages/bundled-features/src/ledger/web/index.ts +7 -7
  295. package/packages/bundled-features/src/legal-pages/README.md +1 -1
  296. package/packages/bundled-features/src/legal-pages/feature.ts +40 -41
  297. package/packages/bundled-features/src/legal-pages/markdown.ts +3 -3
  298. package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +23 -24
  299. package/packages/bundled-features/src/legal-pages/web/index.ts +0 -2
  300. package/packages/bundled-features/src/mail-foundation/changes.json +6 -0
  301. package/packages/bundled-features/src/mail-foundation/feature.ts +31 -30
  302. package/packages/bundled-features/src/mail-transport-inmemory/feature.ts +27 -28
  303. package/packages/bundled-features/src/mail-transport-smtp/feature.ts +20 -20
  304. package/packages/bundled-features/src/managed-pages/branding.ts +6 -6
  305. package/packages/bundled-features/src/managed-pages/feature.ts +62 -62
  306. package/packages/bundled-features/src/managed-pages/handlers/by-slug.query.ts +5 -6
  307. package/packages/bundled-features/src/managed-pages/handlers/by-tenant-published.query.ts +8 -8
  308. package/packages/bundled-features/src/managed-pages/handlers/set.write.ts +5 -7
  309. package/packages/bundled-features/src/managed-pages/screens/page-screens.ts +11 -11
  310. package/packages/bundled-features/src/managed-pages/seeding.ts +8 -8
  311. package/packages/bundled-features/src/managed-pages/table.ts +16 -15
  312. package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +6 -6
  313. package/packages/bundled-features/src/managed-pages/web/i18n.ts +1 -1
  314. package/packages/bundled-features/src/notes-history/entity.ts +4 -4
  315. package/packages/bundled-features/src/notes-history/feature.ts +2 -2
  316. package/packages/bundled-features/src/notes-history-user-data/hooks.ts +1 -1
  317. package/packages/bundled-features/src/page-render/layout.ts +9 -9
  318. package/packages/bundled-features/src/page-render/markdown.ts +11 -11
  319. package/packages/bundled-features/src/page-render/security-headers.ts +7 -6
  320. package/packages/bundled-features/src/personal-access-tokens/feature.ts +9 -6
  321. package/packages/bundled-features/src/personal-access-tokens/roles.ts +2 -2
  322. package/packages/bundled-features/src/readiness/handlers/status.query.ts +3 -3
  323. package/packages/bundled-features/src/renderer-foundation/api.ts +12 -13
  324. package/packages/bundled-features/src/renderer-foundation/constants.ts +2 -2
  325. package/packages/bundled-features/src/renderer-foundation/feature.ts +7 -7
  326. package/packages/bundled-features/src/renderer-foundation/types.ts +11 -12
  327. package/packages/bundled-features/src/renderer-pdf/changes.json +6 -0
  328. package/packages/bundled-features/src/renderer-pdf/render-table-pdf.ts +27 -10
  329. package/packages/bundled-features/src/secrets/feature.ts +9 -9
  330. package/packages/bundled-features/src/secrets/web/constants.ts +2 -2
  331. package/packages/bundled-features/src/seo/feature.ts +3 -3
  332. package/packages/bundled-features/src/sessions/constants.ts +1 -1
  333. package/packages/bundled-features/src/sessions/feature.ts +16 -11
  334. package/packages/bundled-features/src/sessions/handlers/revoke-all-for-user.write.ts +2 -2
  335. package/packages/bundled-features/src/sessions/handlers/revoke-all-others.write.ts +2 -2
  336. package/packages/bundled-features/src/sessions/handlers/revoke.write.ts +1 -1
  337. package/packages/bundled-features/src/sessions/schema/user-session.ts +4 -4
  338. package/packages/bundled-features/src/sessions/screens.ts +2 -2
  339. package/packages/bundled-features/src/sessions/session-callbacks.ts +2 -2
  340. package/packages/bundled-features/src/sessions/session-revoked-event.ts +2 -2
  341. package/packages/bundled-features/src/shared/assert-no-where-rule-in-ownership-write.ts +1 -1
  342. package/packages/bundled-features/src/shared/decrypt-stored-pii.ts +11 -1
  343. package/packages/bundled-features/src/shared/encrypt-for-direct-write.ts +1 -1
  344. package/packages/bundled-features/src/shared/index.ts +1 -1
  345. package/packages/bundled-features/src/shared/mail-template-body.ts +10 -3
  346. package/packages/bundled-features/src/shared/map-with-concurrency.ts +5 -4
  347. package/packages/bundled-features/src/shared/parent-visibility.ts +2 -2
  348. package/packages/bundled-features/src/shared/password-hashing.ts +1 -1
  349. package/packages/bundled-features/src/shared/signup-handover.ts +1 -2
  350. package/packages/bundled-features/src/shared/single-use-token-store.ts +1 -1
  351. package/packages/bundled-features/src/step-dispatcher/changes.json +6 -0
  352. package/packages/bundled-features/src/step-dispatcher/feature.ts +1 -0
  353. package/packages/bundled-features/src/subscription-dodo/changes.json +14 -0
  354. package/packages/bundled-features/src/subscription-dodo/client.ts +45 -0
  355. package/packages/bundled-features/src/subscription-dodo/constants.ts +24 -0
  356. package/packages/bundled-features/src/subscription-dodo/feature.ts +207 -0
  357. package/packages/bundled-features/src/subscription-dodo/index.ts +16 -0
  358. package/packages/bundled-features/src/subscription-dodo/plugin-methods.ts +345 -0
  359. package/packages/bundled-features/src/subscription-dodo/runtime.ts +126 -0
  360. package/packages/bundled-features/src/subscription-dodo/verify-webhook.ts +262 -0
  361. package/packages/bundled-features/src/subscription-mollie/constants.ts +15 -17
  362. package/packages/bundled-features/src/subscription-mollie/feature.ts +41 -42
  363. package/packages/bundled-features/src/subscription-mollie/index.ts +3 -3
  364. package/packages/bundled-features/src/subscription-mollie/plugin-methods.ts +17 -16
  365. package/packages/bundled-features/src/subscription-mollie/verify-webhook.ts +34 -34
  366. package/packages/bundled-features/src/subscription-stripe/changes.json +12 -0
  367. package/packages/bundled-features/src/subscription-stripe/constants.ts +4 -6
  368. package/packages/bundled-features/src/subscription-stripe/feature.ts +45 -43
  369. package/packages/bundled-features/src/subscription-stripe/index.ts +6 -6
  370. package/packages/bundled-features/src/subscription-stripe/plugin-methods.ts +22 -27
  371. package/packages/bundled-features/src/subscription-stripe/runtime.ts +9 -8
  372. package/packages/bundled-features/src/subscription-stripe/verify-webhook.ts +62 -64
  373. package/packages/bundled-features/src/tags/feature.ts +3 -3
  374. package/packages/bundled-features/src/tags/screens.ts +1 -1
  375. package/packages/bundled-features/src/template-resolver/api.ts +41 -14
  376. package/packages/bundled-features/src/template-resolver/changes.json +48 -0
  377. package/packages/bundled-features/src/template-resolver/compile-document-body.ts +1 -0
  378. package/packages/bundled-features/src/template-resolver/feature.ts +2 -2
  379. package/packages/bundled-features/src/template-resolver/handlers/bundle-import.ts +3 -2
  380. package/packages/bundled-features/src/template-resolver/handlers/copy-locale.write.ts +27 -5
  381. package/packages/bundled-features/src/template-resolver/handlers/diff-to-system.query.ts +3 -2
  382. package/packages/bundled-features/src/template-resolver/handlers/document-base.ts +3 -2
  383. package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +8 -7
  384. package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +19 -20
  385. package/packages/bundled-features/src/template-resolver/handlers/overview.query.ts +15 -5
  386. package/packages/bundled-features/src/template-resolver/handlers/shared.ts +2 -2
  387. package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +3 -3
  388. package/packages/bundled-features/src/template-resolver/handlers/tenant-override-counts.query.ts +9 -5
  389. package/packages/bundled-features/src/template-resolver/handlers/tenant-override-selection.ts +8 -6
  390. package/packages/bundled-features/src/template-resolver/handlers/tenant-overrides.query.ts +44 -5
  391. package/packages/bundled-features/src/template-resolver/handlers/upsert-system.write.ts +3 -4
  392. package/packages/bundled-features/src/template-resolver/handlers/upsert-tenant.write.ts +4 -5
  393. package/packages/bundled-features/src/template-resolver/handlers/usage.query.ts +37 -26
  394. package/packages/bundled-features/src/template-resolver/handlers/validate.query.ts +7 -2
  395. package/packages/bundled-features/src/template-resolver/seeding.ts +36 -18
  396. package/packages/bundled-features/src/template-resolver/store-template-resource.ts +22 -4
  397. package/packages/bundled-features/src/template-resolver/table.ts +13 -14
  398. package/packages/bundled-features/src/template-resolver/template-delivery-policy.ts +0 -11
  399. package/packages/bundled-features/src/template-resolver/template-meta.ts +12 -4
  400. package/packages/bundled-features/src/template-resolver/template-preview.ts +11 -3
  401. package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +2 -2
  402. package/packages/bundled-features/src/template-resolver/web/constants.ts +7 -5
  403. package/packages/bundled-features/src/template-resolver/web/index.ts +7 -0
  404. package/packages/bundled-features/src/template-resolver/web/mail-layout-constants.ts +8 -0
  405. package/packages/bundled-features/src/tenant/changes.json +6 -0
  406. package/packages/bundled-features/src/tenant/feature.ts +7 -7
  407. package/packages/bundled-features/src/tenant/handlers/member-directory.query.ts +10 -4
  408. package/packages/bundled-features/src/tenant/handlers/members.query.ts +1 -1
  409. package/packages/bundled-features/src/tenant/handlers/memberships.query.ts +1 -1
  410. package/packages/bundled-features/src/tenant/handlers/team-list.query.ts +1 -1
  411. package/packages/bundled-features/src/tenant/handlers/tenant-directory.query.ts +8 -5
  412. package/packages/bundled-features/src/tenant/invitation-table.ts +37 -40
  413. package/packages/bundled-features/src/tenant/membership-table.ts +3 -3
  414. package/packages/bundled-features/src/tenant/schema/tenant.ts +7 -9
  415. package/packages/bundled-features/src/tenant/screens.ts +1 -1
  416. package/packages/bundled-features/src/tenant/seeding.ts +19 -18
  417. package/packages/bundled-features/src/tenant/testing.ts +5 -6
  418. package/packages/bundled-features/src/tenant/web/constants.ts +2 -2
  419. package/packages/bundled-features/src/tenant-handover/events.ts +5 -7
  420. package/packages/bundled-features/src/tenant-handover/feature.ts +1 -1
  421. package/packages/bundled-features/src/tenant-handover/grant.ts +1 -1
  422. package/packages/bundled-features/src/tenant-handover/handlers/claim.write.ts +1 -1
  423. package/packages/bundled-features/src/tenant-handover/move-entity-graph.ts +8 -9
  424. package/packages/bundled-features/src/tenant-handover/signup-handover-provider.ts +1 -2
  425. package/packages/bundled-features/src/tenant-handover/transfer-graph.ts +4 -5
  426. package/packages/bundled-features/src/tenant-lifecycle/boot-checks.ts +1 -1
  427. package/packages/bundled-features/src/tenant-lifecycle/changes.json +6 -0
  428. package/packages/bundled-features/src/tenant-lifecycle/constants.ts +5 -0
  429. package/packages/bundled-features/src/tenant-lifecycle/feature.ts +1 -1
  430. package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +7 -3
  431. package/packages/bundled-features/src/tenant-lifecycle/stages.ts +1 -1
  432. package/packages/bundled-features/src/tenant-settings/constants.ts +1 -1
  433. package/packages/bundled-features/src/tenant-settings/tenant-defaults.ts +12 -5
  434. package/packages/bundled-features/src/tier-engine/aggregate-id.ts +15 -16
  435. package/packages/bundled-features/src/tier-engine/changes.json +6 -0
  436. package/packages/bundled-features/src/tier-engine/compose-app.ts +14 -14
  437. package/packages/bundled-features/src/tier-engine/entity.ts +18 -19
  438. package/packages/bundled-features/src/tier-engine/feature.ts +88 -87
  439. package/packages/bundled-features/src/tier-engine/handlers/active-tier.query.ts +6 -7
  440. package/packages/bundled-features/src/tier-engine/handlers/get-tenant-tier.query.ts +4 -4
  441. package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +12 -9
  442. package/packages/bundled-features/src/tier-engine/tier-resolver.ts +2 -2
  443. package/packages/bundled-features/src/tier-engine/trial.ts +13 -13
  444. package/packages/bundled-features/src/tier-engine/web/constants.ts +3 -3
  445. package/packages/bundled-features/src/tier-engine/web/index.ts +4 -4
  446. package/packages/bundled-features/src/user/db/queries/stream-tenant-backfill.ts +8 -8
  447. package/packages/bundled-features/src/user/handlers/create.write.ts +4 -4
  448. package/packages/bundled-features/src/user/schema/user.ts +45 -44
  449. package/packages/bundled-features/src/user/seeding.ts +40 -40
  450. package/packages/bundled-features/src/user/testing.ts +3 -3
  451. package/packages/bundled-features/src/user-data-rights/audit-download.ts +27 -28
  452. package/packages/bundled-features/src/user-data-rights/boot-checks.ts +1 -1
  453. package/packages/bundled-features/src/user-data-rights/deletion-token.ts +1 -1
  454. package/packages/bundled-features/src/user-data-rights/feature.ts +112 -113
  455. package/packages/bundled-features/src/user-data-rights/handlers/cancel-deletion.write.ts +9 -9
  456. package/packages/bundled-features/src/user-data-rights/handlers/confirm-deletion-by-token.write.ts +8 -8
  457. package/packages/bundled-features/src/user-data-rights/handlers/download-by-job.query.ts +29 -30
  458. package/packages/bundled-features/src/user-data-rights/handlers/download-by-token.query.ts +40 -42
  459. package/packages/bundled-features/src/user-data-rights/handlers/export-status.query.ts +8 -9
  460. package/packages/bundled-features/src/user-data-rights/handlers/lift-restriction.write.ts +7 -8
  461. package/packages/bundled-features/src/user-data-rights/handlers/list-download-attempts.query.ts +2 -2
  462. package/packages/bundled-features/src/user-data-rights/handlers/my-audit-log.query.ts +4 -4
  463. package/packages/bundled-features/src/user-data-rights/handlers/request-deletion-by-email.write.ts +30 -29
  464. package/packages/bundled-features/src/user-data-rights/handlers/request-deletion.write.ts +15 -18
  465. package/packages/bundled-features/src/user-data-rights/handlers/request-export.write.ts +42 -41
  466. package/packages/bundled-features/src/user-data-rights/handlers/restrict-account.write.ts +22 -19
  467. package/packages/bundled-features/src/user-data-rights/handlers/run-forget-cleanup.write.ts +8 -8
  468. package/packages/bundled-features/src/user-data-rights/index.ts +8 -10
  469. package/packages/bundled-features/src/user-data-rights/lib/default-mailers.ts +3 -3
  470. package/packages/bundled-features/src/user-data-rights/lib/update-user-lifecycle.ts +24 -27
  471. package/packages/bundled-features/src/user-data-rights/run-export-jobs.ts +169 -280
  472. package/packages/bundled-features/src/user-data-rights/run-forget-cleanup.ts +87 -108
  473. package/packages/bundled-features/src/user-data-rights/run-user-export.ts +67 -69
  474. package/packages/bundled-features/src/user-data-rights/schema/download-attempt.ts +11 -11
  475. package/packages/bundled-features/src/user-data-rights/schema/download-token.ts +37 -41
  476. package/packages/bundled-features/src/user-data-rights/schema/export-job.ts +65 -67
  477. package/packages/bundled-features/src/user-data-rights/token-helpers.ts +21 -25
  478. package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +6 -6
  479. package/packages/bundled-features/src/user-data-rights/web/confirm-deletion-screen.tsx +6 -5
  480. package/packages/bundled-features/src/user-data-rights/web/constants.ts +1 -1
  481. package/packages/bundled-features/src/user-data-rights/web/index.ts +5 -5
  482. package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +14 -13
  483. package/packages/bundled-features/src/user-data-rights/web/public-deletion-gate.tsx +13 -12
  484. package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +6 -6
  485. package/packages/bundled-features/src/user-data-rights/zip-path.ts +41 -40
  486. package/packages/bundled-features/src/user-data-rights-defaults/feature.ts +15 -15
  487. package/packages/bundled-features/src/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.ts +3 -5
  488. package/packages/bundled-features/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +45 -51
  489. package/packages/bundled-features/src/user-data-rights-defaults/hooks/job-run.userdata-hook.ts +2 -2
  490. package/packages/bundled-features/src/user-data-rights-defaults/hooks/notification-preference.userdata-hook.ts +1 -1
  491. package/packages/bundled-features/src/user-data-rights-defaults/hooks/user-session.userdata-hook.ts +3 -3
  492. package/packages/bundled-features/src/user-data-rights-defaults/hooks/user.userdata-hook.ts +32 -31
  493. package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +13 -13
  494. package/packages/bundled-features/src/user-profile/index.ts +3 -3
  495. package/packages/bundled-features/src/user-profile/web/client-plugin.ts +1 -1
  496. package/packages/bundled-features/src/user-profile/web/constants.ts +1 -1
  497. package/packages/bundled-features/src/user-profile/web/profile-screen.tsx +1 -1
  498. package/packages/bundled-features/src/waitlist/changes.json +18 -0
  499. package/packages/bundled-features/src/waitlist/handlers/export-purge.write.ts +2 -1
  500. package/packages/bundled-features/src/waitlist/handlers/submit.write.ts +5 -5
  501. package/packages/bundled-features/src/waitlist/import.ts +5 -0
  502. package/packages/bundled-features/src/waitlist/legacy-migrate.ts +22 -3
  503. package/packages/bundled-features/src/waitlist/link-on-signup.ts +20 -10
  504. package/packages/bundled-features/src/waitlist/options.ts +3 -0
  505. package/packages/bundled-features/src/workflow-runner/aggregate-id.ts +1 -1
  506. package/packages/bundled-features/src/workflow-runner/event-subscriber.ts +4 -5
  507. package/packages/bundled-features/src/workflow-runner/event-trigger.ts +4 -15
  508. package/packages/bundled-features/src/workflow-runner/feature.ts +2 -2
  509. package/packages/bundled-features/src/workflow-runner/handlers/resume-run.write.ts +4 -4
  510. package/packages/bundled-features/src/workflow-runner/pending-projection.ts +6 -7
  511. package/packages/bundled-features/src/workflow-runner/runner.ts +6 -6
  512. package/packages/bundled-features/src/workflow-runner/tables.ts +6 -6
  513. package/packages/bundled-features/src/workflow-runner/workflow-registry.ts +1 -1
  514. package/samples/apps/styleguide/src/features/widgets/i18n.ts +11 -0
  515. package/samples/apps/styleguide/src/features/widgets/web/Widgets.tsx +24 -0
  516. package/samples/apps/use-all-bundled/e2e-billing-gallery/gallery-constants.ts +5 -0
  517. package/samples/apps/use-all-bundled/e2e-billing-gallery/gallery-features.ts +90 -15
  518. package/samples/apps/use-all-bundled/e2e-billing-gallery/server.ts +16 -6
  519. package/samples/apps/use-all-bundled/feature-manifest.json +120 -3
  520. package/samples/apps/use-all-bundled/src/run-config.ts +9 -3
  521. package/samples/recipes/auth-mfa/README.md +5 -0
  522. package/samples/recipes/auth-mfa/package.json +5 -2
  523. package/samples/recipes/auth-mfa/src/web/confirmation-code-step.tsx +49 -0
  524. package/samples/recipes/auth-mfa/tsconfig.json +8 -0
  525. package/samples/recipes/env-composition/README.md +3 -1
  526. package/samples/recipes/env-composition/src/env.ts +2 -0
  527. package/samples/recipes/legal-pages/README.md +1 -1
  528. package/samples/recipes/rate-limiting/README.md +18 -0
  529. package/samples/recipes/rate-limiting/src/feature.ts +12 -0
  530. package/packages/bundled-features/src/billing-foundation/consumer-protection/stored-user-email.ts +0 -12
@@ -1,34 +1,35 @@
1
- // Domain-events für inbound-mail-foundation.
1
+ // Domain events for inbound-mail-foundation.
2
2
  //
3
- // **Pattern:** event-sourced — jede eingehende Mail und jeder Account-
4
- // Lifecycle-Übergang wird zu einem domain-event. Read-models =
5
- // inline projections (read_mail_accounts / read_inbound_messages /
6
- // read_mail_threads). Future-consumer (Business-Prozesse: Ticket-
7
- // Anlage, Beleg-Erkennung, Auto-Antwort) listenen direkt auf
8
- // `inbound-message-received` und können via extendEntityProjection
9
- // die KOMPLETTE Historie rückwirkend replayen.
3
+ // **Pattern:** event-sourced — each incoming mail and account-lifecycle
4
+ // transition becomes a domain event. Read models = inline projections
5
+ // (read_mail_accounts / read_inbound_messages / read_mail_threads).
6
+ // Future consumers (business processes: ticket creation, receipt
7
+ // recognition, auto-replies) listen directly to `inbound-message-received`
8
+ // and can replay the COMPLETE history retroactively via
9
+ // extendEntityProjection.
10
10
  //
11
- // **Payload-Disziplin (Events sind forever):**
12
- // - domain-clean + generisch: keine App-Begriffe (kein solon), keine
13
- // provider-raw-Strukturen im payload — raw lebt in metadata.headers.
14
- // - KEINE Bodies: bodyRef zeigt auf file-foundation-Storage. Der
15
- // Event-Store ist kein Blob-Store.
16
- // - PII (address/from/to/cc/subject/snippet) steht als Ciphertext im
17
- // payload (`kumiko-pii:v1:...`), encrypted VOR dem append im
18
- // write-handler — Subject-Key ist der Tenant, tenant-destroy's
19
- // eraseSubjectKeys macht Event-Log UND Projection unlesbar
20
- // (crypto-shredding, Muster billing-foundation #800).
11
+ // **Payload discipline (events are forever):**
12
+ // - Domain-clean and generic: no app-specific terms (no solon), and no
13
+ // provider-raw structures in the payload — raw data lives in
14
+ // metadata.headers.
15
+ // - NO bodies: bodyRef points to file-foundation storage. The event store
16
+ // is not a blob store.
17
+ // - PII (address/from/to/cc/subject/snippet) is stored as ciphertext in
18
+ // the payload (`kumiko-pii:v1:...`), encrypted BEFORE append in the
19
+ // write handler — the subject key is the tenant, and tenant destruction's
20
+ // eraseSubjectKeys makes both the event log and projection unreadable
21
+ // (crypto-shredding, the billing-foundation pattern).
21
22
 
22
23
  import * as z from "zod";
23
24
  import { INBOUND_MAIL_FOUNDATION_FEATURE, InboundMailAccountStatuses } from "./constants.ts";
24
25
 
25
- // Aggregate-types für den event-store.
26
+ // Aggregate types for the event store.
26
27
  export const MAIL_ACCOUNT_AGGREGATE_TYPE = "mail-account" as const;
27
28
  export const INBOUND_MESSAGE_AGGREGATE_TYPE = "inbound-message" as const;
28
29
  export const MAIL_THREAD_AGGREGATE_TYPE = "mail-thread" as const;
29
30
 
30
- // Event-name-Konstanten — short-form (für r.defineEvent) + qualifizierte
31
- // FQN (für ctx.unsafeAppendEvent + projection-apply-keys).
31
+ // Event-name constants — short forms (for r.defineEvent) and qualified
32
+ // FQNs (for ctx.unsafeAppendEvent and projection-apply keys).
32
33
  export const MAIL_ACCOUNT_CONNECTED_EVENT_SHORT = "mail-account-connected" as const;
33
34
  export const MAIL_ACCOUNT_UPDATED_EVENT_SHORT = "mail-account-updated" as const;
34
35
  export const MAIL_ACCOUNT_DISCONNECTED_EVENT_SHORT = "mail-account-disconnected" as const;
@@ -54,48 +55,50 @@ const accountStatusEnum = z.enum([
54
55
  ]);
55
56
 
56
57
  // ============================================================================
57
- // mail-account-Stream — connected / updated / disconnected
58
+ // mail-account stream — connected / updated / disconnected
58
59
  // ============================================================================
59
60
  //
60
- // Ein Stream pro Postfach (aggregateId = accountId, random uuid beim
61
- // connect). address ist PII → maxLength 1000 wegen Ciphertext-Blowup
62
- // (ein 200-char-Plaintext wird ~460+ chars JSON-envelope, siehe
63
- // billing-foundation events.ts).
61
+ // One stream per mailbox (aggregateId = accountId, random UUID on connect).
62
+ // address is PII, so maxLength is 1000 to allow for ciphertext expansion
63
+ // (a 200-character plaintext becomes ~460+ characters in a JSON envelope;
64
+ // see billing-foundation events.ts).
64
65
  export const mailAccountEventPayloadSchema = z.object({
65
66
  provider: z.string().min(1).max(50),
66
- /** "password" | "xoauth2" | "oauth" (InboundMailAuthMethods) — bewusst
67
- * string statt enum: neue Auth-Methoden ohne Event-Upcaster. */
67
+ /** "password" | "xoauth2" | "oauth" (InboundMailAuthMethods) — deliberately
68
+ * a string rather than an enum, so new auth methods require no event
69
+ * upcaster. */
68
70
  authMethod: z.string().min(1).max(30),
69
- /** null = tenant-geteilt, sonst persönliches Postfach dieses Users. */
71
+ /** null = shared by the tenant; otherwise, this user's personal mailbox. */
70
72
  ownerUserId: z.string().max(36).nullable(),
71
73
  displayName: z.string().max(200),
72
74
  address: z.string().min(1).max(1000),
73
75
  status: accountStatusEnum,
74
- /** Provider-agnostischer Watch-Zustand ("idle", "watching",
75
- * "backoff:3", ...) — reines Ops-Signal, kein PII. */
76
+ /** Provider-agnostic watch state ("idle", "watching", "backoff:3", ...)
77
+ * — an operational signal only, not PII. */
76
78
  watchState: z.string().max(100),
77
79
  });
78
80
  export type MailAccountEventPayload = z.infer<typeof mailAccountEventPayloadSchema>;
79
81
 
80
82
  // ============================================================================
81
- // inbound-message-Stream — genau EIN received-Event pro Message
83
+ // inbound-message stream — exactly ONE received event per message
82
84
  // ============================================================================
83
85
  //
84
86
  // aggregateId = inboundMessageAggregateId(accountId, providerMessageId)
85
- // → deterministic, Provider-Replays kollidieren auf demselben Stream.
87
+ // → deterministic, so provider replays collide on the same stream.
86
88
  //
87
- // PII-Felder (from/to/cc/subject/snippet): Ciphertext, maxLength großzügig.
88
- // to/cc als JSON-stringified string[] VOR encryption — im Payload steht
89
- // der Ciphertext-String, nicht das Array (primitives only, upcaster-safe).
89
+ // PII fields (from/to/cc/subject/snippet): ciphertext with generous
90
+ // maximum lengths. to/cc are JSON-stringified string[] BEFORE encryption;
91
+ // the payload contains the ciphertext string, not the array (primitives only,
92
+ // upcaster-safe).
90
93
  export const inboundMessageEventPayloadSchema = z.object({
91
94
  accountId: z.uuid(),
92
- /** Scope-Vererbung vom Account (Ingest-Zeitpunkt). */
95
+ /** Scope inherited from the account at ingest time. */
93
96
  ownerUserId: z.string().max(36).nullable(),
94
- /** RFC-5322 Message-ID-Header (normalisiert, ohne <>) — NICHT PII-
95
- * encrypted: Idempotency/Threading-Anchor, opaque technical id. */
97
+ /** RFC-5322 Message-ID header (normalized, without <>) — NOT PII-encrypted:
98
+ * idempotency/threading anchor and opaque technical ID. */
96
99
  messageIdHeader: z.string().min(1).max(500),
97
- /** Normalisierter Thread-Schlüssel (References-Chain-Root bzw.
98
- * Provider-Thread-ID, provider-präfixed). */
100
+ /** Normalized thread key (References-chain root or provider thread ID,
101
+ * prefixed by the provider). */
99
102
  threadKey: z.string().min(1).max(500),
100
103
  from: z.string().min(1).max(2000),
101
104
  /** JSON-stringified string[], dann PII-encrypted. */
@@ -104,14 +107,14 @@ export const inboundMessageEventPayloadSchema = z.object({
104
107
  cc: z.string().max(8000),
105
108
  subject: z.string().max(4000),
106
109
  snippet: z.string().max(4000),
107
- /** ISO-Instant — Empfangszeit laut Provider (INTERNALDATE bzw.
108
- * receivedDateTime), nicht Ingest-Zeit. */
110
+ /** ISO instant — receipt time reported by the provider (INTERNALDATE or
111
+ * receivedDateTime), not ingest time. */
109
112
  receivedAtIso: z.string().min(1),
110
- /** file-foundation-Referenz auf den raw-Body (MIME). Leer wenn die
111
- * App ohne Body-Persistenz mounted (snippet-only-Mode). */
113
+ /** file-foundation reference to the raw body (MIME). Empty when the app
114
+ * is mounted without body persistence (snippet-only mode). */
112
115
  bodyRef: z.string().max(500),
113
- /** Fachlicher Scope-Hint für nachgelagerte Business-Prozesse —
114
- * generisch ("inbox", Folder-Name), KEINE App-Semantik. */
116
+ /** Domain scope hint for downstream business processes — generic
117
+ * ("inbox", folder name), with NO app-specific semantics. */
115
118
  scope: z.string().max(200),
116
119
  });
117
120
  export type InboundMessageEventPayload = z.infer<typeof inboundMessageEventPayloadSchema>;
@@ -134,14 +137,15 @@ export type MailThreadEventPayload = z.infer<typeof mailThreadEventPayloadSchema
134
137
  export type InboundMessageEventHeaders = {
135
138
  readonly providerMessageId: string;
136
139
  readonly providerName: string;
137
- /** Provider-Cursor-Snapshot zum Ingest-Zeitpunkt (UIDVALIDITY:UID,
138
- * deltaLink, historyId ...) — Debug/Replay-Hilfe, kein Payload. */
140
+ /** Provider cursor snapshot at ingest time (UIDVALIDITY:UID, deltaLink,
141
+ * historyId ...) — useful for debugging and replay, not part of the
142
+ * payload. */
139
143
  readonly providerCursor: string;
140
144
  };
141
145
 
142
146
  export type MailAccountEventHeaders = {
143
147
  readonly providerName: string;
144
- /** Was den Übergang ausgelöst hat ("connect_flow", "watch_supervisor",
148
+ /** What triggered the transition ("connect_flow", "watch_supervisor",
145
149
  * "oauth_refresh", "tenant_admin"). */
146
150
  readonly reason: string;
147
151
  };
@@ -1,44 +1,44 @@
1
1
  // kumiko-feature-version: 1
2
2
  //
3
- // inbound-mail-foundation — Plugin-Host für eingehende E-Mail
4
- // (Inbox-Föderation). Gegenstück zu mail-foundation (outbound): getrennte
5
- // Extension-Points, getrennter State — Architektur-Vorbild ist
6
- // file-foundation (Foundation besitzt State), nicht mail-transport.
3
+ // inbound-mail-foundation — Plugin host for inbound e-mail
4
+ // (inbox federation). Counterpart to mail-foundation (outbound): separate
5
+ // extension points, separate state — architectural model is
6
+ // file-foundation (the foundation owns state), not mail-transport.
7
7
  //
8
- // **Multi-Provider von Tag 1** (wie billing-foundation): KEIN globaler
9
- // `provider`-config-key. Ein Tenant verbindet parallel IMAP- und (später)
10
- // M365-/Gmail-Postfächer; der Provider steht pro MailAccount.
8
+ // **Multi-provider from day one** (as with billing-foundation): NO global
9
+ // `provider` config key. A tenant can connect IMAP and (later) M365/Gmail
10
+ // mailboxes in parallel; the provider is specified per MailAccount.
11
11
  //
12
- // **Was diese Foundation liefert:**
13
- // 1. **Plugin-API** für Inbound-Provider via r.extendsRegistrar
12
+ // **What this foundation provides:**
13
+ // 1. **Plugin API** for inbound providers via r.extendsRegistrar
14
14
  // ("inboundMailProvider"): verify/fetch/oauth?/watch? (types.ts).
15
- // 2. **3 event-sourced Streams** — mail-account (Lifecycle),
16
- // inbound-message (genau EIN received-Event pro Mail, deterministic
17
- // aggregateId ⇒ exactly-once trotz at-least-once-Ingest),
18
- // mail-thread (Rollup). Volle Historie replay-fähig für spätere
19
- // Consumer (Business-Prozesse: Ticket, Beleg, Auto-Antwort).
20
- // 3. **Inline-Projections** auf read_mail_accounts /
15
+ // 2. **3 event-sourced streams** — mail-account (lifecycle),
16
+ // inbound-message (exactly ONE received event per message, deterministic
17
+ // aggregateId ⇒ exactly-once despite at-least-once ingest),
18
+ // mail-thread (rollup). Full replayable history for later
19
+ // consumers (business processes: ticket, receipt, auto-reply).
20
+ // 3. **Inline projections** into read_mail_accounts /
21
21
  // read_inbound_messages / read_mail_threads (read-your-own-write).
22
- // 4. **Write-/Query-Handler**: connect/update/disconnect-account,
22
+ // 4. **Write/query handlers**: connect/update/disconnect-account,
23
23
  // ingest-message (programmatic, SystemAdmin), account:list +
24
- // message:list (PII-decrypted, scope-gefiltert).
25
- // 5. **createInboundMailConnectRoutes**: OAuth-Connect + anonymer
26
- // Callback (außerhalb /api/*), state HMAC-signiert.
27
- // 6. **createInboundMailSupervisor**: app-verdrahteter Watch-(IDLE)-
28
- // Supervisor mit Backoff + Reconciliation-Poll.
24
+ // message:list (PII-decrypted, scope-filtered).
25
+ // 5. **createInboundMailConnectRoutes**: OAuth connect + anonymous
26
+ // callback (outside /api/*), with HMAC-signed state.
27
+ // 6. **createInboundMailSupervisor**: app-wired watch (IDLE)
28
+ // supervisor with backoff + reconciliation poll.
29
29
  //
30
- // **Was diese Foundation NICHT macht:**
31
- // - Keine Business-Semantik (Intent, Ticket, Zuweisung, gelesen/
32
- // erledigt) — das gehört dem App-Consumer (z.B. via Event-Job auf
33
- // inbound-message-received + eigener Projection).
34
- // - Kein Body-Blob im Event-Store: rawMime → file-foundation via
35
- // Supervisor-storeBody-Hook, Event trägt nur bodyRef.
36
- // - Kein IMAP-Flag-Write-back (V1) — Inbox-Status lebt beim Consumer.
30
+ // **What this foundation does NOT do:**
31
+ // - No business semantics (intent, ticket, assignment, read/
32
+ // completed) — those belong to the app consumer (for example, via an
33
+ // event job on inbound-message-received + its own projection).
34
+ // - No body blob in the event store: rawMime → file-foundation via
35
+ // the Supervisor-storeBody-Hook; the event carries only bodyRef.
36
+ // - No IMAP flag write-back (V1) — inbox status belongs to the consumer.
37
37
  //
38
38
  // **PII/GDPR:** address/from/to/cc/subject/snippet are `personal: "tenant"`
39
39
  // — encrypted BEFORE every event append (the only write path), event log AND
40
40
  // projections carry ciphertext; tenant-destroy shreds the subject key
41
- // (crypto-shredding, same pattern as billing-foundation #800). The destroy
41
+ // (crypto-shredding, the same pattern as billing-foundation). The destroy
42
42
  // hook additionally archives all streams + deletes the rows.
43
43
 
44
44
  import type { DbConnection } from "@cosmicdrift/kumiko-framework/db";
@@ -111,7 +111,7 @@ export function createInboundMailFoundationFeature() {
111
111
  category: "notifications",
112
112
  recommended: false,
113
113
  });
114
- // EXT_TENANT_DATA-Hook braucht den tenant-lifecycle-Host.
114
+ // The EXT_TENANT_DATA hook requires the tenant-lifecycle host.
115
115
  r.requires({ features: ["tenant-lifecycle"] });
116
116
 
117
117
  // 5 fine-grained domain-events (Payload-Schemas: events.ts).
@@ -135,7 +135,7 @@ export function createInboundMailFoundationFeature() {
135
135
  piiFields: "none",
136
136
  });
137
137
 
138
- // Inline projections — apply in derselben TX wie der Append.
138
+ // Inline projections — apply in the same transaction as the append.
139
139
  r.projection({
140
140
  name: "mail-account",
141
141
  source: MAIL_ACCOUNT_AGGREGATE_TYPE,
@@ -177,7 +177,7 @@ export function createInboundMailFoundationFeature() {
177
177
 
178
178
  // Sync machinery: high-frequency tick state, deliberately NOT
179
179
  // event-sourced — r.storeTable keeps the migration DDL but excludes the
180
- // tables from the projection rebuild (#494/#498 class).
180
+ // tables from the projection rebuild.
181
181
  r.storeTable(syncCursorTable, {
182
182
  reason: "read_side.mail_sync_cursors_direct_write",
183
183
  });
@@ -203,8 +203,8 @@ export function createInboundMailFoundationFeature() {
203
203
  r.screen(mailAccountEditScreen);
204
204
  r.translations({ keys: INBOUND_MAIL_FOUNDATION_I18N });
205
205
 
206
- // Entity-genaue GDPR-Destroy-Hooks — der gdpr-storage-Boot-Validator
207
- // prueft die EXT_TENANT_DATA-Registrierung pro tenant-subject-Entity.
206
+ // Entity-specific GDPR destroy hooks — the gdpr-storage boot validator
207
+ // checks the EXT_TENANT_DATA registration for each tenant-subject entity.
208
208
  r.useExtension(EXT_TENANT_DATA, "mail-account", {
209
209
  destroy: mailAccountTenantDestroyHook,
210
210
  escapeHatch: { reason: INBOUND_MAIL_TENANT_DESTROY_ARCHIVE_REASON },
@@ -218,7 +218,7 @@ export function createInboundMailFoundationFeature() {
218
218
  escapeHatch: { reason: INBOUND_MAIL_TENANT_DESTROY_ARCHIVE_REASON },
219
219
  });
220
220
 
221
- // Data-Retention (#957) — perTenant fan-out (one run per tenant, like
221
+ // Data-Retention — perTenant fan-out (one run per tenant, like
222
222
  // data-retention:retention-cleanup): runInboundMailRetention's raw query
223
223
  // helpers need the unfiltered runner, so the handler declares escapeHatch
224
224
  // and reaches for ctx.db.unsafeRaw(). Without this cron, read_inbound_messages
@@ -245,10 +245,10 @@ export function createInboundMailFoundationFeature() {
245
245
  const T = (await import("@cosmicdrift/kumiko-framework/time")).getTemporal();
246
246
  const retentionDb = ctx.db.unsafeRaw() as DbConnection; // @cast-boundary db-operator — jobs never run inside a DbTx
247
247
 
248
- // Body-Objekte liegen in file-foundation. Provider lazy + memoized —
249
- // heute schreibt der Ingest kein bodyRef (storeBody-Hook ungebunden),
250
- // der Provider wird also nie gebaut. Sobald storeBody wired ist, raeumt
251
- // die Retention die Bodies mit ab.
248
+ // Body objects are stored in file-foundation. The provider is lazy and memoized —
249
+ // ingest currently writes no bodyRef (the storeBody hook is not wired),
250
+ // so the provider is never built. Once storeBody is wired, retention
251
+ // also cleans up the bodies.
252
252
  let providerPromise: Promise<FileStorageProvider> | null = null;
253
253
  const deleteBodyObject = async (bodyRef: string): Promise<void> => {
254
254
  if (!providerPromise) {
@@ -1,13 +1,13 @@
1
- // Geteilter State-Loader für update-account / disconnect-account.
1
+ // Shared state loader for update-account / disconnect-account.
2
2
  //
3
- // Die mail-account-Events sind full-snapshots (Muster billing-foundation:
4
- // "Alle nutzen denselben payload-shape, der event-type taggt was
5
- // passiert ist") — ein Übergangs-Handler lädt den letzten Snapshot,
6
- // merged seine Delta-Felder rein und appendet den neuen Snapshot.
3
+ // mail-account events are full snapshots (following the billing-foundation
4
+ // pattern: "All events use the same payload shape; the event-type identifies
5
+ // what happened") — a transitional handler loads the latest snapshot, merges
6
+ // its delta fields into it, and appends the new snapshot.
7
7
  //
8
- // **PII-Disziplin:** `address` steht im geladenen Payload bereits als
9
- // Ciphertext und wird 1:1 durchkopiert — NIE re-encrypten (würde bei
10
- // fehlendem KMS decrypt erzwingen bzw. Double-Encryption produzieren).
8
+ // **PII discipline:** `address` is already ciphertext in the loaded payload
9
+ // and is copied byte-for-byte — NEVER re-encrypt it (that would require KMS
10
+ // decryption when unavailable or produce double encryption).
11
11
 
12
12
  import type { HandlerContext } from "@cosmicdrift/kumiko-framework/engine";
13
13
  import type { MailAccountEventPayload } from "../events.ts";
@@ -1,17 +1,16 @@
1
- // connect-account — Tenant-Admin verbindet ein Postfach. Legt den
2
- // mail-account-Stream an (aggregateId = random uuid = accountId =
3
- // Secret-Slot-Key für IMAP-Passwort/OAuth-Refresh-Token).
1
+ // connect-account — A tenant admin connects a mailbox. Creates the
2
+ // mail-account stream (aggregateId = random uuid = accountId =
3
+ // secret-slot key for the IMAP password/OAuth refresh token).
4
4
  //
5
- // **Was hier NICHT passiert:**
6
- // - Kein Secret-Write: IMAP-Credentials laufen über den secrets-Pfad,
7
- // OAuth-Tokens über die generischen /inbound-mail/oauth-Routen —
8
- // beides VOR bzw. NACH diesem Call, nie durch den Handler-Payload
9
- // (Plain-Passwörter gehören nicht in einen Write-Payload, der im
10
- // Dispatcher-Log landen kann).
11
- // - Kein Verbindungs-Test: der Watch-Supervisor probiert den ersten
12
- // fetch und schaltet bei Fehler via update-account auf auth_error —
13
- // der Connect bleibt schnell und offline-fähig (Test-Ergebnis kommt
14
- // asynchron als Status-Übergang).
5
+ // **What does NOT happen here:**
6
+ // - No secret write: IMAP credentials use the secrets path, and OAuth
7
+ // tokens use the generic /inbound-mail/oauth routes—both before or
8
+ // after this call, never in the handler payload (plain passwords must
9
+ // not enter a write payload that can appear in the dispatcher log).
10
+ // - No connection test: the watch supervisor attempts the first fetch
11
+ // and switches to auth_error via update-account on failure—the connect
12
+ // stays fast and offline-capable (the test result arrives asynchronously
13
+ // as a status transition).
15
14
 
16
15
  import {
17
16
  configuredPiiSubjectKms,
@@ -30,7 +29,7 @@ import {
30
29
  } from "../events.ts";
31
30
 
32
31
  export const connectAccountSchema = z.object({
33
- /** Provider-Key wie an der Extension registriert ("imap",
32
+ /** Provider key registered with the extension ("imap",
34
33
  * "m365-graph", "gmail-rest"). */
35
34
  provider: z.string().min(1).max(50),
36
35
  authMethod: z.enum([
@@ -39,16 +38,16 @@ export const connectAccountSchema = z.object({
39
38
  InboundMailAuthMethods.oauth,
40
39
  ]),
41
40
  displayName: z.string().max(200),
42
- /** Postfach-Adresse, Plaintext — wird hier encrypted. */
41
+ /** Mailbox address in plaintext; it is encrypted here. */
43
42
  address: z.string().min(1).max(320),
44
- /** "shared" = tenant-geteilt (info@) · "user" = persönliches Postfach
45
- * des Callers (ownerUserId wird aus der Session gezogen, nie aus dem
46
- * Payload — kein Fremd-Claiming). */
43
+ /** "shared" = shared across the tenant (info@) · "user" = the caller's
44
+ * personal mailbox (ownerUserId is taken from the session, never from
45
+ * the payload—preventing claims on another user's mailbox). */
47
46
  scope: z.enum(["shared", "user"]),
48
- /** NUR für den programmatic OAuth-Callback-Pfad (SystemAdmin): dort
49
- * ist der Dispatcher-User ein SystemUser, der echte Owner steht im
50
- * HMAC-verifizierten state. Tenant-Caller dürfen das Feld nicht
51
- * setzen (Fremd-Claiming-Sperre im Handler). */
47
+ /** Only for the programmatic OAuth callback path (SystemAdmin): there,
48
+ * the dispatcher user is a SystemUser and the actual owner is in the
49
+ * HMAC-verified state. Tenant callers must not set this field (the
50
+ * handler prevents claims on another user's mailbox). */
52
51
  ownerUserIdOverride: z.string().max(36).nullable().optional(),
53
52
  });
54
53
  type ConnectAccountPayload = z.infer<typeof connectAccountSchema>;
@@ -75,8 +74,8 @@ export const connectAccountHandler: WriteHandlerDef = {
75
74
  ? event.user.id
76
75
  : null;
77
76
 
78
- // PII-Encrypt der Adresse vor dem append — einziger Write-Pfad auf
79
- // den Stream, deckt Event-Log UND Projection ab (#800-Muster).
77
+ // PII-encrypt the address before the append. This is the only write path to
78
+ // the stream, so it covers both the event log and the projection.
80
79
  const piiKms = configuredPiiSubjectKms();
81
80
  const plainPii = { tenantId, address: payload.address };
82
81
  const encryptedFields = piiKms
@@ -96,8 +95,8 @@ export const connectAccountHandler: WriteHandlerDef = {
96
95
  ownerUserId,
97
96
  displayName: payload.displayName,
98
97
  address: encryptedFields.address,
99
- // active ab Connect — der Supervisor greift den Account beim
100
- // nächsten Tick auf und degradiert ihn bei Credential-Fehlern.
98
+ // The account is active upon connection; the supervisor picks it up on
99
+ // the next tick and downgrades it when credentials fail.
101
100
  status: InboundMailAccountStatuses.active,
102
101
  watchState: "idle",
103
102
  };
@@ -1,11 +1,11 @@
1
- // disconnect-account — Tenant-Admin trennt ein Postfach. Stream bleibt
2
- // (Audit-Historie), Status wird disconnected, der Watch-Supervisor
3
- // überspringt den Account ab dem nächsten Tick. Secret-Cleanup (IMAP-
4
- // Passwort/Refresh-Token im Slot accountId) macht der Aufrufer-Flow —
5
- // der Handler fasst den secrets-Pfad nicht an.
1
+ // disconnect-account — A TenantAdmin disconnects a mailbox. The stream is retained
2
+ // for audit history, the status becomes disconnected, and the watch supervisor
3
+ // skips the account starting with the next tick. Secret cleanup (IMAP password/
4
+ // refresh token in the accountId slot) is handled by the caller flow; this handler
5
+ // does not touch the secrets path.
6
6
  //
7
- // Idempotent: disconnect auf bereits disconnected Account ist ein
8
- // success-no-op (kein zweites Event) — Doppelklick-/Retry-freundlich.
7
+ // Idempotent: disconnecting an already disconnected account is a success no-op
8
+ // with no second event, making double-clicks and retries safe.
9
9
 
10
10
  import type { WriteHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
11
11
  import { failNotFound } from "@cosmicdrift/kumiko-framework/errors";