@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,18 +1,18 @@
1
- // verifyAndParseMollieWebhook — Mollie-spezifische lazy-fetch +
2
- // event-type-Heuristik. Wird vom Plugin-Build (feature.ts) als
3
- // `verifyAndParseWebhook` registriert.
1
+ // verifyAndParseMollieWebhook: Mollie-specific lazy fetch plus event-type
2
+ // heuristic. The plugin build (feature.ts) registers it as
3
+ // `verifyAndParseWebhook`.
4
4
  //
5
- // Mollie's classic-webhook sendet nur eine `id` (form-urlencoded oder
6
- // JSON). Wir lazy-fetchen payment + subscription via Mollie-API. Sub-
7
- // xxx-events werden NICHT supported — App-Builder bekommt sie indirekt
8
- // via tr_xxx-payment-events (Mollie sendet beide parallel bei normalen
9
- // Lifecycle-Events).
5
+ // Mollie's classic webhook sends only an `id` (form-urlencoded or JSON), so
6
+ // the payment and subscription are lazily fetched through the Mollie API.
7
+ // sub_xxx events are NOT supported; app builders get them indirectly through
8
+ // tr_xxx payment events (Mollie sends both in parallel for normal lifecycle
9
+ // events).
10
10
  //
11
- // **Mandate-setup-flow:** first-payment-paid kommt mit
12
- // `payment.subscriptionId === null` (Mollie's Pattern: App-Builder
13
- // muss `customerSubscriptions.create` selbst aufrufen). Wir machen
14
- // das im Plugin (idempotent via list-check), damit Foundation einen
15
- // Created-Event mit subscription-id bekommt.
11
+ // **Mandate setup flow:** the first paid payment arrives with
12
+ // `payment.subscriptionId === null` (Mollie's pattern: the app builder must
13
+ // call `customerSubscriptions.create` itself). The plugin does that
14
+ // (idempotent via a list check) so the foundation receives a created event
15
+ // with a subscription id.
16
16
 
17
17
  import {
18
18
  parseProviderConsentId,
@@ -33,9 +33,9 @@ import type { MolliePriceConfig } from "./plugin-methods.ts";
33
33
 
34
34
  const log = createFallbackLogger("subscription-mollie");
35
35
 
36
- /** Minimal-Subset des Mollie-Clients, das der Plugin nutzt — separat
37
- * damit Tests ohne den vollen MollieClient mocken können. Adapter in
38
- * feature.ts bridged das gegen den echten SDK. */
36
+ /** Minimal subset of the Mollie client used by the plugin — kept separate
37
+ * so tests can mock it without the full MollieClient. The adapter in
38
+ * feature.ts bridges it to the real SDK. */
39
39
  export type MollieClientShape = {
40
40
  readonly payments: { readonly get: (id: string) => Promise<MolliePayment> };
41
41
  readonly customerSubscriptions: {
@@ -54,11 +54,11 @@ export type MollieClientShape = {
54
54
  };
55
55
 
56
56
  export type MollieWebhookOptions = {
57
- /** priceId (= virtueller Schlüssel aus subscription.metadata) → tier-name. */
57
+ /** priceId (= virtual key from subscription.metadata) → tier name. */
58
58
  readonly priceToTier: Readonly<Record<string, string>>;
59
- /** priceId → amount/interval/description. Wird beim mandate-setup-
60
- * flow zum `customerSubscriptions.create`-Call gebraucht. App-
61
- * Builder pflegt die Map einmal in den factory-options. */
59
+ /** priceId → amount/interval/description. Needed for the mandate-setup
60
+ * flow's `customerSubscriptions.create` call. The app builder maintains
61
+ * this map once in the factory options. */
62
62
  readonly priceToConfig: Readonly<Record<string, MolliePriceConfig>>;
63
63
  };
64
64
 
@@ -97,7 +97,7 @@ export function verifyAndParseMollieWebhook(
97
97
  subscription = await ensureSubscriptionForMandate(client, options, payment);
98
98
  if (!subscription) return null;
99
99
  } else {
100
- // One-shot oder first-payment-failed → nicht unsere Domain.
100
+ // One-shot or first-payment-failed events are outside our domain.
101
101
  return null;
102
102
  }
103
103
  } else if (id.startsWith("sub_")) {
@@ -121,8 +121,8 @@ export function verifyAndParseMollieWebhook(
121
121
  const status = mapMollieStatus(subscription.status);
122
122
  const periodEndSource = subscription.nextPaymentDate ?? subscription.startDate;
123
123
  if (!periodEndSource) {
124
- // Mollie-API-Drift: valid Subs haben mindestens startDate. Loud-
125
- // fail damit App-Owner's monitoring den drift sieht.
124
+ // Mollie API drift: valid subscriptions have at least startDate. Fail
125
+ // loudly so the app owner's monitoring can detect the drift.
126
126
  throw new Error(
127
127
  `subscription-mollie: subscription ${subscription.id} has neither nextPaymentDate nor startDate`,
128
128
  );
@@ -149,9 +149,9 @@ export function verifyAndParseMollieWebhook(
149
149
  // Mandate-setup: subscription on-the-fly erstellen
150
150
  // =============================================================================
151
151
 
152
- /** first-payment-paid OHNE subscriptionId → Mollie-Sub erstellen.
153
- * Idempotent via list-check (replay-safe). Returns null bei
154
- * unvollständiger metadata oder unbekanntem priceId. */
152
+ /** `first-payment-paid` without subscriptionId → create a Mollie subscription.
153
+ * Idempotent via a list check (replay-safe). Returns null for incomplete
154
+ * metadata or an unknown priceId. */
155
155
  async function ensureSubscriptionForMandate(
156
156
  client: MollieClientShape,
157
157
  options: MollieWebhookOptions,
@@ -188,10 +188,10 @@ async function ensureSubscriptionForMandate(
188
188
  }
189
189
 
190
190
  // =============================================================================
191
- // Helpers (exported für Tests)
191
+ // Helpers (exported for tests)
192
192
  // =============================================================================
193
193
 
194
- /** Extract `id` aus rawBody — handelt form-urlencoded + JSON. */
194
+ /** Extracts `id` from rawBody — supports form-urlencoded and JSON. */
195
195
  export function extractMollieId(rawBody: string, headers: Record<string, string>): string | null {
196
196
  const contentType = headers["content-type"] ?? "";
197
197
  if (contentType.includes("application/json")) {
@@ -210,8 +210,8 @@ export function extractMollieId(rawBody: string, headers: Record<string, string>
210
210
  return params.get("id");
211
211
  }
212
212
 
213
- /** Mollie-subscription + optional payment → SubscriptionEventType.
214
- * Heuristik (Mollie hat keine explicit-typed events). */
213
+ /** Mollie subscription + optional payment → SubscriptionEventType.
214
+ * Heuristic because Mollie has no explicitly typed events. */
215
215
  export function mapMollieEventType(
216
216
  subscription: MollieSubscription,
217
217
  triggerPayment: MolliePayment | null,
@@ -240,10 +240,10 @@ export function mapMollieStatus(mollieStatus: MollieSubscription["status"]): Sub
240
240
  return SubscriptionStatuses.active;
241
241
  case "canceled":
242
242
  case "completed":
243
- // completed = alle `times`-charges durchgelaufen → wie canceled.
243
+ // completed = all `times` charges have run → treat it like canceled.
244
244
  return SubscriptionStatuses.canceled;
245
245
  case "suspended":
246
- // Mandate ungültig / payment-method failed → grace-period.
246
+ // Invalid mandate / payment method failed → grace period.
247
247
  return SubscriptionStatuses.pastDue;
248
248
  case "pending":
249
249
  return SubscriptionStatuses.incomplete;
@@ -252,8 +252,8 @@ export function mapMollieStatus(mollieStatus: MollieSubscription["status"]): Sub
252
252
  }
253
253
  }
254
254
 
255
- /** Mollie liefert dates als YYYY-MM-DD; foundation will ISO-Instant.
256
- * Throws bei malformed input (= Mollie-API-Drift, soll loud-fail). */
255
+ /** Mollie provides dates as YYYY-MM-DD; Foundation requires an ISO Instant.
256
+ * Throws on malformed input (= Mollie API drift, which should fail loudly). */
257
257
  function mollieDateStringToInstantIso(dateString: string): string {
258
258
  return Temporal.Instant.from(`${dateString.slice(0, 10)}T00:00:00Z`).toString();
259
259
  }
@@ -1,4 +1,16 @@
1
1
  [
2
+ {
3
+ "version": "0.388.0",
4
+ "type": "improvement",
5
+ "title": "Stripe plugin has a displayName",
6
+ "detail": "The Stripe plugin sets displayName \"Stripe\", which the provider choice in the billing panel shows."
7
+ },
8
+ {
9
+ "version": "0.388.0",
10
+ "type": "fix",
11
+ "title": "A malformed stored credential no longer leaks into the error",
12
+ "detail": "A stored api-key or webhook-secret that is not valid JSON used to raise the JSON parser's own message, which repeats the value into logs and the webhook 401 body. The error now has a fixed text and names no input. subscription-dodo behaves the same."
13
+ },
2
14
  {
3
15
  "version": "0.370.0",
4
16
  "type": "improvement",
@@ -1,8 +1,8 @@
1
1
  // Feature name
2
2
  export const SUBSCRIPTION_STRIPE_FEATURE = "subscription-stripe" as const;
3
3
 
4
- // entityName under den der Plugin gegen "subscriptionProvider"
5
- // registriert. Matcht den path-segment in der webhook-URL
4
+ // entityName under which the plugin registers itself as
5
+ // "subscriptionProvider". It must match the path segment in the webhook URL
6
6
  // `/api/subscription/webhook/stripe`.
7
7
  export const STRIPE_PROVIDER_NAME = "stripe" as const;
8
8
 
@@ -14,10 +14,8 @@ export const STRIPE_API_KEY_CONFIG = "api-key" as const;
14
14
  export const STRIPE_WEBHOOK_SECRET_CONFIG = "webhook-secret" as const;
15
15
  export const STRIPE_BILLING_LIVE_CONFIG = "billingLive" as const;
16
16
 
17
- // =============================================================================
18
- // Stripe-event-types die wir auf normalisierte SubscriptionEventTypes
19
- // mappen. Stripe hat ~80 event-types insgesamt; wir filtern auf 5.
20
- // =============================================================================
17
+ // Stripe event types that map to normalized SubscriptionEventTypes.
18
+ // Stripe has approximately 80 event types; we filter to five.
21
19
 
22
20
  export const StripeEventTypes = {
23
21
  customerSubscriptionCreated: "customer.subscription.created",
@@ -1,35 +1,36 @@
1
1
  // kumiko-feature-version: 3
2
2
  //
3
- // subscription-stripe — Stripe-Plugin für die billing-foundation
4
- // Plugin-API.
3
+ // subscription-stripe — Stripe plugin for the billing-foundation
4
+ // plugin API.
5
5
  //
6
- // **Runtime-config (v3):** Stripe-credentials + der billing-live-Master-
7
- // Switch kommen ZUR LAUFZEIT aus dem config-Feature, nicht mehr aus einem
8
- // mount-time-Closure. Damit lassen sich Keys rotieren und prod live-
9
- // schalten ohne Redeploy — und die Eingabe-Maske entsteht von selbst.
6
+ // **Runtime config (v3):** Stripe credentials and the billing-live master
7
+ // switch come from the config feature AT RUNTIME, no longer from a
8
+ // mount-time closure. This allows keys to rotate and production to go live
9
+ // without a redeploy — and the input form is generated automatically.
10
10
  // - `subscription-stripe:config:api-key` + `:webhook-secret` → system
11
- // config keys mit **backing:"secrets"**: der Wert lebt envelope-
12
- // verschlüsselt im secrets-Store unter SYSTEM_TENANT_ID, adressiert
13
- // wird er als config-Key. `mask` leitet den Sysadmin-configEdit-Screen
14
- // + Settings-Hub-Nav ab — kein handgeschriebenes r.screen/r.nav in der
15
- // App mehr (v2 hatte die Keys als `r.secret` + App-eigene Maske).
11
+ // config keys with **backing:"secrets"**: the value is envelope-encrypted
12
+ // in the secrets store under SYSTEM_TENANT_ID and addressed as a
13
+ // config key. `mask` derives the sysadmin configEdit screen +
14
+ // Settings-Hub navigation — the app no longer needs handwritten
15
+ // r.screen/r.nav entries (v2 used `r.secret` keys + an app-owned form).
16
16
  // - `subscription-stripe:config:billing-live` (shortKey `billingLive`,
17
- // kebab-qualifiziert von r.config) → **system config**
18
- // (boolean, default false). Der Master-Switch: ohne ihn darf kein
19
- // checkout eine Stripe-Session erzeugen (#104-Invariante, write-side
20
- // im createCheckoutSession-Gate durchgesetzt).
17
+ // kebab-qualified by r.config) → **system config**
18
+ // (boolean, default false). The master switch: without it, checkout may
19
+ // not create a Stripe session; this is enforced in the
20
+ // createCheckoutSession gate.
21
21
  //
22
- // **Factory-options als Fallback:** `createSubscriptionStripeFeature({
23
- // apiKey, webhookSecret, priceToTier })` bleibt — apiKey/webhookSecret
24
- // sind jetzt OPTIONAL und dienen nur als Fallback während der env→secrets-
25
- // Bridge-Phase und in Tests, die keinen secrets-context wiren. `priceToTier`
26
- // (Stripe-price-id → app-tier-name) bleibt eine factory-option: app-
27
- // spezifisch, kein Secret, ändert sich selten.
22
+ // **Factory options as fallback:** `createSubscriptionStripeFeature({
23
+ // apiKey, webhookSecret, priceToTier })` remains — apiKey/webhookSecret
24
+ // are now OPTIONAL and serve only as fallbacks during the env→secrets
25
+ // bridge phase and in tests that do not wire a secrets context. `priceToTier`
26
+ // (Stripe price ID → app tier name) remains a factory option: it is
27
+ // app-specific, is not a secret, and changes infrequently.
28
28
  //
29
- // **Webhook + system-secrets:** verifyAndParseWebhook ist pre-tenant
30
- // (kein ctx). Der billing-foundation-webhook-handler reicht einen system-
31
- // scoped SecretsContext als 3. Arg durch, aus dem der Plugin api-key +
32
- // webhook-secret un-audited liest (sanctioned framework-internal read).
29
+ // **Webhook + system secrets:** verifyAndParseWebhook is pre-tenant
30
+ // (no ctx). The billing-foundation webhook handler passes a system-scoped
31
+ // SecretsContext as the third argument, from which the plugin reads the
32
+ // api key + webhook secret without auditing (a sanctioned framework-internal
33
+ // read).
33
34
 
34
35
  import type { SubscriptionProviderPlugin } from "@cosmicdrift/kumiko-bundled-features/billing-foundation";
35
36
  import {
@@ -115,17 +116,17 @@ export function stripeEnvSchema<const TPrice extends string>(options: {
115
116
  }
116
117
 
117
118
  export type SubscriptionStripeOptions = {
118
- /** Bridge-fallback webhook-secret. Optional: v2 liest aus dem
119
- * `subscription-stripe:config:webhook-secret`-Key (backing:"secrets").
120
- * Gesetzt nur während der env→secrets-Übergangsphase / in Tests. */
119
+ /** Bridge-fallback webhook secret. Optional: v2 reads from the
120
+ * `subscription-stripe:config:webhook-secret` key (backing:"secrets").
121
+ * Set only during the env→secrets transition phase / in tests. */
121
122
  readonly webhookSecret?: string;
122
- /** Bridge-fallback api-key. Optional: v2 liest aus dem
123
- * `subscription-stripe:config:api-key`-Key (backing:"secrets"). */
123
+ /** Bridge-fallback API key. Optional: v2 reads from the
124
+ * `subscription-stripe:config:api-key` key (backing:"secrets"). */
124
125
  readonly apiKey?: string;
125
- /** Price-to-tier-Mapping. Plugin liest die price-id aus dem Stripe-event
126
- * (subscription.items.data[0].price.id) und mappt auf einen tier-name.
127
- * App-spezifisch → bleibt factory-option. Fehlt die price-id im Mapping
128
- * → null (event ignored). */
126
+ /** Price-to-tier mapping. The plugin reads the price ID from the Stripe
127
+ * event (subscription.items.data[0].price.id) and maps it to a tier name.
128
+ * App-specific, so it remains a factory option. If the price ID is absent
129
+ * from the mapping → null (event ignored). */
129
130
  readonly priceToTier?: Readonly<Record<string, string>>;
130
131
  /** Whether a mode:"payment" checkout (one-off top-ups etc.) gets a Stripe
131
132
  * invoice — a receipt/invoice document Stripe generates and sends to the
@@ -161,11 +162,11 @@ function validateOneOffPriceIds(priceIds: readonly string[]): void {
161
162
  }
162
163
 
163
164
  /**
164
- * Factory für das subscription-stripe-feature. Mountet IMMER (kein
165
- * key-presence-Guard mehr) — die Aktivität wird runtime über config/secrets
166
- * gegatet (Muster wie feature-toggles). Der returnte FeatureDefinition
167
- * registriert den Plugin gegen billing-foundation's "subscriptionProvider"-
168
- * extension unter entityName "stripe".
165
+ * Factory for the subscription-stripe feature. Always mounts (no
166
+ * key-presence guard) — activity is gated at runtime through config/secrets
167
+ * (following the feature-toggles pattern). The returned FeatureDefinition
168
+ * registers the plugin under billing-foundation's "subscriptionProvider"
169
+ * extension with entityName "stripe".
169
170
  */
170
171
  export function createSubscriptionStripeFeature(
171
172
  options: SubscriptionStripeOptions = {},
@@ -192,15 +193,15 @@ export function createSubscriptionStripeFeature(
192
193
  // the value lives envelope-encrypted in the secrets store under
193
194
  // SYSTEM_TENANT_ID, while `mask` derives the sysadmin settings screen +
194
195
  // Settings-Hub nav (no hand-written r.screen/r.nav in the consuming app).
195
- // billingLive is the #104 master switch. The factory-fallback
196
+ // billingLive is the master switch. The factory-fallback
196
197
  // (options.apiKey/.webhookSecret) covers the env→secrets bridge + tests.
197
198
  const configKeys = r.config({
198
199
  keys: {
199
200
  [STRIPE_API_KEY_CONFIG]: createSystemConfig("text", {
200
201
  backing: "secrets",
201
- // Prefix-Guard, deckungsgleich mit subscriptionStripeEnvSchema:
202
- // fängt den Paste-the-wrong-field-Fehler (pk_/price_), ohne den
203
- // base62-Body zu constrainen. Anchored, kein Backtracking → kein ReDoS.
202
+ // Prefix guard, matching subscriptionStripeEnvSchema:
203
+ // catches the wrong-field paste error (pk_/price_) without
204
+ // constraining the base62 body. Anchored, with no backtracking → no ReDoS.
204
205
  pattern: { regex: "^(sk|rk)_(test|live)_" },
205
206
  write: access.systemAdmin,
206
207
  read: access.admin,
@@ -249,6 +250,7 @@ export function createSubscriptionStripeFeature(
249
250
  const portalConfigurationCache = new Map<string, string>();
250
251
 
251
252
  const plugin: SubscriptionProviderPlugin = {
253
+ displayName: "Stripe",
252
254
  verifyAndParseWebhook: verifyAndParseStripeWebhook(runtimes.webhook, {
253
255
  priceToTier: options.priceToTier ?? {},
254
256
  }),
@@ -1,10 +1,10 @@
1
- // Public API of the subscription-stripe bundled-feature.
1
+ // Public API of the subscription-stripe bundled feature.
2
2
  //
3
- // **Internal-only** (NICHT im public-barrel — App-Builder nutzt das nie direkt):
4
- // - StripeWebhookOptions / verifyAndParseStripeWebhook (intern vom
5
- // feature.ts factory aufgerufen)
6
- // - mapStripeEventType / mapStripeStatus (pure helpers, test-only;
7
- // direct-import aus dem File wenn echt mal extern gebraucht)
3
+ // **Internal-only** (not in the public barrel — the App Builder never uses it directly):
4
+ // - StripeWebhookOptions / verifyAndParseStripeWebhook (called internally by the
5
+ // feature.ts factory)
6
+ // - mapStripeEventType / mapStripeStatus (pure helpers, for tests only;
7
+ // import directly from the file only if truly needed externally)
8
8
 
9
9
  export {
10
10
  STRIPE_PROVIDER_NAME,
@@ -1,19 +1,19 @@
1
- // Stripe-Plugin-Methoden für die POST-tenant-resolution-Phase:
1
+ // Stripe plugin methods for the POST-tenant-resolution phase:
2
2
  // createCheckoutSession, createPortalSession, cancelSubscription,
3
- // retrieveSubscription, retrievePrices, planSwitchSession.
3
+ // retrieveSubscription, retrievePrices, and planSwitchSession.
4
4
  //
5
- // Werden vom Plugin-build (feature.ts) als methods auf dem
6
- // SubscriptionProviderPlugin registriert. Anders als
7
- // verifyAndParseWebhook (= pre-tenant) bekommen diese den vollen
8
- // HandlerContext — sie lösen den Stripe-Client zur CALL-Zeit aus dem
9
- // runtime auf (api-key aus system-secrets, audited), statt aus einem
10
- // mount-time-Closure. Key-Rotation wirkt damit ohne Redeploy.
5
+ // The plugin build (`feature.ts`) registers these as methods on
6
+ // `SubscriptionProviderPlugin`. Unlike verifyAndParseWebhook (= pre-tenant),
7
+ // they receive the full HandlerContext and resolve the Stripe client from
8
+ // the runtime at call time (using the audited api-key from system-secrets),
9
+ // rather than from a mount-time closure. Key rotation therefore works
10
+ // without a redeploy.
11
11
  //
12
- // **Type-Ableitung:** die options-shapes der methods werden
13
- // **direkt vom Plugin-Contract** abgeleitet (`Parameters<NonNullable
14
- // <SubscriptionProviderPlugin["...method"]>>[1]`). Wenn Foundation den
15
- // Contract erweitert (z.B. neuer optionaler Field), bemerkt der
16
- // Stripe-Plugin das beim TS-Compile, nicht erst zur Laufzeit.
12
+ // **Type derivation:** method option shapes are derived **directly from the
13
+ // plugin contract** (`Parameters<NonNullable
14
+ // <SubscriptionProviderPlugin["...method"]>>[1]`). If Foundation extends the
15
+ // contract (for example, with a new optional field), the Stripe plugin detects
16
+ // it at TypeScript compile time rather than at runtime.
17
17
 
18
18
  import { createHash } from "node:crypto";
19
19
  import {
@@ -30,15 +30,10 @@ import Stripe from "stripe";
30
30
  import type { StripeCtxRuntime } from "./runtime.ts";
31
31
  import { isResourceMissingStripeError, mapStripeSubscriptionState } from "./verify-webhook.ts";
32
32
 
33
- // =============================================================================
34
- // createCheckoutSession
35
- // =============================================================================
36
- //
37
- // Stripe-Checkout-Session erstellen. Der hosted-page-URL wird returnt;
38
- // der App-Builder redirected den Tenant-Admin dorthin. Nach erfolgreichem
39
- // checkout sendet Stripe `customer.subscription.created` mit
40
- // `metadata.tenantId` zurück — das ist wie der subsequent webhook den
41
- // Tenant resolved.
33
+ // Create a Stripe Checkout Session and return its hosted-page URL for the
34
+ // app builder to redirect the tenant admin. After checkout, Stripe sends
35
+ // `customer.subscription.created` with `metadata.tenantId`; the subsequent
36
+ // webhook uses it to resolve the tenant.
42
37
 
43
38
  export type StripeCheckoutOptions = Parameters<
44
39
  NonNullable<SubscriptionProviderPlugin["createCheckoutSession"]>
@@ -120,11 +115,11 @@ export function createStripeCheckoutSession(
120
115
  { paymentInvoiceCreation = true }: StripeCheckoutSessionRuntimeOptions = {},
121
116
  ) {
122
117
  return async (ctx: HandlerContext, options: StripeCheckoutOptions): Promise<{ url: string }> => {
123
- // #104-Invariante: ohne billing-live darf keine Stripe-Session
124
- // entstehen (sk_test_-Keys in prod erzeugen sonst einen Test-Mode-
125
- // Checkout). Throw VOR jedem Stripe-Call. Früher hielt diese Schranke
126
- // das ungemountete Plugin; jetzt mountet stripe immer, also gatet der
127
- // billing-live-config-key write-side.
118
+ // Invariant: without billing-live, no Stripe session may be created
119
+ // (sk_test_-keys in production would otherwise create a test-mode checkout).
120
+ // Throw before every Stripe call. The guard used to be provided by the
121
+ // unmounted plugin; Stripe is now always mounted, so the
122
+ // billing-live-config-key gates the write side.
128
123
  await runtime.assertBillingLive(ctx);
129
124
  const stripe = await runtime.clientForCtx(ctx);
130
125
  const mode = options.mode ?? "subscription";
@@ -33,7 +33,7 @@ import {
33
33
  } from "@cosmicdrift/kumiko-framework/engine";
34
34
  import { FeatureDisabledError, UnconfiguredError } from "@cosmicdrift/kumiko-framework/errors";
35
35
  import type { SecretsContext } from "@cosmicdrift/kumiko-framework/secrets";
36
- import { parseJsonOrThrow } from "@cosmicdrift/kumiko-framework/utils";
36
+ import { parseJsonSafe } from "@cosmicdrift/kumiko-framework/utils";
37
37
  import Stripe from "stripe";
38
38
  import { SUBSCRIPTION_STRIPE_FEATURE } from "./constants.ts";
39
39
 
@@ -49,7 +49,7 @@ export function createStripeClientCache(): (apiKey: string) => Stripe {
49
49
  const cached = cache.get(apiKey);
50
50
  if (cached) return cached;
51
51
  // No apiVersion pin — a string literal breaks consumers' typecheck on newer
52
- // stripe SDKs (#256); the SDK's own default keeps wire-version and types aligned.
52
+ // stripe SDKs; the SDK's own default keeps wire-version and types aligned.
53
53
  const client = new Stripe(apiKey);
54
54
  cache.set(apiKey, client);
55
55
  return client;
@@ -68,13 +68,14 @@ export type StripeRuntimeDeps = {
68
68
  // (the un-audited webhook path + the audited ctx read here) therefore returns
69
69
  // the JSON-quoted string and must parse it back. The factory fallback is a
70
70
  // plain env string and stays raw — so parsing is applied only to the store
71
- // read, never to the fallback.
71
+ // read, never to the fallback. The error must not carry the input: the JSON
72
+ // parser's own message would repeat the credential into logs and the 401 body.
72
73
  function parseStoredSecret(raw: string | undefined): string | undefined {
73
74
  if (raw === undefined || raw.length === 0) return undefined;
74
- // parseJsonOrThrow is the sanctioned safe-parse (same helper the config
75
- // resolver's deserializeValue uses for this very value) — mirrors how the
76
- // store round-trips a backing:"secrets" text value.
77
- const parsed = parseJsonOrThrow<unknown>(raw, "subscription-stripe credential (backing:secrets)");
75
+ const parsed = parseJsonSafe<unknown>(raw, undefined);
76
+ if (parsed === undefined) {
77
+ throw new Error("subscription-stripe credential (backing:secrets) is not valid JSON");
78
+ }
78
79
  return typeof parsed === "string" && parsed.length > 0 ? parsed : undefined;
79
80
  }
80
81
 
@@ -83,7 +84,7 @@ function parseStoredSecret(raw: string | undefined): string | undefined {
83
84
  export type StripeCtxRuntime = {
84
85
  readonly clientForCtx: (ctx: HandlerContext) => Promise<Stripe>;
85
86
  /** Throws FeatureDisabledError unless `billing-live` config is true. The
86
- * #104 invariant: no Stripe session may be created while billing is not
87
+ * invariant: no Stripe session may be created while billing is not
87
88
  * live (sk_test_ keys in prod must not produce a live checkout).
88
89
  * `handlerName` names the write-handler in the thrown error — defaults to
89
90
  * "create-checkout-session" for existing callers, but plan-switch/portal