@cosmicdrift/kumiko-bundled-features 0.362.0 → 0.364.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 (468) hide show
  1. package/dist/admin-shell/feature.d.ts +3 -0
  2. package/dist/admin-shell/feature.js +6 -1
  3. package/dist/agent-tools/agent-manifest.js +2 -1
  4. package/dist/agent-tools/filter-ops.d.ts +1 -1
  5. package/dist/agent-tools/filter-ops.js +1 -3
  6. package/dist/agent-tools/tool-dispatch.js +2 -1
  7. package/dist/audit/handlers/list.query.js +9 -5
  8. package/dist/auth-email-password/bootstrap.d.ts +8 -5
  9. package/dist/auth-email-password/bootstrap.js +12 -4
  10. package/dist/auth-email-password/email-rate-limits.d.ts +4 -0
  11. package/dist/auth-email-password/email-rate-limits.js +13 -0
  12. package/dist/auth-email-password/email-templates.d.ts +4 -26
  13. package/dist/auth-email-password/email-templates.js +9 -101
  14. package/dist/auth-email-password/feature.js +24 -6
  15. package/dist/auth-email-password/handlers/change-password.write.d.ts +1 -1
  16. package/dist/auth-email-password/handlers/change-password.write.js +6 -2
  17. package/dist/auth-email-password/handlers/confirm-account-unlock.write.d.ts +1 -1
  18. package/dist/auth-email-password/handlers/invite-accept-with-login.write.d.ts +1 -1
  19. package/dist/auth-email-password/handlers/invite-accept.write.d.ts +1 -1
  20. package/dist/auth-email-password/handlers/invite-create.write.d.ts +2 -2
  21. package/dist/auth-email-password/handlers/invite-create.write.js +4 -4
  22. package/dist/auth-email-password/handlers/invite-signup-complete.write.d.ts +1 -1
  23. package/dist/auth-email-password/handlers/login.write.d.ts +1 -1
  24. package/dist/auth-email-password/handlers/logout.write.d.ts +1 -1
  25. package/dist/auth-email-password/handlers/logout.write.js +6 -2
  26. package/dist/auth-email-password/handlers/request-account-unlock.write.d.ts +1 -1
  27. package/dist/auth-email-password/handlers/request-account-unlock.write.js +2 -4
  28. package/dist/auth-email-password/handlers/request-email-verification.write.d.ts +1 -1
  29. package/dist/auth-email-password/handlers/request-email-verification.write.js +2 -4
  30. package/dist/auth-email-password/handlers/request-password-reset.write.d.ts +1 -1
  31. package/dist/auth-email-password/handlers/request-password-reset.write.js +2 -4
  32. package/dist/auth-email-password/handlers/reset-password.write.d.ts +1 -1
  33. package/dist/auth-email-password/handlers/signup-confirm.write.d.ts +1 -1
  34. package/dist/auth-email-password/handlers/signup-confirm.write.js +3 -4
  35. package/dist/auth-email-password/handlers/signup-request.write.d.ts +1 -1
  36. package/dist/auth-email-password/handlers/signup-request.write.js +2 -1
  37. package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.d.ts +1 -1
  38. package/dist/auth-email-password/handlers/token-request-handler.d.ts +2 -3
  39. package/dist/auth-email-password/handlers/token-request-handler.js +2 -2
  40. package/dist/auth-email-password/handlers/verify-email.write.d.ts +1 -1
  41. package/dist/auth-email-password/index.d.ts +2 -2
  42. package/dist/auth-email-password/index.js +1 -1
  43. package/dist/auth-email-password/magic-link-mail.d.ts +3 -2
  44. package/dist/auth-email-password/magic-link-mail.js +19 -14
  45. package/dist/auth-email-password/mail-notifications.d.ts +32 -0
  46. package/dist/auth-email-password/mail-notifications.js +116 -0
  47. package/dist/auth-email-password/signup-activation.d.ts +1 -1
  48. package/dist/auth-email-password/signup-activation.js +2 -3
  49. package/dist/auth-email-password/web/auth-gate.js +16 -4
  50. package/dist/auth-foundation/types.js +2 -8
  51. package/dist/auth-mfa/feature.js +4 -4
  52. package/dist/auth-mfa/handlers/disable.write.d.ts +1 -1
  53. package/dist/auth-mfa/handlers/enable-confirm-preauth.write.d.ts +1 -1
  54. package/dist/auth-mfa/handlers/enable-confirm.write.d.ts +1 -1
  55. package/dist/auth-mfa/handlers/enable-start-preauth.write.d.ts +1 -1
  56. package/dist/auth-mfa/handlers/enable-start.write.d.ts +1 -1
  57. package/dist/auth-mfa/handlers/regenerate-recovery.write.d.ts +1 -1
  58. package/dist/auth-mfa/handlers/verify.write.d.ts +1 -1
  59. package/dist/auth-mfa/hmac-token-codec.js +4 -4
  60. package/dist/auth-mfa/mfa-challenge-token.js +3 -3
  61. package/dist/auth-mfa/mfa-preauth-setup-token.js +3 -3
  62. package/dist/auth-mfa/mfa-setup-token.js +8 -8
  63. package/dist/billing-foundation/constants.d.ts +3 -3
  64. package/dist/billing-foundation/constants.js +5 -4
  65. package/dist/billing-foundation/consumer-protection/confirmation-mail.d.ts +32 -14
  66. package/dist/billing-foundation/consumer-protection/confirmation-mail.js +74 -32
  67. package/dist/billing-foundation/consumer-protection/consent-gate.d.ts +3 -0
  68. package/dist/billing-foundation/consumer-protection/consent-gate.js +21 -2
  69. package/dist/billing-foundation/consumer-protection/issue-confirmation.js +3 -3
  70. package/dist/billing-foundation/consumer-protection/mail-notifications.d.ts +8 -0
  71. package/dist/billing-foundation/consumer-protection/mail-notifications.js +95 -0
  72. package/dist/billing-foundation/consumer-protection/register-consent.js +2 -0
  73. package/dist/billing-foundation/consumer-protection/register-termination.js +11 -1
  74. package/dist/billing-foundation/consumer-protection/termination-mail.d.ts +25 -13
  75. package/dist/billing-foundation/consumer-protection/termination-mail.js +11 -23
  76. package/dist/billing-foundation/consumer-protection/termination-notify.js +2 -2
  77. package/dist/billing-foundation/consumer-protection/termination-pages.js +1 -3
  78. package/dist/billing-foundation/consumer-protection/termination-receipt-limit.d.ts +6 -0
  79. package/dist/billing-foundation/consumer-protection/termination-receipt-limit.js +34 -0
  80. package/dist/billing-foundation/consumer-protection/termination-record.d.ts +2 -0
  81. package/dist/billing-foundation/consumer-protection/termination-record.js +7 -1
  82. package/dist/billing-foundation/consumer-protection/termination-request.js +31 -21
  83. package/dist/billing-foundation/consumer-protection/termination-texts.d.ts +1 -1
  84. package/dist/billing-foundation/consumer-protection/termination-texts.js +6 -0
  85. package/dist/billing-foundation/consumer-protection/withdrawal-period.d.ts +10 -0
  86. package/dist/billing-foundation/consumer-protection/withdrawal-period.js +26 -0
  87. package/dist/billing-foundation/handlers/create-checkout-session.write.js +11 -5
  88. package/dist/billing-foundation/handlers/process-event.write.js +12 -8
  89. package/dist/billing-foundation/handlers/process-payment-event.write.js +1 -1
  90. package/dist/billing-foundation/i18n.js +3 -0
  91. package/dist/billing-foundation/subscription-tier-sync.d.ts +7 -1
  92. package/dist/billing-foundation/subscription-tier-sync.js +16 -9
  93. package/dist/billing-foundation/types.d.ts +7 -2
  94. package/dist/cap-counter/calendar-cap-usage-reservation.js +2 -0
  95. package/dist/cap-counter/enforce-cap.d.ts +18 -1
  96. package/dist/cap-counter/enforce-cap.js +49 -6
  97. package/dist/cap-counter/index.d.ts +1 -1
  98. package/dist/cap-counter/index.js +1 -1
  99. package/dist/cap-counter/with-cap-enforcement.d.ts +2 -0
  100. package/dist/cap-overview/handlers/tenant-caps-list.query.js +2 -1
  101. package/dist/cap-overview/web/cap-usage-cell.js +5 -4
  102. package/dist/channel-email/email-channel.d.ts +2 -2
  103. package/dist/channel-email/email-channel.js +101 -26
  104. package/dist/channel-email/feature.js +3 -3
  105. package/dist/channel-email/index.d.ts +1 -1
  106. package/dist/channel-email/index.js +1 -1
  107. package/dist/channel-email/pii-guard.js +10 -0
  108. package/dist/channel-email/smtp-transport.js +13 -0
  109. package/dist/channel-email/types.d.ts +8 -0
  110. package/dist/channel-in-app/handlers/mark-all-read.write.d.ts +1 -1
  111. package/dist/channel-in-app/handlers/mark-read.write.d.ts +1 -1
  112. package/dist/compliance-profiles/handlers/set-profile.write.d.ts +1 -1
  113. package/dist/config/handlers/reset.write.d.ts +1 -1
  114. package/dist/config/handlers/set.write.d.ts +1 -1
  115. package/dist/config/handlers/set.write.js +3 -4
  116. package/dist/config/resolver.d.ts +1 -0
  117. package/dist/config/resolver.js +11 -14
  118. package/dist/config/write-helpers.d.ts +2 -0
  119. package/dist/config/write-helpers.js +19 -0
  120. package/dist/crypto-shredding/handlers/forget-subject.write.d.ts +1 -1
  121. package/dist/crypto-shredding/handlers/forget-subject.write.js +29 -19
  122. package/dist/custom-fields/handlers/update-tenant-field.write.js +0 -1
  123. package/dist/custom-fields/lib/value-schema.js +10 -11
  124. package/dist/custom-fields/wire-user-data-rights.js +7 -6
  125. package/dist/data-retention/index.d.ts +1 -0
  126. package/dist/data-retention/index.js +1 -0
  127. package/dist/data-retention/run-retention-cleanup.js +6 -6
  128. package/dist/delivery/attachment-ref.d.ts +41 -0
  129. package/dist/delivery/attachment-ref.js +78 -0
  130. package/dist/delivery/channel-context.d.ts +8 -4
  131. package/dist/delivery/channel-context.js +94 -2
  132. package/dist/delivery/constants.d.ts +1 -0
  133. package/dist/delivery/constants.js +1 -0
  134. package/dist/delivery/delivery-service.d.ts +4 -1
  135. package/dist/delivery/delivery-service.js +38 -32
  136. package/dist/delivery/feature.js +1 -1
  137. package/dist/delivery/handlers/resubscribe-address.write.d.ts +1 -1
  138. package/dist/delivery/handlers/resubscribe-user.write.d.ts +1 -1
  139. package/dist/delivery/handlers/set-preference.write.d.ts +1 -1
  140. package/dist/delivery/handlers/unsubscribe-address.write.d.ts +1 -1
  141. package/dist/delivery/handlers/unsubscribe-user.write.d.ts +1 -1
  142. package/dist/delivery/index.d.ts +5 -2
  143. package/dist/delivery/index.js +4 -1
  144. package/dist/delivery/jobs.js +66 -14
  145. package/dist/delivery/notify-factory.js +4 -1
  146. package/dist/delivery/testing.d.ts +4 -1
  147. package/dist/delivery/types.d.ts +26 -14
  148. package/dist/delivery/unsubscribe.js +4 -1
  149. package/dist/derivatives-sharp/render.js +1 -18
  150. package/dist/document-ingest-foundation/pages.js +4 -4
  151. package/dist/feature-toggles/handlers/set.write.d.ts +1 -1
  152. package/dist/feature-toggles/toggle-sync-signal.js +4 -4
  153. package/dist/file-derivatives/handlers/public-variant.query.js +1 -1
  154. package/dist/file-foundation/index.d.ts +1 -0
  155. package/dist/file-foundation/index.js +1 -0
  156. package/dist/file-foundation/read-file-ref-content.d.ts +27 -0
  157. package/dist/file-foundation/read-file-ref-content.js +51 -0
  158. package/dist/files-tenant-data/hooks.js +4 -0
  159. package/dist/folders/web/folder-manager.js +3 -2
  160. package/dist/form-draft/db/queries/cleanup.js +4 -4
  161. package/dist/form-draft/db/queries/draft-count.js +2 -2
  162. package/dist/form-draft/db/queries/owned-file-refs.js +2 -2
  163. package/dist/form-draft/handlers/discard.write.d.ts +1 -1
  164. package/dist/form-draft/handlers/save.write.d.ts +1 -1
  165. package/dist/form-draft/release-file-refs.js +3 -2
  166. package/dist/inbound-mail-foundation/handlers/connect-account.write.js +1 -1
  167. package/dist/inbound-mail-foundation/handlers/ingest-message.write.js +6 -6
  168. package/dist/inbound-mail-foundation/handlers/scope-visibility.d.ts +1 -1
  169. package/dist/inbound-mail-foundation/oauth-access-token.js +8 -3
  170. package/dist/inbound-mail-foundation/oauth-state.js +7 -7
  171. package/dist/inbound-mail-foundation/types.js +4 -4
  172. package/dist/inbound-mail-foundation/watch-supervisor.js +24 -13
  173. package/dist/inbound-provider-imap/imap-client.js +4 -3
  174. package/dist/jobs/db/queries/stale-run-sweep.d.ts +1 -1
  175. package/dist/jobs/db/queries/stale-run-sweep.js +12 -5
  176. package/dist/jobs/feature.js +5 -3
  177. package/dist/jobs/handlers/list.query.js +3 -1
  178. package/dist/jobs/handlers/retry.write.d.ts +1 -1
  179. package/dist/jobs/handlers/stale-run-sweep.job.d.ts +1 -1
  180. package/dist/jobs/handlers/stale-run-sweep.job.js +2 -2
  181. package/dist/jobs/handlers/trigger.write.d.ts +1 -1
  182. package/dist/jobs/job-run-logger.js +32 -10
  183. package/dist/jobs/tenant-job-run-table.js +3 -2
  184. package/dist/ledger/entity.js +3 -1
  185. package/dist/ledger/recurring.js +1 -3
  186. package/dist/managed-pages/branding.d.ts +2 -0
  187. package/dist/managed-pages/branding.js +24 -2
  188. package/dist/managed-pages/feature.js +1 -0
  189. package/dist/managed-pages/handlers/set.write.d.ts +1 -1
  190. package/dist/managed-pages/i18n.js +1 -0
  191. package/dist/managed-pages/screens/branding-screen.js +8 -1
  192. package/dist/page-render/branding.d.ts +1 -0
  193. package/dist/page-render/branding.js +1 -0
  194. package/dist/page-render/markdown.js +1 -1
  195. package/dist/personal-access-tokens/feature.js +1 -1
  196. package/dist/personal-access-tokens/handlers/create.write.d.ts +1 -1
  197. package/dist/personal-access-tokens/handlers/list.query.js +2 -1
  198. package/dist/personal-access-tokens/handlers/revoke.write.d.ts +1 -1
  199. package/dist/personal-access-tokens/revoke-for-user.js +2 -1
  200. package/dist/renderer-foundation/api.d.ts +13 -13
  201. package/dist/renderer-foundation/api.js +1 -1
  202. package/dist/renderer-foundation/constants.js +2 -4
  203. package/dist/renderer-foundation/feature.js +7 -7
  204. package/dist/renderer-foundation/index.d.ts +2 -1
  205. package/dist/renderer-foundation/index.js +1 -0
  206. package/dist/renderer-foundation/types.d.ts +94 -32
  207. package/dist/renderer-pdf/feature.js +7 -1
  208. package/dist/renderer-pdf/render-table-pdf.d.ts +27 -33
  209. package/dist/renderer-pdf/render-table-pdf.js +95 -34
  210. package/dist/secrets/feature.js +4 -3
  211. package/dist/secrets/handlers/delete.write.d.ts +1 -1
  212. package/dist/secrets/handlers/set.write.d.ts +1 -1
  213. package/dist/secrets/secrets-context.js +15 -3
  214. package/dist/sessions/db/queries/cleanup.js +2 -2
  215. package/dist/sessions/feature.js +1 -1
  216. package/dist/sessions/handlers/list.query.js +2 -1
  217. package/dist/sessions/handlers/revoke-all-for-user.write.d.ts +1 -1
  218. package/dist/sessions/handlers/revoke-all-others.write.d.ts +1 -1
  219. package/dist/sessions/handlers/revoke.write.d.ts +1 -1
  220. package/dist/shared/attachment-file-name.d.ts +3 -0
  221. package/dist/shared/attachment-file-name.js +35 -0
  222. package/dist/shared/chunked-entity-migration.d.ts +1 -0
  223. package/dist/shared/chunked-entity-migration.js +1 -1
  224. package/dist/shared/index.d.ts +3 -0
  225. package/dist/shared/index.js +3 -0
  226. package/dist/shared/is-tenant-db.js +1 -1
  227. package/dist/shared/mail-template-body.d.ts +7 -0
  228. package/dist/shared/mail-template-body.js +27 -0
  229. package/dist/shared/sharp-input-limits.d.ts +6 -0
  230. package/dist/shared/sharp-input-limits.js +22 -0
  231. package/dist/shared/signup-handover.js +2 -2
  232. package/dist/subscription-stripe/plugin-methods.js +18 -8
  233. package/dist/subscription-stripe/verify-webhook.d.ts +1 -1
  234. package/dist/tags/handlers/assign-tag.write.js +3 -1
  235. package/dist/tags/web/tag-chip.js +2 -0
  236. package/dist/template-resolver/api.d.ts +30 -2
  237. package/dist/template-resolver/api.js +42 -6
  238. package/dist/template-resolver/compile-document-body.d.ts +12 -0
  239. package/dist/template-resolver/compile-document-body.js +205 -0
  240. package/dist/template-resolver/constants.d.ts +13 -4
  241. package/dist/template-resolver/constants.js +32 -10
  242. package/dist/template-resolver/document-sanitizer.d.ts +32 -0
  243. package/dist/template-resolver/document-sanitizer.js +201 -0
  244. package/dist/template-resolver/document-schema.d.ts +21 -0
  245. package/dist/template-resolver/document-schema.js +316 -0
  246. package/dist/template-resolver/feature.d.ts +20 -0
  247. package/dist/template-resolver/feature.js +53 -6
  248. package/dist/template-resolver/handlers/bundle-import.d.ts +20 -0
  249. package/dist/template-resolver/handlers/bundle-import.js +147 -0
  250. package/dist/template-resolver/handlers/collection-set.write.d.ts +1 -1
  251. package/dist/template-resolver/handlers/collection-set.write.js +25 -2
  252. package/dist/template-resolver/handlers/copy-locale.write.d.ts +19 -0
  253. package/dist/template-resolver/handlers/copy-locale.write.js +134 -0
  254. package/dist/template-resolver/handlers/diff-to-system.query.d.ts +22 -0
  255. package/dist/template-resolver/handlers/diff-to-system.query.js +30 -0
  256. package/dist/template-resolver/handlers/discard-draft.write.d.ts +13 -0
  257. package/dist/template-resolver/handlers/discard-draft.write.js +37 -0
  258. package/dist/template-resolver/handlers/export-bundle.query.d.ts +35 -0
  259. package/dist/template-resolver/handlers/export-bundle.query.js +118 -0
  260. package/dist/template-resolver/handlers/find-by-id.query.d.ts +2 -0
  261. package/dist/template-resolver/handlers/find-by-id.query.js +9 -6
  262. package/dist/template-resolver/handlers/import-bundle-system.write.d.ts +39 -0
  263. package/dist/template-resolver/handlers/import-bundle-system.write.js +36 -0
  264. package/dist/template-resolver/handlers/import-bundle.write.d.ts +40 -0
  265. package/dist/template-resolver/handlers/import-bundle.write.js +19 -0
  266. package/dist/template-resolver/handlers/layout-source.query.d.ts +31 -0
  267. package/dist/template-resolver/handlers/layout-source.query.js +87 -0
  268. package/dist/template-resolver/handlers/list.query.d.ts +4 -1
  269. package/dist/template-resolver/handlers/list.query.js +9 -8
  270. package/dist/template-resolver/handlers/override-diff.d.ts +20 -0
  271. package/dist/template-resolver/handlers/override-diff.js +41 -0
  272. package/dist/template-resolver/handlers/overview.query.d.ts +65 -0
  273. package/dist/template-resolver/handlers/overview.query.js +205 -0
  274. package/dist/template-resolver/handlers/preview.query.d.ts +12 -0
  275. package/dist/template-resolver/handlers/preview.query.js +24 -0
  276. package/dist/template-resolver/handlers/reset-to-system.write.d.ts +8 -0
  277. package/dist/template-resolver/handlers/reset-to-system.write.js +50 -0
  278. package/dist/template-resolver/handlers/resource-link-pdf.write.d.ts +8 -0
  279. package/dist/template-resolver/handlers/resource-link-pdf.write.js +32 -0
  280. package/dist/template-resolver/handlers/resource-remove.write.d.ts +9 -0
  281. package/dist/template-resolver/handlers/resource-remove.write.js +44 -0
  282. package/dist/template-resolver/handlers/resource-shared.d.ts +9 -0
  283. package/dist/template-resolver/handlers/resource-shared.js +14 -0
  284. package/dist/template-resolver/handlers/resource-upload.write.d.ts +13 -0
  285. package/dist/template-resolver/handlers/resource-upload.write.js +98 -0
  286. package/dist/template-resolver/handlers/send-test.write.d.ts +13 -0
  287. package/dist/template-resolver/handlers/send-test.write.js +108 -0
  288. package/dist/template-resolver/handlers/set.write.d.ts +5 -2
  289. package/dist/template-resolver/handlers/set.write.js +25 -3
  290. package/dist/template-resolver/handlers/shared.d.ts +9 -5
  291. package/dist/template-resolver/handlers/shared.js +6 -2
  292. package/dist/template-resolver/handlers/template-gates.d.ts +36 -0
  293. package/dist/template-resolver/handlers/template-gates.js +142 -0
  294. package/dist/template-resolver/handlers/template-write.d.ts +45 -0
  295. package/dist/template-resolver/handlers/template-write.js +141 -0
  296. package/dist/template-resolver/handlers/tenant-overrides.query.d.ts +49 -0
  297. package/dist/template-resolver/handlers/tenant-overrides.query.js +112 -0
  298. package/dist/template-resolver/handlers/toggle-status.write.d.ts +27 -2
  299. package/dist/template-resolver/handlers/toggle-status.write.js +47 -15
  300. package/dist/template-resolver/handlers/upsert-system.write.d.ts +5 -8
  301. package/dist/template-resolver/handlers/upsert-system.write.js +14 -59
  302. package/dist/template-resolver/handlers/upsert-tenant.write.d.ts +5 -8
  303. package/dist/template-resolver/handlers/upsert-tenant.write.js +11 -62
  304. package/dist/template-resolver/handlers/usage.query.d.ts +17 -0
  305. package/dist/template-resolver/handlers/usage.query.js +24 -0
  306. package/dist/template-resolver/handlers/validate.query.d.ts +74 -0
  307. package/dist/template-resolver/handlers/validate.query.js +80 -0
  308. package/dist/template-resolver/index.d.ts +19 -1
  309. package/dist/template-resolver/index.js +17 -1
  310. package/dist/template-resolver/layout-appearance.d.ts +10 -0
  311. package/dist/template-resolver/layout-appearance.js +26 -0
  312. package/dist/template-resolver/layout-regions.d.ts +23 -0
  313. package/dist/template-resolver/layout-regions.js +125 -0
  314. package/dist/template-resolver/linked-resources.d.ts +17 -0
  315. package/dist/template-resolver/linked-resources.js +75 -0
  316. package/dist/template-resolver/pdf-constants.d.ts +7 -0
  317. package/dist/template-resolver/pdf-constants.js +8 -0
  318. package/dist/template-resolver/preview-display-html.d.ts +7 -0
  319. package/dist/template-resolver/preview-display-html.js +27 -0
  320. package/dist/template-resolver/print-document.d.ts +1 -0
  321. package/dist/template-resolver/print-document.js +55 -0
  322. package/dist/template-resolver/qualified-names.d.ts +34 -0
  323. package/dist/template-resolver/qualified-names.js +34 -0
  324. package/dist/template-resolver/record-mapping.d.ts +2 -0
  325. package/dist/template-resolver/record-mapping.js +21 -0
  326. package/dist/template-resolver/resource-image.d.ts +15 -0
  327. package/dist/template-resolver/resource-image.js +34 -0
  328. package/dist/template-resolver/seeding.d.ts +14 -1
  329. package/dist/template-resolver/seeding.js +125 -18
  330. package/dist/template-resolver/store-template-resource.d.ts +64 -0
  331. package/dist/template-resolver/store-template-resource.js +264 -0
  332. package/dist/template-resolver/table.d.ts +150 -8
  333. package/dist/template-resolver/table.js +20 -2
  334. package/dist/template-resolver/template-bundle.d.ts +36 -0
  335. package/dist/template-resolver/template-bundle.js +60 -0
  336. package/dist/template-resolver/template-diff.d.ts +7 -0
  337. package/dist/template-resolver/template-diff.js +68 -0
  338. package/dist/template-resolver/template-draft.d.ts +51 -0
  339. package/dist/template-resolver/template-draft.js +72 -0
  340. package/dist/template-resolver/template-meta.d.ts +85 -0
  341. package/dist/template-resolver/template-meta.js +145 -0
  342. package/dist/template-resolver/template-preview.d.ts +103 -0
  343. package/dist/template-resolver/template-preview.js +418 -0
  344. package/dist/template-resolver/template-resources.d.ts +19 -0
  345. package/dist/template-resolver/template-resources.js +73 -0
  346. package/dist/template-resolver/template-usage.d.ts +16 -0
  347. package/dist/template-resolver/template-usage.js +35 -0
  348. package/dist/template-resolver/template-validation.d.ts +22 -0
  349. package/dist/template-resolver/template-validation.js +173 -0
  350. package/dist/template-resolver/testing.js +5 -5
  351. package/dist/template-resolver/user-content-table.d.ts +14 -8
  352. package/dist/template-resolver/web/client-plugin.d.ts +1 -0
  353. package/dist/template-resolver/web/client-plugin.js +12 -7
  354. package/dist/template-resolver/web/document-editor-extensions.d.ts +18 -0
  355. package/dist/template-resolver/web/document-editor-extensions.js +145 -0
  356. package/dist/template-resolver/web/document-editor.d.ts +4 -0
  357. package/dist/template-resolver/web/document-editor.js +17 -0
  358. package/dist/template-resolver/web/document-tiptap-editor.d.ts +3 -0
  359. package/dist/template-resolver/web/document-tiptap-editor.js +492 -0
  360. package/dist/template-resolver/web/document-toolbar-blocks.d.ts +41 -0
  361. package/dist/template-resolver/web/document-toolbar-blocks.js +19 -0
  362. package/dist/template-resolver/web/editor-handle.d.ts +3 -0
  363. package/dist/template-resolver/web/editor-handle.js +24 -0
  364. package/dist/template-resolver/web/i18n.js +91 -0
  365. package/dist/template-resolver/web/index.d.ts +5 -0
  366. package/dist/template-resolver/web/index.js +5 -0
  367. package/dist/template-resolver/web/placeholder-line-editor-lazy.d.ts +4 -0
  368. package/dist/template-resolver/web/placeholder-line-editor-lazy.js +16 -0
  369. package/dist/template-resolver/web/placeholder-line-editor.d.ts +17 -0
  370. package/dist/template-resolver/web/placeholder-line-editor.js +94 -0
  371. package/dist/template-resolver/web/placeholder-text.d.ts +4 -0
  372. package/dist/template-resolver/web/placeholder-text.js +34 -0
  373. package/dist/template-resolver/web/use-stable-by-key.d.ts +1 -0
  374. package/dist/template-resolver/web/use-stable-by-key.js +13 -0
  375. package/dist/tenant/handlers/add-member.write.d.ts +1 -1
  376. package/dist/tenant/handlers/cancel-invitation.write.d.ts +1 -1
  377. package/dist/tenant/handlers/create.write.d.ts +1 -1
  378. package/dist/tenant/handlers/remove-member.write.d.ts +1 -1
  379. package/dist/tenant/handlers/team-list.query.js +3 -2
  380. package/dist/tenant/handlers/toggle-enabled.write.d.ts +2 -2
  381. package/dist/tenant/handlers/update-member-roles.write.d.ts +1 -1
  382. package/dist/tenant/handlers/update.write.d.ts +1 -1
  383. package/dist/tenant/seeding.js +31 -6
  384. package/dist/tenant-handover/handlers/claim.write.d.ts +1 -1
  385. package/dist/tenant-lifecycle/handlers/cancel-destruction.write.d.ts +2 -2
  386. package/dist/tenant-lifecycle/handlers/cancel-destruction.write.js +2 -1
  387. package/dist/tenant-lifecycle/handlers/request-destruction.write.d.ts +1 -1
  388. package/dist/tier-engine/feature.js +9 -3
  389. package/dist/tier-engine/handlers/set-tenant-tier.write.d.ts +1 -1
  390. package/dist/user/db/queries/stream-tenant-backfill.js +4 -4
  391. package/dist/user/handlers/create.write.d.ts +1 -1
  392. package/dist/user/handlers/detail.query.js +2 -1
  393. package/dist/user/handlers/update.write.d.ts +1 -1
  394. package/dist/user/resolve-display-names.js +5 -9
  395. package/dist/user/seeding.js +20 -1
  396. package/dist/user-data-rights/db/queries/forget-cleanup.d.ts +2 -2
  397. package/dist/user-data-rights/email-templates.d.ts +1 -29
  398. package/dist/user-data-rights/email-templates.js +5 -106
  399. package/dist/user-data-rights/feature.js +53 -35
  400. package/dist/user-data-rights/handlers/cancel-deletion.write.d.ts +2 -2
  401. package/dist/user-data-rights/handlers/cancel-deletion.write.js +2 -1
  402. package/dist/user-data-rights/handlers/confirm-deletion-by-token.write.d.ts +1 -1
  403. package/dist/user-data-rights/handlers/lift-restriction.write.d.ts +1 -1
  404. package/dist/user-data-rights/handlers/request-deletion-by-email.write.d.ts +1 -1
  405. package/dist/user-data-rights/handlers/request-deletion.write.d.ts +1 -1
  406. package/dist/user-data-rights/handlers/request-deletion.write.js +5 -7
  407. package/dist/user-data-rights/handlers/request-export.write.d.ts +1 -1
  408. package/dist/user-data-rights/handlers/restrict-account.write.d.ts +1 -1
  409. package/dist/user-data-rights/handlers/run-forget-cleanup.write.d.ts +1 -1
  410. package/dist/user-data-rights/lib/default-mailers.d.ts +15 -7
  411. package/dist/user-data-rights/lib/default-mailers.js +100 -48
  412. package/dist/user-data-rights/lib/update-user-lifecycle.js +1 -1
  413. package/dist/user-data-rights/mail-notifications.d.ts +13 -0
  414. package/dist/user-data-rights/mail-notifications.js +118 -0
  415. package/dist/user-data-rights/web/privacy-center-screen.js +2 -1
  416. package/dist/user-profile/handlers/change-email.write.d.ts +1 -1
  417. package/dist/user-profile/web/profile-screen.js +2 -1
  418. package/dist/waitlist/feature.js +10 -0
  419. package/dist/waitlist/handlers/invite.write.d.ts +1 -1
  420. package/dist/waitlist/handlers/reject.write.d.ts +1 -1
  421. package/dist/waitlist/handlers/submit.write.d.ts +1 -1
  422. package/dist/waitlist/handlers/submit.write.js +3 -4
  423. package/dist/waitlist/mail.d.ts +19 -6
  424. package/dist/waitlist/mail.js +50 -14
  425. package/dist/waitlist/options.js +1 -1
  426. package/dist/workflow-runner/event-trigger.js +2 -2
  427. package/dist/workflow-runner/handlers/resume-run.write.js +7 -2
  428. package/package.json +37 -17
  429. package/src/admin-shell/changes.json +6 -0
  430. package/src/audit/changes.json +6 -0
  431. package/src/auth-email-password/changes.json +51 -0
  432. package/src/billing-foundation/changes.json +43 -0
  433. package/src/cap-counter/changes.json +6 -0
  434. package/src/channel-email/changes.json +19 -0
  435. package/src/config/changes.json +6 -0
  436. package/src/crypto-shredding/changes.json +6 -0
  437. package/src/custom-fields/changes.json +6 -0
  438. package/src/data-retention/changes.json +6 -0
  439. package/src/delivery/changes.json +66 -0
  440. package/src/file-foundation/changes.json +6 -0
  441. package/src/files-tenant-data/changes.json +6 -0
  442. package/src/inbound-mail-foundation/changes.json +6 -0
  443. package/src/jobs/changes.json +19 -0
  444. package/src/ledger/changes.json +7 -0
  445. package/src/managed-pages/changes.json +6 -0
  446. package/src/renderer-foundation/changes.json +39 -0
  447. package/src/renderer-pdf/changes.json +12 -0
  448. package/src/secrets/changes.json +6 -0
  449. package/src/shared/changes.json +6 -0
  450. package/src/subscription-stripe/changes.json +6 -0
  451. package/src/template-resolver/changes.json +186 -0
  452. package/src/tier-engine/changes.json +6 -0
  453. package/src/user/changes.json +6 -0
  454. package/src/user-data-rights/changes.json +13 -0
  455. package/src/user-profile/changes.json +1 -1
  456. package/src/waitlist/changes.json +7 -0
  457. package/src/workflow-runner/changes.json +6 -0
  458. package/dist/renderer-simple/feature.d.ts +0 -10
  459. package/dist/renderer-simple/feature.js +0 -42
  460. package/dist/renderer-simple/index.d.ts +0 -3
  461. package/dist/renderer-simple/index.js +0 -2
  462. package/dist/renderer-simple/mail-blocks.d.ts +0 -21
  463. package/dist/renderer-simple/mail-blocks.js +0 -107
  464. package/dist/renderer-simple/resolve-variables.d.ts +0 -7
  465. package/dist/renderer-simple/resolve-variables.js +0 -47
  466. package/dist/renderer-simple/simple-renderer.d.ts +0 -24
  467. package/dist/renderer-simple/simple-renderer.js +0 -200
  468. package/src/renderer-simple/changes.json +0 -27
@@ -1,8 +1,7 @@
1
1
  import { AUTH_VERIFY_DEFAULT_TTL_MINUTES, AuthErrors } from "../constants.js";
2
- import { renderVerifyEmail } from "../email-templates.js";
2
+ import { AuthMailNotificationTypes } from "../mail-notifications.js";
3
3
  import { signVerificationToken } from "../verification-token.js";
4
4
  import { createTokenRequestHandler, } from "./token-request-handler.js";
5
- const VERIFY_NOTIFICATION_TYPE = "auth-email-password:email-verification";
6
5
  // @wrapper-known semantic-alias
7
6
  export function createRequestEmailVerificationHandler(opts) {
8
7
  return createTokenRequestHandler({
@@ -17,7 +16,6 @@ export function createRequestEmailVerificationHandler(opts) {
17
16
  // unknown/deleted to keep the enumeration surface symmetric — the
18
17
  // caller sees the same 200 regardless of whether a token was minted.
19
18
  extraSilentSkip: (user) => user.emailVerified === true,
20
- notificationType: VERIFY_NOTIFICATION_TYPE,
21
- renderContent: renderVerifyEmail,
19
+ notificationType: AuthMailNotificationTypes.emailVerification,
22
20
  }, opts);
23
21
  }
@@ -3,4 +3,4 @@ export type RequestPasswordResetOptions = TokenRequestOptions;
3
3
  export type RequestResetData = TokenRequestData<"reset-requested">;
4
4
  export declare function createRequestPasswordResetHandler(opts: RequestPasswordResetOptions): import("@cosmicdrift/kumiko-types/define-handler").WriteHandlerDefinition<"request-password-reset", import("zod").ZodObject<{
5
5
  email: import("zod").ZodEmail;
6
- }, import("zod/v4/core").$strip>, TokenRequestData<"reset-requested">, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
6
+ }, import("zod/v4/core").$strip>, TokenRequestData<"reset-requested">, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
@@ -1,8 +1,7 @@
1
1
  import { AUTH_RESET_DEFAULT_TTL_MINUTES, AuthErrors } from "../constants.js";
2
- import { renderResetPasswordEmail } from "../email-templates.js";
2
+ import { AuthMailNotificationTypes } from "../mail-notifications.js";
3
3
  import { signResetToken } from "../reset-token.js";
4
4
  import { createTokenRequestHandler, } from "./token-request-handler.js";
5
- const RESET_NOTIFICATION_TYPE = "auth-email-password:password-reset";
6
5
  // @wrapper-known semantic-alias
7
6
  export function createRequestPasswordResetHandler(opts) {
8
7
  return createTokenRequestHandler({
@@ -17,7 +16,6 @@ export function createRequestPasswordResetHandler(opts) {
17
16
  // non-deleted user can initiate a reset regardless of verification
18
17
  // state. The sessions feature handles the post-change revocation.
19
18
  extraSilentSkip: () => false,
20
- notificationType: RESET_NOTIFICATION_TYPE,
21
- renderContent: renderResetPasswordEmail,
19
+ notificationType: AuthMailNotificationTypes.passwordReset,
22
20
  }, opts);
23
21
  }
@@ -7,4 +7,4 @@ export declare function createResetPasswordHandler(opts: ResetPasswordOptions):
7
7
  newPassword: z.ZodString;
8
8
  }, z.core.$strip>, {
9
9
  kind: "password-reset";
10
- }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
10
+ }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
@@ -27,5 +27,5 @@ type ClaimedHandover = {
27
27
  export declare function createSignupConfirmHandler(opts?: SignupConfirmOptions): import("@cosmicdrift/kumiko-types/define-handler").WriteHandlerDefinition<"signup-confirm", z.ZodObject<{
28
28
  token: z.ZodString;
29
29
  password: z.ZodString;
30
- }, z.core.$strip>, SignupConfirmData, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
30
+ }, z.core.$strip>, SignupConfirmData, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
31
31
  export {};
@@ -23,6 +23,7 @@ import { defineWriteHandler, } from "@cosmicdrift/kumiko-framework/engine";
23
23
  import { ConflictError, InternalError, reraiseAsKumikoError, writeFailure, } from "@cosmicdrift/kumiko-framework/errors";
24
24
  import { generateUniqueName } from "@cosmicdrift/kumiko-framework/random";
25
25
  import { generateId } from "@cosmicdrift/kumiko-framework/utils";
26
+ import { isPlainObject } from "@cosmicdrift/kumiko-types/type-guards";
26
27
  import * as z from "zod";
27
28
  import { findSignupHandoverProvider, registrationLocaleFromRequest, SIGNUP_HANDOVER_BENIGN_CLAIM_REJECTION_CODE, } from "../../shared/index.js";
28
29
  // kumiko-lint-ignore cross-feature-import signup-confirm reads tenants.key for slug-uniqueness check (TOCTOU + DB-unique-index zusammen)
@@ -44,10 +45,8 @@ const SIGNUP_CONFIRM_PROVISION_REASON = "provisions a new tenant, its first user
44
45
  // directly against SIGNUP_HANDOVER_BENIGN_CLAIM_REJECTION_CODE would never
45
46
  // match; this reads the same field the framework itself uses.
46
47
  function isBenignClaimRejection(error) {
47
- return (typeof error.details === "object" &&
48
- error.details !== null &&
49
- error.details["reason"] ===
50
- SIGNUP_HANDOVER_BENIGN_CLAIM_REJECTION_CODE);
48
+ return (isPlainObject(error.details) &&
49
+ error.details["reason"] === SIGNUP_HANDOVER_BENIGN_CLAIM_REJECTION_CODE);
51
50
  }
52
51
  // Rides the caller's tx. A benign claim rejection (nothing was written) logs
53
52
  // and yields undefined; any other failure — including a real DB error, which
@@ -29,4 +29,4 @@ export declare function createSignupRequestHandler(opts: SignupRequestOptions):
29
29
  entityType: z.ZodString;
30
30
  token: z.ZodString;
31
31
  }, z.core.$strip>>;
32
- }, z.core.$strip>, SignupRequestData, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
32
+ }, z.core.$strip>, SignupRequestData, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
@@ -24,6 +24,7 @@ import { defineWriteHandler } from "@cosmicdrift/kumiko-framework/engine";
24
24
  import { InternalError, writeFailure } from "@cosmicdrift/kumiko-framework/errors";
25
25
  import * as z from "zod";
26
26
  import { findSignupHandoverProvider } from "../../shared/index.js";
27
+ import { AUTH_EMAIL_PAYLOAD_RATE_LIMITS } from "../email-rate-limits.js";
27
28
  import { resolveHandlerMailLocale } from "../magic-link-mail.js";
28
29
  import { AUTH_SELF_REGISTRATION_FEATURE } from "../self-registration-toggle.js";
29
30
  import { issueSignupActivation } from "../signup-activation.js";
@@ -48,7 +49,7 @@ export function createSignupRequestHandler(opts) {
48
49
  schema: SignupRequestSchema,
49
50
  access: { roles: ["anonymous"] },
50
51
  rateLimit: { per: "ip+handler", limit: 10, windowSeconds: 60 },
51
- additionalRateLimits: [{ per: { payloadField: "email" }, limit: 3, windowSeconds: 86400 }],
52
+ additionalRateLimits: AUTH_EMAIL_PAYLOAD_RATE_LIMITS,
52
53
  description: "Starts magic-link self-registration by mailing a fresh activation link to an address and invalidating any link still outstanding for it; the answer looks the same whether or not the address is already registered.",
53
54
  escapeHatch: { reason: HANDOVER_GRANT_VERIFY_REASON, grants: ["unsafeRaw"] },
54
55
  handler: async (event, ctx) => {
@@ -6,4 +6,4 @@ export type SwitchTenantMfaGateData = {
6
6
  export declare function createSwitchTenantMfaGateHandler(opts: Pick<LoginHandlerOptions, "mfaStatusChecker">): import("@cosmicdrift/kumiko-types/define-handler").WriteHandlerDefinition<"switch-tenant-mfa-gate", z.ZodObject<{
7
7
  userId: z.ZodString;
8
8
  tenantId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
9
- }, z.core.$strip>, SwitchTenantMfaGateData, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
9
+ }, z.core.$strip>, SwitchTenantMfaGateData, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
@@ -1,7 +1,7 @@
1
1
  import type { Temporal } from "@cosmicdrift/kumiko-types/temporal";
2
2
  import * as z from "zod";
3
3
  import { type AuthUserRow } from "../auth-user-row.js";
4
- import type { AuthMailContent, AuthMailLocale, RenderTokenContentArgs } from "../email-templates.js";
4
+ import type { AuthMailLocale } from "../email-templates.js";
5
5
  export type TokenRequestSuccess<K extends string> = {
6
6
  readonly kind: K;
7
7
  readonly email: string;
@@ -25,7 +25,6 @@ export type TokenRequestSpec<TName extends string, TSuccessKind extends string>
25
25
  readonly notConfiguredI18nKey: string;
26
26
  readonly extraSilentSkip: (user: AuthUserRow) => boolean;
27
27
  readonly notificationType: string;
28
- readonly renderContent: (args: RenderTokenContentArgs) => AuthMailContent;
29
28
  };
30
29
  export type TokenRequestOptions = {
31
30
  readonly hmacSecret: string;
@@ -42,4 +41,4 @@ export type TokenRequestOptions = {
42
41
  };
43
42
  export declare function createTokenRequestHandler<TName extends string, TSuccessKind extends string>(spec: TokenRequestSpec<TName, TSuccessKind>, opts: TokenRequestOptions): import("@cosmicdrift/kumiko-types/define-handler").WriteHandlerDefinition<TName, z.ZodObject<{
44
43
  email: z.ZodEmail;
45
- }, z.core.$strip>, TokenRequestData<TSuccessKind>, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
44
+ }, z.core.$strip>, TokenRequestData<TSuccessKind>, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
@@ -17,6 +17,7 @@ import { isValidIanaTimeZone } from "@cosmicdrift/kumiko-framework/time";
17
17
  import * as z from "zod";
18
18
  import { UserQueries } from "../../user/index.js";
19
19
  import { parseAuthUserRow } from "../auth-user-row.js";
20
+ import { AUTH_EMAIL_PAYLOAD_RATE_LIMITS } from "../email-rate-limits.js";
20
21
  import { dispatchMagicLinkMail, resolveHandlerMailLocale } from "../magic-link-mail.js";
21
22
  const RequestTokenSchema = z.object({
22
23
  email: z.email(),
@@ -33,7 +34,7 @@ export function createTokenRequestHandler(spec, opts) {
33
34
  schema: RequestTokenSchema,
34
35
  access: { roles: ["anonymous"] },
35
36
  rateLimit: { per: "ip+handler", limit: 10, windowSeconds: 60 },
36
- additionalRateLimits: [{ per: { payloadField: "email" }, limit: 5, windowSeconds: 86400 }],
37
+ additionalRateLimits: AUTH_EMAIL_PAYLOAD_RATE_LIMITS,
37
38
  escapeHatch: {
38
39
  grants: ["systemIdentity"],
39
40
  reason: "Anonymous requester has no session — looks up the target user by email via " +
@@ -67,7 +68,6 @@ export function createTokenRequestHandler(spec, opts) {
67
68
  await dispatchMagicLinkMail(ctx.notify, {
68
69
  handlerName: spec.handlerName,
69
70
  notificationType: spec.notificationType,
70
- renderContent: spec.renderContent,
71
71
  }, {
72
72
  // Row value is ciphertext with an active KMS; the byte-exact
73
73
  // lookup above guarantees the payload IS the stored plaintext.
@@ -9,4 +9,4 @@ export type VerifyEmailData = {
9
9
  };
10
10
  export declare function createVerifyEmailHandler(opts: VerifyEmailOptions): import("@cosmicdrift/kumiko-types/define-handler").WriteHandlerDefinition<"verify-email", z.ZodObject<{
11
11
  token: z.ZodString;
12
- }, z.core.$strip>, VerifyEmailData, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
12
+ }, z.core.$strip>, VerifyEmailData, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
@@ -3,10 +3,10 @@ export { type AuthPath, type AuthPaths, DEFAULT_AUTH_PATHS, makeAuthPaths } from
3
3
  export type { BootstrapConfigValue, BootstrapDeps, BootstrapInvite, BootstrapInviteOutcome, BootstrapPlan, BootstrapReport, BootstrapSeedDeps, BootstrapSystemAdmin, BootstrapTenant, BootstrapTenantOutcome, } from "./bootstrap.js";
4
4
  export { BootstrapPlanError, BootstrapWriteError, bootstrapTenants } from "./bootstrap.js";
5
5
  export { AUTH_EMAIL_PASSWORD_FEATURE, AuthErrors, AuthHandlers, AuthQueries } from "./constants.js";
6
- export type { AuthMailContent, AuthMailLocale, AuthMailSection, RenderInviteEmailArgs, RenderTokenContentArgs, } from "./email-templates.js";
7
- export { renderActivationEmail, renderInviteEmail, renderResetPasswordEmail, renderUnlockAccountEmail, renderVerifyEmail, } from "./email-templates.js";
6
+ export type { AuthMailLocale } from "./email-templates.js";
8
7
  export type { AccountLockoutOptions, AccountUnlockOptions, AuthEmailPasswordOptions, EmailVerificationOptions, InviteOptions, PasswordResetOptions, SignupOptions, } from "./feature.js";
9
8
  export { authEmailPasswordEnvSchema, createAuthEmailPasswordFeature } from "./feature.js";
9
+ export { AuthMailNotificationTypes } from "./mail-notifications.js";
10
10
  export { AUTH_SELF_REGISTRATION_FEATURE, createAuthSelfRegistrationToggleFeature, } from "./self-registration-toggle.js";
11
11
  export { signToken, TokenPurpose, type VerifyResult, verifyToken } from "./signed-token.js";
12
12
  export { type IssuedSignupActivation, type IssueSignupActivationArgs, issueSignupActivation, SIGNUP_ACTIVATION_NOTIFICATION_TYPE, } from "./signup-activation.js";
@@ -8,8 +8,8 @@ export { hashPassword, verifyPassword } from "../shared/password-hashing.js";
8
8
  export { DEFAULT_AUTH_PATHS, makeAuthPaths } from "./auth-paths.js";
9
9
  export { BootstrapPlanError, BootstrapWriteError, bootstrapTenants } from "./bootstrap.js";
10
10
  export { AUTH_EMAIL_PASSWORD_FEATURE, AuthErrors, AuthHandlers, AuthQueries } from "./constants.js";
11
- export { renderActivationEmail, renderInviteEmail, renderResetPasswordEmail, renderUnlockAccountEmail, renderVerifyEmail, } from "./email-templates.js";
12
11
  export { authEmailPasswordEnvSchema, createAuthEmailPasswordFeature } from "./feature.js";
12
+ export { AuthMailNotificationTypes } from "./mail-notifications.js";
13
13
  export { AUTH_SELF_REGISTRATION_FEATURE, createAuthSelfRegistrationToggleFeature, } from "./self-registration-toggle.js";
14
14
  // Generic HMAC-signed single-purpose token helpers. Re-exported damit
15
15
  // app-spezifische out-of-band-Flows (subscriber-confirm, magic-links,
@@ -1,9 +1,9 @@
1
1
  import type { NotifyFn } from "@cosmicdrift/kumiko-framework/engine";
2
- import type { AuthMailContent, AuthMailLocale, RenderTokenContentArgs } from "./email-templates.js";
2
+ import { type AuthMailLocale } from "./email-templates.js";
3
3
  export type MagicLinkMailSpec = {
4
4
  readonly handlerName: string;
5
5
  readonly notificationType: string;
6
- readonly renderContent: (args: RenderTokenContentArgs) => AuthMailContent;
6
+ readonly fallbackAppName?: string;
7
7
  };
8
8
  export type MagicLinkMailParams = {
9
9
  readonly email: string;
@@ -14,6 +14,7 @@ export type MagicLinkMailParams = {
14
14
  readonly locale?: AuthMailLocale;
15
15
  readonly issuedAt?: string;
16
16
  readonly timeZone?: string;
17
+ readonly role?: string;
17
18
  };
18
19
  export declare function resolveHandlerMailLocale(ctx: {
19
20
  readonly locale?: string;
@@ -1,13 +1,15 @@
1
1
  // Shared dispatch for the magic-link mails (password-reset, email-verification,
2
- // signup-activation). All three follow the same delivery shape: append the
3
- // token to the app page, render structured content, and notify the recipient
4
- // email directly (route:{email} skips preferences — the recipient may not have
5
- // a user account yet — and critical priority keeps a security mail
6
- // non-unsubscribable). No r.notification is declared; buildMessage falls back
7
- // to the structured `data` for the renderer.
2
+ // account-unlock, signup-activation, invite). All follow the same delivery
3
+ // shape: append the token to the app page and notify the recipient email
4
+ // directly (route:{email} skips preferences — the recipient may not have a user
5
+ // account yet — and critical priority keeps a security mail non-unsubscribable).
6
+ // Each mail type is a trigger-less r.notification whose stored template renders
7
+ // from the variables passed here.
8
8
  import { requestContext } from "@cosmicdrift/kumiko-framework/api";
9
9
  import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
10
- import { resolveMailLocale } from "@cosmicdrift/kumiko-framework/i18n";
10
+ import { mailT, resolveMailLocale } from "@cosmicdrift/kumiko-framework/i18n";
11
+ import { tokenMailExpiry } from "./email-templates.js";
12
+ import { authMailTemplateLocale } from "./mail-notifications.js";
11
13
  function resolveAppUrl(appUrl, locale) {
12
14
  return typeof appUrl === "function" ? appUrl(locale) : appUrl;
13
15
  }
@@ -35,18 +37,21 @@ export async function dispatchMagicLinkMail(notify, spec, params) {
35
37
  // mailT already root-falls-back; appUrl must use the same negotiated tag
36
38
  // or language-in-path apps 404 on e.g. /de-AT/activate.
37
39
  const urlLocale = resolveMailLocale(locale);
38
- const content = spec.renderContent({
39
- url: appendToken(resolveAppUrl(params.appUrl, urlLocale), params.token),
40
+ const { validFor, validUntil } = tokenMailExpiry({
40
41
  expiresAt: params.expiresAt,
41
- ...(params.locale !== undefined && { locale: params.locale }),
42
- ...(params.appName !== undefined && { appName: params.appName }),
43
42
  ...(params.issuedAt !== undefined && { issuedAt: params.issuedAt }),
44
43
  ...(params.timeZone !== undefined && { timeZone: params.timeZone }),
45
- });
44
+ }, locale);
46
45
  await notify(spec.notificationType, {
47
46
  route: { email: params.email },
48
- data: content,
49
- locale,
47
+ data: {
48
+ appName: params.appName ?? spec.fallbackAppName ?? mailT(locale, "auth.mail.appNameDefault"),
49
+ actionUrl: appendToken(resolveAppUrl(params.appUrl, urlLocale), params.token),
50
+ validFor,
51
+ validUntil,
52
+ ...(params.role !== undefined && { role: params.role }),
53
+ },
54
+ locale: authMailTemplateLocale(spec.notificationType, locale),
50
55
  priority: "critical",
51
56
  });
52
57
  }
@@ -0,0 +1,32 @@
1
+ import { type NotificationLocalizedTemplate, type TemplateVariables } from "@cosmicdrift/kumiko-framework/engine";
2
+ export declare const AUTH_MAIL_KINDS: {
3
+ readonly passwordReset: {
4
+ readonly name: "password-reset";
5
+ readonly translationKey: "reset";
6
+ };
7
+ readonly accountUnlock: {
8
+ readonly name: "account-unlock";
9
+ readonly translationKey: "unlock";
10
+ };
11
+ readonly emailVerification: {
12
+ readonly name: "email-verification";
13
+ readonly translationKey: "verify";
14
+ };
15
+ readonly signupActivation: {
16
+ readonly name: "signup-activation";
17
+ readonly translationKey: "activation";
18
+ };
19
+ readonly invite: {
20
+ readonly name: "invite";
21
+ readonly translationKey: "invite";
22
+ };
23
+ };
24
+ export type AuthMailKind = keyof typeof AUTH_MAIL_KINDS;
25
+ type MagicLinkFlowOptions = Partial<Record<"passwordReset" | "emailVerification" | "signup" | "invite" | "accountUnlock", unknown>>;
26
+ export declare function sendsMagicLinkMail(flows: MagicLinkFlowOptions): boolean;
27
+ export declare const AuthMailNotificationTypes: Readonly<Record<AuthMailKind, string>>;
28
+ export declare function authMailTemplateLocale(notificationType: string, requestedLocale: string): string;
29
+ export declare const AUTH_MAIL_VARIABLES: TemplateVariables;
30
+ export declare const INVITE_MAIL_VARIABLES: TemplateVariables;
31
+ export declare function authMailLocalizedTemplate(kind: AuthMailKind): () => NotificationLocalizedTemplate;
32
+ export {};
@@ -0,0 +1,116 @@
1
+ import { QnTypes, qn, templateVariable, } from "@cosmicdrift/kumiko-framework/engine";
2
+ import { hasMailTranslationKey, listMailLocales, mailT, resolveMailLocale, } from "@cosmicdrift/kumiko-framework/i18n";
3
+ import { escapeHtml, escapeHtmlAttr } from "@cosmicdrift/kumiko-headless";
4
+ import { AUTH_EMAIL_PASSWORD_FEATURE } from "./constants.js";
5
+ export const AUTH_MAIL_KINDS = {
6
+ passwordReset: { name: "password-reset", translationKey: "reset" },
7
+ accountUnlock: { name: "account-unlock", translationKey: "unlock" },
8
+ emailVerification: { name: "email-verification", translationKey: "verify" },
9
+ signupActivation: { name: "signup-activation", translationKey: "activation" },
10
+ invite: { name: "invite", translationKey: "invite" },
11
+ };
12
+ export function sendsMagicLinkMail(flows) {
13
+ return Boolean(flows.passwordReset ||
14
+ flows.emailVerification ||
15
+ flows.signup ||
16
+ flows.invite ||
17
+ flows.accountUnlock);
18
+ }
19
+ function authMailType(kind) {
20
+ return qn(AUTH_EMAIL_PASSWORD_FEATURE, QnTypes.notify, AUTH_MAIL_KINDS[kind].name);
21
+ }
22
+ export const AuthMailNotificationTypes = {
23
+ passwordReset: authMailType("passwordReset"),
24
+ accountUnlock: authMailType("accountUnlock"),
25
+ emailVerification: authMailType("emailVerification"),
26
+ signupActivation: authMailType("signupActivation"),
27
+ invite: authMailType("invite"),
28
+ };
29
+ function subjectKey(kind) {
30
+ return `auth.mail.${AUTH_MAIL_KINDS[kind].translationKey}.subject`;
31
+ }
32
+ const ALL_AUTH_MAIL_KINDS = [
33
+ "passwordReset",
34
+ "accountUnlock",
35
+ "emailVerification",
36
+ "signupActivation",
37
+ "invite",
38
+ ];
39
+ const SUBJECT_KEY_BY_TYPE = new Map(ALL_AUTH_MAIL_KINDS.map((kind) => [AuthMailNotificationTypes[kind], subjectKey(kind)]));
40
+ // A registered locale whose bundle lacks the subject key has no template (see
41
+ // authMailLocalizedTemplate); the renderer has no locale fallback, so the
42
+ // sender must pick a locale that has one or the mail would not go out at all.
43
+ export function authMailTemplateLocale(notificationType, requestedLocale) {
44
+ const locale = resolveMailLocale(requestedLocale);
45
+ const key = SUBJECT_KEY_BY_TYPE.get(notificationType);
46
+ return key !== undefined && hasMailTranslationKey(locale, key) ? locale : "en";
47
+ }
48
+ export const AUTH_MAIL_VARIABLES = {
49
+ appName: templateVariable.text({ required: true }),
50
+ actionUrl: templateVariable.link({ required: true }),
51
+ validFor: templateVariable.text({ required: true }),
52
+ validUntil: templateVariable.text({ required: true }),
53
+ };
54
+ export const INVITE_MAIL_VARIABLES = {
55
+ ...AUTH_MAIL_VARIABLES,
56
+ role: templateVariable.text({ required: true }),
57
+ };
58
+ // Translation placeholder -> template variable. The markers survive HTML
59
+ // escaping, so only the translated text is escaped, never the placeholders.
60
+ const PLACEHOLDER_VARIABLES = {
61
+ app: "appName",
62
+ duration: "validFor",
63
+ when: "validUntil",
64
+ role: "role",
65
+ };
66
+ const MARKER_OPEN = "\uE000";
67
+ const MARKER_CLOSE = "\uE001";
68
+ const MARKER_PATTERN = new RegExp(`${MARKER_OPEN}(\\w+)${MARKER_CLOSE}`, "g");
69
+ function markers() {
70
+ return Object.fromEntries(Object.keys(PLACEHOLDER_VARIABLES).map((name) => [
71
+ name,
72
+ `${MARKER_OPEN}${name}${MARKER_CLOSE}`,
73
+ ]));
74
+ }
75
+ function translatedHtml(locale, key) {
76
+ return escapeHtml(mailT(locale, key, markers())).replace(MARKER_PATTERN, (_, name) => {
77
+ const variable = PLACEHOLDER_VARIABLES[name];
78
+ return variable === undefined
79
+ ? ""
80
+ : `<span data-variable="${escapeHtmlAttr(variable)}"></span>`;
81
+ });
82
+ }
83
+ function mailBody(locale, translationKey) {
84
+ const html = (part) => translatedHtml(locale, `auth.mail.${translationKey}.${part}`);
85
+ return [
86
+ `<p>${html("greeting")}</p>`,
87
+ `<p>${html("intro")}</p>`,
88
+ `<p><a data-button href="{{actionUrl}}">${html("button")}</a></p>`,
89
+ `<p>${html("expiry")}</p>`,
90
+ `<p>${html("ignore")}</p>`,
91
+ ].join("");
92
+ }
93
+ // Evaluated when the registry is built, after every locale feature has
94
+ // registered its mail translations. English always ships; another locale only
95
+ // gets a template when it has its own subject, so a missing translation never
96
+ // silently becomes an English mail in that locale's slot.
97
+ export function authMailLocalizedTemplate(kind) {
98
+ const { translationKey } = AUTH_MAIL_KINDS[kind];
99
+ const kindSubjectKey = subjectKey(kind);
100
+ return () => {
101
+ const locales = [
102
+ "en",
103
+ ...listMailLocales().filter((locale) => locale !== "en" && hasMailTranslationKey(locale, kindSubjectKey)),
104
+ ];
105
+ return Object.fromEntries(locales.map((locale) => [
106
+ locale,
107
+ {
108
+ body: mailBody(locale, translationKey),
109
+ meta: {
110
+ subject: mailT(locale, kindSubjectKey, { app: "{{appName}}" }),
111
+ category: "transactional",
112
+ },
113
+ },
114
+ ]));
115
+ };
116
+ }
@@ -1,6 +1,6 @@
1
1
  import type { NotifyFn } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import type { Redis } from "ioredis";
3
- export declare const SIGNUP_ACTIVATION_NOTIFICATION_TYPE = "auth-email-password:signup-activation";
3
+ export declare const SIGNUP_ACTIVATION_NOTIFICATION_TYPE: string;
4
4
  export type IssueSignupActivationArgs = {
5
5
  readonly redis: Redis;
6
6
  readonly notify: NotifyFn | undefined;
@@ -6,10 +6,10 @@
6
6
  import { generateToken } from "@cosmicdrift/kumiko-framework/api";
7
7
  import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
8
8
  import { AUTH_SIGNUP_DEFAULT_TTL_MINUTES } from "./constants.js";
9
- import { renderActivationEmail } from "./email-templates.js";
10
9
  import { dispatchMagicLinkMail } from "./magic-link-mail.js";
10
+ import { AuthMailNotificationTypes } from "./mail-notifications.js";
11
11
  import { invalidateExistingSignupToken, normalizeEmail, storeSignupToken, } from "./signup-token-store.js";
12
- export const SIGNUP_ACTIVATION_NOTIFICATION_TYPE = "auth-email-password:signup-activation";
12
+ export const SIGNUP_ACTIVATION_NOTIFICATION_TYPE = AuthMailNotificationTypes.signupActivation;
13
13
  export async function issueSignupActivation(args) {
14
14
  const ttlSeconds = (args.tokenTtlMinutes ?? AUTH_SIGNUP_DEFAULT_TTL_MINUTES) * 60;
15
15
  // At most one live signup token per email.
@@ -26,7 +26,6 @@ export async function issueSignupActivation(args) {
26
26
  await dispatchMagicLinkMail(args.notify, {
27
27
  handlerName: "signup-request",
28
28
  notificationType: SIGNUP_ACTIVATION_NOTIFICATION_TYPE,
29
- renderContent: renderActivationEmail,
30
29
  }, {
31
30
  email,
32
31
  appUrl: args.appUrl,
@@ -10,7 +10,7 @@ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
10
10
  // (nur `{ children }`-Prop). Der Sample kann so einen eigenen Login-
11
11
  // Screen rein konfigurieren, ohne den Gate selbst ersetzen zu müssen.
12
12
  import { useLocale } from "@cosmicdrift/kumiko-renderer";
13
- import { useEffect, useState } from "react";
13
+ import { useEffect, useMemo, useState } from "react";
14
14
  import { assertNavigableUrl, buildLoginRedirectUrl, followNextOrLandingAfterLogin, } from "./auth-redirect.js";
15
15
  import { LoginScreen } from "./login-screen.js";
16
16
  import { SessionProvider, useSession } from "./session.js";
@@ -102,6 +102,17 @@ export function resolveLoginRedirect(loginUrl, locale, { origin, pathname, searc
102
102
  url: typeof loginUrl === "function" ? target : buildLoginRedirectUrl(target, returnPath, origin),
103
103
  };
104
104
  }
105
+ // A throwing loginUrl builder must not take the whole app tree down in render;
106
+ // null falls through to the built-in login screen.
107
+ function resolveLoginRedirectOrNull(loginUrl, locale, location) {
108
+ try {
109
+ return resolveLoginRedirect(loginUrl, locale, location);
110
+ }
111
+ catch (error) {
112
+ console.error("Auth gate: loginUrl could not be resolved, showing the built-in login", error);
113
+ return null;
114
+ }
115
+ }
105
116
  export function makeAuthGate(opts = {}) {
106
117
  const { loginUrl } = opts;
107
118
  if (typeof loginUrl === "string")
@@ -110,9 +121,10 @@ export function makeAuthGate(opts = {}) {
110
121
  function AuthGate({ children }) {
111
122
  const { status } = useSession();
112
123
  const locale = useLocale().locale();
113
- const loginRedirect = loginUrl !== undefined && status === "unauthenticated"
114
- ? resolveLoginRedirect(loginUrl, locale, window.location)
115
- : null;
124
+ const { origin, pathname, search, hash } = window.location;
125
+ const loginRedirect = useMemo(() => loginUrl !== undefined && status === "unauthenticated"
126
+ ? resolveLoginRedirectOrNull(loginUrl, locale, { origin, pathname, search, hash })
127
+ : null, [status, locale, origin, pathname, search, hash]);
116
128
  const redirectUrl = loginRedirect?.kind === "redirect" ? loginRedirect.url : null;
117
129
  // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
118
130
  useEffect(() => {
@@ -47,10 +47,7 @@ export function tokenShapeKey(shape) {
47
47
  // exactly one implementation must be registered (boot-fails on 0 or ≥2).
48
48
  export const EXT_SESSION_STORE = "sessionStore";
49
49
  export function isSessionStoreProvider(o) {
50
- return (typeof o === "object" &&
51
- o !== null &&
52
- "build" in o &&
53
- typeof o.build === "function");
50
+ return typeof o === "object" && o !== null && "build" in o && typeof o.build === "function";
54
51
  }
55
52
  // Tenant-resolution extension points (#1373). Both are single-provider and
56
53
  // optional — zero registered means today's single-tenant / header-cookie
@@ -69,8 +66,5 @@ export function isTenantResolverProvider(o) {
69
66
  isTenantResolverTrust(o.trust));
70
67
  }
71
68
  export function isTenantExistenceProvider(o) {
72
- return (typeof o === "object" &&
73
- o !== null &&
74
- "build" in o &&
75
- typeof o.build === "function");
69
+ return typeof o === "object" && o !== null && "build" in o && typeof o.build === "function";
76
70
  }
@@ -25,7 +25,7 @@ export function bindMfaRevokeAllOtherSessionsFromFeature(feature) {
25
25
  if (exports && typeof exports === "object" && "bindRevokeAllOtherSessions" in exports) {
26
26
  const { bindRevokeAllOtherSessions } = exports;
27
27
  if (typeof bindRevokeAllOtherSessions === "function") {
28
- // @cast-boundary exports-walk — feature.exports is untyped by design
28
+ // @cast-boundary feature-exports — feature.exports is untyped by design
29
29
  return bindRevokeAllOtherSessions;
30
30
  }
31
31
  }
@@ -38,7 +38,7 @@ export function mfaStatusCheckerFromFeature(feature) {
38
38
  if (exports && typeof exports === "object" && "checkMfaStatus" in exports) {
39
39
  const { checkMfaStatus } = exports;
40
40
  if (typeof checkMfaStatus === "function") {
41
- // @cast-boundary exports-walk — feature.exports is untyped by design
41
+ // @cast-boundary feature-exports — feature.exports is untyped by design
42
42
  return checkMfaStatus;
43
43
  }
44
44
  }
@@ -53,7 +53,7 @@ export function mfaVerifierFromFeature(feature) {
53
53
  if (exports && typeof exports === "object" && "verifyMfaCode" in exports) {
54
54
  const { verifyMfaCode } = exports;
55
55
  if (typeof verifyMfaCode === "function") {
56
- // @cast-boundary exports-walk — feature.exports is untyped by design
56
+ // @cast-boundary feature-exports — feature.exports is untyped by design
57
57
  return verifyMfaCode;
58
58
  }
59
59
  }
@@ -68,7 +68,7 @@ export function bindRevokeAllPatTokensFromFeature(feature) {
68
68
  if (exports && typeof exports === "object" && "bindRevokeAllPatTokens" in exports) {
69
69
  const { bindRevokeAllPatTokens } = exports;
70
70
  if (typeof bindRevokeAllPatTokens === "function") {
71
- // @cast-boundary exports-walk — feature.exports is untyped by design
71
+ // @cast-boundary feature-exports — feature.exports is untyped by design
72
72
  return bindRevokeAllPatTokens;
73
73
  }
74
74
  }
@@ -7,4 +7,4 @@ export declare function createDisableHandler(opts: DisableOptions): import("@cos
7
7
  code: z.ZodString;
8
8
  }, z.core.$strip>, {
9
9
  disabled: boolean;
10
- }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
10
+ }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
@@ -13,4 +13,4 @@ export declare function createEnableConfirmPreauthHandler(opts: EnableConfirmPre
13
13
  }, z.core.$strip>, {
14
14
  kind: string;
15
15
  session: SessionUser;
16
- }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
16
+ }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
@@ -9,4 +9,4 @@ export declare function createEnableConfirmHandler(opts: EnableConfirmOptions):
9
9
  code: z.ZodString;
10
10
  }, z.core.$strip>, {
11
11
  enabled: boolean;
12
- }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
12
+ }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
@@ -11,4 +11,4 @@ export declare function createEnableStartPreauthHandler(opts: EnableStartPreauth
11
11
  setupToken: string;
12
12
  otpauthUri: string;
13
13
  recoveryCodes: string[];
14
- }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
14
+ }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
@@ -10,4 +10,4 @@ export declare function createEnableStartHandler(opts: EnableStartOptions): impo
10
10
  otpauthUri: string;
11
11
  totpSecret: string;
12
12
  recoveryCodes: string[];
13
- }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
13
+ }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
@@ -6,4 +6,4 @@ export declare function createRegenerateRecoveryHandler(opts: RegenerateRecovery
6
6
  code: z.ZodString;
7
7
  }, z.core.$strip>, {
8
8
  recoveryCodes: string[];
9
- }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
9
+ }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
@@ -11,4 +11,4 @@ export declare function createMfaVerifyHandler(opts: MfaVerifyOptions): import("
11
11
  }, z.core.$strip>, {
12
12
  kind: string;
13
13
  session: SessionUser;
14
- }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
14
+ }, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;