@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,5 +1,6 @@
1
1
  import { useLocale, usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
2
2
  import type { WriteResult } from "@cosmicdrift/kumiko-renderer/headless";
3
+ import { ChoiceCards } from "@cosmicdrift/kumiko-renderer/web";
3
4
  import { type ReactNode, useState } from "react";
4
5
  import type { BillingPlansResult } from "../types.ts";
5
6
  import { resolveConsentLocale } from "./consumer-protection/consent-locale.ts";
@@ -24,8 +25,24 @@ export type CheckoutConsentDialogProps = {
24
25
  readonly renewalKey?: string;
25
26
  readonly count?: string;
26
27
  };
27
- readonly consumerProtection: ConsumerProtectionView;
28
- readonly onOrder: (consent: CheckoutConsentPayload) => Promise<WriteResult<{ url: string }>>;
28
+ /** Without it the dialog shows no legal links and no consent checkboxes and orders without a consent. */
29
+ readonly consumerProtection?: ConsumerProtectionView;
30
+ /** Several providers to pick from; the parent follows `value` for price and order. */
31
+ readonly providerChoice?: {
32
+ readonly options: readonly {
33
+ readonly value: string;
34
+ readonly title: string;
35
+ readonly description?: string;
36
+ readonly aside?: string;
37
+ }[];
38
+ readonly value: string;
39
+ readonly onChange: (value: string) => void;
40
+ };
41
+ /** Provider note under the price line when there is no provider choice. */
42
+ readonly note?: string;
43
+ readonly onOrder: (
44
+ consent: CheckoutConsentPayload | undefined,
45
+ ) => Promise<WriteResult<{ url: string }>>;
29
46
  readonly onConsentTextOutdated: () => void;
30
47
  };
31
48
 
@@ -36,6 +53,8 @@ export function CheckoutConsentDialog({
36
53
  planName,
37
54
  price,
38
55
  consumerProtection,
56
+ providerChoice,
57
+ note,
39
58
  onOrder,
40
59
  onConsentTextOutdated,
41
60
  }: CheckoutConsentDialogProps): ReactNode {
@@ -48,18 +67,23 @@ export function CheckoutConsentDialog({
48
67
  const [errorText, setErrorText] = useState<string | null>(null);
49
68
 
50
69
  const consentLocale = resolveConsentLocale(uiLocale);
51
- const texts = consumerProtection.consentTexts[consentLocale];
52
- const legalLinks = consumerProtection.legalLinks[consentLocale];
70
+ const texts = consumerProtection?.consentTexts[consentLocale];
71
+ const legalLinks = consumerProtection?.legalLinks[consentLocale];
72
+ const consentGiven = consumerProtection === undefined || (earlyPerformance && withdrawalLoss);
53
73
 
54
74
  async function order(): Promise<void> {
55
75
  setSubmitting(true);
56
76
  setErrorText(null);
57
- const result = await onOrder({
58
- earlyPerformanceRequested: true,
59
- withdrawalLossAcknowledged: true,
60
- consentTextVersion: texts.consentTextVersion,
61
- locale: consentLocale,
62
- });
77
+ const result = await onOrder(
78
+ texts === undefined
79
+ ? undefined
80
+ : {
81
+ earlyPerformanceRequested: true,
82
+ withdrawalLossAcknowledged: true,
83
+ consentTextVersion: texts.consentTextVersion,
84
+ locale: consentLocale,
85
+ },
86
+ );
63
87
  if (result.isSuccess) return;
64
88
  setSubmitting(false);
65
89
  setErrorText(t(result.error.i18nKey, result.error.i18nParams));
@@ -78,6 +102,18 @@ export function CheckoutConsentDialog({
78
102
  testId="checkout-consent-dialog"
79
103
  >
80
104
  <div className="flex flex-col gap-4">
105
+ {providerChoice !== undefined && (
106
+ <div className="flex flex-col gap-2">
107
+ <Text variant="muted">{t("billing-foundation.consent.chooseProvider")}</Text>
108
+ <ChoiceCards
109
+ value={providerChoice.value}
110
+ options={providerChoice.options}
111
+ onChange={providerChoice.onChange}
112
+ ariaLabel={t("billing-foundation.consent.chooseProvider")}
113
+ testId="checkout-provider-choice"
114
+ />
115
+ </div>
116
+ )}
81
117
  <div className="flex flex-col gap-1" data-testid="checkout-consent-summary">
82
118
  <Text>
83
119
  {planName} — {price.amount}
@@ -93,38 +129,49 @@ export function CheckoutConsentDialog({
93
129
  <Text variant="muted">{t("billing-foundation.consent.cancelAnytime")}</Text>
94
130
  </>
95
131
  )}
132
+ {note !== undefined && (
133
+ <Text variant="muted" testId="checkout-consent-note">
134
+ {note}
135
+ </Text>
136
+ )}
96
137
  </div>
97
- <div className="flex flex-wrap gap-4">
98
- <Link href={legalLinks.terms} target="_blank">
99
- {t("billing-foundation.consent.link.terms")}
100
- </Link>
101
- <Link href={legalLinks.withdrawal} target="_blank">
102
- {t("billing-foundation.consent.link.withdrawal")}
103
- </Link>
104
- <Link href={legalLinks.privacy} target="_blank">
105
- {t("billing-foundation.consent.link.privacy")}
106
- </Link>
107
- </div>
108
- <Field id="consent-early-performance" label={texts.earlyPerformance} layout="inline">
109
- <Input
110
- kind="boolean"
111
- id="consent-early-performance"
112
- name="consent-early-performance"
113
- value={earlyPerformance}
114
- onChange={setEarlyPerformance}
115
- disabled={submitting}
116
- />
117
- </Field>
118
- <Field id="consent-withdrawal-loss" label={texts.withdrawalLoss} layout="inline">
119
- <Input
120
- kind="boolean"
121
- id="consent-withdrawal-loss"
122
- name="consent-withdrawal-loss"
123
- value={withdrawalLoss}
124
- onChange={setWithdrawalLoss}
125
- disabled={submitting}
126
- />
127
- </Field>
138
+ {legalLinks !== undefined && (
139
+ <div className="flex flex-wrap gap-4">
140
+ <Link href={legalLinks.terms} target="_blank">
141
+ {t("billing-foundation.consent.link.terms")}
142
+ </Link>
143
+ <Link href={legalLinks.withdrawal} target="_blank">
144
+ {t("billing-foundation.consent.link.withdrawal")}
145
+ </Link>
146
+ <Link href={legalLinks.privacy} target="_blank">
147
+ {t("billing-foundation.consent.link.privacy")}
148
+ </Link>
149
+ </div>
150
+ )}
151
+ {texts !== undefined && (
152
+ <>
153
+ <Field id="consent-early-performance" label={texts.earlyPerformance} layout="inline">
154
+ <Input
155
+ kind="boolean"
156
+ id="consent-early-performance"
157
+ name="consent-early-performance"
158
+ value={earlyPerformance}
159
+ onChange={setEarlyPerformance}
160
+ disabled={submitting}
161
+ />
162
+ </Field>
163
+ <Field id="consent-withdrawal-loss" label={texts.withdrawalLoss} layout="inline">
164
+ <Input
165
+ kind="boolean"
166
+ id="consent-withdrawal-loss"
167
+ name="consent-withdrawal-loss"
168
+ value={withdrawalLoss}
169
+ onChange={setWithdrawalLoss}
170
+ disabled={submitting}
171
+ />
172
+ </Field>
173
+ </>
174
+ )}
128
175
  {errorText !== null && (
129
176
  <Banner variant="error" testId="checkout-consent-error">
130
177
  {errorText}
@@ -140,7 +187,7 @@ export function CheckoutConsentDialog({
140
187
  {t("billing-foundation.consent.back")}
141
188
  </Button>
142
189
  <Button
143
- disabled={!earlyPerformance || !withdrawalLoss || submitting}
190
+ disabled={!consentGiven || submitting}
144
191
  loading={submitting}
145
192
  onClick={order}
146
193
  testId="checkout-consent-order"
@@ -95,6 +95,10 @@ export const SubscriptionFoundationQueries = {
95
95
  * current tier and per-plan action. Only registered when a `catalog` is
96
96
  * configured. */
97
97
  billingPlans: "billing-foundation:query:billing-plans",
98
+ /** What switching to a tier would cost right now, for providers that switch
99
+ * plans in-app (preview + apply). Only registered when a `catalog` is
100
+ * configured. */
101
+ planSwitchPreview: "billing-foundation:query:plan-switch-preview",
98
102
  /** System-only probe: does the caller tenant hold a non-terminal
99
103
  * subscription (consumerProtection only). */
100
104
  terminableSubscription: "billing-foundation:query:terminable-subscription",
@@ -0,0 +1,55 @@
1
+ import type { BillingPlanView } from "../types.ts";
2
+
3
+ type Recurrence = {
4
+ readonly interval: string | null;
5
+ readonly intervalCount: number | null;
6
+ };
7
+
8
+ export function intervalKey(price: Recurrence | null): string | undefined {
9
+ if (price === null || price.interval === null) return undefined;
10
+ return price.intervalCount !== null && price.intervalCount > 1
11
+ ? `billing-foundation.plans.everyInterval.${price.interval}`
12
+ : `billing-foundation.plans.perInterval.${price.interval}`;
13
+ }
14
+
15
+ export function renewalKey(price: Recurrence | null): string | undefined {
16
+ if (price === null || price.interval === null) return undefined;
17
+ return price.intervalCount !== null && price.intervalCount > 1
18
+ ? `billing-foundation.consent.renewsEvery.${price.interval}`
19
+ : `billing-foundation.consent.renews.${price.interval}`;
20
+ }
21
+
22
+ type PlanPrice = NonNullable<BillingPlanView["price"]>;
23
+
24
+ export function pricesDiffer(prices: readonly PlanPrice[]): boolean {
25
+ const [first, ...rest] = prices;
26
+ return (
27
+ first !== undefined &&
28
+ rest.some(
29
+ (price) =>
30
+ price.unitAmount !== first.unitAmount ||
31
+ price.currency !== first.currency ||
32
+ price.interval !== first.interval ||
33
+ price.intervalCount !== first.intervalCount,
34
+ )
35
+ );
36
+ }
37
+
38
+ /** Price of `tier` at every provider that offers it, in provider order. */
39
+ export function tierPrices(
40
+ providers: readonly { readonly plans: readonly BillingPlanView[] }[],
41
+ tier: string,
42
+ ): PlanPrice[] {
43
+ return providers.flatMap((provider) => {
44
+ const price = provider.plans.find((plan) => plan.tier === tier)?.price;
45
+ return price ? [price] : [];
46
+ });
47
+ }
48
+
49
+ export function cheapestPrice(prices: readonly PlanPrice[]): PlanPrice | undefined {
50
+ return prices.reduce<PlanPrice | undefined>(
51
+ (lowest, price) =>
52
+ lowest === undefined || price.unitAmount < lowest.unitAmount ? price : lowest,
53
+ undefined,
54
+ );
55
+ }
@@ -0,0 +1,224 @@
1
+ import {
2
+ useLocale,
3
+ useMutation,
4
+ usePrimitives,
5
+ useQuery,
6
+ useTranslation,
7
+ } from "@cosmicdrift/kumiko-renderer";
8
+ import { formatMoney } from "@cosmicdrift/kumiko-renderer/web";
9
+ import { type ReactNode, useState } from "react";
10
+ import type { BillingPlansResult, PlanSwitchPreview } from "../types.ts";
11
+ import {
12
+ type CheckoutConsentPayload,
13
+ CONSENT_TEXT_OUTDATED_CODE,
14
+ } from "./checkout-consent-dialog.tsx";
15
+ import { SubscriptionFoundationHandlers, SubscriptionFoundationQueries } from "./constants.ts";
16
+ import { resolveConsentLocale } from "./consumer-protection/consent-locale.ts";
17
+ import { intervalKey } from "./plan-price.ts";
18
+
19
+ type ConsumerProtectionView = NonNullable<BillingPlansResult["consumerProtection"]>;
20
+
21
+ type PlanSwitchPreviewReply = {
22
+ readonly preview: PlanSwitchPreview;
23
+ readonly target: {
24
+ readonly unitAmount: number;
25
+ readonly currency: string;
26
+ readonly interval: string | null;
27
+ readonly intervalCount: number | null;
28
+ };
29
+ };
30
+
31
+ export type PlanSwitchConfirmDialogProps = {
32
+ readonly open: boolean;
33
+ readonly onOpenChange: (open: boolean) => void;
34
+ readonly tier: string;
35
+ readonly fromPlanName: string;
36
+ readonly toPlanName: string;
37
+ readonly consumerProtection?: ConsumerProtectionView;
38
+ readonly onApplied: () => void;
39
+ readonly onConsentTextOutdated: () => void;
40
+ };
41
+
42
+ // kumiko-lint-ignore no-custom-primitives Uses usePrimitives().Modal internally, name is a billing domain action, not a primitive reimplementation
43
+ export function PlanSwitchConfirmDialog({
44
+ open,
45
+ onOpenChange,
46
+ tier,
47
+ fromPlanName,
48
+ toPlanName,
49
+ consumerProtection,
50
+ onApplied,
51
+ onConsentTextOutdated,
52
+ }: PlanSwitchConfirmDialogProps): ReactNode {
53
+ const t = useTranslation();
54
+ const locale = useLocale().locale();
55
+ const { Modal, Text, Field, Input, Button, Link, Banner } = usePrimitives();
56
+ const previewQuery = useQuery<PlanSwitchPreviewReply>(
57
+ SubscriptionFoundationQueries.planSwitchPreview,
58
+ { tier },
59
+ );
60
+ const switchMutation = useMutation<{ readonly applied: true }>(
61
+ SubscriptionFoundationHandlers.switchPlan,
62
+ );
63
+ const [earlyPerformance, setEarlyPerformance] = useState(false);
64
+ const [withdrawalLoss, setWithdrawalLoss] = useState(false);
65
+ const [submitting, setSubmitting] = useState(false);
66
+ const [errorText, setErrorText] = useState<string | null>(null);
67
+
68
+ const consentLocale = resolveConsentLocale(locale);
69
+ const texts = consumerProtection?.consentTexts[consentLocale];
70
+ const legalLinks = consumerProtection?.legalLinks[consentLocale];
71
+ const consentGiven = consumerProtection === undefined || (earlyPerformance && withdrawalLoss);
72
+
73
+ async function confirm(): Promise<void> {
74
+ setSubmitting(true);
75
+ setErrorText(null);
76
+ const consent: CheckoutConsentPayload | undefined =
77
+ texts === undefined
78
+ ? undefined
79
+ : {
80
+ earlyPerformanceRequested: true,
81
+ withdrawalLossAcknowledged: true,
82
+ consentTextVersion: texts.consentTextVersion,
83
+ locale: consentLocale,
84
+ };
85
+ const result = await switchMutation.mutate({ tier, ...(consent && { consent }) });
86
+ if (result.isSuccess) {
87
+ onApplied();
88
+ return;
89
+ }
90
+ setSubmitting(false);
91
+ setErrorText(t(result.error.i18nKey, result.error.i18nParams));
92
+ if (result.error.code === CONSENT_TEXT_OUTDATED_CODE) {
93
+ setEarlyPerformance(false);
94
+ setWithdrawalLoss(false);
95
+ onConsentTextOutdated();
96
+ }
97
+ }
98
+
99
+ const reply = previewQuery.data;
100
+ const money = (amount: number, currency: string) => formatMoney(amount, currency, locale);
101
+ const recurringKey = reply === null ? undefined : intervalKey(reply.target);
102
+ const recurringPrice =
103
+ reply === null
104
+ ? ""
105
+ : `${money(reply.target.unitAmount, reply.target.currency)}${
106
+ recurringKey === undefined
107
+ ? ""
108
+ : ` ${t(recurringKey, { count: new Intl.NumberFormat(locale).format(reply.target.intervalCount ?? 1) })}`
109
+ }`;
110
+
111
+ return (
112
+ <Modal
113
+ open={open}
114
+ onOpenChange={onOpenChange}
115
+ title={t("billing-foundation.planSwitch.title")}
116
+ testId="plan-switch-confirm-dialog"
117
+ >
118
+ <div className="flex flex-col gap-4">
119
+ <Text>
120
+ {t("billing-foundation.planSwitch.summary", { from: fromPlanName, to: toPlanName })}
121
+ </Text>
122
+ {previewQuery.error !== null && (
123
+ <Banner variant="error" testId="plan-switch-preview-error">
124
+ {t(previewQuery.error.i18nKey, previewQuery.error.i18nParams)}
125
+ </Banner>
126
+ )}
127
+ {previewQuery.loading && reply === null && (
128
+ <Banner variant="loading" testId="plan-switch-preview-loading">
129
+ {t("kumiko.widget.loading")}
130
+ </Banner>
131
+ )}
132
+ {reply !== null && (
133
+ <div className="flex flex-col gap-1" data-testid="plan-switch-summary">
134
+ <Text>
135
+ {t("billing-foundation.planSwitch.dueNow", {
136
+ amount: money(reply.preview.amountDueNow, reply.preview.currency),
137
+ })}
138
+ {reply.preview.tax !== null &&
139
+ ` (${t("billing-foundation.planSwitch.includesTax", {
140
+ tax: money(reply.preview.tax, reply.preview.currency),
141
+ })})`}
142
+ </Text>
143
+ <Text variant="muted">
144
+ {t("billing-foundation.planSwitch.credit", {
145
+ amount: money(reply.preview.credit, reply.preview.currency),
146
+ })}
147
+ </Text>
148
+ <Text variant="muted">
149
+ {t("billing-foundation.planSwitch.recurring", {
150
+ amount: recurringPrice,
151
+ })}
152
+ </Text>
153
+ <Text variant="muted">{t("billing-foundation.planSwitch.effective")}</Text>
154
+ <Text variant="muted">{t("billing-foundation.planSwitch.pendingNote")}</Text>
155
+ </div>
156
+ )}
157
+ {legalLinks !== undefined && (
158
+ <div className="flex flex-wrap gap-4">
159
+ <Link href={legalLinks.terms} target="_blank">
160
+ {t("billing-foundation.consent.link.terms")}
161
+ </Link>
162
+ <Link href={legalLinks.withdrawal} target="_blank">
163
+ {t("billing-foundation.consent.link.withdrawal")}
164
+ </Link>
165
+ <Link href={legalLinks.privacy} target="_blank">
166
+ {t("billing-foundation.consent.link.privacy")}
167
+ </Link>
168
+ </div>
169
+ )}
170
+ {texts !== undefined && (
171
+ <>
172
+ <Field
173
+ id="plan-switch-early-performance"
174
+ label={texts.earlyPerformance}
175
+ layout="inline"
176
+ >
177
+ <Input
178
+ kind="boolean"
179
+ id="plan-switch-early-performance"
180
+ name="plan-switch-early-performance"
181
+ value={earlyPerformance}
182
+ onChange={setEarlyPerformance}
183
+ disabled={submitting}
184
+ />
185
+ </Field>
186
+ <Field id="plan-switch-withdrawal-loss" label={texts.withdrawalLoss} layout="inline">
187
+ <Input
188
+ kind="boolean"
189
+ id="plan-switch-withdrawal-loss"
190
+ name="plan-switch-withdrawal-loss"
191
+ value={withdrawalLoss}
192
+ onChange={setWithdrawalLoss}
193
+ disabled={submitting}
194
+ />
195
+ </Field>
196
+ </>
197
+ )}
198
+ {errorText !== null && (
199
+ <Banner variant="error" testId="plan-switch-confirm-error">
200
+ {errorText}
201
+ </Banner>
202
+ )}
203
+ <div className="flex justify-end gap-2">
204
+ <Button
205
+ variant="secondary"
206
+ disabled={submitting}
207
+ onClick={() => onOpenChange(false)}
208
+ testId="plan-switch-confirm-cancel"
209
+ >
210
+ {t("billing-foundation.consent.back")}
211
+ </Button>
212
+ <Button
213
+ disabled={!consentGiven || reply === null || submitting}
214
+ loading={submitting}
215
+ onClick={confirm}
216
+ testId="plan-switch-confirm-order"
217
+ >
218
+ {t("billing-foundation.planSwitch.order")}
219
+ </Button>
220
+ </div>
221
+ </div>
222
+ </Modal>
223
+ );
224
+ }
@@ -95,7 +95,7 @@ export function createSubscriptionWebhookRoute(options: SubscriptionWebhookRoute
95
95
  return c.json({ ignored: true }, 200);
96
96
  }
97
97
  const parsed = verified.event;
98
- const tenantId = parsed.tenantId as import("@cosmicdrift/kumiko-framework/engine").TenantId;
98
+ const tenantId = parsed.tenantId;
99
99
  if (parsed.kind === BillingEventKinds.payment) {
100
100
  const dispatched = await deps.dispatchSystemWrite({
101
101
  handlerQn: SubscriptionFoundationHandlers.processPaymentEvent,
@@ -1,16 +1,15 @@
1
1
  import { v5 as uuidv5 } from "uuid";
2
2
 
3
- // Fixed UUID-namespace für die cap-counter-aggregate-id-Ableitung.
4
- // Generiert einmalig (2026-05-02), in Stein gemeißelt: ein Wechsel würde
5
- // jeden existing aggregate-Stream re-keyen → kaputter event-replay,
6
- // kaputte counter-history, verlorener Audit-Trail. Drift-Pin in
7
- // __tests__/drift.test.ts pinnt den UUID-Wert.
3
+ // Fixed UUID namespace for deriving cap-counter aggregate IDs.
4
+ // Generated once (2026-05-02) and immutable: changing it would re-key every
5
+ // existing aggregate stream, breaking event replay and counter history and
6
+ // losing the audit trail. The drift test in __tests__/drift.test.ts pins the UUID.
8
7
  const CAP_COUNTER_NAMESPACE = "9c1bf2a3-6e4d-4f5b-8a9c-2d3e4f5a6b7c";
9
8
 
10
- // Separater Namespace für Rolling-Window-Counter (Sprint 4). Eigener
11
- // Namespace damit das aggregate-id NIE mit einem Calendar-Counter
12
- // kollidiert, selbst wenn jemand "1970-01-01..." als periodStart in
13
- // den Calendar-Pfad reinpasst. Drift-Pin in __tests__/drift.test.ts.
9
+ // Separate namespace for rolling-window counters. This prevents the aggregate ID
10
+ // from colliding with a calendar counter, even if "1970-01-01..." is passed as
11
+ // periodStart through the calendar path. The drift test in __tests__/drift.test.ts
12
+ // pins the UUID.
14
13
  const CAP_COUNTER_ROLLING_NAMESPACE = "8b2ad0c6-1f3e-4f7c-9b8a-3c4d5e6f7a8b";
15
14
 
16
15
  /**
@@ -473,7 +473,11 @@ async function consumeClaimedRow(
473
473
  if (!booked.isSuccess) return booked;
474
474
  await txDb.updateMany(
475
475
  capReservationsTable,
476
- { consumedAmount: claimed.consumedAmount + options.units },
476
+ {
477
+ consumedAmount: claimed.consumedAmount + options.units,
478
+ // Keep the tombstone alive past its last consume, else a later consume would start a fresh one and double count.
479
+ expiresAt: Temporal.Now.instant().add({ minutes: CAP_SETTLED_TOMBSTONE_TTL_MINUTES }),
480
+ },
477
481
  ownRow,
478
482
  );
479
483
  return booked;
@@ -1,4 +1,22 @@
1
1
  [
2
+ {
3
+ "version": "0.388.0",
4
+ "type": "fix",
5
+ "title": "Consume on a released reservation extends its tombstone",
6
+ "detail": "Every consume against a released reservation tombstone now pushes its expiry out, so a long-running job that consumes across the sweep can no longer lose the tombstone and have its earlier units counted twice at settle."
7
+ },
8
+ {
9
+ "version": "0.388.0",
10
+ "type": "fix",
11
+ "title": "Misconfigured cap period fails on every enforcement",
12
+ "detail": "A periodEndIso that is unparsable or not after periodStartIso now throws on each enforceCap or reservation call instead of only once the hard cap is reached, so a bad period no longer turns into a 500 at the limit instead of cap_exceeded."
13
+ },
14
+ {
15
+ "version": "0.388.0",
16
+ "type": "fix",
17
+ "title": "Stock cap lock covers the counted rows, not the error code",
18
+ "detail": "withStockCap serializes on the table and where filter that are counted, so two handlers capping the same rows under different codes can no longer both pass the check in parallel and exceed the cap together."
19
+ },
2
20
  {
3
21
  "version": "0.378.0",
4
22
  "type": "fix",
@@ -3,20 +3,19 @@ export const CAP_COUNTER_FEATURE = "cap-counter" as const;
3
3
 
4
4
  export const CAP_COUNTER_LIST_SCREEN_ID = "cap-list" as const;
5
5
 
6
- // Aggregate types — calendar-period-Counter benutzt CRUD-Events der
7
- // projection-row. Rolling-Window-Counter benutzt einen eigenen
8
- // aggregate-type mit custom increment-events (no projection — der
9
- // Read summiert über die letzten N Tage Events). Sind getrennt damit
10
- // die r.entity-projection nicht auch noch rolling-counter-rows tracken
11
- // muss.
6
+ // Aggregate types: calendar-period counters use CRUD events for the
7
+ // projection row. Rolling-window counters use a separate aggregate type
8
+ // with custom increment events (no projection—the read sums events from
9
+ // the last N days). They are separate so `r.entity-projection` does not
10
+ // also have to track rolling-counter rows.
12
11
  export const CAP_COUNTER_ROLLING_AGGREGATE_TYPE = "cap-counter-rolling" as const;
13
12
 
14
- // Custom event-type für Rolling-Window-Counter. Symmetrisches Paar:
15
- // _SHORT — passt zu `r.defineEvent(short, schema)` im Registrar
16
- // (Framework prefixt automatisch zu QN)
17
- // _QN — qualifizierte Form für `ctx.unsafeAppendEvent({type})`
18
- // + `events.type`-Spalte + `registry.getEvent(qn)`-Lookup
19
- // Beide MÜSSEN konsistent sein (drift-pin im feature-test).
13
+ // Custom event types for rolling-window counters. The pair is symmetric:
14
+ // _SHORT — matches `r.defineEvent(short, schema)` in the registrar
15
+ // (the framework automatically prefixes it to the QN)
16
+ // _QN — qualified form for `ctx.unsafeAppendEvent({type})`, the
17
+ // `events.type` column, and `registry.getEvent(qn)` lookups
18
+ // Both MUST stay consistent; the feature test pins against drift.
20
19
  export const ROLLING_INCREMENTED_EVENT_SHORT = "rolling-incremented" as const;
21
20
  export const ROLLING_INCREMENTED_EVENT_QN = "cap-counter:event:rolling-incremented" as const;
22
21