@cosmicdrift/kumiko-bundled-features 0.386.0 → 0.387.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 (469) hide show
  1. package/LICENSE +21 -57
  2. package/dist/agent-tools/tool-catalog.js +1 -1
  3. package/dist/audit/screens.js +1 -1
  4. package/dist/auth-email-password/feature.js +1 -1
  5. package/dist/auth-email-password/handlers/change-password.write.js +3 -3
  6. package/dist/auth-email-password/handlers/confirm-token-flow.js +5 -5
  7. package/dist/auth-email-password/handlers/invite-accept-with-login.write.js +1 -1
  8. package/dist/auth-email-password/handlers/invite-accept.write.js +18 -18
  9. package/dist/auth-email-password/handlers/invite-create.write.d.ts +2 -2
  10. package/dist/auth-email-password/handlers/invite-create.write.js +10 -10
  11. package/dist/auth-email-password/handlers/invite-info.query.js +1 -1
  12. package/dist/auth-email-password/handlers/invite-signup-complete.write.js +24 -26
  13. package/dist/auth-email-password/handlers/login.write.d.ts +1 -1
  14. package/dist/auth-email-password/handlers/login.write.js +1 -1
  15. package/dist/auth-email-password/handlers/self-registration-status.query.js +1 -1
  16. package/dist/auth-email-password/handlers/signup-confirm.write.js +34 -37
  17. package/dist/auth-email-password/handlers/signup-request.write.js +6 -7
  18. package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.d.ts +1 -1
  19. package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.js +1 -4
  20. package/dist/auth-email-password/index.js +5 -5
  21. package/dist/auth-email-password/lockout-store.js +1 -1
  22. package/dist/auth-email-password/seeding.d.ts +42 -45
  23. package/dist/auth-email-password/seeding.js +51 -53
  24. package/dist/auth-email-password/signup-token-store.js +8 -8
  25. package/dist/auth-email-password/testing.js +3 -3
  26. package/dist/auth-email-password/web/auth-client.d.ts +2 -2
  27. package/dist/auth-email-password/web/auth-client.js +36 -37
  28. package/dist/auth-email-password/web/auth-form-primitives.js +10 -10
  29. package/dist/auth-email-password/web/auth-gate.js +15 -16
  30. package/dist/auth-email-password/web/client-plugin.d.ts +7 -7
  31. package/dist/auth-email-password/web/client-plugin.js +4 -5
  32. package/dist/auth-email-password/web/confirm-account-unlock-screen.js +1 -1
  33. package/dist/auth-email-password/web/constants.js +3 -3
  34. package/dist/auth-email-password/web/default-topbar-actions.d.ts +8 -8
  35. package/dist/auth-email-password/web/default-topbar-actions.js +6 -6
  36. package/dist/auth-email-password/web/forgot-password-screen.d.ts +2 -2
  37. package/dist/auth-email-password/web/forgot-password-screen.js +9 -9
  38. package/dist/auth-email-password/web/index.js +5 -5
  39. package/dist/auth-email-password/web/invite-accept-screen.d.ts +1 -1
  40. package/dist/auth-email-password/web/invite-accept-screen.js +16 -16
  41. package/dist/auth-email-password/web/login-screen.d.ts +1 -1
  42. package/dist/auth-email-password/web/login-screen.js +2 -3
  43. package/dist/auth-email-password/web/reset-password-screen.d.ts +4 -4
  44. package/dist/auth-email-password/web/reset-password-screen.js +12 -13
  45. package/dist/auth-email-password/web/session.d.ts +10 -9
  46. package/dist/auth-email-password/web/session.js +28 -29
  47. package/dist/auth-email-password/web/signup-complete-screen.js +3 -3
  48. package/dist/auth-email-password/web/signup-screen.d.ts +1 -1
  49. package/dist/auth-email-password/web/signup-screen.js +13 -13
  50. package/dist/auth-email-password/web/tenant-switcher.d.ts +4 -4
  51. package/dist/auth-email-password/web/tenant-switcher.js +21 -22
  52. package/dist/auth-email-password/web/use-shell-user.js +12 -13
  53. package/dist/auth-email-password/web/user-menu.d.ts +4 -4
  54. package/dist/auth-email-password/web/user-menu.js +12 -13
  55. package/dist/auth-email-password/web/verify-email-screen.d.ts +2 -2
  56. package/dist/auth-email-password/web/verify-email-screen.js +9 -10
  57. package/dist/auth-foundation/boot-checks.js +4 -4
  58. package/dist/auth-foundation/resolve-anonymous-access.d.ts +1 -1
  59. package/dist/auth-foundation/resolve-anonymous-access.js +3 -3
  60. package/dist/auth-foundation/types.js +2 -2
  61. package/dist/auth-mfa/handlers/disable.write.js +3 -3
  62. package/dist/auth-mfa/handlers/enable-confirm-preauth.write.js +4 -4
  63. package/dist/auth-mfa/handlers/enable-confirm.write.js +2 -2
  64. package/dist/auth-mfa/handlers/enable-start-preauth.write.js +1 -1
  65. package/dist/auth-mfa/handlers/reencrypt.job.js +1 -1
  66. package/dist/auth-mfa/handlers/regenerate-recovery.write.js +5 -5
  67. package/dist/auth-mfa/handlers/verify.write.js +1 -1
  68. package/dist/auth-mfa/token-secrets.js +1 -1
  69. package/dist/auth-mfa/web/client-plugin.d.ts +1 -1
  70. package/dist/auth-mfa/web/client-plugin.js +1 -1
  71. package/dist/auth-mfa/web/i18n.js +3 -3
  72. package/dist/auth-mfa/web/index.js +4 -4
  73. package/dist/auth-mfa/web/mfa-client.js +17 -16
  74. package/dist/auth-mfa/web/mfa-verify-screen.js +6 -6
  75. package/dist/billing-foundation/aggregate-id.d.ts +5 -5
  76. package/dist/billing-foundation/aggregate-id.js +10 -11
  77. package/dist/billing-foundation/entities.js +27 -27
  78. package/dist/billing-foundation/events.js +18 -17
  79. package/dist/billing-foundation/feature.js +42 -43
  80. package/dist/billing-foundation/get-subscription-for-tenant.d.ts +3 -3
  81. package/dist/billing-foundation/get-subscription-for-tenant.js +3 -5
  82. package/dist/billing-foundation/handlers/create-checkout-session.write.js +18 -17
  83. package/dist/billing-foundation/handlers/create-portal-session.write.js +11 -12
  84. package/dist/billing-foundation/handlers/list-subscriptions.query.js +4 -4
  85. package/dist/billing-foundation/handlers/process-event.write.js +20 -20
  86. package/dist/billing-foundation/projection.d.ts +15 -11
  87. package/dist/billing-foundation/projection.js +38 -37
  88. package/dist/billing-foundation/subscription-tier-sync.js +3 -3
  89. package/dist/billing-foundation/tenant-destroy-hook.d.ts +2 -2
  90. package/dist/billing-foundation/tenant-destroy-hook.js +7 -7
  91. package/dist/billing-foundation/types.d.ts +40 -41
  92. package/dist/billing-foundation/types.js +20 -20
  93. package/dist/billing-foundation/web/billing-plans-panel.js +4 -4
  94. package/dist/cap-counter/aggregate-id.js +8 -9
  95. package/dist/cap-counter/constants.js +11 -12
  96. package/dist/cap-counter/enforce-cap.d.ts +59 -62
  97. package/dist/cap-counter/enforce-cap.js +47 -48
  98. package/dist/cap-counter/entity.js +29 -29
  99. package/dist/cap-counter/feature.js +34 -35
  100. package/dist/cap-counter/handlers/increment-rolling.write.d.ts +2 -2
  101. package/dist/cap-counter/handlers/increment-rolling.write.js +31 -31
  102. package/dist/cap-counter/handlers/mark-soft-warned.write.js +4 -5
  103. package/dist/cap-counter/stock-cap-guard.js +1 -1
  104. package/dist/cap-counter/with-cap-enforcement.d.ts +3 -5
  105. package/dist/channel-email/smtp-transport.d.ts +18 -17
  106. package/dist/channel-email/smtp-transport.js +24 -21
  107. package/dist/channel-in-app/handlers/unread-count.query.js +3 -4
  108. package/dist/compliance-profiles/feature.js +4 -4
  109. package/dist/compliance-profiles/handlers/for-tenant.query.js +3 -6
  110. package/dist/compliance-profiles/handlers/list-profiles.query.js +5 -5
  111. package/dist/compliance-profiles/handlers/needs-profile.query.js +4 -4
  112. package/dist/compliance-profiles/handlers/set-profile.write.js +13 -14
  113. package/dist/compliance-profiles/handlers/sub-processors.query.js +9 -11
  114. package/dist/compliance-profiles/resolve-for-tenant.js +7 -7
  115. package/dist/compliance-profiles/schema/profile-selection.js +18 -23
  116. package/dist/compliance-profiles/seeding.js +14 -15
  117. package/dist/compliance-profiles-ops/handlers/tenants-missing-profile.query.js +3 -3
  118. package/dist/compliance-profiles-ops/index.js +2 -2
  119. package/dist/config/handlers/readiness.query.d.ts +4 -4
  120. package/dist/config/handlers/readiness.query.js +1 -1
  121. package/dist/config/handlers/reencrypt.job.js +4 -5
  122. package/dist/config/handlers/set.write.js +4 -4
  123. package/dist/config/resolver.js +4 -4
  124. package/dist/config/table.js +10 -10
  125. package/dist/config/write-helpers.js +1 -1
  126. package/dist/crypto-shredding/handlers/forget-subject.write.d.ts +2 -2
  127. package/dist/crypto-shredding/handlers/forget-subject.write.js +12 -11
  128. package/dist/custom-fields/aggregate-id.d.ts +12 -13
  129. package/dist/custom-fields/aggregate-id.js +16 -17
  130. package/dist/custom-fields/entity.js +49 -47
  131. package/dist/custom-fields/events.js +7 -8
  132. package/dist/custom-fields/feature.d.ts +14 -14
  133. package/dist/custom-fields/feature.js +53 -54
  134. package/dist/custom-fields/handlers/clear-custom-field.write.d.ts +3 -2
  135. package/dist/custom-fields/handlers/clear-custom-field.write.js +9 -8
  136. package/dist/custom-fields/handlers/define-tenant-field.write.d.ts +1 -1
  137. package/dist/custom-fields/handlers/define-tenant-field.write.js +2 -2
  138. package/dist/custom-fields/handlers/delete-system-field.write.js +6 -7
  139. package/dist/custom-fields/handlers/delete-tenant-field.write.d.ts +1 -1
  140. package/dist/custom-fields/handlers/delete-tenant-field.write.js +3 -3
  141. package/dist/custom-fields/handlers/set-custom-field.write.d.ts +3 -3
  142. package/dist/custom-fields/handlers/set-custom-field.write.js +25 -28
  143. package/dist/custom-fields/handlers/update-tenant-field.write.d.ts +1 -1
  144. package/dist/custom-fields/handlers/update-tenant-field.write.js +1 -1
  145. package/dist/custom-fields/lib/field-access.js +2 -2
  146. package/dist/custom-fields/lib/parse-serialized-field.js +1 -1
  147. package/dist/custom-fields/lib/quota.js +1 -1
  148. package/dist/custom-fields/lib/value-schema.js +10 -12
  149. package/dist/custom-fields/run-retention.js +3 -3
  150. package/dist/custom-fields/schemas.js +14 -14
  151. package/dist/custom-fields/web/client-plugin.js +2 -5
  152. package/dist/custom-fields/web/constants.js +2 -2
  153. package/dist/custom-fields/web/custom-fields-form-section.d.ts +4 -4
  154. package/dist/custom-fields/web/custom-fields-form-section.js +22 -22
  155. package/dist/custom-fields/wire-for-entity.js +65 -67
  156. package/dist/custom-fields/wire-user-data-rights.js +3 -3
  157. package/dist/data-retention/_internal/parse-override.js +2 -3
  158. package/dist/data-retention/feature.js +11 -18
  159. package/dist/data-retention/handlers/policy-for.query.js +6 -6
  160. package/dist/data-retention/keep-for.d.ts +7 -7
  161. package/dist/data-retention/keep-for.js +15 -15
  162. package/dist/data-retention/override-schema.d.ts +3 -4
  163. package/dist/data-retention/override-schema.js +13 -15
  164. package/dist/data-retention/presets.d.ts +4 -5
  165. package/dist/data-retention/presets.js +18 -23
  166. package/dist/data-retention/resolve-tenant-preset.js +17 -16
  167. package/dist/data-retention/resolver.d.ts +12 -12
  168. package/dist/data-retention/resolver.js +24 -23
  169. package/dist/data-retention/run-retention-cleanup.d.ts +8 -3
  170. package/dist/data-retention/run-retention-cleanup.js +61 -51
  171. package/dist/data-retention/schema/tenant-retention-override.js +13 -11
  172. package/dist/delivery/feature.js +2 -2
  173. package/dist/delivery/handlers/log.query.js +1 -1
  174. package/dist/delivery/tables.js +9 -8
  175. package/dist/delivery/unsubscribe.js +4 -4
  176. package/dist/document-ingest-foundation/entity.js +4 -4
  177. package/dist/document-ingest-foundation/events.js +2 -2
  178. package/dist/document-ingest-foundation/feature.js +2 -2
  179. package/dist/document-ingest-foundation/pages.js +1 -1
  180. package/dist/document-ingest-foundation/tenant-destroy-hook.js +4 -4
  181. package/dist/feature-toggles/compose-tier-resolver.js +1 -1
  182. package/dist/feature-toggles/feature.js +1 -1
  183. package/dist/feature-toggles/global-feature-state-table.js +1 -1
  184. package/dist/feature-toggles/handlers/registered.query.js +5 -5
  185. package/dist/feature-toggles/toggle-sync-signal.js +1 -1
  186. package/dist/feature-toggles/web/constants.js +1 -1
  187. package/dist/file-derivatives/feature.d.ts +1 -1
  188. package/dist/file-derivatives/feature.js +1 -1
  189. package/dist/file-derivatives/handlers/public-variant.query.js +1 -1
  190. package/dist/file-derivatives/presets.js +1 -1
  191. package/dist/file-foundation/feature.js +6 -6
  192. package/dist/file-provider-inmemory/feature.d.ts +1 -1
  193. package/dist/file-provider-inmemory/feature.js +16 -16
  194. package/dist/file-provider-s3/feature.js +16 -16
  195. package/dist/file-provider-s3/lib/s3-provider.js +6 -6
  196. package/dist/files/feature.js +6 -6
  197. package/dist/files-tenant-data/handlers/sweep-orphaned-derivatives.job.js +4 -4
  198. package/dist/files-tenant-data/hooks.js +24 -26
  199. package/dist/files-tenant-data/index.js +1 -1
  200. package/dist/folders/feature.d.ts +1 -1
  201. package/dist/folders/web/folder-manager.js +2 -2
  202. package/dist/folders/web/tree.js +5 -5
  203. package/dist/form-draft/db/queries/cleanup.js +1 -1
  204. package/dist/form-draft/db/queries/owned-file-refs.js +1 -1
  205. package/dist/form-draft/entity.js +3 -3
  206. package/dist/form-draft/feature.js +4 -5
  207. package/dist/form-draft/handlers/discard.write.js +1 -1
  208. package/dist/form-draft/release-file-refs.js +6 -6
  209. package/dist/form-draft/schemas.js +3 -3
  210. package/dist/form-draft/web/constants.js +0 -2
  211. package/dist/inbound-mail-foundation/aggregate-id.d.ts +13 -13
  212. package/dist/inbound-mail-foundation/aggregate-id.js +19 -19
  213. package/dist/inbound-mail-foundation/connect-routes.js +4 -3
  214. package/dist/inbound-mail-foundation/constants.d.ts +22 -24
  215. package/dist/inbound-mail-foundation/constants.js +30 -33
  216. package/dist/inbound-mail-foundation/entities.d.ts +12 -12
  217. package/dist/inbound-mail-foundation/entities.js +47 -48
  218. package/dist/inbound-mail-foundation/events.d.ts +4 -3
  219. package/dist/inbound-mail-foundation/events.js +50 -47
  220. package/dist/inbound-mail-foundation/feature.js +39 -39
  221. package/dist/inbound-mail-foundation/handlers/account-state.js +8 -8
  222. package/dist/inbound-mail-foundation/handlers/connect-account.write.js +25 -26
  223. package/dist/inbound-mail-foundation/handlers/disconnect-account.write.js +7 -7
  224. package/dist/inbound-mail-foundation/handlers/ingest-message.write.js +50 -51
  225. package/dist/inbound-mail-foundation/handlers/list-accounts.query.js +8 -8
  226. package/dist/inbound-mail-foundation/handlers/list-messages.query.js +10 -10
  227. package/dist/inbound-mail-foundation/handlers/scope-visibility.js +3 -4
  228. package/dist/inbound-mail-foundation/handlers/update-account.write.js +11 -11
  229. package/dist/inbound-mail-foundation/oauth-state.d.ts +5 -5
  230. package/dist/inbound-mail-foundation/oauth-state.js +11 -10
  231. package/dist/inbound-mail-foundation/projection.d.ts +4 -4
  232. package/dist/inbound-mail-foundation/projection.js +31 -29
  233. package/dist/inbound-mail-foundation/provider-factory.d.ts +4 -4
  234. package/dist/inbound-mail-foundation/provider-factory.js +9 -9
  235. package/dist/inbound-mail-foundation/retention-sweep.d.ts +5 -3
  236. package/dist/inbound-mail-foundation/retention-sweep.js +38 -36
  237. package/dist/inbound-mail-foundation/tenant-destroy-hook.js +14 -16
  238. package/dist/inbound-mail-foundation/types.d.ts +45 -46
  239. package/dist/inbound-mail-foundation/types.js +21 -21
  240. package/dist/inbound-mail-foundation/watch-supervisor.d.ts +10 -10
  241. package/dist/inbound-mail-foundation/watch-supervisor.js +57 -56
  242. package/dist/inbound-provider-imap/credential-document.js +13 -13
  243. package/dist/inbound-provider-imap/feature.d.ts +2 -2
  244. package/dist/inbound-provider-imap/feature.js +42 -40
  245. package/dist/inbound-provider-imap/imap-client.d.ts +12 -11
  246. package/dist/inbound-provider-imap/imap-client.js +20 -19
  247. package/dist/inbound-provider-inmemory/feature.d.ts +9 -9
  248. package/dist/inbound-provider-inmemory/feature.js +19 -19
  249. package/dist/jobs/db/queries/retention.js +2 -2
  250. package/dist/jobs/db/queries/stale-run-sweep.js +3 -3
  251. package/dist/jobs/events.js +1 -1
  252. package/dist/jobs/feature.js +5 -6
  253. package/dist/jobs/handlers/detail.query.js +4 -4
  254. package/dist/jobs/handlers/list.query.js +1 -1
  255. package/dist/jobs/handlers/projection-rebuild.job.js +1 -1
  256. package/dist/jobs/handlers/reindex-entity.job.js +1 -1
  257. package/dist/jobs/handlers/retry.write.js +1 -1
  258. package/dist/jobs/job-instant.js +1 -1
  259. package/dist/jobs/job-run-logger.js +10 -11
  260. package/dist/jobs/job-run-table.js +3 -3
  261. package/dist/jobs/screens.js +1 -1
  262. package/dist/jobs/tenant-job-failure-table.js +1 -1
  263. package/dist/jobs/tenant-job-run-table.js +1 -1
  264. package/dist/ledger/entity.js +5 -5
  265. package/dist/ledger/feature.js +3 -3
  266. package/dist/ledger/handlers/confirm-schedule-period.write.js +3 -3
  267. package/dist/ledger/recurring.js +12 -12
  268. package/dist/ledger/schemas.js +1 -1
  269. package/dist/ledger/web/constants.js +2 -2
  270. package/dist/ledger/web/index.js +7 -7
  271. package/dist/legal-pages/feature.d.ts +4 -4
  272. package/dist/legal-pages/feature.js +25 -26
  273. package/dist/legal-pages/markdown.js +3 -3
  274. package/dist/legal-pages/web/client-plugin.js +23 -24
  275. package/dist/legal-pages/web/index.js +0 -1
  276. package/dist/mail-foundation/feature.d.ts +2 -2
  277. package/dist/mail-foundation/feature.js +24 -25
  278. package/dist/mail-transport-inmemory/feature.d.ts +4 -4
  279. package/dist/mail-transport-inmemory/feature.js +27 -28
  280. package/dist/mail-transport-smtp/feature.js +20 -20
  281. package/dist/managed-pages/branding.js +6 -6
  282. package/dist/managed-pages/feature.d.ts +26 -26
  283. package/dist/managed-pages/feature.js +34 -34
  284. package/dist/managed-pages/handlers/by-slug.query.js +5 -6
  285. package/dist/managed-pages/handlers/by-tenant-published.query.js +2 -2
  286. package/dist/managed-pages/handlers/set.write.js +5 -7
  287. package/dist/managed-pages/screens/page-screens.js +11 -11
  288. package/dist/managed-pages/seeding.js +8 -8
  289. package/dist/managed-pages/table.js +13 -12
  290. package/dist/managed-pages/web/client-plugin.d.ts +1 -1
  291. package/dist/managed-pages/web/client-plugin.js +5 -5
  292. package/dist/managed-pages/web/i18n.js +1 -1
  293. package/dist/notes-history/entity.js +4 -4
  294. package/dist/notes-history/feature.d.ts +2 -2
  295. package/dist/notes-history-user-data/hooks.js +1 -1
  296. package/dist/page-render/layout.js +9 -9
  297. package/dist/page-render/markdown.js +11 -11
  298. package/dist/page-render/security-headers.js +7 -6
  299. package/dist/personal-access-tokens/feature.js +5 -5
  300. package/dist/personal-access-tokens/roles.js +2 -2
  301. package/dist/readiness/handlers/status.query.js +3 -3
  302. package/dist/renderer-foundation/api.js +12 -13
  303. package/dist/renderer-foundation/constants.js +2 -2
  304. package/dist/renderer-foundation/feature.js +7 -7
  305. package/dist/secrets/feature.js +9 -9
  306. package/dist/secrets/web/constants.js +2 -2
  307. package/dist/seo/feature.js +3 -3
  308. package/dist/sessions/constants.d.ts +1 -1
  309. package/dist/sessions/constants.js +1 -1
  310. package/dist/sessions/feature.js +8 -8
  311. package/dist/sessions/handlers/revoke-all-for-user.write.js +2 -2
  312. package/dist/sessions/handlers/revoke-all-others.write.js +2 -2
  313. package/dist/sessions/handlers/revoke.write.js +1 -1
  314. package/dist/sessions/schema/user-session.js +4 -4
  315. package/dist/sessions/screens.js +2 -2
  316. package/dist/sessions/session-callbacks.js +2 -2
  317. package/dist/sessions/session-revoked-event.js +2 -2
  318. package/dist/shared/assert-no-where-rule-in-ownership-write.js +1 -1
  319. package/dist/shared/decrypt-stored-pii.js +1 -1
  320. package/dist/shared/encrypt-for-direct-write.js +1 -1
  321. package/dist/shared/map-with-concurrency.js +5 -4
  322. package/dist/shared/parent-visibility.js +2 -2
  323. package/dist/shared/password-hashing.js +1 -1
  324. package/dist/shared/signup-handover.js +1 -2
  325. package/dist/shared/single-use-token-store.js +1 -1
  326. package/dist/subscription-mollie/constants.js +15 -17
  327. package/dist/subscription-mollie/feature.d.ts +17 -18
  328. package/dist/subscription-mollie/feature.js +24 -24
  329. package/dist/subscription-mollie/index.js +3 -3
  330. package/dist/subscription-mollie/plugin-methods.d.ts +2 -2
  331. package/dist/subscription-mollie/plugin-methods.js +15 -14
  332. package/dist/subscription-mollie/verify-webhook.d.ts +10 -10
  333. package/dist/subscription-mollie/verify-webhook.js +27 -27
  334. package/dist/subscription-stripe/constants.js +4 -6
  335. package/dist/subscription-stripe/feature.d.ts +14 -14
  336. package/dist/subscription-stripe/feature.js +35 -34
  337. package/dist/subscription-stripe/index.js +6 -6
  338. package/dist/subscription-stripe/plugin-methods.js +18 -18
  339. package/dist/subscription-stripe/runtime.d.ts +1 -1
  340. package/dist/subscription-stripe/runtime.js +1 -1
  341. package/dist/subscription-stripe/verify-webhook.d.ts +11 -11
  342. package/dist/subscription-stripe/verify-webhook.js +59 -61
  343. package/dist/tags/feature.d.ts +3 -3
  344. package/dist/tags/screens.js +1 -1
  345. package/dist/template-resolver/api.js +10 -10
  346. package/dist/template-resolver/handlers/find-by-id.query.js +5 -5
  347. package/dist/template-resolver/handlers/list.query.js +1 -1
  348. package/dist/template-resolver/handlers/shared.js +2 -2
  349. package/dist/template-resolver/handlers/template-write.js +3 -3
  350. package/dist/template-resolver/handlers/upsert-system.write.js +3 -4
  351. package/dist/template-resolver/handlers/upsert-tenant.write.js +4 -5
  352. package/dist/template-resolver/seeding.js +4 -4
  353. package/dist/template-resolver/table.js +10 -11
  354. package/dist/template-resolver/web/client-plugin.js +2 -2
  355. package/dist/tenant/feature.js +7 -7
  356. package/dist/tenant/handlers/member-directory.query.js +1 -1
  357. package/dist/tenant/handlers/members.query.js +1 -1
  358. package/dist/tenant/handlers/team-list.query.js +1 -1
  359. package/dist/tenant/handlers/tenant-directory.query.js +1 -1
  360. package/dist/tenant/invitation-table.js +37 -40
  361. package/dist/tenant/membership-table.js +3 -3
  362. package/dist/tenant/schema/tenant.js +7 -9
  363. package/dist/tenant/screens.js +1 -1
  364. package/dist/tenant/seeding.d.ts +6 -5
  365. package/dist/tenant/seeding.js +12 -12
  366. package/dist/tenant/testing.js +5 -6
  367. package/dist/tenant/web/constants.js +2 -2
  368. package/dist/tenant-handover/events.js +5 -7
  369. package/dist/tenant-handover/feature.js +1 -1
  370. package/dist/tenant-handover/grant.js +1 -1
  371. package/dist/tenant-handover/handlers/claim.write.js +1 -1
  372. package/dist/tenant-handover/move-entity-graph.js +8 -9
  373. package/dist/tenant-handover/signup-handover-provider.js +1 -2
  374. package/dist/tenant-handover/transfer-graph.js +4 -5
  375. package/dist/tenant-lifecycle/boot-checks.js +1 -1
  376. package/dist/tenant-lifecycle/feature.js +1 -1
  377. package/dist/tenant-settings/constants.js +1 -1
  378. package/dist/tenant-settings/tenant-defaults.d.ts +1 -1
  379. package/dist/tenant-settings/tenant-defaults.js +9 -2
  380. package/dist/tier-engine/aggregate-id.d.ts +11 -11
  381. package/dist/tier-engine/aggregate-id.js +15 -16
  382. package/dist/tier-engine/compose-app.d.ts +14 -14
  383. package/dist/tier-engine/compose-app.js +1 -1
  384. package/dist/tier-engine/entity.js +18 -19
  385. package/dist/tier-engine/feature.d.ts +19 -17
  386. package/dist/tier-engine/feature.js +68 -69
  387. package/dist/tier-engine/handlers/active-tier.query.js +6 -7
  388. package/dist/tier-engine/handlers/get-tenant-tier.query.js +4 -4
  389. package/dist/tier-engine/handlers/set-tenant-tier.write.d.ts +5 -5
  390. package/dist/tier-engine/handlers/set-tenant-tier.write.js +3 -3
  391. package/dist/tier-engine/tier-resolver.js +2 -2
  392. package/dist/tier-engine/trial.js +8 -8
  393. package/dist/tier-engine/web/index.js +4 -4
  394. package/dist/user/db/queries/stream-tenant-backfill.js +8 -8
  395. package/dist/user/handlers/create.write.js +4 -4
  396. package/dist/user/schema/user.d.ts +11 -11
  397. package/dist/user/schema/user.js +45 -44
  398. package/dist/user/seeding.d.ts +15 -15
  399. package/dist/user/seeding.js +28 -28
  400. package/dist/user/testing.js +3 -3
  401. package/dist/user-data-rights/audit-download.d.ts +8 -8
  402. package/dist/user-data-rights/audit-download.js +19 -20
  403. package/dist/user-data-rights/boot-checks.js +1 -1
  404. package/dist/user-data-rights/deletion-token.js +1 -1
  405. package/dist/user-data-rights/feature.d.ts +49 -50
  406. package/dist/user-data-rights/feature.js +54 -53
  407. package/dist/user-data-rights/handlers/cancel-deletion.write.js +9 -9
  408. package/dist/user-data-rights/handlers/confirm-deletion-by-token.write.js +8 -8
  409. package/dist/user-data-rights/handlers/download-by-job.query.js +29 -30
  410. package/dist/user-data-rights/handlers/download-by-token.query.js +40 -42
  411. package/dist/user-data-rights/handlers/export-status.query.js +8 -9
  412. package/dist/user-data-rights/handlers/lift-restriction.write.js +7 -8
  413. package/dist/user-data-rights/handlers/list-download-attempts.query.js +2 -2
  414. package/dist/user-data-rights/handlers/my-audit-log.query.js +4 -4
  415. package/dist/user-data-rights/handlers/request-deletion-by-email.write.d.ts +5 -5
  416. package/dist/user-data-rights/handlers/request-deletion-by-email.write.js +16 -15
  417. package/dist/user-data-rights/handlers/request-deletion.write.d.ts +2 -2
  418. package/dist/user-data-rights/handlers/request-deletion.write.js +7 -9
  419. package/dist/user-data-rights/handlers/request-export.write.js +42 -41
  420. package/dist/user-data-rights/handlers/restrict-account.write.js +22 -19
  421. package/dist/user-data-rights/handlers/run-forget-cleanup.write.js +8 -8
  422. package/dist/user-data-rights/index.js +8 -10
  423. package/dist/user-data-rights/lib/default-mailers.js +3 -3
  424. package/dist/user-data-rights/lib/update-user-lifecycle.js +14 -17
  425. package/dist/user-data-rights/run-export-jobs.d.ts +38 -42
  426. package/dist/user-data-rights/run-export-jobs.js +127 -233
  427. package/dist/user-data-rights/run-forget-cleanup.d.ts +16 -20
  428. package/dist/user-data-rights/run-forget-cleanup.js +63 -82
  429. package/dist/user-data-rights/run-user-export.d.ts +34 -33
  430. package/dist/user-data-rights/run-user-export.js +55 -57
  431. package/dist/user-data-rights/schema/download-attempt.js +11 -11
  432. package/dist/user-data-rights/schema/download-token.js +37 -41
  433. package/dist/user-data-rights/schema/export-job.d.ts +4 -4
  434. package/dist/user-data-rights/schema/export-job.js +65 -67
  435. package/dist/user-data-rights/token-helpers.d.ts +8 -9
  436. package/dist/user-data-rights/token-helpers.js +21 -25
  437. package/dist/user-data-rights/web/client-plugin.d.ts +5 -5
  438. package/dist/user-data-rights/web/client-plugin.js +1 -1
  439. package/dist/user-data-rights/web/confirm-deletion-screen.js +6 -5
  440. package/dist/user-data-rights/web/constants.js +1 -1
  441. package/dist/user-data-rights/web/index.js +5 -5
  442. package/dist/user-data-rights/web/privacy-center-screen.js +14 -13
  443. package/dist/user-data-rights/web/public-deletion-gate.d.ts +4 -4
  444. package/dist/user-data-rights/web/request-deletion-screen.js +6 -6
  445. package/dist/user-data-rights/zip-path.d.ts +15 -15
  446. package/dist/user-data-rights/zip-path.js +41 -40
  447. package/dist/user-data-rights-defaults/feature.js +15 -15
  448. package/dist/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.js +3 -5
  449. package/dist/user-data-rights-defaults/hooks/file-ref.userdata-hook.js +45 -51
  450. package/dist/user-data-rights-defaults/hooks/job-run.userdata-hook.js +2 -2
  451. package/dist/user-data-rights-defaults/hooks/notification-preference.userdata-hook.js +1 -1
  452. package/dist/user-data-rights-defaults/hooks/user-session.userdata-hook.js +3 -3
  453. package/dist/user-data-rights-defaults/hooks/user.userdata-hook.js +32 -31
  454. package/dist/user-profile/handlers/change-email.write.js +13 -13
  455. package/dist/user-profile/index.js +3 -3
  456. package/dist/user-profile/web/client-plugin.js +1 -1
  457. package/dist/user-profile/web/constants.js +1 -1
  458. package/dist/user-profile/web/profile-screen.js +1 -1
  459. package/dist/workflow-runner/aggregate-id.d.ts +1 -1
  460. package/dist/workflow-runner/aggregate-id.js +1 -1
  461. package/dist/workflow-runner/event-subscriber.js +4 -5
  462. package/dist/workflow-runner/event-trigger.js +4 -17
  463. package/dist/workflow-runner/feature.js +2 -2
  464. package/dist/workflow-runner/handlers/resume-run.write.js +4 -4
  465. package/dist/workflow-runner/pending-projection.js +6 -7
  466. package/dist/workflow-runner/runner.js +6 -6
  467. package/dist/workflow-runner/tables.js +6 -6
  468. package/dist/workflow-runner/workflow-registry.js +1 -1
  469. package/package.json +10 -10
@@ -60,14 +60,14 @@ export async function hostRowIsGone(registry, entityType, entityId, db) {
60
60
  const row = await db.fetchOne(table, { id: entityId });
61
61
  return row === undefined || row["isDeleted"] === true;
62
62
  }
63
- // Write-path half of the parentRef gate (fw#2766). Resolves the join entity's
63
+ // Write-path half of the parentRef gate. Resolves the join entity's
64
64
  // own `parentRef` declaration from the registry — the same object the read
65
65
  // path's SQL gate reads — so the field names and the allowedTypes allowlist
66
66
  // exist in exactly one place instead of once per path.
67
67
  export async function joinRowParentIsVisible(registry, joinEntityName, payload, user, db) {
68
68
  const parentRef = registry.getEntity(joinEntityName)?.parentRef;
69
69
  // A mount whose join entity lost its declaration can't derive a gate —
70
- // deny rather than silently fall back to the pre-#2766 open behaviour.
70
+ // deny rather than silently fall back to the open behaviour.
71
71
  if (parentRef === undefined)
72
72
  return false;
73
73
  const entityType = payload[parentRef.entityTypeField];
@@ -40,7 +40,7 @@ export async function verifyPassword(hashString, password) {
40
40
  return false;
41
41
  }
42
42
  }
43
- // Anti-enumeration timing equaliser (#774). The login handler runs this on
43
+ // Anti-enumeration timing equaliser. The login handler runs this on
44
44
  // the no-user / no-hash path so a missing account costs the same argon2
45
45
  // latency as a real verify — otherwise response timing leaks whether an
46
46
  // email is registered. Derived from hashPassword once and cached, so it
@@ -1,5 +1,4 @@
1
- // Cross-device try-first handover (kumiko-framework#3035 follow-up,
2
- // offlot-app#454): signup-request runs in whichever browser the activation
1
+ // Cross-device try-first handover: signup-request runs in whichever browser the activation
3
2
  // link ends up opened in, which may not be the one holding the anonymous
4
3
  // visitor's tenant-handover grant. This extension point lets
5
4
  // auth-email-password bind a verified grant to the signup token server-side
@@ -25,7 +25,7 @@
25
25
  //
26
26
  // Every key is derived from sha256(token), never the raw token — Redis key
27
27
  // names, MONITOR output, replica traffic, and memory/backup dumps never
28
- // carry the bearer secret in the clear (#2174). The by-subject entry stores
28
+ // carry the bearer secret in the clear. The by-subject entry stores
29
29
  // the *hash* of the live token, not the token itself, so it can only be
30
30
  // used to invalidate (delete the matching forward entry) — never to
31
31
  // recover or resend the original token. A resend therefore always mints a
@@ -1,31 +1,29 @@
1
1
  // Feature name
2
2
  export const SUBSCRIPTION_MOLLIE_FEATURE = "subscription-mollie";
3
- // entityName under den der Plugin gegen "subscriptionProvider"
4
- // registriert. Matcht den path-segment in der webhook-URL
3
+ // Entity name under which the plugin registers against
4
+ // "subscriptionProvider". Matches the path segment in the webhook URL
5
5
  // `/api/subscription/webhook/mollie`.
6
6
  export const MOLLIE_PROVIDER_NAME = "mollie";
7
7
  // =============================================================================
8
- // Mollie-Webhook-Pattern (anders als Stripe!)
8
+ // Mollie webhook pattern (unlike Stripe)
9
9
  // =============================================================================
10
10
  //
11
- // Mollie sendet bei JEDEM event nur die ID im body (form-urlencoded
12
- // oder JSON). Plugin muss IMMER lazy-fetchen via Mollie-API:
13
- // - `id=tr_xxx` → payment-id, fetch payment + subscription
14
- // - `id=sub_xxx` → subscription-id, fetch subscription direkt
11
+ // Mollie sends only the ID in the body for EVERY event (form-urlencoded
12
+ // or JSON). The plugin must ALWAYS fetch lazily via the Mollie API:
13
+ // - `id=tr_xxx` → payment ID, fetch payment + subscription
14
+ // - `id=sub_xxx` → subscription ID, fetch subscription directly
15
15
  //
16
- // **Keine native HMAC-sig-verify** in Mollie-SDK 4.5.0. Mollie's
17
- // Sicherheits-Modell stützt sich auf nicht-guessable IDs (~10^25
18
- // brute-force-space) + API-Lookup-Validation (garbage-id → 401 von
19
- // Mollie-API). Plus: App-Builder kann zusätzlich einen URL-Token-
20
- // Wrapper vor die Foundation-route schalten (eigener extraRoute der
21
- // einen secret-token im URL-Pfad verifiziert + dann an die Foundation
22
- // weiterreicht).
16
+ // **No native HMAC signature verification** in Mollie SDK 4.5.0. Mollie's
17
+ // security model relies on non-guessable IDs (~10^25 brute-force space)
18
+ // plus API lookup validation (garbage ID → 401 from the Mollie API). In
19
+ // addition, the app builder can place a URL-token wrapper before the
20
+ // foundation route (a custom extraRoute that verifies a secret token in
21
+ // the URL path and then forwards to the foundation).
23
22
  //
24
- // **Event-Type-Mapping** ist heuristisch — Mollie hat keine explicit-
25
- // typed events:
23
+ // **Event type mapping** is heuristic—Mollie has no explicitly typed events:
26
24
  // - sub_xxx + status=canceled/completed → SubscriptionEventTypes.canceled
27
25
  // - sub_xxx + status=active/pending → SubscriptionEventTypes.updated
28
26
  // - tr_xxx + sequenceType=first + paid → SubscriptionEventTypes.created
29
27
  // - tr_xxx + sequenceType=recurring + paid → SubscriptionEventTypes.invoicePaid
30
28
  // - tr_xxx + sequenceType=recurring + failed → SubscriptionEventTypes.invoicePaymentFailed
31
- // - alles andere → null (foundation 200 ignored)
29
+ // - everything else → null (foundation 200 ignored)
@@ -11,29 +11,28 @@ export declare const subscriptionMollieEnvSchema: z.ZodObject<{
11
11
  MOLLIE_API_KEY: z.ZodString;
12
12
  }, z.core.$strip>;
13
13
  export type SubscriptionMollieOptions = {
14
- /** Mollie-API-key (`test_...` oder `live_...`). App-wide, beim Plugin-
15
- * mount aus process.env oder system-config. */
14
+ /** Mollie API key (`test_...` or `live_...`). App-wide, mounted from
15
+ * process.env or system configuration. */
16
16
  readonly apiKey: string;
17
- /** Foundation-webhook-URL die der App-Builder unter Mollie-Dashboard
18
- * als webhook eingetragen hat. Plugin reicht das beim payment-
19
- * create an Mollie weiter — Mollie sendet beim payment-event
20
- * webhooks an diese URL. Typisch:
17
+ /** Foundation webhook URL registered by the app builder in the Mollie
18
+ * dashboard. The plugin passes it to Mollie when creating a payment;
19
+ * Mollie sends payment-event webhooks to this URL. Typically:
21
20
  * `https://app.example.com/api/subscription/webhook/mollie`. */
22
21
  readonly webhookUrl: string;
23
- /** Price-to-tier-Map. Plugin liest die priceId aus dem subscription-
24
- * metadata (= `metadata.priceId` den der App-Builder beim
25
- * createCheckoutSession setzt) und mappt auf einen tier-name. */
22
+ /** Price-to-tier map. The plugin reads the priceId from the subscription
23
+ * metadata (= `metadata.priceId` set by the app builder when calling
24
+ * createCheckoutSession) and maps it to a tier name. */
26
25
  readonly priceToTier: Readonly<Record<string, string>>;
27
- /** Mollie-Subscription-Setup pro priceId. Mollie hat keinen nativen
28
- * price-id-Konzept — App-Builder muss pro virtuellem priceId einen
29
- * amount/interval/description bereitstellen. */
26
+ /** Mollie subscription setup per priceId. Mollie has no native price-ID
27
+ * concept, so the app builder must provide an amount/interval/description
28
+ * for each virtual priceId. */
30
29
  readonly priceToConfig: Readonly<Record<string, MolliePriceConfig>>;
31
- /** @internal Test-only injection-port: ersetzt den verify-webhook-
32
- * fetch-client durch eine Mock-instance. Production left undefined —
33
- * factory baut den Adapter aus `createMollieClient(apiKey)`. Wird
34
- * vom IT (mollie-foundation.integration.ts) genutzt damit der echte
35
- * factory-Code (drift-validation, plugin-registration) im Test-pfad
36
- * durchläuft, ohne dass Mollie-API-Calls passieren. */
30
+ /** @internal Test-only injection port: replaces the verify-webhook fetch
31
+ * client with a mock instance. Production leaves this undefined; the
32
+ * factory builds the adapter from `createMollieClient(apiKey)`. The
33
+ * integration test (mollie-foundation.integration.ts) uses it so the real
34
+ * factory code (drift validation, plugin registration) runs in the test
35
+ * path without making Mollie API calls. */
37
36
  readonly _clientShapeForTests?: MollieClientShape;
38
37
  };
39
38
  export declare function createSubscriptionMollieFeature(options: SubscriptionMollieOptions): FeatureDefinition;
@@ -1,26 +1,26 @@
1
1
  // kumiko-feature-version: 1
2
2
  //
3
- // subscription-mollie — Mollie-Plugin für die subscription-foundation
4
- // Plugin-API (EU-Compliance-Story für DACH-Mid-Market).
3
+ // subscription-mollie — Mollie plugin for subscription-foundation
4
+ // plugin API (EU compliance for the DACH mid-market).
5
5
  //
6
- // **Factory-Pattern (analog subscription-stripe):** liest API-key beim
7
- // mount-time aus den factory-options (typisch process.env aus dem App-
8
- // Builder-bin/server.ts). Mollie hat KEIN webhook-secret — Mollie-SDK
9
- // 4.5.0 bietet keine native HMAC-sig-verify-API. Sicherheit kommt aus
10
- // nicht-guessable IDs + API-Validation; App-Builder kann optional
11
- // einen URL-Token-Wrapper davor schalten.
6
+ // **Factory pattern (analogous to subscription-stripe):** reads the API key
7
+ // at mount time from the factory options (typically process.env from the app
8
+ // builder's bin/server.ts). Mollie has NO webhook secret — Mollie SDK
9
+ // 4.5.0 provides no native HMAC signature verification API. Security comes
10
+ // from non-guessable IDs + API validation; the app builder can optionally
11
+ // add a URL-token wrapper in front.
12
12
  //
13
- // **Phase-5.3-Scope:**
13
+ // **Scope:**
14
14
  // - verifyAndParseWebhook ✓ (lazy-fetch payment + subscription via
15
- // Mollie-API, heuristisches event-type-mapping)
16
- // - createCheckoutSession ✓ (Mollie's mehrstufiger flow: customer
17
- // anlegen + first-payment mit sequenceType="first" → redirectUrl)
18
- // - createPortalSession ✗ (Mollie hat keinen Customer-Portal)
19
- // - cancelSubscription ✗ (Mollie braucht customerId zusätzlich zur
20
- // subId; Plugin-Contract reicht's nicht durch — App-Builder cancelt
21
- // via Mollie-Dashboard oder custom-route)
15
+ // Mollie API, heuristic event-type mapping)
16
+ // - createCheckoutSession ✓ (Mollie's multistep flow: create customer
17
+ // + first payment with sequenceType="first" → redirectUrl)
18
+ // - createPortalSession ✗ (Mollie has no customer portal)
19
+ // - cancelSubscription ✗ (Mollie additionally requires customerId besides
20
+ // subId; the plugin contract does not pass it through — the app builder
21
+ // cancels via the Mollie dashboard or a custom route)
22
22
  //
23
- // **Beispiel-Verwendung in run-config.ts:**
23
+ // **Example usage in run-config.ts:**
24
24
  //
25
25
  // const features = [
26
26
  // billingFoundationFeature,
@@ -64,8 +64,8 @@ export function createSubscriptionMollieFeature(options) {
64
64
  if (options.webhookUrl.length === 0) {
65
65
  throw new Error("subscription-mollie: webhookUrl is empty. Set the foundation-webhook-URL where Mollie sends events.");
66
66
  }
67
- // Drift-Guard: priceToTier + priceToConfig müssen identische Keys
68
- // haben — sonst silent-null-returns aus verifyAndParseWebhook.
67
+ // Drift guard: priceToTier and priceToConfig must have identical keys;
68
+ // otherwise verifyAndParseWebhook silently returns null.
69
69
  const tierKeys = new Set(Object.keys(options.priceToTier));
70
70
  const configKeys = new Set(Object.keys(options.priceToConfig));
71
71
  const missingInConfig = [...tierKeys].filter((k) => !configKeys.has(k));
@@ -76,9 +76,9 @@ export function createSubscriptionMollieFeature(options) {
76
76
  `priceIds in config but missing tier: [${missingInTier.join(", ")}]`);
77
77
  }
78
78
  const client = createMollieClient({ apiKey: options.apiKey });
79
- // Adapter um den Plugin's verify-fetch-client an den vollen Mollie-
80
- // Client zu binden. Plugin-fetch-API ist minimal damit Tests ohne
81
- // den vollen MollieClient mocken können.
79
+ // Adapter that binds the plugin's minimal fetch client to the full Mollie
80
+ // client. The minimal plugin fetch API lets tests mock it without mocking
81
+ // the full MollieClient.
82
82
  const fetchAdapter = options._clientShapeForTests ?? {
83
83
  payments: { get: (id) => client.payments.get(id) },
84
84
  customerSubscriptions: {
@@ -107,8 +107,8 @@ export function createSubscriptionMollieFeature(options) {
107
107
  const plugin = {
108
108
  verifyAndParseWebhook: verifyAndParse,
109
109
  createCheckoutSession: checkoutSession,
110
- // createPortalSession + cancelSubscription bewusst nicht — siehe
111
- // plugin-methods.ts für Begründung.
110
+ // createPortalSession and cancelSubscription are intentionally omitted;
111
+ // see plugin-methods.ts for why.
112
112
  priceToTier: options.priceToTier,
113
113
  };
114
114
  r.useExtension("subscriptionProvider", MOLLIE_PROVIDER_NAME, plugin);
@@ -1,8 +1,8 @@
1
1
  // Public API of the subscription-mollie bundled-feature.
2
2
  //
3
- // **Internal-only** (NICHT im public-barrel — App-Builder nutzt das nie direkt):
4
- // - verifyAndParseMollieWebhook (intern vom feature.ts factory aufgerufen)
3
+ // **Internal-only** (not in the public barrel—the App Builder never uses it directly):
4
+ // - verifyAndParseMollieWebhook (called internally by the feature.ts factory)
5
5
  // - mapMollieEventType / mapMollieStatus / extractMollieId (pure helpers,
6
- // test-only — direct-import aus dem File wenn echt mal extern gebraucht)
6
+ // test-only—direct-import from the file if ever genuinely needed externally)
7
7
  export { MOLLIE_PROVIDER_NAME, SUBSCRIPTION_MOLLIE_FEATURE } from "./constants.js";
8
8
  export { createSubscriptionMollieFeature, subscriptionMollieEnvSchema, } from "./feature.js";
@@ -2,8 +2,8 @@ import type { SubscriptionProviderPlugin } from "@cosmicdrift/kumiko-bundled-fea
2
2
  import type { HandlerContext } from "@cosmicdrift/kumiko-framework/engine";
3
3
  import type { MollieClient } from "@mollie/api-client";
4
4
  export type MollieCheckoutOptions = Parameters<NonNullable<SubscriptionProviderPlugin["createCheckoutSession"]>>[1];
5
- /** Mollie hat keinen nativen price-id-Konzept — App-Builder pflegt
6
- * pro virtuellem priceId einen amount/interval/description. */
5
+ /** Mollie has no native price ID concept; the App Builder maintains
6
+ * an amount/interval/description for each virtual priceId. */
7
7
  export type MolliePriceConfig = {
8
8
  /** Mollie-format: 2-decimal string, z.B. `"9.99"`. */
9
9
  readonly amountValue: string;
@@ -1,17 +1,18 @@
1
- // Mollie-Plugin-Methoden für die POST-tenant-resolution-Phase:
2
- // createCheckoutSession (only). createPortalSession + cancelSubscription
3
- // nicht implementiert weil Mollie's API die Patterns nicht 1:1 bietet:
1
+ // Mollie plugin methods for the POST-tenant-resolution phase:
2
+ // createCheckoutSession only. createPortalSession and cancelSubscription
3
+ // are not implemented because Mollie's API does not provide these patterns
4
+ // 1:1:
4
5
  //
5
- // - **Portal:** Mollie hat keinen Customer-Portal — App-Builder UI muss
6
- // das selbst rendern.
7
- // - **Cancel:** Mollie braucht (customerId, subId), Plugin-Contract
8
- // reicht aber nur subId durch — App-Builder cancelt via Mollie-
9
- // Dashboard oder eigener Route bis Foundation-Contract erweitert ist.
6
+ // - **Portal:** Mollie has no customer portal, so the App Builder UI must
7
+ // render it itself.
8
+ // - **Cancel:** Mollie requires (customerId, subId), but the plugin contract
9
+ // passes through only subId. The App Builder cancels through the Mollie
10
+ // dashboard or a custom route until the Foundation contract is extended.
10
11
  //
11
- // **Mollie-Checkout-Flow ist mehrstufig:** Customer anlegen → first-
12
- // payment mit sequenceType="first" (= Mandate-setup) → User bezahlt →
13
- // Mollie-webhook → verify-webhook erstellt die Mollie-Subscription
14
- // idempotent (siehe verify-webhook.ts ensureSubscriptionForMandate).
12
+ // **The Mollie checkout flow has multiple steps:** create customer → first
13
+ // payment with sequenceType="first" (= mandate setup) → user pays →
14
+ // Mollie webhook → verify-webhook creates the Mollie subscription
15
+ // idempotently (see verify-webhook.ts ensureSubscriptionForMandate).
15
16
  import { SequenceType } from "@mollie/api-client";
16
17
  export function createMollieCheckoutSession(client, priceToConfig, appWebhookUrl) {
17
18
  return async (_ctx, options) => {
@@ -36,8 +37,8 @@ export function createMollieCheckoutSession(client, priceToConfig, appWebhookUrl
36
37
  // sequenceType "first", so verifyAndParseMollieWebhook drops them before
37
38
  // any mandate/subscription handling.
38
39
  const sequenceType = options.mode === "payment" ? SequenceType.oneoff : SequenceType.first;
39
- // payments.create ist overloaded (Promise OR void mit callback);
40
- // explicit cast auf Promise<Payment>-overload.
40
+ // payments.create is overloaded (Promise or void with a callback);
41
+ // explicitly cast to the Promise<Payment> overload.
41
42
  const payment = (await client.payments.create({
42
43
  amount: { currency: priceCfg.amountCurrency, value: priceCfg.amountValue },
43
44
  description: priceCfg.description,
@@ -1,9 +1,9 @@
1
1
  import { type SubscriptionEvent, type SubscriptionEventType, type SubscriptionStatus } from "@cosmicdrift/kumiko-bundled-features/billing-foundation";
2
2
  import type { Payment as MolliePayment, Subscription as MollieSubscription } from "@mollie/api-client";
3
3
  import type { MolliePriceConfig } from "./plugin-methods.ts";
4
- /** Minimal-Subset des Mollie-Clients, das der Plugin nutzt — separat
5
- * damit Tests ohne den vollen MollieClient mocken können. Adapter in
6
- * feature.ts bridged das gegen den echten SDK. */
4
+ /** Minimal subset of the Mollie client used by the plugin — kept separate
5
+ * so tests can mock it without the full MollieClient. The adapter in
6
+ * feature.ts bridges it to the real SDK. */
7
7
  export type MollieClientShape = {
8
8
  readonly payments: {
9
9
  readonly get: (id: string) => Promise<MolliePayment>;
@@ -23,18 +23,18 @@ export type MollieClientShape = {
23
23
  };
24
24
  };
25
25
  export type MollieWebhookOptions = {
26
- /** priceId (= virtueller Schlüssel aus subscription.metadata) → tier-name. */
26
+ /** priceId (= virtual key from subscription.metadata) → tier name. */
27
27
  readonly priceToTier: Readonly<Record<string, string>>;
28
- /** priceId → amount/interval/description. Wird beim mandate-setup-
29
- * flow zum `customerSubscriptions.create`-Call gebraucht. App-
30
- * Builder pflegt die Map einmal in den factory-options. */
28
+ /** priceId → amount/interval/description. Needed for the mandate-setup
29
+ * flow's `customerSubscriptions.create` call. The app builder maintains
30
+ * this map once in the factory options. */
31
31
  readonly priceToConfig: Readonly<Record<string, MolliePriceConfig>>;
32
32
  };
33
33
  export declare function verifyAndParseMollieWebhook(client: MollieClientShape, options: MollieWebhookOptions): (rawBody: string, headers: Record<string, string>) => Promise<SubscriptionEvent | null>;
34
- /** Extract `id` aus rawBody — handelt form-urlencoded + JSON. */
34
+ /** Extracts `id` from rawBody — supports form-urlencoded and JSON. */
35
35
  export declare function extractMollieId(rawBody: string, headers: Record<string, string>): string | null;
36
- /** Mollie-subscription + optional payment → SubscriptionEventType.
37
- * Heuristik (Mollie hat keine explicit-typed events). */
36
+ /** Mollie subscription + optional payment → SubscriptionEventType.
37
+ * Heuristic because Mollie has no explicitly typed events. */
38
38
  export declare function mapMollieEventType(subscription: MollieSubscription, triggerPayment: MolliePayment | null): SubscriptionEventType | null;
39
39
  /** Mollie-status → normalized. */
40
40
  export declare function mapMollieStatus(mollieStatus: MollieSubscription["status"]): SubscriptionStatus;
@@ -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
  import { parseProviderConsentId, SubscriptionEventTypes, SubscriptionStatuses, } from "@cosmicdrift/kumiko-bundled-features/billing-foundation";
17
17
  import { createFallbackLogger } from "@cosmicdrift/kumiko-framework/logging";
18
18
  import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
@@ -53,7 +53,7 @@ export function verifyAndParseMollieWebhook(client, options) {
53
53
  return null;
54
54
  }
55
55
  else {
56
- // One-shot oder first-payment-failed → nicht unsere Domain.
56
+ // One-shot or first-payment-failed events are outside our domain.
57
57
  return null;
58
58
  }
59
59
  }
@@ -80,8 +80,8 @@ export function verifyAndParseMollieWebhook(client, options) {
80
80
  const status = mapMollieStatus(subscription.status);
81
81
  const periodEndSource = subscription.nextPaymentDate ?? subscription.startDate;
82
82
  if (!periodEndSource) {
83
- // Mollie-API-Drift: valid Subs haben mindestens startDate. Loud-
84
- // fail damit App-Owner's monitoring den drift sieht.
83
+ // Mollie API drift: valid subscriptions have at least startDate. Fail
84
+ // loudly so the app owner's monitoring can detect the drift.
85
85
  throw new Error(`subscription-mollie: subscription ${subscription.id} has neither nextPaymentDate nor startDate`);
86
86
  }
87
87
  const currentPeriodEnd = mollieDateStringToInstantIso(periodEndSource);
@@ -103,9 +103,9 @@ export function verifyAndParseMollieWebhook(client, options) {
103
103
  // =============================================================================
104
104
  // Mandate-setup: subscription on-the-fly erstellen
105
105
  // =============================================================================
106
- /** first-payment-paid OHNE subscriptionId → Mollie-Sub erstellen.
107
- * Idempotent via list-check (replay-safe). Returns null bei
108
- * unvollständiger metadata oder unbekanntem priceId. */
106
+ /** `first-payment-paid` without subscriptionId → create a Mollie subscription.
107
+ * Idempotent via a list check (replay-safe). Returns null for incomplete
108
+ * metadata or an unknown priceId. */
109
109
  async function ensureSubscriptionForMandate(client, options, payment) {
110
110
  const customerId = payment.customerId;
111
111
  if (!customerId)
@@ -136,9 +136,9 @@ async function ensureSubscriptionForMandate(client, options, payment) {
136
136
  });
137
137
  }
138
138
  // =============================================================================
139
- // Helpers (exported für Tests)
139
+ // Helpers (exported for tests)
140
140
  // =============================================================================
141
- /** Extract `id` aus rawBody — handelt form-urlencoded + JSON. */
141
+ /** Extracts `id` from rawBody — supports form-urlencoded and JSON. */
142
142
  export function extractMollieId(rawBody, headers) {
143
143
  const contentType = headers["content-type"] ?? "";
144
144
  if (contentType.includes("application/json")) {
@@ -156,8 +156,8 @@ export function extractMollieId(rawBody, headers) {
156
156
  const params = new URLSearchParams(rawBody);
157
157
  return params.get("id");
158
158
  }
159
- /** Mollie-subscription + optional payment → SubscriptionEventType.
160
- * Heuristik (Mollie hat keine explicit-typed events). */
159
+ /** Mollie subscription + optional payment → SubscriptionEventType.
160
+ * Heuristic because Mollie has no explicitly typed events. */
161
161
  export function mapMollieEventType(subscription, triggerPayment) {
162
162
  if (subscription.status === "canceled" || subscription.status === "completed") {
163
163
  return SubscriptionEventTypes.canceled;
@@ -184,10 +184,10 @@ export function mapMollieStatus(mollieStatus) {
184
184
  return SubscriptionStatuses.active;
185
185
  case "canceled":
186
186
  case "completed":
187
- // completed = alle `times`-charges durchgelaufen → wie canceled.
187
+ // completed = all `times` charges have run → treat it like canceled.
188
188
  return SubscriptionStatuses.canceled;
189
189
  case "suspended":
190
- // Mandate ungültig / payment-method failed → grace-period.
190
+ // Invalid mandate / payment method failed → grace period.
191
191
  return SubscriptionStatuses.pastDue;
192
192
  case "pending":
193
193
  return SubscriptionStatuses.incomplete;
@@ -195,8 +195,8 @@ export function mapMollieStatus(mollieStatus) {
195
195
  return SubscriptionStatuses.incomplete;
196
196
  }
197
197
  }
198
- /** Mollie liefert dates als YYYY-MM-DD; foundation will ISO-Instant.
199
- * Throws bei malformed input (= Mollie-API-Drift, soll loud-fail). */
198
+ /** Mollie provides dates as YYYY-MM-DD; Foundation requires an ISO Instant.
199
+ * Throws on malformed input (= Mollie API drift, which should fail loudly). */
200
200
  function mollieDateStringToInstantIso(dateString) {
201
201
  return Temporal.Instant.from(`${dateString.slice(0, 10)}T00:00:00Z`).toString();
202
202
  }
@@ -1,7 +1,7 @@
1
1
  // Feature name
2
2
  export const SUBSCRIPTION_STRIPE_FEATURE = "subscription-stripe";
3
- // entityName under den der Plugin gegen "subscriptionProvider"
4
- // registriert. Matcht den path-segment in der webhook-URL
3
+ // entityName under which the plugin registers itself as
4
+ // "subscriptionProvider". It must match the path segment in the webhook URL
5
5
  // `/api/subscription/webhook/stripe`.
6
6
  export const STRIPE_PROVIDER_NAME = "stripe";
7
7
  // Config-key short-names, qualified to `subscription-stripe:config:<name>`
@@ -11,10 +11,8 @@ export const STRIPE_PROVIDER_NAME = "stripe";
11
11
  export const STRIPE_API_KEY_CONFIG = "api-key";
12
12
  export const STRIPE_WEBHOOK_SECRET_CONFIG = "webhook-secret";
13
13
  export const STRIPE_BILLING_LIVE_CONFIG = "billingLive";
14
- // =============================================================================
15
- // Stripe-event-types die wir auf normalisierte SubscriptionEventTypes
16
- // mappen. Stripe hat ~80 event-types insgesamt; wir filtern auf 5.
17
- // =============================================================================
14
+ // Stripe event types that map to normalized SubscriptionEventTypes.
15
+ // Stripe has approximately 80 event types; we filter to five.
18
16
  export const StripeEventTypes = {
19
17
  customerSubscriptionCreated: "customer.subscription.created",
20
18
  customerSubscriptionUpdated: "customer.subscription.updated",
@@ -28,17 +28,17 @@ export declare function stripeEnvSchema<const TPrice extends string>(options: {
28
28
  STRIPE_API_KEY: z.ZodOptional<z.ZodString>;
29
29
  } & StripePriceEnvShape<TPrice> extends infer T ? { -readonly [P in keyof T]: T[P]; } : never, z.core.$strip>;
30
30
  export type SubscriptionStripeOptions = {
31
- /** Bridge-fallback webhook-secret. Optional: v2 liest aus dem
32
- * `subscription-stripe:config:webhook-secret`-Key (backing:"secrets").
33
- * Gesetzt nur während der env→secrets-Übergangsphase / in Tests. */
31
+ /** Bridge-fallback webhook secret. Optional: v2 reads from the
32
+ * `subscription-stripe:config:webhook-secret` key (backing:"secrets").
33
+ * Set only during the env→secrets transition phase / in tests. */
34
34
  readonly webhookSecret?: string;
35
- /** Bridge-fallback api-key. Optional: v2 liest aus dem
36
- * `subscription-stripe:config:api-key`-Key (backing:"secrets"). */
35
+ /** Bridge-fallback API key. Optional: v2 reads from the
36
+ * `subscription-stripe:config:api-key` key (backing:"secrets"). */
37
37
  readonly apiKey?: string;
38
- /** Price-to-tier-Mapping. Plugin liest die price-id aus dem Stripe-event
39
- * (subscription.items.data[0].price.id) und mappt auf einen tier-name.
40
- * App-spezifisch → bleibt factory-option. Fehlt die price-id im Mapping
41
- * → null (event ignored). */
38
+ /** Price-to-tier mapping. The plugin reads the price ID from the Stripe
39
+ * event (subscription.items.data[0].price.id) and maps it to a tier name.
40
+ * App-specific, so it remains a factory option. If the price ID is absent
41
+ * from the mapping → null (event ignored). */
42
42
  readonly priceToTier?: Readonly<Record<string, string>>;
43
43
  /** Whether a mode:"payment" checkout (one-off top-ups etc.) gets a Stripe
44
44
  * invoice — a receipt/invoice document Stripe generates and sends to the
@@ -56,11 +56,11 @@ export type SubscriptionStripeOptions = {
56
56
  readonly oneOffPriceIds?: readonly string[];
57
57
  };
58
58
  /**
59
- * Factory für das subscription-stripe-feature. Mountet IMMER (kein
60
- * key-presence-Guard mehr) — die Aktivität wird runtime über config/secrets
61
- * gegatet (Muster wie feature-toggles). Der returnte FeatureDefinition
62
- * registriert den Plugin gegen billing-foundation's "subscriptionProvider"-
63
- * extension unter entityName "stripe".
59
+ * Factory for the subscription-stripe feature. Always mounts (no
60
+ * key-presence guard) — activity is gated at runtime through config/secrets
61
+ * (following the feature-toggles pattern). The returned FeatureDefinition
62
+ * registers the plugin under billing-foundation's "subscriptionProvider"
63
+ * extension with entityName "stripe".
64
64
  */
65
65
  export declare function createSubscriptionStripeFeature(options?: SubscriptionStripeOptions): FeatureWithEnvSchema<FeatureDefinition, typeof subscriptionStripeEnvSchema.shape>;
66
66
  export {};