@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
@@ -1,13 +1,13 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
- // Auth-Gate: rendert den LoginScreen solange der Session-Status
3
- // "unauthenticated" ist, sonst die Kinder. "loading" zeigt einen
4
- // minimalen Placeholder — die initiale Refresh-Runde liefert in der
5
- // Regel in <100ms, also kein Spinner-Overkill.
2
+ // Auth gate: renders the LoginScreen while the session status is
3
+ // "unauthenticated" and the children otherwise. "loading" shows a
4
+ // minimal placeholder—the initial refresh usually completes in <100ms,
5
+ // so a spinner would be excessive.
6
6
  //
7
- // Die Factory makeAuthGate schließt die LoginScreen-Komponente in,
8
- // damit das Gate der ClientFeatureDefinition-Signatur entspricht
9
- // (nur `{ children }`-Prop). Der Sample kann so einen eigenen Login-
10
- // Screen rein konfigurieren, ohne den Gate selbst ersetzen zu müssen.
7
+ // The makeAuthGate factory closes over the LoginScreen component so the
8
+ // gate matches the ClientFeatureDefinition signature (only a `{ children }`
9
+ // prop). This lets the sample configure a custom login screen without
10
+ // replacing the gate.
11
11
  import { useLocale } from "@cosmicdrift/kumiko-renderer";
12
12
  import { useEffect, useMemo, useState } from "react";
13
13
  import { assertNavigableUrl, buildLoginRedirectUrl, followNextOrLandingAfterLogin, } from "./auth-redirect.js";
@@ -20,12 +20,11 @@ import { SessionBootstrapErrorScreen } from "./session-bootstrap-error.js";
20
20
  // their own standalone login route outside any gate (createPublicSurface
21
21
  // apex pages stack providers, not gates — see auth-mount.tsx recipes).
22
22
  // Handing an app raw LoginScreen + telling it to hand-roll the challenge-
23
- // token swap itself is exactly how kumiko-framework#266's login-time MFA
24
- // step went missing in a real apex surface; this prevents the *most common*
25
- // version of that mistake. MFA still only actually works once a consumer
26
- // wires `mfaVerifyScreen` — omitting it is a silent no-MFA fallback, not
27
- // something this route can catch on its own (auth-mfa is a separate,
28
- // optional package).
23
+ // token swap itself is exactly how the login-time MFA step went missing in a
24
+ // real apex surface; this prevents the *most common* version of that mistake.
25
+ // MFA still only actually works once a consumer wires `mfaVerifyScreen` —
26
+ // omitting it is a silent no-MFA fallback, not something this route can catch
27
+ // on its own (auth-mfa is a separate, optional package).
29
28
  export function createLoginRoute(opts = {}) {
30
29
  const LoginComponent = opts.loginScreen ?? LoginScreen;
31
30
  const MfaVerifyComponent = opts.mfaVerifyScreen;
@@ -38,7 +37,7 @@ export function createLoginRoute(opts = {}) {
38
37
  // never considers this session authenticated until verify succeeds.
39
38
  const [challengeToken, setChallengeToken] = useState(null);
40
39
  const [setupRequest, setSetupRequest] = useState(null);
41
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
40
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
42
41
  useEffect(() => {
43
42
  if (status === "authenticated")
44
43
  onAuthenticated?.();
@@ -125,7 +124,7 @@ export function makeAuthGate(opts = {}) {
125
124
  ? resolveLoginRedirectOrNull(loginUrl, locale, { origin, pathname, search, hash })
126
125
  : null, [status, locale, origin, pathname, search, hash]);
127
126
  const redirectUrl = loginRedirect?.kind === "redirect" ? loginRedirect.url : null;
128
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
127
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
129
128
  useEffect(() => {
130
129
  if (redirectUrl !== null)
131
130
  window.location.replace(redirectUrl);
@@ -3,9 +3,9 @@ import type { ComponentType, ReactNode } from "react";
3
3
  import { type AuthGateOptions, type MfaSetupComponentProps, type MfaVerifyComponentProps } from "./auth-gate.tsx";
4
4
  import type { LoginScreenProps } from "./login-screen.tsx";
5
5
  export type EmailPasswordClientOptions = {
6
- /** Eigener Login-Screen. Default: der shadcn-stylte LoginScreen
7
- * aus diesem Modul. Für Branding- oder Layout-Overrides einfach
8
- * eine eigene Komponente mit derselben Signatur reichen. */
6
+ /** Custom login screen. Default: the shadcn-styled LoginScreen
7
+ * from this module. Provide a component with the same signature for
8
+ * branding or layout overrides. */
9
9
  readonly loginScreen?: ComponentType<LoginScreenProps>;
10
10
  readonly loginScreenProps?: LoginScreenProps;
11
11
  /** auth-mfa's MfaVerifyScreen, wired in from the app so this feature
@@ -26,10 +26,10 @@ export type EmailPasswordClientOptions = {
26
26
  readonly loginUrl?: AuthGateOptions["loginUrl"];
27
27
  /** Where logout navigates to (root-relative path or http(s) URL). Default: reload. */
28
28
  readonly postLogoutUrl?: string;
29
- /** Key-Overrides pro Locale. Wird mit den Default-Bundles (de/en)
30
- * aus `translations.ts` gemerged — jeder hier gesetzte Key gewinnt.
31
- * Für Branding ("Sign in" → "Login to Acme") oder weitere Sprachen
32
- * (`fr`, `es`, …) zusätzlich. */
29
+ /** Per-locale key overrides. Merged with the default bundles (de/en)
30
+ * from `translations.ts`; each key supplied here takes precedence.
31
+ * Use this for branding ("Sign in" → "Login to Acme") or to add
32
+ * further languages (`fr`, `es`, …). */
33
33
  readonly translations?: TranslationsByLocale;
34
34
  /** Serve the forgot-password, reset-password and unlock-account pages at
35
35
  * their convention paths for signed-out visitors. Apps with their own
@@ -1,8 +1,7 @@
1
- // Client-Feature-Factory für auth-email-password. Wird vom App-Code
2
- // in createKumikoApp({ clientFeatures: [emailPasswordClient()] })
3
- // eingehängt und bringt Session-Context + AuthGate + Default-UI-
4
- // Translations (de/en) mit. Alles ist overridbar — Login-Screen,
5
- // Strings pro Locale, pro Key.
1
+ // Client feature factory for auth-email-password. App code mounts it in
2
+ // createKumikoApp({ clientFeatures: [emailPasswordClient()] }) to provide
3
+ // session context, AuthGate, and default UI translations (de/en). All of
4
+ // these can be overridden: the login screen and strings per locale and key.
6
5
  import { makeSessionAuthGate, } from "./auth-gate.js";
7
6
  import { emailPasswordClientActions } from "./client-actions.js";
8
7
  import { DefaultAuthPagesGate } from "./default-auth-pages-gate.js";
@@ -16,7 +16,7 @@ export function ConfirmAccountUnlockScreen({ title, token: tokenProp, loginHref
16
16
  const token = useUrlToken(tokenProp);
17
17
  const [status, setStatus] = useState(token === "" ? "missing-token" : "verifying");
18
18
  const startedRef = useRef(false);
19
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
19
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
20
20
  useEffect(() => {
21
21
  if (status !== "verifying")
22
22
  return;
@@ -15,7 +15,7 @@ export const AuthHandlers = {
15
15
  requestEmailVerification: "auth-email-password:write:request-email-verification",
16
16
  verifyEmail: "auth-email-password:write:verify-email",
17
17
  // Account-Unlock Magic-Link (fixes the lockout-DoS where the monotonic
18
- // failure-counter re-locks immediately after expiry, #1266). Mirrors
18
+ // failure-counter re-locks immediately after expiry). Mirrors
19
19
  // reset: request mints an HMAC token + mails it, confirm clears the
20
20
  // Redis lockout state.
21
21
  requestAccountUnlock: "auth-email-password:write:request-account-unlock",
@@ -81,7 +81,7 @@ export const AuthErrors = {
81
81
  invalidSignupToken: "invalid_signup_token",
82
82
  signupNotConfigured: "signup_not_configured",
83
83
  // Self-signup: confirm rejects an already-registered email instead of
84
- // reusing the existing user (account takeover, #365). NO
84
+ // reusing the existing user (account takeover). NO
85
85
  // anti-enumeration collapse like invalidSignupToken: whoever gets here
86
86
  // controls the inbox (has the magic link), so revealing "email exists"
87
87
  // is not new information.
@@ -101,7 +101,7 @@ export const AuthErrors = {
101
101
  // deliberate enumeration trade-off: the lockout event itself is already
102
102
  // observable to the attacker, and legit users benefit from a clear signal.
103
103
  accountLocked: "account_locked",
104
- // S2.U6 (GDPR Art. 18) — account is in Restricted status. Login is
104
+ // (GDPR Art. 18) — account is in Restricted status. Login is
105
105
  // explicitly refused with its own code (not collapsed into
106
106
  // invalid_credentials) so the UI can say "account is currently paused,
107
107
  // click here to lift it". Enumeration leak accepted: restriction is
@@ -1,15 +1,15 @@
1
1
  import type { ReactNode } from "react";
2
2
  export type DefaultTopbarActionsProps = {
3
- /** Mapped Tenant-ID auf einen sprechenden Namen (z.B. branded label
4
- * pro Tenant). TenantSwitcher's Default zeigt sonst die ersten 8
5
- * Zeichen der UUID. */
3
+ /** Maps a tenant ID to a human-readable name (for example, a branded label
4
+ * per tenant). TenantSwitcher's default otherwise displays the first 8
5
+ * characters of the UUID. */
6
6
  readonly tenantName?: (tenantId: string) => string;
7
- /** Slot zwischen TenantSwitcher und ThemeToggle. Typischer Use-Case:
8
- * LanguageSwitcher pro App. ReactNode (nicht Array) damit die App
9
- * selbst Reihenfolge + Spacing bestimmt. */
7
+ /** Slot between TenantSwitcher and ThemeToggle. Typical use case:
8
+ * an app-specific LanguageSwitcher. ReactNode, rather than an array, so the
9
+ * app controls the ordering and spacing. */
10
10
  readonly extras?: ReactNode;
11
- /** Light-Mode-Icon im ThemeToggle. Default: Unicode ☀. Apps die
12
- * Lucide-Icons o.ä. wollen, übergeben ein eigenes Icon-Element. */
11
+ /** Light-mode icon for ThemeToggle. Default: Unicode ☀. Apps that want
12
+ * Lucide icons or similar can provide a custom icon element. */
13
13
  readonly lightIcon?: ReactNode;
14
14
  /** Dark-Mode-Icon. Default: Unicode ☾. */
15
15
  readonly darkIcon?: ReactNode;
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // Standard-Topbar-Actions Komposition für Apps mit Auth + Workspaces.
3
- // Bündelt das Pattern das jeder App-Sample sonst hand-ausschreibt:
4
- // TenantSwitcher (links) → optional Extras (z.B. LanguageSwitcher) →
5
- // ThemeToggle → UserMenu (rechts). Apps mit eigener Anordnung
6
- // importieren weiter die Einzelkomponenten direkt — DefaultTopbarActions
7
- // ist Convenience, kein Muss.
2
+ // Composes the standard top-bar actions for apps with auth and workspaces.
3
+ // This bundles the pattern that each app sample would otherwise write by hand:
4
+ // TenantSwitcher (left) → optional extras (for example, LanguageSwitcher) →
5
+ // ThemeToggle → UserMenu (right). Apps with a custom arrangement can still
6
+ // import the individual components directly; DefaultTopbarActions is
7
+ // convenience, not a requirement.
8
8
  import { ThemeToggle } from "@cosmicdrift/kumiko-renderer/web";
9
9
  import { TenantSwitcher } from "./tenant-switcher.js";
10
10
  import { UserMenu } from "./user-menu.js";
@@ -2,8 +2,8 @@ import { type ReactNode } from "react";
2
2
  export type ForgotPasswordScreenProps = {
3
3
  readonly title?: string;
4
4
  readonly subtitle?: ReactNode;
5
- /** href für den "Zurück zum Login"-Link in success + form. App-
6
- * spezifisch — Default "/login". */
5
+ /** href for the "Back to login" link in the success and form states. App-
6
+ * specific — defaults to "/login". */
7
7
  readonly loginHref?: string;
8
8
  };
9
9
  export declare function ForgotPasswordScreen({ title, subtitle, loginHref, }: ForgotPasswordScreenProps): ReactNode;
@@ -1,13 +1,13 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // ForgotPasswordScreen — Form mit email-input. Submit triggert
3
- // /api/auth/request-password-reset (silent-success, kein account-
4
- // enumeration). UI zeigt unconditional ein "Wenn Account existiert,
5
- // Mail unterwegs"-Confirm — auch wenn der Server intern erkannt hat
6
- // dass die Email nicht existiert.
2
+ // ForgotPasswordScreen — form with an email input. Submission triggers
3
+ // /api/auth/request-password-reset (silent success, no account enumeration).
4
+ // The UI always shows a "If an account exists, the email is on its way"
5
+ // confirmation, even when the server determines internally that the email
6
+ // does not exist.
7
7
  //
8
- // App ist verantwortlich, den Screen unter einer URL zu mounten (z.B.
9
- // /forgot-password) und ihn zu erreichen — der LoginScreen kann einen
10
- // "Passwort vergessen?"-Link auf die App-Route setzen.
8
+ // The app is responsible for mounting and exposing the screen at a URL
9
+ // (for example, /forgot-password); the LoginScreen can link to that app
10
+ // route with a "Forgot password?" link.
11
11
  import { usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
12
12
  import { useState } from "react";
13
13
  import { requestPasswordReset } from "./auth-client.js";
@@ -19,7 +19,7 @@ export function ForgotPasswordScreen({ title, subtitle, loginHref = "/login", })
19
19
  const [submitting, setSubmitting] = useState(false);
20
20
  const [done, setDone] = useState(false);
21
21
  const [error, setError] = useState(null);
22
- // guard:dup-ok — gleiches Submit-Muster wie signup-screen, aber verschiedene API-Endpoints und State
22
+ // guard:dup-ok — same submission pattern as signup-screen, but with different API endpoints and state
23
23
  const doSubmit = async () => {
24
24
  setSubmitting(true);
25
25
  setError(null);
@@ -1,8 +1,8 @@
1
- // Public exports für die Browser-Seite des auth-email-password Features.
2
- // Wird über den Sub-Path-Export `@cosmicdrift/kumiko-bundled-features/auth-email-
3
- // password/web` konsumiert — die Server-Seite (defineFeature) lebt in
4
- // `@cosmicdrift/kumiko-bundled-features/auth-email-password` und hat keine
5
- // React-/DOM-Deps. Trennung bleibt sauber so wie renderer vs renderer/web.
1
+ // Public exports for the browser side of the auth-email-password feature.
2
+ // Consumed through the subpath export `@cosmicdrift/kumiko-bundled-features/auth-email-
3
+ // password/web`; the server side (defineFeature) lives in
4
+ // `@cosmicdrift/kumiko-bundled-features/auth-email-password` and has no
5
+ // React-/DOM dependencies. This keeps the separation clean, like renderer vs renderer/web.
6
6
  export { AuthRequestError, confirmAccountUnlock, confirmSignup, requestAccountUnlock, requestEmailVerification, requestPasswordReset, requestSignup, resetPassword, toLoginResponse, verifyEmail, } from "./auth-client.js";
7
7
  export { AuthCard, AuthShellProvider, useAuthShell } from "./auth-form-primitives.js";
8
8
  export { createLoginRoute, makeAuthGate, makeSessionAuthGate } from "./auth-gate.js";
@@ -12,7 +12,7 @@ export type InviteAcceptScreenProps = {
12
12
  tenantId: string;
13
13
  roles: readonly string[];
14
14
  }) => string);
15
- /** Login-Href für "Mit anderem Account anmelden". Default "/login". */
15
+ /** Login href for "Mit anderem Account anmelden". Default "/login". */
16
16
  readonly loginHref?: string;
17
17
  };
18
18
  export declare function InviteAcceptScreen({ title, token: tokenProp, loggedInHref, loginHref, }: InviteAcceptScreenProps): ReactNode;
@@ -1,20 +1,20 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // InviteAcceptScreen — Magic-Link-Accept für Tenant-Invitations.
2
+ // InviteAcceptScreen — accepts tenant invitations through a magic link.
3
3
  //
4
- // Liest `?token=...` aus der URL und branched intern je nach session-state:
5
- // - Logged-in + Email-Match: 1-click accept (Branch 1, dispatcher
6
- // invite-accept). Bei Email-Mismatch zeigen wir die fehlermeldung
7
- // und einen "Mit anderem Account anmelden"-Link.
8
- // - Anonymous: Email + Password-Form. Toggle "Schon einen Account?"
9
- // entscheidet Branch 2 (existing user, login + accept) vs Branch 3
10
- // (neuer user, signup + accept).
4
+ // Reads `?token=...` from the URL and selects a flow based on session state:
5
+ // - Logged in with a matching email: one-click accept (Branch 1, via the
6
+ // invite-accept dispatcher). For an email mismatch, show an error and a
7
+ // "Sign in with a different account" link.
8
+ // - Anonymous: email and password form. The "Already have an account?" toggle
9
+ // selects Branch 2 (existing user, login + accept) or Branch 3 (new user,
10
+ // signup + accept).
11
11
  //
12
- // Anti-enumeration: invalidInviteToken collapsed alle Token/User/
13
- // Password-Failures auf einen Code (gleicher Trade-off wie reset).
12
+ // Anti-enumeration: invalidInviteToken collapses token, user, and password
13
+ // failures into one code, using the same trade-off as reset.
14
14
  //
15
- // Auto-Login: Branch 2+3 setzen Cookies via Server, Frontend redirected
16
- // zu loggedInHref. Branch 1 hat schon eine Session — Frontend redirected
17
- // auch zu loggedInHref damit der invitee in seinem neuen Tenant landet.
15
+ // Auto-login: Branches 2 and 3 set cookies through the server, then the
16
+ // frontend redirects to loggedInHref. Branch 1 already has a session, but the
17
+ // frontend also redirects to loggedInHref so the invitee enters the new tenant.
18
18
  import { usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
19
19
  import { useContext, useState } from "react";
20
20
  import { csrfHeader } from "./auth-client.js";
@@ -60,7 +60,7 @@ export function InviteAcceptScreen({ title, token: tokenProp, loggedInHref = "/"
60
60
  const acceptLoggedIn = async () => {
61
61
  setSubmitting(true);
62
62
  setError(null);
63
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
63
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
64
64
  const res = await fetch("/api/auth/invite-accept", {
65
65
  method: "POST",
66
66
  credentials: "same-origin",
@@ -79,7 +79,7 @@ export function InviteAcceptScreen({ title, token: tokenProp, loggedInHref = "/"
79
79
  const acceptAnonExisting = async () => {
80
80
  setSubmitting(true);
81
81
  setError(null);
82
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
82
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
83
83
  const res = await fetch("/api/auth/invite-accept-with-login", {
84
84
  method: "POST",
85
85
  credentials: "same-origin",
@@ -98,7 +98,7 @@ export function InviteAcceptScreen({ title, token: tokenProp, loggedInHref = "/"
98
98
  const acceptAnonNew = async () => {
99
99
  setSubmitting(true);
100
100
  setError(null);
101
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
101
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
102
102
  const res = await fetch("/api/auth/invite-signup-complete", {
103
103
  method: "POST",
104
104
  credentials: "same-origin",
@@ -12,7 +12,7 @@ export type LoginScreenProps = {
12
12
  * default path once the server offers the reset flow (login-options);
13
13
  * `null` hides the link deliberately. */
14
14
  readonly forgotPasswordHref?: string | null;
15
- /** Optional href to RequestAccountUnlockScreen (#1266). When set, an
15
+ /** Optional href to RequestAccountUnlockScreen. When set, an
16
16
  * account_locked login error renders an "Unlock account?" link inline —
17
17
  * the account-lockout escape hatch, since forgotPasswordHref does NOT
18
18
  * help here: the lockout gate blocks login before password verify even
@@ -9,9 +9,8 @@ import { DEFAULT_AUTH_PATHS, DEFAULT_FORGOT_PASSWORD_PATH } from "./auth-paths.j
9
9
  import { followNextOrLandingAfterLogin } from "./auth-redirect.js";
10
10
  import { AuthQueries } from "./constants.js";
11
11
  import { useSession } from "./session.js";
12
- // Map vom Reason-Code des Login-Handlers auf einen i18n-Key plus
13
- // optional extrahierte Interpolations-Parameter. Ungekannte Codes
14
- // fallen auf `auth.errors.loginFailed` zurück.
12
+ // Maps login-handler reason codes to i18n keys and optional interpolation parameters.
13
+ // Unknown codes fall back to `auth.errors.loginFailed`.
15
14
  function reasonToKey(failure) {
16
15
  switch (failure.reason) {
17
16
  case "invalid_credentials":
@@ -1,11 +1,11 @@
1
1
  import { type ReactNode } from "react";
2
2
  export type ResetPasswordScreenProps = {
3
3
  readonly title?: string;
4
- /** Override für den Token aus der URL — Apps die per server-side-
5
- * Render einen Token reinreichen, brauchen das. Default: parsed aus
6
- * `?token=...` in der URL. */
4
+ /** Override for the token from the URL. Apps that pass a token during
5
+ * server-side rendering need this. Default: parsed from `?token=...` in
6
+ * the URL. */
7
7
  readonly token?: string;
8
- /** href für "Zum Login"-Link nach Success. Default "/login". */
8
+ /** href for the "Zum Login" link after success. Default "/login". */
9
9
  readonly loginHref?: string;
10
10
  };
11
11
  export declare function ResetPasswordScreen({ title, token: tokenProp, loginHref, }: ResetPasswordScreenProps): ReactNode;
@@ -1,14 +1,13 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // ResetPasswordScreen — liest `?token=...` aus der URL, zeigt Form mit
3
- // new + confirm-password. Submit triggert /api/auth/reset-password mit
4
- // dem Token. Server collapses alle Token-Verify-Failures auf einen
5
- // Code (anti-enumeration); UI zeigt unified "Link ungültig oder
6
- // abgelaufen"-message.
2
+ // ResetPasswordScreen reads `?token=...` from the URL and shows fields for
3
+ // a new and confirmed password. Submission calls /api/auth/reset-password
4
+ // with the token. The server collapses all token-verification failures into
5
+ // one code (anti-enumeration), so the UI shows the unified "link invalid or
6
+ // expired" message.
7
7
  //
8
- // Token-Quelle ist read-once via useUrlToken(): liest `?token=...` beim
9
- // Mount und scrubbt den Param danach aus der URL (#774). Apps die das
10
- // anders brauchen (server-injected Token-Prop) reichen `token` als Prop
11
- // durch — dann bleibt die URL unangetastet.
8
+ // The token is read once via useUrlToken(): `?token=...` is read on mount and
9
+ // then scrubbed from the URL. Apps that need different behavior can pass a
10
+ // server-injected token through the `token` prop; the URL is then left intact.
12
11
  import { usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
13
12
  import { useState } from "react";
14
13
  import { resetPassword } from "./auth-client.js";
@@ -56,10 +55,10 @@ export function ResetPasswordScreen({ title, token: tokenProp, loginHref = "/log
56
55
  void doSubmit();
57
56
  };
58
57
  const effectiveTitle = title ?? t("auth.resetPassword.title");
59
- // Kein Token in der URL → User soll den Link aus seiner Mail nochmal
60
- // klicken oder einen neuen Reset anfordern. Form ohne Token zu
61
- // submitten würde nur den invalidResetToken-Error zeigen — das ist
62
- // verwirrend. Lieber upfront eine klare Message.
58
+ // No token in the URL: the user should click the link from their email again
59
+ // or request a new reset. Submitting without a token would only show the
60
+ // invalidResetToken error, which is confusing, so show a clear message
61
+ // immediately instead.
63
62
  if (token === "") {
64
63
  return (_jsxs(AuthCard, { title: effectiveTitle, children: [_jsx("p", { className: "text-sm text-muted-foreground", children: t("auth.resetPassword.missingToken") }), _jsx(Link, { href: loginHref, variant: "muted", children: t("auth.resetPassword.goToLogin") })] }));
65
64
  }
@@ -11,11 +11,12 @@ export type SessionState = {
11
11
  readonly user: CurrentUserProfile | null;
12
12
  readonly activeTenantId: string | null;
13
13
  readonly tenants: readonly TenantSummary[];
14
- /** Merged session-roles für den active tenant: globalRoles (z.B.
15
- * SystemAdmin) + membership-roles des activeTenant. Server hat sie
16
- * schon im JWT gemerged, aber das JWT ist HttpOnly + nicht JS-lesbar;
17
- * Client computed dieselbe merge-Logik aus user.globalRoles +
18
- * tenants[active].roles damit nav-filtering greift. Dedupliziert. */
14
+ /** Merged session roles for the active tenant: globalRoles (for example,
15
+ * SystemAdmin) plus the active tenant's membership roles. The server has
16
+ * already merged them into the JWT, but the JWT is HttpOnly and cannot be
17
+ * read by JavaScript; the client computes the same merge from
18
+ * user.globalRoles + tenants[active].roles so navigation filtering works.
19
+ * The result is deduplicated. */
19
20
  readonly roles: readonly string[];
20
21
  readonly bootstrapFailure: SessionBootstrapFailure | null;
21
22
  /** Set when an authenticated session was ended server-side (revoked,
@@ -35,10 +36,10 @@ export type SessionApi = SessionState & {
35
36
  export declare const UNAUTHENTICATED: SessionState;
36
37
  export declare function hasLikelyAuthSession(cookieSource?: string): boolean;
37
38
  export declare function computeActiveRoles(user: CurrentUserProfile | null, activeTenantId: string | null, tenants: readonly TenantSummary[]): readonly string[];
38
- /** Internal — exposed for tests die einen Mock-SessionApi-Wert reinreichen
39
- * wollen, ohne durch SessionProvider's refresh-Lifecycle zu müssen. App-
40
- * Code nutzt SessionProvider + useSession; direkter Context-Zugriff ist
41
- * für Tests/Stories. */
39
+ /** Internal — exposed so tests can pass a mock SessionApi value
40
+ * without going through SessionProvider's refresh lifecycle. Application
41
+ * code uses SessionProvider + useSession; direct context access is
42
+ * intended for tests/stories. */
42
43
  export declare const SessionContext: import("react").Context<SessionApi | undefined>;
43
44
  export declare function SessionProvider({ children, postLogoutUrl, }: {
44
45
  readonly children: ReactNode;
@@ -1,13 +1,13 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- // Session-State für den Browser-Renderer. Hält den aktuell eingeloggten
3
- // User (Profile + aktive Tenant-Zuordnung + Memberships), reagiert auf
4
- // Login/Logout/Switch-Tenant und refresh't die Daten automatisch.
2
+ // Session state for the browser renderer. Holds the currently signed-in
3
+ // user (profile + active tenant assignment + memberships), responds to
4
+ // login/logout/tenant switching, and refreshes the data automatically.
5
5
  //
6
- // Warum Context + useReducer statt z.B. Zustand? Weil die State-Menge
7
- // klein ist (ein Handful Felder, ein paar Transitionen) und wir damit
8
- // eine Dependency weniger im Browser-Bundle haben. Die Consumer leben
9
- // unter `<SessionProvider>`; der `useSession()`-Hook liefert den State
10
- // und die Transitions.
6
+ // Context + useReducer is used instead of, for example, Zustand because
7
+ // the state is small (a handful of fields and a few transitions), avoiding
8
+ // another dependency in the browser bundle. Consumers live under
9
+ // `<SessionProvider>`; the `useSession()` hook provides the state
10
+ // and transitions.
11
11
  import { CurrentUserProvider, useSessionEndedSignal, } from "@cosmicdrift/kumiko-renderer";
12
12
  import { readCsrfToken } from "@cosmicdrift/kumiko-renderer/live";
13
13
  import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from "react";
@@ -34,14 +34,14 @@ const INITIAL = {
34
34
  bootstrapFailure: null,
35
35
  signedOutReason: null,
36
36
  };
37
- // kumiko_auth ist HttpOnly — kumiko_csrf wird beim Login gemeinsam gesetzt.
37
+ // kumiko_auth is HttpOnly; kumiko_csrf is set together with it at login.
38
38
  export function hasLikelyAuthSession(cookieSource) {
39
39
  return readCsrfToken(cookieSource) !== undefined;
40
40
  }
41
- // Exported damit tests den merge-pfad direkt pinnen können — der hier
42
- // muss byte-identisch zum server-side merge in auth-routes.ts +
43
- // login.write.ts sein, sonst sieht der Client andere session-rollen
44
- // als der Server.
41
+ // Exported so tests can pin the merge path directly: this must be
42
+ // byte-identical to the server-side merge in auth-routes.ts +
43
+ // login.write.ts, otherwise the client sees different session roles
44
+ // from the server.
45
45
  export function computeActiveRoles(user, activeTenantId, tenants) {
46
46
  if (user === null)
47
47
  return [];
@@ -51,13 +51,13 @@ export function computeActiveRoles(user, activeTenantId, tenants) {
51
51
  // login.write.ts).
52
52
  return Array.from(new Set([...user.globalRoles, ...membershipRoles]));
53
53
  }
54
- /** Internal — exposed for tests die einen Mock-SessionApi-Wert reinreichen
55
- * wollen, ohne durch SessionProvider's refresh-Lifecycle zu müssen. App-
56
- * Code nutzt SessionProvider + useSession; direkter Context-Zugriff ist
57
- * für Tests/Stories. */
54
+ /** Internal — exposed so tests can pass a mock SessionApi value
55
+ * without going through SessionProvider's refresh lifecycle. Application
56
+ * code uses SessionProvider + useSession; direct context access is
57
+ * intended for tests/stories. */
58
58
  export const SessionContext = createContext(undefined);
59
- // Eine Refresh-Runde: /auth/tenants → wenn 401 nicht-eingeloggt, sonst
60
- // /user:me. Beides zusammen ergibt den vollen SessionState.
59
+ // One refresh round: /auth/tenants → if 401, unauthenticated; otherwise
60
+ // /user:me. Together, both requests produce the complete SessionState.
61
61
  async function refresh() {
62
62
  if (!hasLikelyAuthSession()) {
63
63
  return UNAUTHENTICATED;
@@ -103,14 +103,14 @@ export function SessionProvider({ children, postLogoutUrl, }) {
103
103
  setState({ ...UNAUTHENTICATED, status: "error", bootstrapFailure: toBootstrapFailure(err) });
104
104
  }
105
105
  }, []);
106
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
106
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
107
107
  useEffect(() => {
108
108
  void doRefresh();
109
109
  }, [doRefresh]);
110
110
  const sessionEndedSignal = useSessionEndedSignal();
111
111
  // Only an authenticated session can "end": an anonymous 401 on a public
112
112
  // surface must not show the hint.
113
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
113
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
114
114
  useEffect(() => {
115
115
  return sessionEndedSignal?.subscribe(() => {
116
116
  setState((prev) => prev.status === "authenticated"
@@ -134,20 +134,19 @@ export function SessionProvider({ children, postLogoutUrl, }) {
134
134
  return;
135
135
  }
136
136
  setState(UNAUTHENTICATED);
137
- // Hard-Reload: React-Tree, dispatcher-live-Caches, EventSource —
138
- // alles fliegt auf Null. Nach Logout ist das der billigste Weg zu
139
- // sauberer Ausgangslage, ohne dass wir jeden einzelnen Consumer
140
- // per Context-Bust invalidieren müssen.
137
+ // Hard reload: the React tree, dispatcher live caches, and EventSource
138
+ // are all reset. After logout, this is the cheapest way to reach a clean
139
+ // state without having to invalidate every consumer through a context
140
+ // reset.
141
141
  if (typeof window !== "undefined") {
142
142
  window.location.reload();
143
143
  }
144
144
  }, [postLogoutUrl]);
145
145
  const switchTenant = useCallback(async (tenantId) => {
146
146
  await switchTenantApi(tenantId);
147
- // Tenant-Wechsel rotiert JWT + Cookies. React-Tree enthält
148
- // tenant-gebundene Caches (Queries, Live-Events) — simpler
149
- // Reload ist konsistent mit dem Logout-Pfad und vermeidet
150
- // halbe State-Übergänge.
147
+ // Tenant switching rotates the JWT + cookies. The React tree contains
148
+ // tenant-bound caches (queries, live events), so a simple reload is
149
+ // consistent with the logout path and avoids partial state transitions.
151
150
  if (typeof window !== "undefined") {
152
151
  window.location.reload();
153
152
  }
@@ -6,7 +6,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
6
  // JWT + cookies (auto-login!) and returns the tenantKey.
7
7
  //
8
8
  // Token source is read-once via useUrlToken: reads `?token=...` on mount
9
- // and scrubs the param from the URL afterwards (#774). Apps that inject a
9
+ // and scrubs the param from the URL afterwards. Apps that inject a
10
10
  // server-side token pass `token` as a prop instead.
11
11
  //
12
12
  // On success: shows a confirmation (account active, signed in) with a
@@ -82,8 +82,8 @@ export function SignupCompleteScreen({ title, token: tokenProp, loggedInHref = "
82
82
  (continueHref !== null
83
83
  ? t("auth.signupComplete.activatedTitle")
84
84
  : t("auth.signupComplete.title"));
85
- // Kein Token in der URL → klare Message statt Form ohne Token
86
- // (würde nur invalidSignupToken zeigen, verwirrend).
85
+ // No token in the URL → show a clear message instead of a form without a token
86
+ // (which would only show invalidSignupToken and confuse the user).
87
87
  if (token === "") {
88
88
  return (_jsxs(AuthCard, { title: effectiveTitle, children: [_jsx("p", { className: "text-sm text-muted-foreground", children: t("auth.signupComplete.missingToken") }), _jsx(Link, { href: loginHref, variant: "muted", children: t("auth.signup.haveAccount") })] }));
89
89
  }
@@ -2,7 +2,7 @@ import { type ReactNode } from "react";
2
2
  export type SignupScreenProps = {
3
3
  readonly title?: string;
4
4
  readonly subtitle?: ReactNode;
5
- /** href für den "Bereits einen Account?"-Link. App-spezifisch — Default
5
+ /** href for the "Already have an account?" link. App-specific; defaults to
6
6
  * "/login". */
7
7
  readonly loginHref?: string;
8
8
  };