@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,28 +1,30 @@
1
- // Inbound-mail data-retention (#957). DSGVO Art. 5 (Datenminimierung):
2
- // ohne Retention wachsen read_inbound_messages + die File-Storage-Bodies
3
- // unbegrenzt. Zwei Targets, zwei Mechanismen — der Unterschied ist
4
- // event-sourced vs. unmanaged:
1
+ // Inbound-mail data retention. DSGVO Art. 5 (data minimization):
2
+ // without retention, read_inbound_messages and the file-storage bodies grow
3
+ // without bound. Two targets, two mechanisms—the difference is
4
+ // event-sourced versus unmanaged:
5
5
  //
6
- // read_inbound_messages (event-sourced, EXPLIZITE r.projection):
7
- // pro Row aelter als messageRetentionDays → archiveStream + Row-Delete
8
- // (+ bodyRef-Objekt loeschen). archiveStream statt executor.forget, weil
9
- // die Projection nur das received-Domain-Event mappt, nicht den
10
- // forgotten-Auto-Verb (den registriert nur ImplicitProjection). Ein
11
- // forget-Event wuerde beim Rebuild ignoriert und die Row aus dem
12
- // received-Event resurrecten (#648-Klasse). Der archivierte Stream macht
13
- // loadAggregate leer → received wird gar nicht erst repliziert. Gleiches
14
- // Muster wie tenant-destroy-hook, nur per-Row-cutoff statt ganzer Tenant.
6
+ // read_inbound_messages (event-sourced, EXPLICIT r.projection):
7
+ // each Row older than messageRetentionDays → archiveStream + Row delete
8
+ // (+ delete the bodyRef object). archiveStream instead of executor.forget
9
+ // because the projection maps only the received domain event, not the
10
+ // forgotten auto-verb (which only ImplicitProjection registers). A
11
+ // forget event would be ignored during a rebuild, causing the Row to be
12
+ // resurrected from the received event. The archived stream makes
13
+ // loadAggregate empty, so received is not replicated in the first place.
14
+ // Same pattern as tenant-destroy-hook, but with a per-Row cutoff instead
15
+ // of an entire Tenant.
15
16
  //
16
- // store_mail_seen_messages (unmanaged, direct-write, nicht event-sourced):
17
- // Dedup-Anker braucht nur das Backfill-/Replay-Fenster → seenAt-cutoff
18
- // via plain deleteMany, kein Stream/Archiv. Gescoped direkt über die
19
- // tenant_id-Spalte der Tabelle (table-builder-Konvention), kein Account-Join.
17
+ // store_mail_seen_messages (unmanaged, direct-write, not event-sourced):
18
+ // The deduplication anchor is needed only for the backfill/replay window →
19
+ // seenAt cutoff via plain deleteMany, with no stream/archive. Scoped
20
+ // directly through the table's tenant_id column (table-builder convention),
21
+ // without an Account join.
20
22
  //
21
- // GRENZE (#957 Teil 2, Plan §3.4): die PII in den Message-Events bleibt
22
- // unter dem TENANT-Subject-Key entschluesselbar — per-Row-Retention
23
- // shreddet keinen Key. Echte Art.-17-Erasure der Event-Payloads passiert
24
- // erst bei tenant-destroy (Key-Erase). Read-Row + Body-File sind nach dem
25
- // Sweep weg; das Event-Log ist append-only by design.
23
+ // LIMITATION: the PII in the message events remains decryptable under the
24
+ // TENANT subject key—per-Row retention does not shred a key. Actual Art.-17
25
+ // erasure of event payloads happens only during tenant-destroy (key erasure).
26
+ // The read Row and body file are gone after the sweep; the event log is
27
+ // append-only by design.
26
28
 
27
29
  import { type DbRunner, deleteMany, selectMany } from "@cosmicdrift/kumiko-framework/db";
28
30
  import type { TenantId } from "@cosmicdrift/kumiko-framework/engine";
@@ -35,8 +37,8 @@ import { seenMessageTable } from "./entities.ts";
35
37
  import { INBOUND_MESSAGE_AGGREGATE_TYPE } from "./events.ts";
36
38
  import { inboundMessagesProjectionTable } from "./projection.ts";
37
39
 
38
- // Temporal.Instant ohne den Caller zwingen es aus globalThis zu ziehen
39
- // (Muster data-retention/keep-for.ts).
40
+ // Provides Temporal.Instant without forcing the caller to obtain it from
41
+ // globalThis (same pattern as data-retention/keep-for.ts).
40
42
  type Instant = InstanceType<ReturnType<typeof getTemporal>["Instant"]>;
41
43
 
42
44
  export const MESSAGE_RETENTION_DAYS = 365;
@@ -48,12 +50,14 @@ const REASON = "retention_expired";
48
50
  export interface InboundRetentionArgs {
49
51
  readonly db: DbRunner;
50
52
  readonly tenantId: TenantId;
51
- /** Now-Injection — Tests pinnen den Wert ohne Date-Mock (Pattern keep-for.ts). */
53
+ /**
54
+ * Injects the current time so tests can pin it without a date mock (pattern from keep-for.ts).
55
+ */
52
56
  readonly now: Instant;
53
57
  readonly messageRetentionDays?: number;
54
58
  readonly seenRetentionDays?: number;
55
- /** Loescht ein file-storage-Body-Objekt per bodyRef-key. Vom Job lazy
56
- * verdrahtet (createFileProviderForTenant). Fehlt = kein Body-Delete. */
59
+ /** Deletes a file-storage body object by bodyRef key. Wired lazily by the job
60
+ * (createFileProviderForTenant); if absent, no body is deleted. */
57
61
  readonly deleteBodyObject?: (bodyRef: string) => Promise<void>;
58
62
  }
59
63
 
@@ -88,18 +92,18 @@ async function purgeExpiredMessages(
88
92
  let bodyObjectsDeleted = 0;
89
93
  let bodyObjectErrors = 0;
90
94
 
91
- // Drain-Loop: jede Page loescht die Rows die sie liest, die naechste ist
92
- // damit frisch. archiveStream VOR dem Delete (crash dazwischen → naechster
93
- // Lauf re-archiviert idempotent + loescht). Delete strikt nach den
94
- // archivierten ids, nie per cutoff-WHERE — sonst koennte eine zwischen
95
- // select und delete eingegangene Alt-Mail unarchiviert geloescht werden
96
- // und beim Rebuild resurrecten.
95
+ // Drain loop: each page deletes the Rows it reads, so the next page is fresh.
96
+ // Run archiveStream BEFORE deletion: if a crash occurs in between, the next
97
+ // run re-archives idempotently and deletes the Row. Delete strictly by the
98
+ // archived IDs, never with a cutoff WHERE; otherwise an old mail arriving
99
+ // between select and delete could be deleted without being archived and
100
+ // resurrected during a rebuild.
97
101
  //
98
- // Ein Row deren deleteBodyObject fehlschlaegt wird NICHT geloescht — sonst
99
- // ginge die einzige Referenz auf das (dann verwaiste) File-Objekt verloren
100
- // (kein Retry, kein Dead-Letter). Die Row bleibt fuer den naechsten Sweep
101
- // stehen (archiveStream ist idempotent). failedIds verhindert, dass so ein
102
- // Row innerhalb DIESES Laufs endlos re-selektiert wird.
102
+ // A Row whose deleteBodyObject fails is NOT deleted; otherwise the only
103
+ // reference to the now-orphaned file object would be lost (no retry or
104
+ // dead-letter). The Row remains for the next sweep (archiveStream is
105
+ // idempotent). failedIds prevents such a Row from being selected endlessly
106
+ // during THIS run.
103
107
  const failedIds = new Set<string>();
104
108
  for (;;) {
105
109
  const rows = (
@@ -153,9 +157,9 @@ async function purgeExpiredSeenAnchors(
153
157
  tenantId: TenantId,
154
158
  cutoff: Instant,
155
159
  ): Promise<number> {
156
- // Seen-Anker erben tenantId (table-builder: jede Entity hat tenant_id) →
157
- // direkt tenant-scoped, kein Account-Join. Trifft auch Anker, deren Account
158
- // schon disconnected/geloescht ist.
160
+ // Seen anchors inherit tenantId (table-builder: every Entity has tenant_id) →
161
+ // scoped directly to the tenant, without an Account join. This also includes
162
+ // anchors whose Account has already been disconnected or deleted.
159
163
  const where = { tenantId, seenAt: { lt: cutoff } };
160
164
  const expired = await selectMany<{ accountId: string }>(db, seenMessageTable, where);
161
165
  if (expired.length === 0) return 0;
@@ -77,8 +77,6 @@ export const mailAccountListScreen: ProjectionListScreenDefinition = {
77
77
  dormant: true,
78
78
  };
79
79
 
80
- // The reason is the audit label update-account requires; it is not in the
81
- // layout, so the default is what gets written.
82
80
  export const mailAccountEditScreen: ActionFormScreenDefinition = {
83
81
  id: MAIL_ACCOUNT_EDIT_SCREEN_ID,
84
82
  type: "actionForm",
@@ -87,7 +85,6 @@ export const mailAccountEditScreen: ActionFormScreenDefinition = {
87
85
  fields: {
88
86
  accountId: { type: "text", required: true },
89
87
  displayName: { type: "text", required: true, maxLength: 200 },
90
- reason: { type: "text", default: "tenant_admin" },
91
88
  },
92
89
  layout: {
93
90
  sections: [{ fields: [{ field: "accountId", readOnly: true }, "displayName"] }],
@@ -1,21 +1,19 @@
1
- // Tenant-destroy hooks — räumen beim Tenant-Destroy alle Inbound-Mail-
2
- // Spuren des Tenants ab. Ein Hook PRO tenant-subject-Entity (der
3
- // gdpr-storage-Boot-Validator prüft die EXT_TENANT_DATA-Registrierung
4
- // entity-genau), jeweils:
1
+ // Tenant-destroy hooks remove all inbound-mail traces belonging to the tenant.
2
+ // One hook per tenant-subject entity (the gdpr-storage boot validator checks
3
+ // the EXT_TENANT_DATA registration per entity), each of which:
5
4
  //
6
- // 1. Streams archivieren — ein künftiger Projection-Rebuild kann
7
- // Gelöschtes nicht resurrecten (Muster billing-foundation #800).
8
- // Message-Streams sind viele → Loop über die Projection-Rows
9
- // (Row-PK = Stream-ID); tenant-destroy ist ein seltener
10
- // Batch-Vorgang, O(n) ist ok.
11
- // 2. Projection-Rows löschen.
12
- // 3. Nur mail-account: unmanaged Sync-State (Cursors, Seen-Anchors)
13
- // löschen — gekeyt per accountId, deshalb aus den Account-Rows
14
- // VOR dem Delete eingesammelt.
5
+ // 1. Archives streams so a future projection rebuild cannot resurrect
6
+ // deleted data. Message streams are numerous, so loop over the
7
+ // projection rows (row PK = stream ID); tenant-destroy is a rare batch
8
+ // operation, so O(n) is acceptable.
9
+ // 2. Deletes the projection rows.
10
+ // 3. For mail-account only, deletes unmanaged sync state (cursors,
11
+ // seen anchors), which is keyed by accountId and must therefore be
12
+ // collected from the account rows BEFORE deletion.
15
13
  //
16
- // Die eigentliche PII-Erasure macht crypto-shredding: eraseSubjectKeys
17
- // löscht den Tenant-Subject-Key, damit werden Event-Log-Payloads UND
18
- // etwaige Ciphertext-Kopien unlesbar. Diese Hooks entsorgen die Rows.
14
+ // The actual PII erasure uses crypto-shredding: eraseSubjectKeys deletes the
15
+ // tenant subject key, making event-log payloads AND any ciphertext copies
16
+ // unreadable. These hooks dispose of the rows.
19
17
 
20
18
  import type { EntityTableMeta } from "@cosmicdrift/kumiko-framework/db";
21
19
  import { declareEscapeHatch, type TenantDataHookCtx } from "@cosmicdrift/kumiko-framework/engine";
@@ -1,14 +1,14 @@
1
- // Provider-Contract für inbound-mail-Provider-Plugins (Plan §2).
1
+ // Provider contract for inbound-mail provider plugins.
2
2
  //
3
- // Gespiegelt von mail-foundation's MailTransportContext/-Plugin —
4
- // gleiche Trennung Foundation ↔ Provider, gleicher Slim-Context.
3
+ // Mirrored from mail-foundation's MailTransportContext/-Plugin —
4
+ // the Foundation/provider separation and slim context are identical.
5
5
  //
6
- // **Warum kein voller HandlerContext?** fetch()/watch() laufen im
7
- // Worker-Pfad (Poll-Cron, IDLE-Supervisor) — dort gibt es keinen
8
- // per-request `tx`/`actor`. Ein Plugin das mehr liest würde den
9
- // Worker-Pfad zur Runtime brechen, und das fiele nur in production
10
- // auf. Plugin das mehr braucht: InboundMailContext explizit erweitern
11
- // (sichtbarer breaking change) statt ctx-cast.
6
+ // **Why not a full HandlerContext?** fetch()/watch() run in the worker
7
+ // path (poll cron, IDLE supervisor), where there is no per-request
8
+ // `tx`/`actor`. A plugin that reads more would break the worker path at
9
+ // runtime, and this would only be noticed in production. Plugins that need
10
+ // more must explicitly extend InboundMailContext (a visible breaking change)
11
+ // instead of casting ctx.
12
12
 
13
13
  import type { ConfigAccessor, Registry } from "@cosmicdrift/kumiko-framework/engine";
14
14
  import type { MetricsHandle } from "@cosmicdrift/kumiko-framework/observability";
@@ -21,8 +21,9 @@ import { INBOUND_MAIL_PROVIDER_EXTENSION, type InboundMailAccountStatus } from "
21
21
  * config — tenant config reads (host/port/... of the plugins)
22
22
  * registry — extension lookup in the factory (not plugin-internal)
23
23
  * secrets — tenant secret reads (IMAP password, OAuth refresh token)
24
- * auditUserId — audit identity for secret reads. Handler path: the dispatcher
25
- * sets the caller user ID; worker path: system identity.
24
+ * auditUserId — audit identity for secret reads. Handler path: unset,
25
+ * requireSecretsContext falls back to ctx.user.id; worker/provider
26
+ * path: system identity set by the resolver.
26
27
  * metricsFor — metrics handle of a feature by name, same behavior as
27
28
  * HandlerContext.metricsFor: unregistered metrics are a silent
28
29
  * no-op instead of a throw.
@@ -36,23 +37,23 @@ export type InboundMailContext = {
36
37
  };
37
38
 
38
39
  /**
39
- * Plaintext-Sicht auf ein verbundenes Postfach, wie Provider sie sehen.
40
- * Die Foundation decryptet `address` VOR dem Provider-Call — Provider
41
- * arbeiten nie mit `kumiko-pii:`-Ciphertext (Guard analog
42
- * withPiiCiphertextGuard im Transport-Pfad).
40
+ * Plaintext view of a connected mailbox exposed to providers.
41
+ * The Foundation decrypts `address` BEFORE the provider call; providers
42
+ * never receive `kumiko-pii:` ciphertext (guard analogous to
43
+ * withPiiCiphertextGuard in the transport path).
43
44
  */
44
45
  export type MailAccountRecord = {
45
- /** = aggregateId des mail-account-Streams; zugleich Secret-Slot-Key. */
46
+ /** = aggregateId of the mail-account stream and the secret-slot key. */
46
47
  readonly id: string;
47
48
  readonly tenantId: string;
48
- /** Provider-Key wie bei der Extension registriert ("imap", "m365-graph",
49
+ /** Provider key registered with the extension ("imap", "m365-graph",
49
50
  * "gmail-rest"). */
50
51
  readonly provider: string;
51
- /** "password" | "xoauth2" | "oauth" — imap unterscheidet hierüber
52
- * Formular-Connect vs. XOAUTH2-Fallback (Plan §2). */
52
+ /** "password" | "xoauth2" | "oauth" — imap uses this to distinguish
53
+ * form-based connect from the XOAUTH2 fallback. */
53
54
  readonly authMethod: string;
54
- /** null = tenant-geteiltes Postfach, sonst persönliches Postfach
55
- * dieses Users (Sichtbarkeits-Scope, Plan Entscheidung 2). */
55
+ /** null = tenant-shared mailbox; otherwise this user's personal mailbox
56
+ * (visibility scope). */
56
57
  readonly ownerUserId: string | null;
57
58
  /** Postfach-Adresse, Plaintext (decrypted). */
58
59
  readonly address: string;
@@ -62,36 +63,35 @@ export type MailAccountRecord = {
62
63
  };
63
64
 
64
65
  /**
65
- * Normalisierte eingehende Mail — Provider-Output, Ingest-Input.
66
- * Provider-raw-Strukturen (IMAP-Flags, Graph-Objekte) bleiben im
67
- * Provider; hier nur der domain-clean Schnitt.
66
+ * Normalized incoming mail — provider output and ingest input.
67
+ * Provider-specific structures (IMAP flags, Graph objects) remain in the
68
+ * provider; this type contains only the domain-level boundary.
68
69
  */
69
70
  export type RawInboundMessage = {
70
- /** Provider-native Message-ID (IMAP UID, Graph id, Gmail id) —
71
- * Idempotency-Anchor zusammen mit providerName. */
71
+ /** Provider-native message ID (IMAP UID, Graph id, Gmail id) — the
72
+ * idempotency anchor together with providerName. */
72
73
  readonly providerMessageId: string;
73
- /** RFC-5322 Message-ID-Header ohne <>; null wenn der Header fehlt
74
- * (Foundation fällt auf deterministischen Ersatz zurück). */
74
+ /** RFC-5322 Message-ID header without <>; null when the header is missing
75
+ * (the Foundation falls back to a deterministic replacement). */
75
76
  readonly messageIdHeader: string | null;
76
- /** Provider-native Thread-/Conversation-ID falls vorhanden (Graph
77
- * conversationId, Gmail threadId); Foundation bevorzugt sie vor der
78
- * References-Chain beim threadKey-Bau. */
77
+ /** Provider-native thread/conversation ID when available (Graph
78
+ * conversationId, Gmail threadId); the Foundation prefers it over the
79
+ * References chain when building threadKey. */
79
80
  readonly providerThreadId: string | null;
80
- /** References/In-Reply-To-Chain (Message-IDs ohne <>), älteste zuerst. */
81
+ /** References/In-Reply-To chain (message IDs without <>), oldest first. */
81
82
  readonly references: readonly string[];
82
83
  readonly from: string;
83
84
  readonly to: readonly string[];
84
85
  readonly cc: readonly string[];
85
86
  readonly subject: string;
86
- /** Plaintext-Vorschau, provider-generiert oder aus dem Body geschnitten. */
87
+ /** Plaintext preview generated by the provider or truncated from the body. */
87
88
  readonly snippet: string;
88
- /** ISO-Instant — INTERNALDATE bzw. receivedDateTime, nicht Ingest-Zeit. */
89
+ /** ISO instant — INTERNALDATE or receivedDateTime, not ingest time. */
89
90
  readonly receivedAtIso: string;
90
- /** Raw MIME; null im snippet-only-Mode. Foundation persisted ihn nach
91
- * file-foundation und schreibt bodyRef — der Event-Store bleibt
92
- * blob-frei. */
91
+ /** Raw MIME; null in snippet-only mode. The Foundation persists it through
92
+ * file-foundation and writes bodyRef, so the event store remains blob-free. */
93
93
  readonly rawMime: Uint8Array | null;
94
- /** Generischer Scope-Hint ("inbox", Folder-Name) — keine App-Semantik. */
94
+ /** Generic scope hint ("inbox", folder name), with no application semantics. */
95
95
  readonly scope: string;
96
96
  };
97
97
 
@@ -103,8 +103,8 @@ export type SyncCursorPayload = Readonly<Record<string, unknown>>;
103
103
  export type InboundFetchResult = {
104
104
  readonly messages: readonly RawInboundMessage[];
105
105
  readonly nextCursor: SyncCursorPayload;
106
- /** true ⇒ Foundation ruft fetch im selben Poll-Tick erneut auf
107
- * (Pagination), bis false oder maxMessages-Budget erschöpft. */
106
+ /** true ⇒ the Foundation calls fetch again in the same poll tick
107
+ * (pagination) until false or the maxMessages budget is exhausted. */
108
108
  readonly hasMore: boolean;
109
109
  };
110
110
 
@@ -117,13 +117,13 @@ export type OAuthTokenSet = {
117
117
  };
118
118
 
119
119
  /**
120
- * OAuth-Teil des Contracts — nur OAuth-Provider; imap (Passwort-Modus)
121
- * lässt `oauth` weg. Die Routen (`/inbound-mail/connect`,
122
- * `/inbound-mail/oauth/callback`) stellt die Foundation generisch —
123
- * Provider registrieren KEINE eigenen Routen.
120
+ * OAuth portion of the contract — OAuth providers only; imap in password
121
+ * mode omits `oauth`. The Foundation provides the routes
122
+ * (`/inbound-mail/connect`, `/inbound-mail/oauth/callback`) generically;
123
+ * providers MUST NOT register their own routes.
124
124
  */
125
125
  export type InboundOAuthFlow = {
126
- /** Scopes: Empfang UND Send in EINEM Consent — Re-Consent ist teuer. */
126
+ /** Scopes: request receive AND send in a SINGLE consent; re-consent is costly. */
127
127
  readonly scopes: {
128
128
  readonly receive: readonly string[];
129
129
  readonly send?: readonly string[];
@@ -150,17 +150,17 @@ export type InboundOAuthFlow = {
150
150
  };
151
151
 
152
152
  /**
153
- * Inbound-Mail-Provider-Plugin contract. Jedes Provider-Feature
154
- * (inbound-provider-imap, -m365-graph, -gmail-rest) registriert eine
155
- * Implementation via `r.useExtension(INBOUND_MAIL_PROVIDER_EXTENSION,
153
+ * Inbound-mail provider plugin contract. Each provider feature
154
+ * (inbound-provider-imap, -m365-graph, -gmail-rest) registers an
155
+ * implementation via `r.useExtension(INBOUND_MAIL_PROVIDER_EXTENSION,
156
156
  * "<key>", plugin)`.
157
157
  */
158
158
  export type InboundMailProviderPlugin = {
159
- /** Credentials-/Erreichbarkeits-Check beim Connect-Flow — wirft
160
- * typisiert (InboundAuthError etc.), kein Rückgabewert. */
159
+ /** Credential/reachability check during the connect flow — throws a
160
+ * typed error (InboundAuthError, etc.) and returns no value. */
161
161
  readonly verify: (ctx: InboundMailContext, account: MailAccountRecord) => Promise<void>;
162
- /** Pull seit cursor. `cursor === null` ⇒ Erst-Befüllung, begrenzt
163
- * durch backfillWindowDays. */
162
+ /** Fetch since cursor. `cursor === null` means initial population,
163
+ * limited by backfillWindowDays. */
164
164
  readonly fetch: (
165
165
  ctx: InboundMailContext,
166
166
  account: MailAccountRecord,
@@ -173,7 +173,7 @@ export type InboundMailProviderPlugin = {
173
173
  * for password accounts and providers without an oauth flow. */
174
174
  readonly accessToken?: string;
175
175
  /** Batch lookup of the provider message ids not yet ingested for this
176
- * account (committed seen anchors, one query per call). Call it after
176
+ * account (committed seen anchors; lists of any size are fine, queried in chunks). Call it after
177
177
  * the listing/delta page and download MIME only for the returned ids.
178
178
  * Ingest dedup stays the correctness anchor; this only saves downloads. */
179
179
  readonly filterUnknownMessageIds?: (
@@ -183,11 +183,11 @@ export type InboundMailProviderPlugin = {
183
183
  ) => Promise<InboundFetchResult>;
184
184
  /** Nur OAuth-Provider. */
185
185
  readonly oauth?: InboundOAuthFlow;
186
- /** Optional: Live-Push (IMAP IDLE, später Graph/Gmail-Webhooks).
187
- * Liefert stop(). Poll bleibt Reconciliation — watch ist Latenz-
188
- * Optimierung, nie Korrektheits-Anker. `onError` meldet den Tod der
189
- * Live-Verbindung (Drop, Auth-Revoke) an den Supervisor, der mit
190
- * Backoff neu startet — der Provider reconnected NICHT selbst. */
186
+ /** Optional live push (IMAP IDLE, later Graph/Gmail webhooks).
187
+ * Returns stop(). Polling remains reconciliation: watch optimizes
188
+ * latency but is never the correctness anchor. `onError` reports a dead
189
+ * live connection (drop, auth revocation) to the supervisor, which
190
+ * restarts it with backoff; the provider does NOT reconnect itself. */
191
191
  readonly watch?: (
192
192
  ctx: InboundMailContext,
193
193
  account: MailAccountRecord,
@@ -201,8 +201,9 @@ export type InboundMailProviderPlugin = {
201
201
  ) => Promise<() => Promise<void>>;
202
202
  };
203
203
 
204
- // extension-usage `options` ist engine-payload (unknown) — strukturell
205
- // validieren statt blind casten (Muster isMailTransportPlugin).
204
+ // `options` in the extension usage is an engine payload (unknown), so
205
+ // validate its structure instead of casting blindly (patterned after
206
+ // isMailTransportPlugin).
206
207
  export function isInboundMailProviderPlugin(o: unknown): o is InboundMailProviderPlugin {
207
208
  return (
208
209
  typeof o === "object" &&
@@ -222,18 +223,17 @@ declare module "@cosmicdrift/kumiko-framework/engine" {
222
223
  }
223
224
 
224
225
  // =============================================================================
225
- // Typisierte Fehlerklassen — Foundation reagiert einheitlich im Poll
226
- // (Plan §2, Fehler-Tabelle):
227
- // InboundAuthError → status=auth_error, kein Retry
228
- // InboundRateLimitError → Poll-Abbruch, nächster Cron-Tick
229
- // InboundCursorInvalidError → Cursor-Reset + Voll-Resync im Backfill-
230
- // Fenster; Dedup fängt Dubletten
231
- // InboundTransientError → Job-Retry (retries: 3, exponential)
226
+ // Typed errors handled uniformly by the Foundation during polling:
227
+ // InboundAuthError → status=auth_error, no retry
228
+ // InboundRateLimitError → abort poll, wait for the next cron tick
229
+ // InboundCursorInvalidError → reset cursor + full resync in the backfill
230
+ // window; deduplication handles duplicates
231
+ // InboundTransientError → job retry (retries: 3, exponential)
232
232
  // =============================================================================
233
233
  //
234
- // `kind`-Discriminant statt instanceof: Plugin und Foundation können in
235
- // getrennten Bundles leben (dual-package-hazard), instanceof über
236
- // Realm-/Kopie-Grenzen ist unzuverlässig.
234
+ // Use a `kind` discriminant instead of instanceof: plugins and the Foundation
235
+ // may run in separate bundles (dual-package-hazard), and instanceof is
236
+ // unreliable across realm or package-copy boundaries.
237
237
 
238
238
  export class InboundAuthError extends Error {
239
239
  readonly kind = "inbound-auth-error" as const;