@cosmicdrift/kumiko-samples 0.385.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 (395) hide show
  1. package/LICENSE +21 -57
  2. package/README.md +1 -1
  3. package/package.json +2 -2
  4. package/packages/bundled-features/package.json +2 -2
  5. package/packages/bundled-features/src/agent-tools/tool-catalog.ts +1 -1
  6. package/packages/bundled-features/src/agent-tools/tool-dispatch.ts +0 -2
  7. package/packages/bundled-features/src/audit/screens.ts +1 -1
  8. package/packages/bundled-features/src/auth-email-password/auth-user-row.ts +10 -10
  9. package/packages/bundled-features/src/auth-email-password/feature.ts +6 -6
  10. package/packages/bundled-features/src/auth-email-password/handlers/change-password.write.ts +3 -3
  11. package/packages/bundled-features/src/auth-email-password/handlers/confirm-token-flow.ts +5 -5
  12. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +1 -1
  13. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept.write.ts +18 -18
  14. package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +12 -12
  15. package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +1 -1
  16. package/packages/bundled-features/src/auth-email-password/handlers/invite-signup-complete.write.ts +24 -26
  17. package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +1 -1
  18. package/packages/bundled-features/src/auth-email-password/handlers/self-registration-status.query.ts +1 -1
  19. package/packages/bundled-features/src/auth-email-password/handlers/signup-confirm.write.ts +34 -37
  20. package/packages/bundled-features/src/auth-email-password/handlers/signup-request.write.ts +6 -7
  21. package/packages/bundled-features/src/auth-email-password/handlers/switch-tenant-mfa-gate.write.ts +1 -5
  22. package/packages/bundled-features/src/auth-email-password/index.ts +5 -5
  23. package/packages/bundled-features/src/auth-email-password/lockout-store.ts +1 -1
  24. package/packages/bundled-features/src/auth-email-password/seeding.ts +63 -66
  25. package/packages/bundled-features/src/auth-email-password/signup-token-store.ts +8 -8
  26. package/packages/bundled-features/src/auth-email-password/testing.ts +3 -3
  27. package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +57 -57
  28. package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +14 -14
  29. package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +15 -16
  30. package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +11 -12
  31. package/packages/bundled-features/src/auth-email-password/web/confirm-account-unlock-screen.tsx +1 -1
  32. package/packages/bundled-features/src/auth-email-password/web/constants.ts +3 -3
  33. package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +14 -14
  34. package/packages/bundled-features/src/auth-email-password/web/forgot-password-screen.tsx +11 -11
  35. package/packages/bundled-features/src/auth-email-password/web/index.ts +5 -5
  36. package/packages/bundled-features/src/auth-email-password/web/invite-accept-screen.tsx +17 -17
  37. package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +3 -4
  38. package/packages/bundled-features/src/auth-email-password/web/reset-password-screen.tsx +16 -17
  39. package/packages/bundled-features/src/auth-email-password/web/session.tsx +34 -34
  40. package/packages/bundled-features/src/auth-email-password/web/signup-complete-screen.tsx +3 -3
  41. package/packages/bundled-features/src/auth-email-password/web/signup-screen.tsx +14 -14
  42. package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +26 -27
  43. package/packages/bundled-features/src/auth-email-password/web/use-shell-user.ts +12 -13
  44. package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +17 -18
  45. package/packages/bundled-features/src/auth-email-password/web/verify-email-screen.tsx +11 -12
  46. package/packages/bundled-features/src/auth-foundation/boot-checks.ts +4 -4
  47. package/packages/bundled-features/src/auth-foundation/resolve-anonymous-access.ts +4 -4
  48. package/packages/bundled-features/src/auth-foundation/types.ts +2 -2
  49. package/packages/bundled-features/src/auth-mfa/handlers/disable.write.ts +3 -3
  50. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +4 -4
  51. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm.write.ts +2 -2
  52. package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +1 -1
  53. package/packages/bundled-features/src/auth-mfa/handlers/reencrypt.job.ts +1 -1
  54. package/packages/bundled-features/src/auth-mfa/handlers/regenerate-recovery.write.ts +5 -5
  55. package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +1 -1
  56. package/packages/bundled-features/src/auth-mfa/token-secrets.ts +1 -1
  57. package/packages/bundled-features/src/auth-mfa/web/client-plugin.ts +2 -2
  58. package/packages/bundled-features/src/auth-mfa/web/i18n.ts +3 -3
  59. package/packages/bundled-features/src/auth-mfa/web/index.ts +4 -4
  60. package/packages/bundled-features/src/auth-mfa/web/mfa-client.ts +17 -16
  61. package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +6 -6
  62. package/packages/bundled-features/src/billing-foundation/aggregate-id.ts +10 -11
  63. package/packages/bundled-features/src/billing-foundation/entities.ts +27 -27
  64. package/packages/bundled-features/src/billing-foundation/events.ts +22 -21
  65. package/packages/bundled-features/src/billing-foundation/feature.ts +42 -43
  66. package/packages/bundled-features/src/billing-foundation/get-subscription-for-tenant.ts +3 -5
  67. package/packages/bundled-features/src/billing-foundation/handlers/create-checkout-session.write.ts +18 -17
  68. package/packages/bundled-features/src/billing-foundation/handlers/create-portal-session.write.ts +11 -12
  69. package/packages/bundled-features/src/billing-foundation/handlers/list-subscriptions.query.ts +4 -4
  70. package/packages/bundled-features/src/billing-foundation/handlers/process-event.write.ts +20 -20
  71. package/packages/bundled-features/src/billing-foundation/projection.ts +38 -37
  72. package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +3 -3
  73. package/packages/bundled-features/src/billing-foundation/tenant-destroy-hook.ts +7 -8
  74. package/packages/bundled-features/src/billing-foundation/types.ts +64 -65
  75. package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +4 -4
  76. package/packages/bundled-features/src/billing-foundation/webhook-handler.ts +1 -1
  77. package/packages/bundled-features/src/cap-counter/aggregate-id.ts +8 -9
  78. package/packages/bundled-features/src/cap-counter/constants.ts +11 -12
  79. package/packages/bundled-features/src/cap-counter/enforce-cap.ts +64 -67
  80. package/packages/bundled-features/src/cap-counter/entity.ts +29 -29
  81. package/packages/bundled-features/src/cap-counter/feature.ts +34 -35
  82. package/packages/bundled-features/src/cap-counter/handlers/increment-rolling.write.ts +31 -31
  83. package/packages/bundled-features/src/cap-counter/handlers/mark-soft-warned.write.ts +4 -5
  84. package/packages/bundled-features/src/cap-counter/stock-cap-guard.ts +1 -1
  85. package/packages/bundled-features/src/cap-counter/with-cap-enforcement.ts +3 -5
  86. package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +1 -3
  87. package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +1 -1
  88. package/packages/bundled-features/src/channel-email/smtp-transport.ts +34 -31
  89. package/packages/bundled-features/src/channel-in-app/handlers/unread-count.query.ts +3 -4
  90. package/packages/bundled-features/src/compliance-profiles/feature.ts +15 -16
  91. package/packages/bundled-features/src/compliance-profiles/handlers/for-tenant.query.ts +3 -6
  92. package/packages/bundled-features/src/compliance-profiles/handlers/list-profiles.query.ts +5 -5
  93. package/packages/bundled-features/src/compliance-profiles/handlers/needs-profile.query.ts +4 -4
  94. package/packages/bundled-features/src/compliance-profiles/handlers/set-profile.write.ts +13 -14
  95. package/packages/bundled-features/src/compliance-profiles/handlers/sub-processors.query.ts +9 -11
  96. package/packages/bundled-features/src/compliance-profiles/resolve-for-tenant.ts +7 -7
  97. package/packages/bundled-features/src/compliance-profiles/schema/profile-selection.ts +18 -23
  98. package/packages/bundled-features/src/compliance-profiles/seeding.ts +14 -15
  99. package/packages/bundled-features/src/compliance-profiles-ops/handlers/tenants-missing-profile.query.ts +3 -3
  100. package/packages/bundled-features/src/compliance-profiles-ops/index.ts +2 -2
  101. package/packages/bundled-features/src/config/handlers/readiness.query.ts +7 -7
  102. package/packages/bundled-features/src/config/handlers/reencrypt.job.ts +4 -5
  103. package/packages/bundled-features/src/config/handlers/set.write.ts +4 -4
  104. package/packages/bundled-features/src/config/resolver.ts +4 -4
  105. package/packages/bundled-features/src/config/table.ts +10 -10
  106. package/packages/bundled-features/src/config/write-helpers.ts +1 -1
  107. package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +13 -12
  108. package/packages/bundled-features/src/custom-fields/aggregate-id.ts +16 -17
  109. package/packages/bundled-features/src/custom-fields/entity.ts +49 -47
  110. package/packages/bundled-features/src/custom-fields/events.ts +7 -8
  111. package/packages/bundled-features/src/custom-fields/feature.ts +70 -72
  112. package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +9 -8
  113. package/packages/bundled-features/src/custom-fields/handlers/define-tenant-field.write.ts +28 -26
  114. package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +6 -7
  115. package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +12 -13
  116. package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +25 -28
  117. package/packages/bundled-features/src/custom-fields/handlers/update-tenant-field.write.ts +6 -6
  118. package/packages/bundled-features/src/custom-fields/lib/field-access.ts +2 -2
  119. package/packages/bundled-features/src/custom-fields/lib/parse-serialized-field.ts +1 -1
  120. package/packages/bundled-features/src/custom-fields/lib/quota.ts +1 -1
  121. package/packages/bundled-features/src/custom-fields/lib/value-schema.ts +10 -12
  122. package/packages/bundled-features/src/custom-fields/run-retention.ts +3 -3
  123. package/packages/bundled-features/src/custom-fields/schemas.ts +14 -14
  124. package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +2 -5
  125. package/packages/bundled-features/src/custom-fields/web/constants.ts +2 -2
  126. package/packages/bundled-features/src/custom-fields/web/custom-fields-form-section.tsx +26 -26
  127. package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +65 -67
  128. package/packages/bundled-features/src/custom-fields/wire-user-data-rights.ts +3 -3
  129. package/packages/bundled-features/src/data-retention/_internal/parse-override.ts +2 -3
  130. package/packages/bundled-features/src/data-retention/feature.ts +11 -18
  131. package/packages/bundled-features/src/data-retention/handlers/policy-for.query.ts +6 -6
  132. package/packages/bundled-features/src/data-retention/keep-for.ts +17 -17
  133. package/packages/bundled-features/src/data-retention/override-schema.ts +13 -15
  134. package/packages/bundled-features/src/data-retention/presets.ts +18 -23
  135. package/packages/bundled-features/src/data-retention/resolve-for-tenant.ts +1 -1
  136. package/packages/bundled-features/src/data-retention/resolve-tenant-preset.ts +17 -16
  137. package/packages/bundled-features/src/data-retention/resolver.ts +33 -32
  138. package/packages/bundled-features/src/data-retention/run-retention-cleanup.ts +71 -58
  139. package/packages/bundled-features/src/data-retention/schema/tenant-retention-override.ts +13 -11
  140. package/packages/bundled-features/src/delivery/feature.ts +3 -3
  141. package/packages/bundled-features/src/delivery/handlers/log.query.ts +1 -1
  142. package/packages/bundled-features/src/delivery/tables.ts +9 -8
  143. package/packages/bundled-features/src/delivery/unsubscribe.ts +4 -4
  144. package/packages/bundled-features/src/delivery/upsert-preference.ts +3 -4
  145. package/packages/bundled-features/src/document-ingest-foundation/entity.ts +5 -5
  146. package/packages/bundled-features/src/document-ingest-foundation/events.ts +2 -2
  147. package/packages/bundled-features/src/document-ingest-foundation/feature.ts +2 -2
  148. package/packages/bundled-features/src/document-ingest-foundation/pages.ts +1 -1
  149. package/packages/bundled-features/src/document-ingest-foundation/tenant-destroy-hook.ts +4 -4
  150. package/packages/bundled-features/src/feature-toggles/compose-tier-resolver.ts +1 -1
  151. package/packages/bundled-features/src/feature-toggles/feature.ts +1 -1
  152. package/packages/bundled-features/src/feature-toggles/global-feature-state-table.ts +1 -1
  153. package/packages/bundled-features/src/feature-toggles/handlers/registered.query.ts +5 -5
  154. package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +1 -1
  155. package/packages/bundled-features/src/feature-toggles/toggle-sync-signal.ts +1 -1
  156. package/packages/bundled-features/src/feature-toggles/web/constants.ts +1 -1
  157. package/packages/bundled-features/src/file-derivatives/feature.ts +2 -2
  158. package/packages/bundled-features/src/file-derivatives/handlers/public-variant.query.ts +1 -1
  159. package/packages/bundled-features/src/file-derivatives/presets.ts +1 -1
  160. package/packages/bundled-features/src/file-foundation/feature.ts +6 -6
  161. package/packages/bundled-features/src/file-provider-inmemory/feature.ts +16 -16
  162. package/packages/bundled-features/src/file-provider-s3/feature.ts +16 -16
  163. package/packages/bundled-features/src/file-provider-s3/lib/s3-provider.ts +6 -6
  164. package/packages/bundled-features/src/files/feature.ts +6 -6
  165. package/packages/bundled-features/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +5 -5
  166. package/packages/bundled-features/src/files-tenant-data/hooks.ts +24 -26
  167. package/packages/bundled-features/src/files-tenant-data/index.ts +1 -1
  168. package/packages/bundled-features/src/folders/feature.ts +1 -1
  169. package/packages/bundled-features/src/folders/web/folder-manager.tsx +2 -2
  170. package/packages/bundled-features/src/folders/web/tree.ts +5 -5
  171. package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +1 -1
  172. package/packages/bundled-features/src/form-draft/db/queries/owned-file-refs.ts +1 -1
  173. package/packages/bundled-features/src/form-draft/entity.ts +3 -3
  174. package/packages/bundled-features/src/form-draft/feature.ts +4 -5
  175. package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +1 -1
  176. package/packages/bundled-features/src/form-draft/release-file-refs.ts +6 -6
  177. package/packages/bundled-features/src/form-draft/schemas.ts +3 -3
  178. package/packages/bundled-features/src/form-draft/web/constants.ts +0 -2
  179. package/packages/bundled-features/src/inbound-mail-foundation/aggregate-id.ts +19 -19
  180. package/packages/bundled-features/src/inbound-mail-foundation/connect-routes.ts +4 -3
  181. package/packages/bundled-features/src/inbound-mail-foundation/constants.ts +30 -33
  182. package/packages/bundled-features/src/inbound-mail-foundation/entities.ts +47 -48
  183. package/packages/bundled-features/src/inbound-mail-foundation/events.ts +54 -50
  184. package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +39 -39
  185. package/packages/bundled-features/src/inbound-mail-foundation/handlers/account-state.ts +8 -8
  186. package/packages/bundled-features/src/inbound-mail-foundation/handlers/connect-account.write.ts +25 -26
  187. package/packages/bundled-features/src/inbound-mail-foundation/handlers/disconnect-account.write.ts +7 -7
  188. package/packages/bundled-features/src/inbound-mail-foundation/handlers/ingest-message.write.ts +50 -51
  189. package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-accounts.query.ts +8 -8
  190. package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-messages.query.ts +10 -10
  191. package/packages/bundled-features/src/inbound-mail-foundation/handlers/scope-visibility.ts +3 -4
  192. package/packages/bundled-features/src/inbound-mail-foundation/handlers/update-account.write.ts +11 -11
  193. package/packages/bundled-features/src/inbound-mail-foundation/oauth-state.ts +16 -15
  194. package/packages/bundled-features/src/inbound-mail-foundation/projection.ts +31 -29
  195. package/packages/bundled-features/src/inbound-mail-foundation/provider-factory.ts +9 -9
  196. package/packages/bundled-features/src/inbound-mail-foundation/retention-sweep.ts +45 -41
  197. package/packages/bundled-features/src/inbound-mail-foundation/tenant-destroy-hook.ts +14 -16
  198. package/packages/bundled-features/src/inbound-mail-foundation/types.ts +66 -67
  199. package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor.ts +69 -68
  200. package/packages/bundled-features/src/inbound-provider-imap/credential-document.ts +13 -13
  201. package/packages/bundled-features/src/inbound-provider-imap/feature.ts +42 -40
  202. package/packages/bundled-features/src/inbound-provider-imap/imap-client.ts +20 -19
  203. package/packages/bundled-features/src/inbound-provider-inmemory/feature.ts +21 -21
  204. package/packages/bundled-features/src/jobs/db/queries/retention.ts +2 -2
  205. package/packages/bundled-features/src/jobs/db/queries/stale-run-sweep.ts +3 -3
  206. package/packages/bundled-features/src/jobs/events.ts +1 -1
  207. package/packages/bundled-features/src/jobs/feature.ts +6 -7
  208. package/packages/bundled-features/src/jobs/handlers/detail.query.ts +4 -4
  209. package/packages/bundled-features/src/jobs/handlers/list.query.ts +1 -1
  210. package/packages/bundled-features/src/jobs/handlers/projection-rebuild.job.ts +1 -1
  211. package/packages/bundled-features/src/jobs/handlers/reindex-entity.job.ts +1 -1
  212. package/packages/bundled-features/src/jobs/handlers/retry.write.ts +1 -1
  213. package/packages/bundled-features/src/jobs/job-instant.ts +1 -1
  214. package/packages/bundled-features/src/jobs/job-run-logger.ts +14 -15
  215. package/packages/bundled-features/src/jobs/job-run-table.ts +3 -3
  216. package/packages/bundled-features/src/jobs/screens.ts +1 -1
  217. package/packages/bundled-features/src/jobs/tenant-job-failure-table.ts +1 -1
  218. package/packages/bundled-features/src/jobs/tenant-job-run-table.ts +1 -1
  219. package/packages/bundled-features/src/ledger/entity.ts +5 -5
  220. package/packages/bundled-features/src/ledger/feature.ts +3 -3
  221. package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +3 -3
  222. package/packages/bundled-features/src/ledger/recurring.ts +12 -12
  223. package/packages/bundled-features/src/ledger/schemas.ts +1 -1
  224. package/packages/bundled-features/src/ledger/web/constants.ts +2 -2
  225. package/packages/bundled-features/src/ledger/web/index.ts +7 -7
  226. package/packages/bundled-features/src/legal-pages/feature.ts +40 -41
  227. package/packages/bundled-features/src/legal-pages/markdown.ts +3 -3
  228. package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +23 -24
  229. package/packages/bundled-features/src/legal-pages/web/index.ts +0 -2
  230. package/packages/bundled-features/src/mail-foundation/feature.ts +26 -27
  231. package/packages/bundled-features/src/mail-transport-inmemory/feature.ts +27 -28
  232. package/packages/bundled-features/src/mail-transport-smtp/feature.ts +20 -20
  233. package/packages/bundled-features/src/managed-pages/branding.ts +6 -6
  234. package/packages/bundled-features/src/managed-pages/feature.ts +62 -62
  235. package/packages/bundled-features/src/managed-pages/handlers/by-slug.query.ts +5 -6
  236. package/packages/bundled-features/src/managed-pages/handlers/by-tenant-published.query.ts +8 -8
  237. package/packages/bundled-features/src/managed-pages/handlers/set.write.ts +5 -7
  238. package/packages/bundled-features/src/managed-pages/screens/page-screens.ts +11 -11
  239. package/packages/bundled-features/src/managed-pages/seeding.ts +8 -8
  240. package/packages/bundled-features/src/managed-pages/table.ts +16 -15
  241. package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +6 -6
  242. package/packages/bundled-features/src/managed-pages/web/i18n.ts +1 -1
  243. package/packages/bundled-features/src/notes-history/entity.ts +4 -4
  244. package/packages/bundled-features/src/notes-history/feature.ts +2 -2
  245. package/packages/bundled-features/src/notes-history-user-data/hooks.ts +1 -1
  246. package/packages/bundled-features/src/page-render/layout.ts +9 -9
  247. package/packages/bundled-features/src/page-render/markdown.ts +11 -11
  248. package/packages/bundled-features/src/page-render/security-headers.ts +7 -6
  249. package/packages/bundled-features/src/personal-access-tokens/feature.ts +5 -5
  250. package/packages/bundled-features/src/personal-access-tokens/roles.ts +2 -2
  251. package/packages/bundled-features/src/readiness/handlers/status.query.ts +3 -3
  252. package/packages/bundled-features/src/renderer-foundation/api.ts +12 -13
  253. package/packages/bundled-features/src/renderer-foundation/constants.ts +2 -2
  254. package/packages/bundled-features/src/renderer-foundation/feature.ts +7 -7
  255. package/packages/bundled-features/src/renderer-foundation/types.ts +11 -12
  256. package/packages/bundled-features/src/secrets/feature.ts +9 -9
  257. package/packages/bundled-features/src/secrets/web/constants.ts +2 -2
  258. package/packages/bundled-features/src/seo/feature.ts +3 -3
  259. package/packages/bundled-features/src/sessions/constants.ts +1 -1
  260. package/packages/bundled-features/src/sessions/feature.ts +9 -9
  261. package/packages/bundled-features/src/sessions/handlers/revoke-all-for-user.write.ts +2 -2
  262. package/packages/bundled-features/src/sessions/handlers/revoke-all-others.write.ts +2 -2
  263. package/packages/bundled-features/src/sessions/handlers/revoke.write.ts +1 -1
  264. package/packages/bundled-features/src/sessions/schema/user-session.ts +4 -4
  265. package/packages/bundled-features/src/sessions/screens.ts +2 -2
  266. package/packages/bundled-features/src/sessions/session-callbacks.ts +2 -2
  267. package/packages/bundled-features/src/sessions/session-revoked-event.ts +2 -2
  268. package/packages/bundled-features/src/shared/assert-no-where-rule-in-ownership-write.ts +1 -1
  269. package/packages/bundled-features/src/shared/decrypt-stored-pii.ts +1 -1
  270. package/packages/bundled-features/src/shared/encrypt-for-direct-write.ts +1 -1
  271. package/packages/bundled-features/src/shared/map-with-concurrency.ts +5 -4
  272. package/packages/bundled-features/src/shared/parent-visibility.ts +2 -2
  273. package/packages/bundled-features/src/shared/password-hashing.ts +1 -1
  274. package/packages/bundled-features/src/shared/signup-handover.ts +1 -2
  275. package/packages/bundled-features/src/shared/single-use-token-store.ts +1 -1
  276. package/packages/bundled-features/src/subscription-mollie/constants.ts +15 -17
  277. package/packages/bundled-features/src/subscription-mollie/feature.ts +41 -42
  278. package/packages/bundled-features/src/subscription-mollie/index.ts +3 -3
  279. package/packages/bundled-features/src/subscription-mollie/plugin-methods.ts +17 -16
  280. package/packages/bundled-features/src/subscription-mollie/verify-webhook.ts +34 -34
  281. package/packages/bundled-features/src/subscription-stripe/constants.ts +4 -6
  282. package/packages/bundled-features/src/subscription-stripe/feature.ts +44 -43
  283. package/packages/bundled-features/src/subscription-stripe/index.ts +6 -6
  284. package/packages/bundled-features/src/subscription-stripe/plugin-methods.ts +22 -27
  285. package/packages/bundled-features/src/subscription-stripe/runtime.ts +2 -2
  286. package/packages/bundled-features/src/subscription-stripe/verify-webhook.ts +62 -64
  287. package/packages/bundled-features/src/tags/feature.ts +3 -3
  288. package/packages/bundled-features/src/tags/screens.ts +1 -1
  289. package/packages/bundled-features/src/template-resolver/api.ts +10 -10
  290. package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +5 -5
  291. package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +1 -1
  292. package/packages/bundled-features/src/template-resolver/handlers/shared.ts +2 -2
  293. package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +3 -3
  294. package/packages/bundled-features/src/template-resolver/handlers/upsert-system.write.ts +3 -4
  295. package/packages/bundled-features/src/template-resolver/handlers/upsert-tenant.write.ts +4 -5
  296. package/packages/bundled-features/src/template-resolver/seeding.ts +4 -4
  297. package/packages/bundled-features/src/template-resolver/table.ts +13 -14
  298. package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +2 -2
  299. package/packages/bundled-features/src/tenant/feature.ts +7 -7
  300. package/packages/bundled-features/src/tenant/handlers/member-directory.query.ts +1 -1
  301. package/packages/bundled-features/src/tenant/handlers/members.query.ts +1 -1
  302. package/packages/bundled-features/src/tenant/handlers/memberships.query.ts +1 -1
  303. package/packages/bundled-features/src/tenant/handlers/team-list.query.ts +1 -1
  304. package/packages/bundled-features/src/tenant/handlers/tenant-directory.query.ts +1 -1
  305. package/packages/bundled-features/src/tenant/invitation-table.ts +37 -40
  306. package/packages/bundled-features/src/tenant/membership-table.ts +3 -3
  307. package/packages/bundled-features/src/tenant/schema/tenant.ts +7 -9
  308. package/packages/bundled-features/src/tenant/screens.ts +1 -1
  309. package/packages/bundled-features/src/tenant/seeding.ts +19 -18
  310. package/packages/bundled-features/src/tenant/testing.ts +5 -6
  311. package/packages/bundled-features/src/tenant/web/constants.ts +2 -2
  312. package/packages/bundled-features/src/tenant-handover/events.ts +5 -7
  313. package/packages/bundled-features/src/tenant-handover/feature.ts +1 -1
  314. package/packages/bundled-features/src/tenant-handover/grant.ts +1 -1
  315. package/packages/bundled-features/src/tenant-handover/handlers/claim.write.ts +1 -1
  316. package/packages/bundled-features/src/tenant-handover/move-entity-graph.ts +8 -9
  317. package/packages/bundled-features/src/tenant-handover/signup-handover-provider.ts +1 -2
  318. package/packages/bundled-features/src/tenant-handover/transfer-graph.ts +4 -5
  319. package/packages/bundled-features/src/tenant-lifecycle/boot-checks.ts +1 -1
  320. package/packages/bundled-features/src/tenant-lifecycle/feature.ts +1 -1
  321. package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +2 -2
  322. package/packages/bundled-features/src/tenant-lifecycle/stages.ts +1 -1
  323. package/packages/bundled-features/src/tenant-settings/constants.ts +1 -1
  324. package/packages/bundled-features/src/tenant-settings/tenant-defaults.ts +12 -5
  325. package/packages/bundled-features/src/tier-engine/aggregate-id.ts +15 -16
  326. package/packages/bundled-features/src/tier-engine/compose-app.ts +14 -14
  327. package/packages/bundled-features/src/tier-engine/entity.ts +18 -19
  328. package/packages/bundled-features/src/tier-engine/feature.ts +88 -87
  329. package/packages/bundled-features/src/tier-engine/handlers/active-tier.query.ts +6 -7
  330. package/packages/bundled-features/src/tier-engine/handlers/get-tenant-tier.query.ts +4 -4
  331. package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +8 -8
  332. package/packages/bundled-features/src/tier-engine/tier-resolver.ts +2 -2
  333. package/packages/bundled-features/src/tier-engine/trial.ts +13 -13
  334. package/packages/bundled-features/src/tier-engine/web/index.ts +4 -4
  335. package/packages/bundled-features/src/user/db/queries/stream-tenant-backfill.ts +8 -8
  336. package/packages/bundled-features/src/user/handlers/create.write.ts +4 -4
  337. package/packages/bundled-features/src/user/schema/user.ts +45 -44
  338. package/packages/bundled-features/src/user/seeding.ts +40 -40
  339. package/packages/bundled-features/src/user/testing.ts +3 -3
  340. package/packages/bundled-features/src/user-data-rights/audit-download.ts +27 -28
  341. package/packages/bundled-features/src/user-data-rights/boot-checks.ts +1 -1
  342. package/packages/bundled-features/src/user-data-rights/deletion-token.ts +1 -1
  343. package/packages/bundled-features/src/user-data-rights/feature.ts +112 -113
  344. package/packages/bundled-features/src/user-data-rights/handlers/cancel-deletion.write.ts +9 -9
  345. package/packages/bundled-features/src/user-data-rights/handlers/confirm-deletion-by-token.write.ts +8 -8
  346. package/packages/bundled-features/src/user-data-rights/handlers/download-by-job.query.ts +29 -30
  347. package/packages/bundled-features/src/user-data-rights/handlers/download-by-token.query.ts +40 -42
  348. package/packages/bundled-features/src/user-data-rights/handlers/export-status.query.ts +8 -9
  349. package/packages/bundled-features/src/user-data-rights/handlers/lift-restriction.write.ts +7 -8
  350. package/packages/bundled-features/src/user-data-rights/handlers/list-download-attempts.query.ts +2 -2
  351. package/packages/bundled-features/src/user-data-rights/handlers/my-audit-log.query.ts +4 -4
  352. package/packages/bundled-features/src/user-data-rights/handlers/request-deletion-by-email.write.ts +30 -29
  353. package/packages/bundled-features/src/user-data-rights/handlers/request-deletion.write.ts +15 -18
  354. package/packages/bundled-features/src/user-data-rights/handlers/request-export.write.ts +42 -41
  355. package/packages/bundled-features/src/user-data-rights/handlers/restrict-account.write.ts +22 -19
  356. package/packages/bundled-features/src/user-data-rights/handlers/run-forget-cleanup.write.ts +8 -8
  357. package/packages/bundled-features/src/user-data-rights/index.ts +8 -10
  358. package/packages/bundled-features/src/user-data-rights/lib/default-mailers.ts +3 -3
  359. package/packages/bundled-features/src/user-data-rights/lib/update-user-lifecycle.ts +24 -27
  360. package/packages/bundled-features/src/user-data-rights/run-export-jobs.ts +166 -276
  361. package/packages/bundled-features/src/user-data-rights/run-forget-cleanup.ts +85 -107
  362. package/packages/bundled-features/src/user-data-rights/run-user-export.ts +67 -69
  363. package/packages/bundled-features/src/user-data-rights/schema/download-attempt.ts +11 -11
  364. package/packages/bundled-features/src/user-data-rights/schema/download-token.ts +37 -41
  365. package/packages/bundled-features/src/user-data-rights/schema/export-job.ts +65 -67
  366. package/packages/bundled-features/src/user-data-rights/token-helpers.ts +21 -25
  367. package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +6 -6
  368. package/packages/bundled-features/src/user-data-rights/web/confirm-deletion-screen.tsx +6 -5
  369. package/packages/bundled-features/src/user-data-rights/web/constants.ts +1 -1
  370. package/packages/bundled-features/src/user-data-rights/web/index.ts +5 -5
  371. package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +14 -13
  372. package/packages/bundled-features/src/user-data-rights/web/public-deletion-gate.tsx +13 -12
  373. package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +6 -6
  374. package/packages/bundled-features/src/user-data-rights/zip-path.ts +41 -40
  375. package/packages/bundled-features/src/user-data-rights-defaults/feature.ts +15 -15
  376. package/packages/bundled-features/src/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.ts +3 -5
  377. package/packages/bundled-features/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +45 -51
  378. package/packages/bundled-features/src/user-data-rights-defaults/hooks/job-run.userdata-hook.ts +2 -2
  379. package/packages/bundled-features/src/user-data-rights-defaults/hooks/notification-preference.userdata-hook.ts +1 -1
  380. package/packages/bundled-features/src/user-data-rights-defaults/hooks/user-session.userdata-hook.ts +3 -3
  381. package/packages/bundled-features/src/user-data-rights-defaults/hooks/user.userdata-hook.ts +32 -31
  382. package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +13 -13
  383. package/packages/bundled-features/src/user-profile/index.ts +3 -3
  384. package/packages/bundled-features/src/user-profile/web/client-plugin.ts +1 -1
  385. package/packages/bundled-features/src/user-profile/web/constants.ts +1 -1
  386. package/packages/bundled-features/src/user-profile/web/profile-screen.tsx +1 -1
  387. package/packages/bundled-features/src/workflow-runner/aggregate-id.ts +1 -1
  388. package/packages/bundled-features/src/workflow-runner/event-subscriber.ts +4 -5
  389. package/packages/bundled-features/src/workflow-runner/event-trigger.ts +4 -15
  390. package/packages/bundled-features/src/workflow-runner/feature.ts +2 -2
  391. package/packages/bundled-features/src/workflow-runner/handlers/resume-run.write.ts +4 -4
  392. package/packages/bundled-features/src/workflow-runner/pending-projection.ts +6 -7
  393. package/packages/bundled-features/src/workflow-runner/runner.ts +6 -6
  394. package/packages/bundled-features/src/workflow-runner/tables.ts +6 -6
  395. package/packages/bundled-features/src/workflow-runner/workflow-registry.ts +1 -1
@@ -1,12 +1,11 @@
1
- // Browser-Seite der Auth-Routes. Dünne fetch-Wrapper um /api/auth/*
2
- // mit Cookie-Transport: JWT lebt im HttpOnly kumiko_auth-Cookie,
3
- // Double-Submit-CSRF-Token im JS-lesbaren kumiko_csrf-Cookie. Alle
4
- // state-changing Requests echo'n den CSRF-Token via X-CSRF-Token —
5
- // der Server rejected sonst mit csrf_token_missing.
1
+ // Browser-side wrappers around /api/auth/* using cookie transport: the JWT
2
+ // lives in the HttpOnly kumiko_auth cookie, while the Double-Submit CSRF
3
+ // token lives in the JS-readable kumiko_csrf cookie. Every state-changing
4
+ // request echoes the CSRF token via X-CSRF-Token; otherwise the server
5
+ // rejects it with csrf_token_missing.
6
6
  //
7
- // Die dispatcher-live nutzt denselben readCsrfToken-Helper; wir
8
- // reuse'n ihn hier, damit die Konstanten (Cookie-Name, Header-Name)
9
- // nicht divergieren.
7
+ // dispatcher-live uses the same readCsrfToken helper; reusing it here keeps
8
+ // the cookie and header constants from diverging.
10
9
 
11
10
  import { parseRoles } from "@cosmicdrift/kumiko-framework/utils";
12
11
  import { CSRF_HEADER_NAME, readCsrfToken } from "@cosmicdrift/kumiko-renderer/live";
@@ -14,8 +13,8 @@ import { CSRF_HEADER_NAME, readCsrfToken } from "@cosmicdrift/kumiko-renderer/li
14
13
  export type TenantSummary = {
15
14
  readonly tenantId: string;
16
15
  readonly roles: readonly string[];
17
- /** Display-Name aus /auth/tenants — fehlt nur bei App-eigenen
18
- * membership-Queries ohne tenantName-Anreicherung. */
16
+ /** Display name from /auth/tenants; absent only for app-owned membership
17
+ * queries without tenantName enrichment. */
19
18
  readonly name?: string;
20
19
  readonly key?: string;
21
20
  };
@@ -154,8 +153,8 @@ export async function login(req: LoginRequest): Promise<LoginResult> {
154
153
  return { kind: "success", data: toLoginResponse(body.token, body.user, body.landingPath) };
155
154
  }
156
155
  }
157
- // Der Server schickt error entweder als string ("invalid_body") oder als
158
- // strukturiertes Objekt. Wir ziehen uns den sprechendsten Reason raus.
156
+ // The server sends error either as a string ("invalid_body") or as a
157
+ // structured object. Extract the most descriptive reason.
159
158
  const err = body.error;
160
159
  if (typeof err === "string") {
161
160
  return { kind: "failure", error: { reason: err } };
@@ -172,10 +171,10 @@ export async function login(req: LoginRequest): Promise<LoginResult> {
172
171
  };
173
172
  }
174
173
 
175
- // POST /api/auth/logout. Server revoked die Session (wenn sessionRevoker
176
- // gewired ist) und clear't die Cookies. Wir triggern hinterher einen
177
- // Navigation-Refresh, damit alle caches (React-State, query-cache) auf
178
- // Null gehen — billigster Weg zu sauberer Ausgangslage.
174
+ // POST /api/auth/logout. The server revokes the session when
175
+ // sessionRevoker is wired and clears the cookies. A navigation refresh
176
+ // afterward ensures that all caches (React state, query cache) return to
177
+ // an unauthenticated state—the simplest way to restore a clean baseline.
179
178
  export async function logout(): Promise<void> {
180
179
  await fetch("/api/auth/logout", {
181
180
  method: "POST",
@@ -184,29 +183,29 @@ export async function logout(): Promise<void> {
184
183
  });
185
184
  }
186
185
 
187
- // Gemeinsamer Failure-Type für die vier Token-Flow-Endpoints (request-
186
+ // Shared failure type for the four token-flow endpoints (request-
188
187
  // password-reset, reset-password, request-email-verification, verify-
189
- // email). Server collapses alle Token-Verify-Fehler (malformed / bad-
190
- // signature / expired) auf einen einzigen Code pro Flow (anti-
191
- // enumeration); UI mappt reason → i18n-Key. Plus rate-limit (429) wird
192
- // als reason "rate_limited" + retryAfterSeconds durchgereicht — gleiche
193
- // Shape wie LoginFailure damit Apps die Errors uniform mappen können.
188
+ // email). The server collapses all token-verification errors (malformed,
189
+ // bad signature, expired) into one code per flow to prevent enumeration;
190
+ // the UI maps reason to an i18n key. Rate limits (429) pass through as
191
+ // reason "rate_limited" with retryAfterSeconds, using the same shape as
192
+ // LoginFailure so apps can map errors uniformly.
194
193
  export type AuthTokenFailure = {
195
194
  readonly reason: string;
196
195
  readonly retryAfterSeconds?: number;
197
196
  };
198
197
 
199
- // Backward-compat-Aliase für die alten Type-Namen — damit Code, der
200
- // `ResetPasswordFailure` / `VerifyEmailFailure` importiert hat, ohne
201
- // Änderung weiterläuft. Für neuen Code direkt `AuthTokenFailure` nutzen.
198
+ // Backward-compatible aliases for the old type names, so code importing
199
+ // `ResetPasswordFailure` or `VerifyEmailFailure` continues to work without
200
+ // changes. New code should use `AuthTokenFailure` directly.
202
201
  export type ResetPasswordFailure = AuthTokenFailure;
203
202
  export type VerifyEmailFailure = AuthTokenFailure;
204
203
 
205
- // 4xx/5xx → typed AuthTokenFailure parsen. 429 (Rate-Limit) hat einen
206
- // dedizierten reason damit das UI einen Retry-Hinweis zeigen kann.
204
+ // Parse 4xx/5xx responses into AuthTokenFailure. 429 uses a dedicated
205
+ // reason so the UI can display a retry hint.
207
206
  async function parseTokenFailure(res: Response): Promise<AuthTokenFailure> {
208
207
  if (res.status === 429) {
209
- // @cast-boundary engine-payload — server schickt details.retryAfterSeconds bei 429
208
+ // @cast-boundary engine-payload — the server sends details.retryAfterSeconds for 429
210
209
  const body = (await res.json().catch(() => ({}))) as {
211
210
  error?: { details?: { retryAfterSeconds?: number } };
212
211
  };
@@ -238,11 +237,12 @@ export async function requestPasswordReset(
238
237
  return { ok: false, error: await parseTokenFailure(res) };
239
238
  }
240
239
 
241
- // POST /api/auth/reset-password. Token aus URL + neues Passwort. Auf
242
- // 422 collapses der Server alle Token-Verify-Fehler (malformed / bad-
243
- // signature / expired) auf den einzigen Code `invalid_reset_token` —
244
- // anti-enumeration. Plus zod-validation-failures (newPassword < 8) als
245
- // eigene 4xx mit code "validation_failed". UI mappt reason → i18n-Key.
240
+ // POST /api/auth/reset-password. The token comes from the URL and the
241
+ // request includes the new password. On 422, the server collapses all
242
+ // token-verification errors (malformed, bad signature, expired) into the
243
+ // single code `invalid_reset_token` to prevent enumeration. Zod validation
244
+ // failures (newPassword < 8) use a separate 4xx code, "validation_failed".
245
+ // The UI maps reason to an i18n key.
246
246
  export async function resetPassword(
247
247
  token: string,
248
248
  newPassword: string,
@@ -272,9 +272,9 @@ export async function requestEmailVerification(
272
272
  return { ok: false, error: await parseTokenFailure(res) };
273
273
  }
274
274
 
275
- // POST /api/auth/verify-email. Auto-submitted vom VerifyEmailScreen
276
- // nach `?token=...`-parse. Server collapses alle Verify-Failures auf
277
- // `invalid_verification_token` (anti-enumeration, parallel zu reset).
275
+ // POST /api/auth/verify-email. VerifyEmailScreen submits this automatically
276
+ // after parsing `?token=...`. The server collapses all verification failures
277
+ // into `invalid_verification_token` to prevent enumeration, as with reset.
278
278
  export async function verifyEmail(
279
279
  token: string,
280
280
  ): Promise<{ ok: true } | { ok: false; error: AuthTokenFailure }> {
@@ -321,15 +321,14 @@ export async function confirmAccountUnlock(
321
321
  return { ok: false, error: await parseTokenFailure(res) };
322
322
  }
323
323
 
324
- // POST /api/auth/signup-request. Always-200 (anti-enumeration; wir
325
- // sagen nicht ob die Email schon registriert ist). Server schickt
326
- // Activation-Mail an die Adresse — beim Klick auf den Link landet der
327
- // User auf /signup/complete?token=… wo er sein Password setzt.
324
+ // POST /api/auth/signup-request. Always returns 200 to prevent enumeration;
325
+ // the response does not reveal whether the email is already registered. The
326
+ // server sends an activation email to the address; following its link takes
327
+ // the user to /signup/complete?token=… to set a password.
328
328
  export async function requestSignup(
329
329
  email: string,
330
- // Cross-device try-first handover (kumiko-framework#3035 follow-up,
331
- // offlot-app#454): forwards a row-bound tenant-handover grant so the
332
- // server can verify + rebind it to the signup token. The grant never
330
+ // Cross-device try-first handover: forwards a row-bound tenant-handover
331
+ // grant so the server can verify + rebind it to the signup token. The grant never
333
332
  // travels any further than this request — never in the URL, the mail,
334
333
  // or the confirm response.
335
334
  handover?: { readonly entityType: string; readonly token: string },
@@ -397,8 +396,8 @@ export async function confirmSignup(
397
396
  return { ok: false, error: await parseTokenFailure(res) };
398
397
  }
399
398
 
400
- // GET /api/auth/tenants. Liefert die Memberships des aktuellen Users;
401
- // der Server liefert 401 wenn das Cookie fehlt oder abgelaufen ist.
399
+ // GET /api/auth/tenants. Returns the current user's memberships; the server
400
+ // returns 401 when the cookie is missing or expired.
402
401
  export async function fetchTenants(): Promise<{
403
402
  readonly tenants: readonly TenantSummary[];
404
403
  readonly activeTenantId: string;
@@ -422,9 +421,9 @@ export async function fetchTenants(): Promise<{
422
421
  };
423
422
  }
424
423
 
425
- // POST /api/auth/switch-tenant. Mintet ein neues JWT für den Ziel-Tenant
426
- // und rotated beide Cookies. 400 wenn already_in_tenant oder tenant_
427
- // switch_not_available, 403 wenn not_a_member.
424
+ // POST /api/auth/switch-tenant. Mints a new JWT for the target tenant and
425
+ // rotates both cookies. Returns 400 for already_in_tenant or
426
+ // tenant_switch_not_available, and 403 for not_a_member.
428
427
  export async function switchTenant(tenantId: string): Promise<void> {
429
428
  const res = await fetch("/api/auth/switch-tenant", {
430
429
  method: "POST",
@@ -438,14 +437,15 @@ export async function switchTenant(tenantId: string): Promise<void> {
438
437
  }
439
438
  }
440
439
 
441
- // POST /api/query → user:query:user:me. Profil-Daten (email, displayName)
442
- // für das UserMenu im Topbar. 401 → kein Cookie / abgelaufen, wird
443
- // vom SessionProvider als "ausgeloggt" interpretiert.
440
+ // POST /api/query → user:query:user:me. Returns profile data (email,
441
+ // displayName) for the UserMenu in the top bar. A 401 for a missing or
442
+ // expired cookie is interpreted by SessionProvider as signed out.
444
443
  //
445
- // globalRoles: tenant-unabhängige user-rollen (z.B. SystemAdmin) aus
446
- // users.roles. Im JWT schon mit tenant-membership-roles gemerged, aber
447
- // das JWT ist HttpOnly + nicht JS-lesbar — der Client muss die globalen
448
- // Rollen separat aus dem user-row holen damit nav-filtering greift.
444
+ // globalRoles are tenant-independent user roles (for example, SystemAdmin)
445
+ // from users.roles. They are merged into the JWT with tenant-membership
446
+ // roles, but the JWT is HttpOnly and unreadable by JavaScript, so the client
447
+ // must fetch the global roles separately from the user row for navigation
448
+ // filtering.
449
449
  export type CurrentUserProfile = {
450
450
  readonly id: string;
451
451
  readonly email: string;
@@ -479,8 +479,8 @@ export async function fetchCurrentUser(): Promise<CurrentUserProfile | null> {
479
479
  displayName: string;
480
480
  locale?: string;
481
481
  effectiveTimeZone?: string;
482
- // JSON-encoded string[] — siehe userEntity.roles. Default "[]" wenn
483
- // keine globalen Rollen.
482
+ // JSON-encoded string[]; see userEntity.roles. Defaults to "[]" when
483
+ // there are no global roles.
484
484
  roles?: string;
485
485
  };
486
486
  };
@@ -14,10 +14,10 @@ import { usePrimitives } from "@cosmicdrift/kumiko-renderer";
14
14
  import { BareFormProvider, cn } from "@cosmicdrift/kumiko-renderer/web";
15
15
  import { createContext, type ReactNode, useContext, useEffect, useState } from "react";
16
16
 
17
- // Wrappt die zentrierte Auth-Card in ihre Umgebung. Default = Fullscreen-
18
- // zentriert (Standalone-Auth-Page). Eine Apex-/Marketing-Chrome reicht über
19
- // AuthShellProvider eine eigene Variante rein, ohne dass `min-h-screen` die
20
- // Chrome übermalt.
17
+ // Wraps the centered auth card in its surrounding layout. The default is
18
+ // fullscreen-centered for standalone auth pages. Apex/marketing chrome can
19
+ // provide its own variant through AuthShellProvider without `min-h-screen`
20
+ // covering that chrome.
21
21
  export type AuthShellRenderer = (card: ReactNode) => ReactNode;
22
22
 
23
23
  const defaultAuthShell: AuthShellRenderer = (card) => (
@@ -64,8 +64,9 @@ export function AuthCard({
64
64
  }: AuthCardProps): ReactNode {
65
65
  const { Card } = usePrimitives();
66
66
  const shell = useAuthShell() ?? defaultAuthShell;
67
- // h1 (Seiten-Hauptüberschrift) via Header-Slot erhalten — die Card-Default-
68
- // Header wäre h3. padded:false = Form sitzt randlos wie bisher (bare form).
67
+ // Keep an h1 (page heading) through the header slot; the Card's default
68
+ // header would be h3. padded:false keeps the form edge-to-edge as before
69
+ // (bare form).
69
70
  const card = (
70
71
  <Card
71
72
  className={cn("w-full max-w-sm", className)}
@@ -94,14 +95,13 @@ export function AuthCard({
94
95
  return shell(card);
95
96
  }
96
97
 
97
- // Liest `?<paramName>=<value>` aus der aktuellen URL — typisches
98
- // Pattern für Token-bearing Pages (reset, verify). Returnt "" wenn der
99
- // Browser nicht da ist (SSR-safety) oder der Parameter fehlt.
98
+ // Reads `?<paramName>=<value>` from the current URL, as used by token-bearing
99
+ // pages (reset, verify). Returns "" during SSR or when the parameter is absent.
100
100
  //
101
- // Nicht über useState/useEffect - das wäre ein read-once-on-mount
102
- // pattern aber URL-changes sind hier irrelevant (Token-Pages re-loaden
103
- // für neue Tokens). Caller setzt useState(() => parseUrlToken(...)) wenn
104
- // gewünscht.
101
+ // This is intentionally not read through useState/useEffect: that would be a
102
+ // read-once-on-mount pattern, while URL changes are irrelevant here because
103
+ // token pages reload for new tokens. Callers can use
104
+ // useState(() => parseUrlToken(...)) when needed.
105
105
  export function parseUrlToken(paramName = "token"): string {
106
106
  if (typeof window === "undefined") return "";
107
107
  return new URLSearchParams(window.location.search).get(paramName) ?? "";
@@ -109,7 +109,7 @@ export function parseUrlToken(paramName = "token"): string {
109
109
 
110
110
  // Reads the magic-link token from `?<paramName>=` once on mount, then strips
111
111
  // that param from the URL via history.replaceState so the single-use token
112
- // doesn't linger in browser history / Referer (#774). An explicit `override`
112
+ // doesn't linger in browser history / Referer. An explicit `override`
113
113
  // (server-injected token) short-circuits both the URL read and the scrub.
114
114
  export function useUrlToken(override?: string, paramName = "token"): string {
115
115
  const [token] = useState(() => override ?? parseUrlToken(paramName));
@@ -1,12 +1,12 @@
1
- // Auth-Gate: rendert den LoginScreen solange der Session-Status
2
- // "unauthenticated" ist, sonst die Kinder. "loading" zeigt einen
3
- // minimalen Placeholder — die initiale Refresh-Runde liefert in der
4
- // Regel in <100ms, also kein Spinner-Overkill.
1
+ // Auth gate: renders the LoginScreen while the session status is
2
+ // "unauthenticated" and the children otherwise. "loading" shows a
3
+ // minimal placeholder—the initial refresh usually completes in <100ms,
4
+ // so a spinner would be excessive.
5
5
  //
6
- // Die Factory makeAuthGate schließt die LoginScreen-Komponente in,
7
- // damit das Gate der ClientFeatureDefinition-Signatur entspricht
8
- // (nur `{ children }`-Prop). Der Sample kann so einen eigenen Login-
9
- // Screen rein konfigurieren, ohne den Gate selbst ersetzen zu müssen.
6
+ // The makeAuthGate factory closes over the LoginScreen component so the
7
+ // gate matches the ClientFeatureDefinition signature (only a `{ children }`
8
+ // prop). This lets the sample configure a custom login screen without
9
+ // replacing the gate.
10
10
 
11
11
  import { useLocale } from "@cosmicdrift/kumiko-renderer";
12
12
  import { type ComponentType, type ReactNode, useEffect, useMemo, useState } from "react";
@@ -57,12 +57,11 @@ export type LoginRouteOptions = {
57
57
  // their own standalone login route outside any gate (createPublicSurface
58
58
  // apex pages stack providers, not gates — see auth-mount.tsx recipes).
59
59
  // Handing an app raw LoginScreen + telling it to hand-roll the challenge-
60
- // token swap itself is exactly how kumiko-framework#266's login-time MFA
61
- // step went missing in a real apex surface; this prevents the *most common*
62
- // version of that mistake. MFA still only actually works once a consumer
63
- // wires `mfaVerifyScreen` — omitting it is a silent no-MFA fallback, not
64
- // something this route can catch on its own (auth-mfa is a separate,
65
- // optional package).
60
+ // token swap itself is exactly how the login-time MFA step went missing in a
61
+ // real apex surface; this prevents the *most common* version of that mistake.
62
+ // MFA still only actually works once a consumer wires `mfaVerifyScreen` —
63
+ // omitting it is a silent no-MFA fallback, not something this route can catch
64
+ // on its own (auth-mfa is a separate, optional package).
66
65
  export function createLoginRoute(
67
66
  opts: LoginRouteOptions = {},
68
67
  ): ComponentType<Record<string, never>> {
@@ -82,7 +81,7 @@ export function createLoginRoute(
82
81
  readonly accountLabel: string;
83
82
  } | null>(null);
84
83
 
85
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
84
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
86
85
  useEffect(() => {
87
86
  if (status === "authenticated") onAuthenticated?.();
88
87
  }, [status]);
@@ -236,7 +235,7 @@ export function makeAuthGate(opts: AuthGateOptions = {}): ComponentType<{
236
235
  [status, locale, origin, pathname, search, hash],
237
236
  );
238
237
  const redirectUrl = loginRedirect?.kind === "redirect" ? loginRedirect.url : null;
239
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
238
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
240
239
  useEffect(() => {
241
240
  if (redirectUrl !== null) window.location.replace(redirectUrl);
242
241
  }, [redirectUrl]);
@@ -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
 
7
6
  import type { ClientActionHandler, TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
8
7
  import type { ComponentType, ReactNode } from "react";
@@ -18,9 +17,9 @@ import { defaultTranslations, mergeTranslations } from "./i18n.ts";
18
17
  import type { LoginScreenProps } from "./login-screen.tsx";
19
18
 
20
19
  export type EmailPasswordClientOptions = {
21
- /** Eigener Login-Screen. Default: der shadcn-stylte LoginScreen
22
- * aus diesem Modul. Für Branding- oder Layout-Overrides einfach
23
- * eine eigene Komponente mit derselben Signatur reichen. */
20
+ /** Custom login screen. Default: the shadcn-styled LoginScreen
21
+ * from this module. Provide a component with the same signature for
22
+ * branding or layout overrides. */
24
23
  readonly loginScreen?: ComponentType<LoginScreenProps>;
25
24
  readonly loginScreenProps?: LoginScreenProps;
26
25
  /** auth-mfa's MfaVerifyScreen, wired in from the app so this feature
@@ -41,10 +40,10 @@ export type EmailPasswordClientOptions = {
41
40
  readonly loginUrl?: AuthGateOptions["loginUrl"];
42
41
  /** Where logout navigates to (root-relative path or http(s) URL). Default: reload. */
43
42
  readonly postLogoutUrl?: string;
44
- /** Key-Overrides pro Locale. Wird mit den Default-Bundles (de/en)
45
- * aus `translations.ts` gemerged — jeder hier gesetzte Key gewinnt.
46
- * Für Branding ("Sign in" → "Login to Acme") oder weitere Sprachen
47
- * (`fr`, `es`, …) zusätzlich. */
43
+ /** Per-locale key overrides. Merged with the default bundles (de/en)
44
+ * from `translations.ts`; each key supplied here takes precedence.
45
+ * Use this for branding ("Sign in" → "Login to Acme") or to add
46
+ * further languages (`fr`, `es`, …). */
48
47
  readonly translations?: TranslationsByLocale;
49
48
  /** Serve the forgot-password, reset-password and unlock-account pages at
50
49
  * their convention paths for signed-out visitors. Apps with their own
@@ -32,7 +32,7 @@ export function ConfirmAccountUnlockScreen({
32
32
  const [status, setStatus] = useState<Status>(token === "" ? "missing-token" : "verifying");
33
33
  const startedRef = useRef(false);
34
34
 
35
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
35
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
36
36
  useEffect(() => {
37
37
  if (status !== "verifying") return;
38
38
  if (startedRef.current) return;
@@ -17,7 +17,7 @@ export const AuthHandlers = {
17
17
  requestEmailVerification: "auth-email-password:write:request-email-verification",
18
18
  verifyEmail: "auth-email-password:write:verify-email",
19
19
  // Account-Unlock Magic-Link (fixes the lockout-DoS where the monotonic
20
- // failure-counter re-locks immediately after expiry, #1266). Mirrors
20
+ // failure-counter re-locks immediately after expiry). Mirrors
21
21
  // reset: request mints an HMAC token + mails it, confirm clears the
22
22
  // Redis lockout state.
23
23
  requestAccountUnlock: "auth-email-password:write:request-account-unlock",
@@ -85,7 +85,7 @@ export const AuthErrors = {
85
85
  invalidSignupToken: "invalid_signup_token",
86
86
  signupNotConfigured: "signup_not_configured",
87
87
  // Self-signup: confirm rejects an already-registered email instead of
88
- // reusing the existing user (account takeover, #365). NO
88
+ // reusing the existing user (account takeover). NO
89
89
  // anti-enumeration collapse like invalidSignupToken: whoever gets here
90
90
  // controls the inbox (has the magic link), so revealing "email exists"
91
91
  // is not new information.
@@ -105,7 +105,7 @@ export const AuthErrors = {
105
105
  // deliberate enumeration trade-off: the lockout event itself is already
106
106
  // observable to the attacker, and legit users benefit from a clear signal.
107
107
  accountLocked: "account_locked",
108
- // S2.U6 (GDPR Art. 18) — account is in Restricted status. Login is
108
+ // (GDPR Art. 18) — account is in Restricted status. Login is
109
109
  // explicitly refused with its own code (not collapsed into
110
110
  // invalid_credentials) so the UI can say "account is currently paused,
111
111
  // click here to lift it". Enumeration leak accepted: restriction is
@@ -1,9 +1,9 @@
1
- // Standard-Topbar-Actions Komposition für Apps mit Auth + Workspaces.
2
- // Bündelt das Pattern das jeder App-Sample sonst hand-ausschreibt:
3
- // TenantSwitcher (links) → optional Extras (z.B. LanguageSwitcher) →
4
- // ThemeToggle → UserMenu (rechts). Apps mit eigener Anordnung
5
- // importieren weiter die Einzelkomponenten direkt — DefaultTopbarActions
6
- // ist Convenience, kein Muss.
1
+ // Composes the standard top-bar actions for apps with auth and workspaces.
2
+ // This bundles the pattern that each app sample would otherwise write by hand:
3
+ // TenantSwitcher (left) → optional extras (for example, LanguageSwitcher) →
4
+ // ThemeToggle → UserMenu (right). Apps with a custom arrangement can still
5
+ // import the individual components directly; DefaultTopbarActions is
6
+ // convenience, not a requirement.
7
7
 
8
8
  import { ThemeToggle } from "@cosmicdrift/kumiko-renderer/web";
9
9
  import type { ReactNode } from "react";
@@ -11,16 +11,16 @@ import { TenantSwitcher } from "./tenant-switcher.tsx";
11
11
  import { UserMenu } from "./user-menu.tsx";
12
12
 
13
13
  export type DefaultTopbarActionsProps = {
14
- /** Mapped Tenant-ID auf einen sprechenden Namen (z.B. branded label
15
- * pro Tenant). TenantSwitcher's Default zeigt sonst die ersten 8
16
- * Zeichen der UUID. */
14
+ /** Maps a tenant ID to a human-readable name (for example, a branded label
15
+ * per tenant). TenantSwitcher's default otherwise displays the first 8
16
+ * characters of the UUID. */
17
17
  readonly tenantName?: (tenantId: string) => string;
18
- /** Slot zwischen TenantSwitcher und ThemeToggle. Typischer Use-Case:
19
- * LanguageSwitcher pro App. ReactNode (nicht Array) damit die App
20
- * selbst Reihenfolge + Spacing bestimmt. */
18
+ /** Slot between TenantSwitcher and ThemeToggle. Typical use case:
19
+ * an app-specific LanguageSwitcher. ReactNode, rather than an array, so the
20
+ * app controls the ordering and spacing. */
21
21
  readonly extras?: ReactNode;
22
- /** Light-Mode-Icon im ThemeToggle. Default: Unicode ☀. Apps die
23
- * Lucide-Icons o.ä. wollen, übergeben ein eigenes Icon-Element. */
22
+ /** Light-mode icon for ThemeToggle. Default: Unicode ☀. Apps that want
23
+ * Lucide icons or similar can provide a custom icon element. */
24
24
  readonly lightIcon?: ReactNode;
25
25
  /** Dark-Mode-Icon. Default: Unicode ☾. */
26
26
  readonly darkIcon?: ReactNode;
@@ -1,12 +1,12 @@
1
- // ForgotPasswordScreen — Form mit email-input. Submit triggert
2
- // /api/auth/request-password-reset (silent-success, kein account-
3
- // enumeration). UI zeigt unconditional ein "Wenn Account existiert,
4
- // Mail unterwegs"-Confirm — auch wenn der Server intern erkannt hat
5
- // dass die Email nicht existiert.
1
+ // ForgotPasswordScreen — form with an email input. Submission triggers
2
+ // /api/auth/request-password-reset (silent success, no account enumeration).
3
+ // The UI always shows a "If an account exists, the email is on its way"
4
+ // confirmation, even when the server determines internally that the email
5
+ // does not exist.
6
6
  //
7
- // App ist verantwortlich, den Screen unter einer URL zu mounten (z.B.
8
- // /forgot-password) und ihn zu erreichen — der LoginScreen kann einen
9
- // "Passwort vergessen?"-Link auf die App-Route setzen.
7
+ // The app is responsible for mounting and exposing the screen at a URL
8
+ // (for example, /forgot-password); the LoginScreen can link to that app
9
+ // route with a "Forgot password?" link.
10
10
 
11
11
  import { usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
12
12
  import { type FormEvent, type ReactNode, useState } from "react";
@@ -16,8 +16,8 @@ import { AuthCard } from "./auth-form-primitives.tsx";
16
16
  export type ForgotPasswordScreenProps = {
17
17
  readonly title?: string;
18
18
  readonly subtitle?: ReactNode;
19
- /** href für den "Zurück zum Login"-Link in success + form. App-
20
- * spezifisch — Default "/login". */
19
+ /** href for the "Back to login" link in the success and form states. App-
20
+ * specific — defaults to "/login". */
21
21
  readonly loginHref?: string;
22
22
  };
23
23
 
@@ -33,7 +33,7 @@ export function ForgotPasswordScreen({
33
33
  const [done, setDone] = useState(false);
34
34
  const [error, setError] = useState<string | null>(null);
35
35
 
36
- // guard:dup-ok — gleiches Submit-Muster wie signup-screen, aber verschiedene API-Endpoints und State
36
+ // guard:dup-ok — same submission pattern as signup-screen, but with different API endpoints and state
37
37
  const doSubmit = async (): Promise<void> => {
38
38
  setSubmitting(true);
39
39
  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
 
7
7
  export type {
8
8
  AuthTokenFailure,
@@ -1,19 +1,19 @@
1
- // InviteAcceptScreen — Magic-Link-Accept für Tenant-Invitations.
1
+ // InviteAcceptScreen — accepts tenant invitations through a magic link.
2
2
  //
3
- // Liest `?token=...` aus der URL und branched intern je nach session-state:
4
- // - Logged-in + Email-Match: 1-click accept (Branch 1, dispatcher
5
- // invite-accept). Bei Email-Mismatch zeigen wir die fehlermeldung
6
- // und einen "Mit anderem Account anmelden"-Link.
7
- // - Anonymous: Email + Password-Form. Toggle "Schon einen Account?"
8
- // entscheidet Branch 2 (existing user, login + accept) vs Branch 3
9
- // (neuer user, signup + accept).
3
+ // Reads `?token=...` from the URL and selects a flow based on session state:
4
+ // - Logged in with a matching email: one-click accept (Branch 1, via the
5
+ // invite-accept dispatcher). For an email mismatch, show an error and a
6
+ // "Sign in with a different account" link.
7
+ // - Anonymous: email and password form. The "Already have an account?" toggle
8
+ // selects Branch 2 (existing user, login + accept) or Branch 3 (new user,
9
+ // signup + accept).
10
10
  //
11
- // Anti-enumeration: invalidInviteToken collapsed alle Token/User/
12
- // Password-Failures auf einen Code (gleicher Trade-off wie reset).
11
+ // Anti-enumeration: invalidInviteToken collapses token, user, and password
12
+ // failures into one code, using the same trade-off as reset.
13
13
  //
14
- // Auto-Login: Branch 2+3 setzen Cookies via Server, Frontend redirected
15
- // zu loggedInHref. Branch 1 hat schon eine Session — Frontend redirected
16
- // auch zu loggedInHref damit der invitee in seinem neuen Tenant landet.
14
+ // Auto-login: Branches 2 and 3 set cookies through the server, then the
15
+ // frontend redirects to loggedInHref. Branch 1 already has a session, but the
16
+ // frontend also redirects to loggedInHref so the invitee enters the new tenant.
17
17
 
18
18
  import { usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
19
19
  import { type FormEvent, type ReactNode, useContext, useState } from "react";
@@ -34,7 +34,7 @@ export type InviteAcceptScreenProps = {
34
34
  readonly loggedInHref?:
35
35
  | string
36
36
  | ((args: { tenantId: string; roles: readonly string[] }) => string);
37
- /** Login-Href für "Mit anderem Account anmelden". Default "/login". */
37
+ /** Login href for "Mit anderem Account anmelden". Default "/login". */
38
38
  readonly loginHref?: string;
39
39
  };
40
40
 
@@ -112,7 +112,7 @@ export function InviteAcceptScreen({
112
112
  const acceptLoggedIn = async (): Promise<void> => {
113
113
  setSubmitting(true);
114
114
  setError(null);
115
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
115
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
116
116
  const res = await fetch("/api/auth/invite-accept", {
117
117
  method: "POST",
118
118
  credentials: "same-origin",
@@ -132,7 +132,7 @@ export function InviteAcceptScreen({
132
132
  const acceptAnonExisting = async (): Promise<void> => {
133
133
  setSubmitting(true);
134
134
  setError(null);
135
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
135
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
136
136
  const res = await fetch("/api/auth/invite-accept-with-login", {
137
137
  method: "POST",
138
138
  credentials: "same-origin",
@@ -152,7 +152,7 @@ export function InviteAcceptScreen({
152
152
  const acceptAnonNew = async (): Promise<void> => {
153
153
  setSubmitting(true);
154
154
  setError(null);
155
- // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
155
+ // kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
156
156
  const res = await fetch("/api/auth/invite-signup-complete", {
157
157
  method: "POST",
158
158
  credentials: "same-origin",
@@ -41,7 +41,7 @@ export type LoginScreenProps = {
41
41
  * default path once the server offers the reset flow (login-options);
42
42
  * `null` hides the link deliberately. */
43
43
  readonly forgotPasswordHref?: string | null;
44
- /** Optional href to RequestAccountUnlockScreen (#1266). When set, an
44
+ /** Optional href to RequestAccountUnlockScreen. When set, an
45
45
  * account_locked login error renders an "Unlock account?" link inline —
46
46
  * the account-lockout escape hatch, since forgotPasswordHref does NOT
47
47
  * help here: the lockout gate blocks login before password verify even
@@ -71,9 +71,8 @@ export type LoginScreenProps = {
71
71
  readonly onMfaSetupRequired?: (preauthSetupToken: string, accountLabel: string) => void;
72
72
  };
73
73
 
74
- // Map vom Reason-Code des Login-Handlers auf einen i18n-Key plus
75
- // optional extrahierte Interpolations-Parameter. Ungekannte Codes
76
- // fallen auf `auth.errors.loginFailed` zurück.
74
+ // Maps login-handler reason codes to i18n keys and optional interpolation parameters.
75
+ // Unknown codes fall back to `auth.errors.loginFailed`.
77
76
  function reasonToKey(failure: LoginFailure): {
78
77
  readonly key: string;
79
78
  readonly params?: Readonly<Record<string, unknown>>;