@cosmicdrift/kumiko-bundled-features 0.386.0 → 0.388.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (643) hide show
  1. package/LICENSE +21 -57
  2. package/dist/agent-tools/tool-catalog.js +1 -1
  3. package/dist/agent-tools/tool-dispatch.d.ts +7 -7
  4. package/dist/agent-tools/tool-dispatch.js +9 -9
  5. package/dist/audit/handlers/audit-events.js +1 -1
  6. package/dist/audit/screens.js +1 -1
  7. package/dist/auth-email-password/feature.js +1 -1
  8. package/dist/auth-email-password/handlers/change-password.write.js +3 -3
  9. package/dist/auth-email-password/handlers/confirm-token-flow.js +5 -5
  10. package/dist/auth-email-password/handlers/invite-accept-with-login.write.js +1 -1
  11. package/dist/auth-email-password/handlers/invite-accept.write.js +18 -18
  12. package/dist/auth-email-password/handlers/invite-create.write.d.ts +2 -2
  13. package/dist/auth-email-password/handlers/invite-create.write.js +10 -10
  14. package/dist/auth-email-password/handlers/invite-info.query.js +1 -1
  15. package/dist/auth-email-password/handlers/invite-signup-complete.write.js +24 -26
  16. package/dist/auth-email-password/handlers/login.write.d.ts +1 -1
  17. package/dist/auth-email-password/handlers/login.write.js +1 -1
  18. package/dist/auth-email-password/handlers/self-registration-status.query.js +1 -1
  19. package/dist/auth-email-password/handlers/signup-confirm.write.js +34 -37
  20. package/dist/auth-email-password/handlers/signup-request.write.js +6 -7
  21. package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.d.ts +1 -1
  22. package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.js +1 -4
  23. package/dist/auth-email-password/index.js +5 -5
  24. package/dist/auth-email-password/lockout-store.js +1 -1
  25. package/dist/auth-email-password/seeding.d.ts +42 -45
  26. package/dist/auth-email-password/seeding.js +51 -53
  27. package/dist/auth-email-password/signup-token-store.js +8 -8
  28. package/dist/auth-email-password/testing.js +3 -3
  29. package/dist/auth-email-password/web/auth-client.d.ts +2 -2
  30. package/dist/auth-email-password/web/auth-client.js +36 -37
  31. package/dist/auth-email-password/web/auth-form-primitives.js +10 -10
  32. package/dist/auth-email-password/web/auth-gate.js +15 -16
  33. package/dist/auth-email-password/web/client-plugin.d.ts +7 -7
  34. package/dist/auth-email-password/web/client-plugin.js +4 -5
  35. package/dist/auth-email-password/web/confirm-account-unlock-screen.js +1 -1
  36. package/dist/auth-email-password/web/constants.js +3 -3
  37. package/dist/auth-email-password/web/default-topbar-actions.d.ts +8 -8
  38. package/dist/auth-email-password/web/default-topbar-actions.js +6 -6
  39. package/dist/auth-email-password/web/forgot-password-screen.d.ts +2 -2
  40. package/dist/auth-email-password/web/forgot-password-screen.js +9 -9
  41. package/dist/auth-email-password/web/index.js +5 -5
  42. package/dist/auth-email-password/web/invite-accept-screen.d.ts +1 -1
  43. package/dist/auth-email-password/web/invite-accept-screen.js +16 -16
  44. package/dist/auth-email-password/web/login-screen.d.ts +1 -1
  45. package/dist/auth-email-password/web/login-screen.js +2 -3
  46. package/dist/auth-email-password/web/reset-password-screen.d.ts +4 -4
  47. package/dist/auth-email-password/web/reset-password-screen.js +12 -13
  48. package/dist/auth-email-password/web/session.d.ts +10 -9
  49. package/dist/auth-email-password/web/session.js +28 -29
  50. package/dist/auth-email-password/web/signup-complete-screen.js +3 -3
  51. package/dist/auth-email-password/web/signup-screen.d.ts +1 -1
  52. package/dist/auth-email-password/web/signup-screen.js +13 -13
  53. package/dist/auth-email-password/web/tenant-switcher.d.ts +4 -4
  54. package/dist/auth-email-password/web/tenant-switcher.js +21 -22
  55. package/dist/auth-email-password/web/use-shell-user.js +12 -13
  56. package/dist/auth-email-password/web/user-menu.d.ts +4 -4
  57. package/dist/auth-email-password/web/user-menu.js +12 -13
  58. package/dist/auth-email-password/web/verify-email-screen.d.ts +2 -2
  59. package/dist/auth-email-password/web/verify-email-screen.js +9 -10
  60. package/dist/auth-foundation/boot-checks.js +4 -4
  61. package/dist/auth-foundation/resolve-anonymous-access.d.ts +1 -1
  62. package/dist/auth-foundation/resolve-anonymous-access.js +3 -3
  63. package/dist/auth-foundation/types.js +2 -2
  64. package/dist/auth-mfa/feature-exports.d.ts +2 -2
  65. package/dist/auth-mfa/feature.js +8 -0
  66. package/dist/auth-mfa/handlers/disable.write.js +3 -3
  67. package/dist/auth-mfa/handlers/enable-confirm-preauth.write.js +4 -4
  68. package/dist/auth-mfa/handlers/enable-confirm.write.js +2 -2
  69. package/dist/auth-mfa/handlers/enable-start-preauth.write.js +1 -1
  70. package/dist/auth-mfa/handlers/reencrypt.job.js +1 -1
  71. package/dist/auth-mfa/handlers/regenerate-recovery.write.js +5 -5
  72. package/dist/auth-mfa/handlers/verify.write.js +1 -1
  73. package/dist/auth-mfa/token-secrets.js +1 -1
  74. package/dist/auth-mfa/web/client-plugin.d.ts +1 -1
  75. package/dist/auth-mfa/web/client-plugin.js +1 -1
  76. package/dist/auth-mfa/web/i18n.js +8 -4
  77. package/dist/auth-mfa/web/index.js +4 -4
  78. package/dist/auth-mfa/web/mfa-client.js +17 -16
  79. package/dist/auth-mfa/web/mfa-code-or-recovery-field.d.ts +11 -0
  80. package/dist/auth-mfa/web/mfa-code-or-recovery-field.js +12 -0
  81. package/dist/auth-mfa/web/mfa-disable-dialog.js +14 -3
  82. package/dist/auth-mfa/web/mfa-regenerate-recovery-dialog.js +14 -3
  83. package/dist/auth-mfa/web/mfa-setup-preauth-screen.js +10 -5
  84. package/dist/auth-mfa/web/mfa-verify-screen.js +32 -11
  85. package/dist/billing-foundation/aggregate-id.d.ts +5 -5
  86. package/dist/billing-foundation/aggregate-id.js +10 -11
  87. package/dist/billing-foundation/checkout-core.d.ts +9 -14
  88. package/dist/billing-foundation/checkout-core.js +24 -39
  89. package/dist/billing-foundation/consumer-protection/confirmation-mail.js +8 -2
  90. package/dist/billing-foundation/consumer-protection/consent-gate.d.ts +1 -0
  91. package/dist/billing-foundation/consumer-protection/consent-gate.js +1 -0
  92. package/dist/billing-foundation/consumer-protection/issue-confirmation.js +9 -3
  93. package/dist/billing-foundation/consumer-protection/mail-notifications.js +3 -1
  94. package/dist/billing-foundation/consumer-protection/termination-receipt-limit.d.ts +4 -2
  95. package/dist/billing-foundation/consumer-protection/termination-receipt-limit.js +6 -5
  96. package/dist/billing-foundation/consumer-protection/termination-record.d.ts +5 -1
  97. package/dist/billing-foundation/consumer-protection/termination-record.js +27 -17
  98. package/dist/billing-foundation/consumer-protection/termination-request.js +12 -7
  99. package/dist/billing-foundation/consumer-protection/termination-revoke.js +12 -7
  100. package/dist/billing-foundation/consumer-protection/termination-texts.d.ts +1 -1
  101. package/dist/billing-foundation/consumer-protection/termination-texts.js +3 -0
  102. package/dist/billing-foundation/consumer-protection/withdrawal-period.d.ts +5 -2
  103. package/dist/billing-foundation/consumer-protection/withdrawal-period.js +8 -9
  104. package/dist/billing-foundation/entities.js +27 -27
  105. package/dist/billing-foundation/events.d.ts +1 -0
  106. package/dist/billing-foundation/events.js +19 -17
  107. package/dist/billing-foundation/feature.js +45 -44
  108. package/dist/billing-foundation/get-subscription-for-tenant.d.ts +3 -3
  109. package/dist/billing-foundation/get-subscription-for-tenant.js +3 -5
  110. package/dist/billing-foundation/handlers/billing-plans.query.js +35 -5
  111. package/dist/billing-foundation/handlers/create-checkout-session.write.js +19 -17
  112. package/dist/billing-foundation/handlers/create-portal-session.write.js +11 -12
  113. package/dist/billing-foundation/handlers/list-subscriptions.query.js +4 -4
  114. package/dist/billing-foundation/handlers/plan-switch-preview.query.d.ts +13 -0
  115. package/dist/billing-foundation/handlers/plan-switch-preview.query.js +48 -0
  116. package/dist/billing-foundation/handlers/process-event.write.d.ts +6 -0
  117. package/dist/billing-foundation/handlers/process-event.write.js +28 -22
  118. package/dist/billing-foundation/handlers/start-plan-checkout.write.js +32 -5
  119. package/dist/billing-foundation/handlers/switch-plan.write.d.ts +2 -2
  120. package/dist/billing-foundation/handlers/switch-plan.write.js +56 -64
  121. package/dist/billing-foundation/handlers/sync-subscription.write.js +12 -1
  122. package/dist/billing-foundation/i18n.js +22 -0
  123. package/dist/billing-foundation/index.d.ts +1 -1
  124. package/dist/billing-foundation/plan-catalog.d.ts +21 -5
  125. package/dist/billing-foundation/plan-catalog.js +25 -16
  126. package/dist/billing-foundation/plan-switch.d.ts +12 -0
  127. package/dist/billing-foundation/plan-switch.js +60 -0
  128. package/dist/billing-foundation/projection.d.ts +15 -11
  129. package/dist/billing-foundation/projection.js +38 -37
  130. package/dist/billing-foundation/subscription-tier-sync.js +3 -3
  131. package/dist/billing-foundation/tenant-destroy-hook.d.ts +2 -2
  132. package/dist/billing-foundation/tenant-destroy-hook.js +7 -7
  133. package/dist/billing-foundation/types.d.ts +97 -42
  134. package/dist/billing-foundation/types.js +29 -20
  135. package/dist/billing-foundation/validate-options.js +17 -0
  136. package/dist/billing-foundation/web/billing-plans-panel.js +82 -36
  137. package/dist/billing-foundation/web/checkout-consent-dialog.d.ts +17 -3
  138. package/dist/billing-foundation/web/checkout-consent-dialog.js +14 -10
  139. package/dist/billing-foundation/web/constants.d.ts +4 -0
  140. package/dist/billing-foundation/web/constants.js +4 -0
  141. package/dist/billing-foundation/web/plan-price.d.ts +15 -0
  142. package/dist/billing-foundation/web/plan-price.js +32 -0
  143. package/dist/billing-foundation/web/plan-switch-confirm-dialog.d.ts +15 -0
  144. package/dist/billing-foundation/web/plan-switch-confirm-dialog.js +66 -0
  145. package/dist/cap-counter/aggregate-id.js +8 -9
  146. package/dist/cap-counter/cap-reservation.js +5 -1
  147. package/dist/cap-counter/constants.js +11 -12
  148. package/dist/cap-counter/enforce-cap.d.ts +59 -62
  149. package/dist/cap-counter/enforce-cap.js +49 -49
  150. package/dist/cap-counter/entity.js +29 -29
  151. package/dist/cap-counter/feature.js +34 -35
  152. package/dist/cap-counter/handlers/increment-rolling.write.d.ts +2 -2
  153. package/dist/cap-counter/handlers/increment-rolling.write.js +31 -31
  154. package/dist/cap-counter/handlers/mark-soft-warned.write.js +4 -5
  155. package/dist/cap-counter/stock-cap-guard.js +8 -2
  156. package/dist/cap-counter/with-cap-enforcement.d.ts +3 -5
  157. package/dist/channel-email/feature.js +1 -1
  158. package/dist/channel-email/smtp-transport.d.ts +18 -17
  159. package/dist/channel-email/smtp-transport.js +24 -21
  160. package/dist/channel-in-app/handlers/unread-count.query.js +3 -4
  161. package/dist/compliance-profiles/feature.js +4 -4
  162. package/dist/compliance-profiles/handlers/for-tenant.query.js +3 -6
  163. package/dist/compliance-profiles/handlers/list-profiles.query.js +5 -5
  164. package/dist/compliance-profiles/handlers/needs-profile.query.js +4 -4
  165. package/dist/compliance-profiles/handlers/set-profile.write.js +13 -14
  166. package/dist/compliance-profiles/handlers/sub-processors.query.js +9 -11
  167. package/dist/compliance-profiles/resolve-for-tenant.js +7 -7
  168. package/dist/compliance-profiles/schema/profile-selection.js +18 -23
  169. package/dist/compliance-profiles/seeding.js +14 -15
  170. package/dist/compliance-profiles-ops/handlers/tenants-missing-profile.query.js +3 -3
  171. package/dist/compliance-profiles-ops/index.js +2 -2
  172. package/dist/config/handlers/cascade.query.d.ts +5 -0
  173. package/dist/config/handlers/cascade.query.js +4 -3
  174. package/dist/config/handlers/readiness.query.d.ts +4 -4
  175. package/dist/config/handlers/readiness.query.js +1 -1
  176. package/dist/config/handlers/reencrypt.job.js +4 -5
  177. package/dist/config/handlers/set.write.js +4 -4
  178. package/dist/config/handlers/values.query.d.ts +5 -0
  179. package/dist/config/handlers/values.query.js +4 -3
  180. package/dist/config/resolver.js +4 -4
  181. package/dist/config/table.js +10 -10
  182. package/dist/config/write-helpers.d.ts +1 -0
  183. package/dist/config/write-helpers.js +19 -10
  184. package/dist/crypto-shredding/handlers/forget-subject.write.d.ts +2 -2
  185. package/dist/crypto-shredding/handlers/forget-subject.write.js +25 -21
  186. package/dist/custom-fields/aggregate-id.d.ts +12 -13
  187. package/dist/custom-fields/aggregate-id.js +16 -17
  188. package/dist/custom-fields/entity.js +49 -47
  189. package/dist/custom-fields/events.js +7 -8
  190. package/dist/custom-fields/feature.d.ts +14 -14
  191. package/dist/custom-fields/feature.js +53 -54
  192. package/dist/custom-fields/handlers/clear-custom-field.write.d.ts +3 -2
  193. package/dist/custom-fields/handlers/clear-custom-field.write.js +9 -8
  194. package/dist/custom-fields/handlers/define-tenant-field.write.d.ts +1 -1
  195. package/dist/custom-fields/handlers/define-tenant-field.write.js +2 -2
  196. package/dist/custom-fields/handlers/delete-system-field.write.js +6 -7
  197. package/dist/custom-fields/handlers/delete-tenant-field.write.d.ts +1 -1
  198. package/dist/custom-fields/handlers/delete-tenant-field.write.js +3 -3
  199. package/dist/custom-fields/handlers/set-custom-field.write.d.ts +3 -3
  200. package/dist/custom-fields/handlers/set-custom-field.write.js +25 -28
  201. package/dist/custom-fields/handlers/update-tenant-field.write.d.ts +1 -1
  202. package/dist/custom-fields/handlers/update-tenant-field.write.js +1 -1
  203. package/dist/custom-fields/lib/field-access.js +2 -2
  204. package/dist/custom-fields/lib/parse-serialized-field.js +1 -1
  205. package/dist/custom-fields/lib/quota.js +1 -1
  206. package/dist/custom-fields/lib/value-schema.js +10 -12
  207. package/dist/custom-fields/run-retention.js +3 -3
  208. package/dist/custom-fields/schemas.js +14 -14
  209. package/dist/custom-fields/web/client-plugin.js +2 -5
  210. package/dist/custom-fields/web/constants.js +2 -2
  211. package/dist/custom-fields/web/custom-fields-form-section.d.ts +4 -4
  212. package/dist/custom-fields/web/custom-fields-form-section.js +22 -22
  213. package/dist/custom-fields/wire-for-entity.js +65 -67
  214. package/dist/custom-fields/wire-user-data-rights.js +3 -3
  215. package/dist/data-retention/_internal/parse-override.js +2 -3
  216. package/dist/data-retention/feature.js +11 -18
  217. package/dist/data-retention/handlers/policy-for.query.js +6 -6
  218. package/dist/data-retention/keep-for.d.ts +7 -7
  219. package/dist/data-retention/keep-for.js +15 -15
  220. package/dist/data-retention/override-schema.d.ts +3 -4
  221. package/dist/data-retention/override-schema.js +13 -15
  222. package/dist/data-retention/presets.d.ts +4 -5
  223. package/dist/data-retention/presets.js +18 -23
  224. package/dist/data-retention/resolve-tenant-preset.js +17 -16
  225. package/dist/data-retention/resolver.d.ts +12 -12
  226. package/dist/data-retention/resolver.js +24 -23
  227. package/dist/data-retention/run-retention-cleanup.d.ts +8 -3
  228. package/dist/data-retention/run-retention-cleanup.js +61 -51
  229. package/dist/data-retention/schema/tenant-retention-override.js +13 -11
  230. package/dist/delivery/channel-context.js +6 -3
  231. package/dist/delivery/db/queries/preferences.js +2 -2
  232. package/dist/delivery/delivery-service.js +22 -7
  233. package/dist/delivery/feature.js +2 -2
  234. package/dist/delivery/handlers/log.query.js +1 -1
  235. package/dist/delivery/handlers/preferences.query.d.ts +1 -1
  236. package/dist/delivery/handlers/preferences.query.js +20 -1
  237. package/dist/delivery/handlers/unsubscribe-page-chrome.query.js +1 -1
  238. package/dist/delivery/tables.js +9 -8
  239. package/dist/delivery/unsubscribe-link.d.ts +3 -1
  240. package/dist/delivery/unsubscribe-page-strings.d.ts +1 -0
  241. package/dist/delivery/unsubscribe-page-strings.js +1 -0
  242. package/dist/delivery/unsubscribe-page.d.ts +2 -0
  243. package/dist/delivery/unsubscribe-page.js +5 -0
  244. package/dist/delivery/unsubscribe.js +29 -11
  245. package/dist/document-ingest-foundation/entity.js +4 -4
  246. package/dist/document-ingest-foundation/events.js +2 -2
  247. package/dist/document-ingest-foundation/feature.js +2 -2
  248. package/dist/document-ingest-foundation/pages.js +1 -1
  249. package/dist/document-ingest-foundation/tenant-destroy-hook.js +4 -4
  250. package/dist/feature-toggles/compose-tier-resolver.js +1 -1
  251. package/dist/feature-toggles/feature.js +1 -1
  252. package/dist/feature-toggles/global-feature-state-table.js +1 -1
  253. package/dist/feature-toggles/handlers/registered.query.js +5 -5
  254. package/dist/feature-toggles/toggle-sync-signal.js +1 -1
  255. package/dist/feature-toggles/web/constants.js +1 -1
  256. package/dist/file-derivatives/feature.d.ts +1 -1
  257. package/dist/file-derivatives/feature.js +1 -1
  258. package/dist/file-derivatives/handlers/public-variant.query.js +1 -1
  259. package/dist/file-derivatives/presets.js +1 -1
  260. package/dist/file-foundation/feature.js +6 -6
  261. package/dist/file-foundation/index.d.ts +1 -1
  262. package/dist/file-foundation/index.js +1 -1
  263. package/dist/file-foundation/read-file-ref-content.d.ts +3 -0
  264. package/dist/file-foundation/read-file-ref-content.js +6 -1
  265. package/dist/file-provider-inmemory/feature.d.ts +1 -1
  266. package/dist/file-provider-inmemory/feature.js +16 -16
  267. package/dist/file-provider-s3/env-named-feature.d.ts +0 -2
  268. package/dist/file-provider-s3/feature.js +16 -16
  269. package/dist/file-provider-s3/lib/s3-provider.js +6 -6
  270. package/dist/files/feature.js +6 -6
  271. package/dist/files-tenant-data/handlers/sweep-orphaned-derivatives.job.js +4 -4
  272. package/dist/files-tenant-data/hooks.js +24 -26
  273. package/dist/files-tenant-data/index.js +1 -1
  274. package/dist/folders/feature.d.ts +1 -1
  275. package/dist/folders/web/folder-manager.js +2 -2
  276. package/dist/folders/web/tree.js +5 -5
  277. package/dist/form-draft/db/queries/cleanup.js +3 -3
  278. package/dist/form-draft/db/queries/owned-file-refs.js +1 -1
  279. package/dist/form-draft/decrypt-draft.js +5 -1
  280. package/dist/form-draft/entity.js +3 -3
  281. package/dist/form-draft/feature.js +4 -5
  282. package/dist/form-draft/handlers/discard.write.js +1 -1
  283. package/dist/form-draft/release-file-refs.js +6 -6
  284. package/dist/form-draft/schemas.js +3 -3
  285. package/dist/form-draft/web/constants.js +0 -2
  286. package/dist/host-routing/dispatch.js +11 -20
  287. package/dist/inbound-mail-foundation/aggregate-id.d.ts +13 -13
  288. package/dist/inbound-mail-foundation/aggregate-id.js +19 -19
  289. package/dist/inbound-mail-foundation/connect-routes.js +4 -3
  290. package/dist/inbound-mail-foundation/constants.d.ts +22 -24
  291. package/dist/inbound-mail-foundation/constants.js +30 -33
  292. package/dist/inbound-mail-foundation/entities.d.ts +12 -12
  293. package/dist/inbound-mail-foundation/entities.js +47 -48
  294. package/dist/inbound-mail-foundation/events.d.ts +4 -3
  295. package/dist/inbound-mail-foundation/events.js +50 -47
  296. package/dist/inbound-mail-foundation/feature.js +39 -39
  297. package/dist/inbound-mail-foundation/handlers/account-state.js +8 -8
  298. package/dist/inbound-mail-foundation/handlers/connect-account.write.js +25 -26
  299. package/dist/inbound-mail-foundation/handlers/disconnect-account.write.js +7 -7
  300. package/dist/inbound-mail-foundation/handlers/ingest-message.write.js +50 -51
  301. package/dist/inbound-mail-foundation/handlers/list-accounts.query.js +8 -8
  302. package/dist/inbound-mail-foundation/handlers/list-messages.query.js +10 -10
  303. package/dist/inbound-mail-foundation/handlers/scope-visibility.js +3 -4
  304. package/dist/inbound-mail-foundation/handlers/update-account.write.d.ts +2 -2
  305. package/dist/inbound-mail-foundation/handlers/update-account.write.js +22 -14
  306. package/dist/inbound-mail-foundation/i18n.js +0 -1
  307. package/dist/inbound-mail-foundation/oauth-state.d.ts +5 -5
  308. package/dist/inbound-mail-foundation/oauth-state.js +11 -10
  309. package/dist/inbound-mail-foundation/projection.d.ts +4 -4
  310. package/dist/inbound-mail-foundation/projection.js +31 -29
  311. package/dist/inbound-mail-foundation/provider-factory.d.ts +4 -4
  312. package/dist/inbound-mail-foundation/provider-factory.js +9 -9
  313. package/dist/inbound-mail-foundation/retention-sweep.d.ts +5 -3
  314. package/dist/inbound-mail-foundation/retention-sweep.js +38 -36
  315. package/dist/inbound-mail-foundation/screens.js +0 -3
  316. package/dist/inbound-mail-foundation/tenant-destroy-hook.js +14 -16
  317. package/dist/inbound-mail-foundation/types.d.ts +49 -49
  318. package/dist/inbound-mail-foundation/types.js +21 -21
  319. package/dist/inbound-mail-foundation/watch-supervisor.d.ts +10 -10
  320. package/dist/inbound-mail-foundation/watch-supervisor.js +85 -67
  321. package/dist/inbound-provider-imap/credential-document.js +13 -13
  322. package/dist/inbound-provider-imap/feature.d.ts +2 -2
  323. package/dist/inbound-provider-imap/feature.js +42 -40
  324. package/dist/inbound-provider-imap/imap-client.d.ts +12 -11
  325. package/dist/inbound-provider-imap/imap-client.js +20 -19
  326. package/dist/inbound-provider-inmemory/feature.d.ts +9 -9
  327. package/dist/inbound-provider-inmemory/feature.js +19 -19
  328. package/dist/jobs/db/queries/retention.js +2 -2
  329. package/dist/jobs/db/queries/stale-run-sweep.js +3 -3
  330. package/dist/jobs/events.js +1 -1
  331. package/dist/jobs/feature.d.ts +1 -0
  332. package/dist/jobs/feature.js +13 -10
  333. package/dist/jobs/handlers/detail.query.js +4 -4
  334. package/dist/jobs/handlers/list.query.js +1 -1
  335. package/dist/jobs/handlers/projection-rebuild.job.js +1 -1
  336. package/dist/jobs/handlers/reindex-entity.job.js +1 -1
  337. package/dist/jobs/handlers/retry.write.js +1 -1
  338. package/dist/jobs/handlers/tenant-failures.query.d.ts +1 -1
  339. package/dist/jobs/handlers/tenant-failures.query.js +45 -41
  340. package/dist/jobs/handlers/tenant-runs.query.d.ts +1 -1
  341. package/dist/jobs/handlers/tenant-runs.query.js +54 -50
  342. package/dist/jobs/job-instant.js +1 -1
  343. package/dist/jobs/job-run-logger.js +15 -15
  344. package/dist/jobs/job-run-table.js +3 -3
  345. package/dist/jobs/screens.js +1 -1
  346. package/dist/jobs/tenant-job-failure-table.js +1 -1
  347. package/dist/jobs/tenant-job-run-table.js +1 -1
  348. package/dist/ledger/entity.js +5 -5
  349. package/dist/ledger/feature.js +3 -3
  350. package/dist/ledger/handlers/confirm-schedule-period.write.js +3 -3
  351. package/dist/ledger/recurring.js +12 -12
  352. package/dist/ledger/schemas.js +1 -1
  353. package/dist/ledger/web/constants.js +2 -2
  354. package/dist/ledger/web/index.js +7 -7
  355. package/dist/legal-pages/feature.d.ts +4 -4
  356. package/dist/legal-pages/feature.js +25 -26
  357. package/dist/legal-pages/markdown.js +3 -3
  358. package/dist/legal-pages/web/client-plugin.js +23 -24
  359. package/dist/legal-pages/web/index.js +0 -1
  360. package/dist/mail-foundation/feature.d.ts +5 -5
  361. package/dist/mail-foundation/feature.js +27 -25
  362. package/dist/mail-transport-inmemory/feature.d.ts +4 -4
  363. package/dist/mail-transport-inmemory/feature.js +27 -28
  364. package/dist/mail-transport-smtp/feature.js +20 -20
  365. package/dist/managed-pages/branding.js +6 -6
  366. package/dist/managed-pages/feature.d.ts +26 -26
  367. package/dist/managed-pages/feature.js +34 -34
  368. package/dist/managed-pages/handlers/by-slug.query.js +5 -6
  369. package/dist/managed-pages/handlers/by-tenant-published.query.js +2 -2
  370. package/dist/managed-pages/handlers/set.write.js +5 -7
  371. package/dist/managed-pages/screens/page-screens.js +11 -11
  372. package/dist/managed-pages/seeding.js +8 -8
  373. package/dist/managed-pages/table.js +13 -12
  374. package/dist/managed-pages/web/client-plugin.d.ts +1 -1
  375. package/dist/managed-pages/web/client-plugin.js +5 -5
  376. package/dist/managed-pages/web/i18n.js +1 -1
  377. package/dist/notes-history/entity.js +4 -4
  378. package/dist/notes-history/feature.d.ts +2 -2
  379. package/dist/notes-history-user-data/hooks.js +1 -1
  380. package/dist/page-render/layout.js +9 -9
  381. package/dist/page-render/markdown.js +11 -11
  382. package/dist/page-render/security-headers.js +7 -6
  383. package/dist/personal-access-tokens/feature.d.ts +1 -1
  384. package/dist/personal-access-tokens/feature.js +9 -5
  385. package/dist/personal-access-tokens/roles.js +2 -2
  386. package/dist/readiness/handlers/status.query.js +3 -3
  387. package/dist/renderer-foundation/api.js +12 -13
  388. package/dist/renderer-foundation/constants.js +2 -2
  389. package/dist/renderer-foundation/feature.js +7 -7
  390. package/dist/renderer-pdf/render-table-pdf.d.ts +1 -1
  391. package/dist/renderer-pdf/render-table-pdf.js +22 -10
  392. package/dist/secrets/feature.js +9 -9
  393. package/dist/secrets/web/constants.js +2 -2
  394. package/dist/seo/feature.js +3 -3
  395. package/dist/sessions/constants.d.ts +1 -1
  396. package/dist/sessions/constants.js +1 -1
  397. package/dist/sessions/feature.d.ts +2 -2
  398. package/dist/sessions/feature.js +12 -8
  399. package/dist/sessions/handlers/revoke-all-for-user.write.js +2 -2
  400. package/dist/sessions/handlers/revoke-all-others.write.js +2 -2
  401. package/dist/sessions/handlers/revoke.write.js +1 -1
  402. package/dist/sessions/schema/user-session.js +4 -4
  403. package/dist/sessions/screens.js +2 -2
  404. package/dist/sessions/session-callbacks.js +2 -2
  405. package/dist/sessions/session-revoked-event.js +2 -2
  406. package/dist/shared/assert-no-where-rule-in-ownership-write.js +1 -1
  407. package/dist/shared/decrypt-stored-pii.d.ts +1 -0
  408. package/dist/shared/decrypt-stored-pii.js +7 -2
  409. package/dist/shared/encrypt-for-direct-write.js +1 -1
  410. package/dist/shared/index.d.ts +1 -1
  411. package/dist/shared/index.js +1 -1
  412. package/dist/shared/mail-template-body.d.ts +6 -2
  413. package/dist/shared/mail-template-body.js +7 -4
  414. package/dist/shared/map-with-concurrency.js +5 -4
  415. package/dist/shared/parent-visibility.js +2 -2
  416. package/dist/shared/password-hashing.js +1 -1
  417. package/dist/shared/signup-handover.js +1 -2
  418. package/dist/shared/single-use-token-store.js +1 -1
  419. package/dist/step-dispatcher/feature.js +1 -0
  420. package/dist/subscription-dodo/client.d.ts +17 -0
  421. package/dist/subscription-dodo/client.js +31 -0
  422. package/dist/subscription-dodo/constants.d.ts +12 -0
  423. package/dist/subscription-dodo/constants.js +19 -0
  424. package/dist/subscription-dodo/feature.d.ts +37 -0
  425. package/dist/subscription-dodo/feature.js +144 -0
  426. package/dist/subscription-dodo/index.d.ts +2 -0
  427. package/dist/subscription-dodo/index.js +4 -0
  428. package/dist/subscription-dodo/plugin-methods.d.ts +23 -0
  429. package/dist/subscription-dodo/plugin-methods.js +260 -0
  430. package/dist/subscription-dodo/runtime.d.ts +27 -0
  431. package/dist/subscription-dodo/runtime.js +89 -0
  432. package/dist/subscription-dodo/verify-webhook.d.ts +37 -0
  433. package/dist/subscription-dodo/verify-webhook.js +189 -0
  434. package/dist/subscription-mollie/constants.js +15 -17
  435. package/dist/subscription-mollie/feature.d.ts +17 -18
  436. package/dist/subscription-mollie/feature.js +24 -24
  437. package/dist/subscription-mollie/index.js +3 -3
  438. package/dist/subscription-mollie/plugin-methods.d.ts +2 -2
  439. package/dist/subscription-mollie/plugin-methods.js +15 -14
  440. package/dist/subscription-mollie/verify-webhook.d.ts +10 -10
  441. package/dist/subscription-mollie/verify-webhook.js +27 -27
  442. package/dist/subscription-stripe/constants.js +4 -6
  443. package/dist/subscription-stripe/feature.d.ts +14 -14
  444. package/dist/subscription-stripe/feature.js +36 -34
  445. package/dist/subscription-stripe/index.js +6 -6
  446. package/dist/subscription-stripe/plugin-methods.js +18 -18
  447. package/dist/subscription-stripe/runtime.d.ts +1 -1
  448. package/dist/subscription-stripe/runtime.js +8 -7
  449. package/dist/subscription-stripe/verify-webhook.d.ts +11 -11
  450. package/dist/subscription-stripe/verify-webhook.js +59 -61
  451. package/dist/tags/feature.d.ts +3 -3
  452. package/dist/tags/screens.js +1 -1
  453. package/dist/template-resolver/api.d.ts +3 -2
  454. package/dist/template-resolver/api.js +34 -12
  455. package/dist/template-resolver/compile-document-body.js +1 -0
  456. package/dist/template-resolver/feature.js +2 -2
  457. package/dist/template-resolver/handlers/bundle-import.js +3 -3
  458. package/dist/template-resolver/handlers/copy-locale.write.d.ts +5 -1
  459. package/dist/template-resolver/handlers/copy-locale.write.js +22 -7
  460. package/dist/template-resolver/handlers/diff-to-system.query.js +3 -2
  461. package/dist/template-resolver/handlers/document-base.js +3 -2
  462. package/dist/template-resolver/handlers/find-by-id.query.js +8 -7
  463. package/dist/template-resolver/handlers/list.query.js +6 -7
  464. package/dist/template-resolver/handlers/overview.query.d.ts +3 -0
  465. package/dist/template-resolver/handlers/overview.query.js +6 -3
  466. package/dist/template-resolver/handlers/shared.js +2 -2
  467. package/dist/template-resolver/handlers/template-write.js +3 -3
  468. package/dist/template-resolver/handlers/tenant-override-counts.query.js +1 -3
  469. package/dist/template-resolver/handlers/tenant-override-selection.d.ts +2 -1
  470. package/dist/template-resolver/handlers/tenant-overrides.query.js +28 -5
  471. package/dist/template-resolver/handlers/upsert-system.write.js +3 -4
  472. package/dist/template-resolver/handlers/upsert-tenant.write.js +4 -5
  473. package/dist/template-resolver/handlers/usage.query.d.ts +2 -1
  474. package/dist/template-resolver/handlers/usage.query.js +26 -16
  475. package/dist/template-resolver/handlers/validate.query.js +7 -2
  476. package/dist/template-resolver/seeding.js +30 -14
  477. package/dist/template-resolver/store-template-resource.d.ts +1 -0
  478. package/dist/template-resolver/store-template-resource.js +19 -4
  479. package/dist/template-resolver/table.js +10 -11
  480. package/dist/template-resolver/template-delivery-policy.d.ts +0 -5
  481. package/dist/template-resolver/template-delivery-policy.js +0 -6
  482. package/dist/template-resolver/template-meta.js +7 -4
  483. package/dist/template-resolver/template-preview.js +4 -3
  484. package/dist/template-resolver/web/client-plugin.js +2 -2
  485. package/dist/template-resolver/web/constants.d.ts +2 -2
  486. package/dist/template-resolver/web/constants.js +3 -3
  487. package/dist/template-resolver/web/index.d.ts +1 -0
  488. package/dist/template-resolver/web/index.js +1 -0
  489. package/dist/template-resolver/web/mail-layout-constants.d.ts +5 -0
  490. package/dist/template-resolver/web/mail-layout-constants.js +7 -0
  491. package/dist/tenant/feature.js +7 -7
  492. package/dist/tenant/handlers/member-directory.query.d.ts +1 -0
  493. package/dist/tenant/handlers/member-directory.query.js +11 -4
  494. package/dist/tenant/handlers/members.query.js +1 -1
  495. package/dist/tenant/handlers/team-list.query.js +1 -1
  496. package/dist/tenant/handlers/tenant-directory.query.d.ts +1 -0
  497. package/dist/tenant/handlers/tenant-directory.query.js +9 -5
  498. package/dist/tenant/invitation-table.js +37 -40
  499. package/dist/tenant/membership-table.js +3 -3
  500. package/dist/tenant/schema/tenant.js +7 -9
  501. package/dist/tenant/screens.js +1 -1
  502. package/dist/tenant/seeding.d.ts +6 -5
  503. package/dist/tenant/seeding.js +12 -12
  504. package/dist/tenant/testing.js +5 -6
  505. package/dist/tenant/web/constants.js +2 -2
  506. package/dist/tenant-handover/events.js +5 -7
  507. package/dist/tenant-handover/feature.js +1 -1
  508. package/dist/tenant-handover/grant.js +1 -1
  509. package/dist/tenant-handover/handlers/claim.write.js +1 -1
  510. package/dist/tenant-handover/move-entity-graph.js +8 -9
  511. package/dist/tenant-handover/signup-handover-provider.js +1 -2
  512. package/dist/tenant-handover/transfer-graph.js +4 -5
  513. package/dist/tenant-lifecycle/boot-checks.js +1 -1
  514. package/dist/tenant-lifecycle/constants.d.ts +1 -0
  515. package/dist/tenant-lifecycle/constants.js +4 -0
  516. package/dist/tenant-lifecycle/feature.js +1 -1
  517. package/dist/tenant-lifecycle/run-tenant-destroy.js +2 -2
  518. package/dist/tenant-settings/constants.js +1 -1
  519. package/dist/tenant-settings/tenant-defaults.d.ts +1 -1
  520. package/dist/tenant-settings/tenant-defaults.js +9 -2
  521. package/dist/tier-engine/aggregate-id.d.ts +11 -11
  522. package/dist/tier-engine/aggregate-id.js +15 -16
  523. package/dist/tier-engine/compose-app.d.ts +14 -14
  524. package/dist/tier-engine/compose-app.js +1 -1
  525. package/dist/tier-engine/entity.js +18 -19
  526. package/dist/tier-engine/feature.d.ts +19 -17
  527. package/dist/tier-engine/feature.js +68 -69
  528. package/dist/tier-engine/handlers/active-tier.query.js +6 -7
  529. package/dist/tier-engine/handlers/get-tenant-tier.query.js +4 -4
  530. package/dist/tier-engine/handlers/set-tenant-tier.write.d.ts +7 -8
  531. package/dist/tier-engine/handlers/set-tenant-tier.write.js +7 -4
  532. package/dist/tier-engine/tier-resolver.js +2 -2
  533. package/dist/tier-engine/trial.js +8 -8
  534. package/dist/tier-engine/web/constants.js +2 -2
  535. package/dist/tier-engine/web/index.js +4 -4
  536. package/dist/user/db/queries/stream-tenant-backfill.js +8 -8
  537. package/dist/user/handlers/create.write.js +4 -4
  538. package/dist/user/schema/user.d.ts +11 -11
  539. package/dist/user/schema/user.js +45 -44
  540. package/dist/user/seeding.d.ts +15 -15
  541. package/dist/user/seeding.js +28 -28
  542. package/dist/user/testing.js +3 -3
  543. package/dist/user-data-rights/audit-download.d.ts +8 -8
  544. package/dist/user-data-rights/audit-download.js +19 -20
  545. package/dist/user-data-rights/boot-checks.js +1 -1
  546. package/dist/user-data-rights/deletion-token.js +1 -1
  547. package/dist/user-data-rights/feature.d.ts +49 -50
  548. package/dist/user-data-rights/feature.js +54 -53
  549. package/dist/user-data-rights/handlers/cancel-deletion.write.js +9 -9
  550. package/dist/user-data-rights/handlers/confirm-deletion-by-token.write.js +8 -8
  551. package/dist/user-data-rights/handlers/download-by-job.query.js +29 -30
  552. package/dist/user-data-rights/handlers/download-by-token.query.js +40 -42
  553. package/dist/user-data-rights/handlers/export-status.query.js +8 -9
  554. package/dist/user-data-rights/handlers/lift-restriction.write.js +7 -8
  555. package/dist/user-data-rights/handlers/list-download-attempts.query.js +2 -2
  556. package/dist/user-data-rights/handlers/my-audit-log.query.js +4 -4
  557. package/dist/user-data-rights/handlers/request-deletion-by-email.write.d.ts +5 -5
  558. package/dist/user-data-rights/handlers/request-deletion-by-email.write.js +16 -15
  559. package/dist/user-data-rights/handlers/request-deletion.write.d.ts +2 -2
  560. package/dist/user-data-rights/handlers/request-deletion.write.js +7 -9
  561. package/dist/user-data-rights/handlers/request-export.write.js +42 -41
  562. package/dist/user-data-rights/handlers/restrict-account.write.js +22 -19
  563. package/dist/user-data-rights/handlers/run-forget-cleanup.write.js +8 -8
  564. package/dist/user-data-rights/index.js +8 -10
  565. package/dist/user-data-rights/lib/default-mailers.js +3 -3
  566. package/dist/user-data-rights/lib/update-user-lifecycle.js +14 -17
  567. package/dist/user-data-rights/run-export-jobs.d.ts +38 -42
  568. package/dist/user-data-rights/run-export-jobs.js +130 -237
  569. package/dist/user-data-rights/run-forget-cleanup.d.ts +16 -20
  570. package/dist/user-data-rights/run-forget-cleanup.js +65 -83
  571. package/dist/user-data-rights/run-user-export.d.ts +34 -33
  572. package/dist/user-data-rights/run-user-export.js +55 -57
  573. package/dist/user-data-rights/schema/download-attempt.js +11 -11
  574. package/dist/user-data-rights/schema/download-token.js +37 -41
  575. package/dist/user-data-rights/schema/export-job.d.ts +4 -4
  576. package/dist/user-data-rights/schema/export-job.js +65 -67
  577. package/dist/user-data-rights/token-helpers.d.ts +8 -9
  578. package/dist/user-data-rights/token-helpers.js +21 -25
  579. package/dist/user-data-rights/web/client-plugin.d.ts +5 -5
  580. package/dist/user-data-rights/web/client-plugin.js +1 -1
  581. package/dist/user-data-rights/web/confirm-deletion-screen.js +6 -5
  582. package/dist/user-data-rights/web/constants.js +1 -1
  583. package/dist/user-data-rights/web/index.js +5 -5
  584. package/dist/user-data-rights/web/privacy-center-screen.js +14 -13
  585. package/dist/user-data-rights/web/public-deletion-gate.d.ts +4 -4
  586. package/dist/user-data-rights/web/request-deletion-screen.js +6 -6
  587. package/dist/user-data-rights/zip-path.d.ts +15 -15
  588. package/dist/user-data-rights/zip-path.js +41 -40
  589. package/dist/user-data-rights-defaults/feature.js +15 -15
  590. package/dist/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.js +3 -5
  591. package/dist/user-data-rights-defaults/hooks/file-ref.userdata-hook.js +45 -51
  592. package/dist/user-data-rights-defaults/hooks/job-run.userdata-hook.js +2 -2
  593. package/dist/user-data-rights-defaults/hooks/notification-preference.userdata-hook.js +1 -1
  594. package/dist/user-data-rights-defaults/hooks/user-session.userdata-hook.js +3 -3
  595. package/dist/user-data-rights-defaults/hooks/user.userdata-hook.js +32 -31
  596. package/dist/user-profile/handlers/change-email.write.js +13 -13
  597. package/dist/user-profile/index.js +3 -3
  598. package/dist/user-profile/web/client-plugin.js +1 -1
  599. package/dist/user-profile/web/constants.js +1 -1
  600. package/dist/user-profile/web/profile-screen.js +1 -1
  601. package/dist/waitlist/handlers/export-purge.write.js +2 -1
  602. package/dist/waitlist/handlers/submit.write.js +5 -5
  603. package/dist/waitlist/import.d.ts +1 -0
  604. package/dist/waitlist/import.js +4 -0
  605. package/dist/waitlist/legacy-migrate.js +17 -6
  606. package/dist/waitlist/link-on-signup.js +18 -6
  607. package/dist/waitlist/options.d.ts +3 -0
  608. package/dist/workflow-runner/aggregate-id.d.ts +1 -1
  609. package/dist/workflow-runner/aggregate-id.js +1 -1
  610. package/dist/workflow-runner/event-subscriber.js +4 -5
  611. package/dist/workflow-runner/event-trigger.js +4 -17
  612. package/dist/workflow-runner/feature.js +2 -2
  613. package/dist/workflow-runner/handlers/resume-run.write.js +4 -4
  614. package/dist/workflow-runner/pending-projection.js +6 -7
  615. package/dist/workflow-runner/runner.js +6 -6
  616. package/dist/workflow-runner/tables.js +6 -6
  617. package/dist/workflow-runner/workflow-registry.js +1 -1
  618. package/package.json +20 -10
  619. package/src/agent-tools/changes.json +6 -0
  620. package/src/audit/changes.json +12 -0
  621. package/src/auth-mfa/changes.json +6 -0
  622. package/src/billing-foundation/changes.json +55 -0
  623. package/src/cap-counter/changes.json +18 -0
  624. package/src/channel-email/changes.json +6 -0
  625. package/src/config/changes.json +12 -0
  626. package/src/crypto-shredding/changes.json +6 -0
  627. package/src/delivery/changes.json +30 -0
  628. package/src/form-draft/changes.json +6 -0
  629. package/src/host-routing/changes.json +6 -0
  630. package/src/inbound-mail-foundation/changes.json +18 -0
  631. package/src/jobs/changes.json +13 -0
  632. package/src/mail-foundation/changes.json +6 -0
  633. package/src/renderer-pdf/changes.json +6 -0
  634. package/src/step-dispatcher/changes.json +6 -0
  635. package/src/subscription-dodo/changes.json +14 -0
  636. package/src/subscription-stripe/changes.json +12 -0
  637. package/src/template-resolver/changes.json +48 -0
  638. package/src/tenant/changes.json +6 -0
  639. package/src/tenant-lifecycle/changes.json +6 -0
  640. package/src/tier-engine/changes.json +6 -0
  641. package/src/waitlist/changes.json +18 -0
  642. package/dist/billing-foundation/consumer-protection/stored-user-email.d.ts +0 -1
  643. package/dist/billing-foundation/consumer-protection/stored-user-email.js +0 -8
@@ -1,45 +1,44 @@
1
- // tier-engine — Pricing-Tier-Mechanik als reguläres Bundled-Feature.
1
+ // tier-engine — pricing-tier mechanics as a regular bundled feature.
2
2
  //
3
- // **Was diese Feature macht:**
4
- // Speichert pro Plattform-Tenant ein Tier-Assignment (welcher Tier ist
5
- // aktiv). Optional (mit `tierMap` in Options): per-tenant feature-set
6
- // resolution via Framework's `tenantTierResolver`-extension — das
7
- // dispatcher-feature-gate fragt automatisch pro request den resolver
8
- // nach dem effective Set für den aktiven Tenant.
3
+ // **What this feature does:**
4
+ // Stores one tier assignment per platform tenant (the active tier). With
5
+ // `tierMap` in the options, it also resolves the per-tenant feature set via
6
+ // the framework's `tenantTierResolver` extension; the dispatcher feature gate
7
+ // automatically asks the resolver for the active tenant's effective set.
9
8
  //
10
- // **Zwei Use-Modes:**
11
- // 1. `createTierEngineFeature()` ohne opts — nur Storage (Standard-CRUD
12
- // für tier-assignment-Entity). Apps die composeApp() oder eigene
13
- // logic nutzen.
14
- // 2. `createTierEngineFeature({ defaultTier, tierMap })` — vollständige
15
- // Tier-Composition. Sprint-8a Pattern für multi-tenant SaaS-Apps.
16
- // Framework auto-wires effectiveFeatures via extension-pickup.
9
+ // **Two usage modes:**
10
+ // 1. `createTierEngineFeature()` without options — storage only (standard CRUD
11
+ // for the tier-assignment entity). Apps can use `composeApp()` or their
12
+ // own logic.
13
+ // 2. `createTierEngineFeature({ defaultTier, tierMap })` — complete tier
14
+ // composition for multi-tenant SaaS apps. The framework auto-wires
15
+ // effectiveFeatures through extension pickup.
17
16
  //
18
- // **Generic über Tier-Werte:** das Feature kennt keine "free"/"pro"/etc.
19
- // konkreten Tier-Werte. App definiert ihre TierMap.
17
+ // **Generic over tier values:** the feature knows no concrete `free`/`pro`/etc.
18
+ // tier values. The app defines its tier map.
20
19
  //
21
- // **Auto-Default-Tier on Tenant-Signup:** wenn `opts.defaultTier` gesetzt
22
- // ist, schreibt ein r.entityHook("postSave", "tenant", phase: inTransaction)
23
- // automatisch eine tier-assignment für den neuen Tenant. Atomic mit
24
- // tenant-create — wenn tier-assignment fail't, tenant-create rolled back.
25
- // Idempotent via deterministic aggregate-id (re-replay re-checkt stream-
26
- // version, skip wenn schon da). Plus: cache-miss-fallback returnt
27
- // defaultTier-features wenn assignment-row fehlt (defense-in-depth gegen
28
- // replay-races wo der hook noch nicht durch ist).
20
+ // **Auto-default tier on tenant signup:** when `opts.defaultTier` is set, an
21
+ // `r.entityHook("postSave", "tenant", phase: inTransaction)` automatically
22
+ // writes a tier assignment for the new tenant. The write is atomic with
23
+ // tenant creation: if it fails, tenant creation is rolled back. It is
24
+ // idempotent through a deterministic aggregate ID; replay re-checks the
25
+ // stream version and skips the write if it already exists. A cache-miss
26
+ // fallback also returns the default tier's features when the assignment row
27
+ // is missing, protecting against races while the hook is still running.
29
28
  //
30
- // **In-Memory-Cache mit Push-Invalidation:**
31
- // Closure-state pro feature-instance hält die effective Sets pro Tenant.
32
- // r.entityHook auf tier-assignment:postSave/postDelete hält cache aktuell.
33
- // Erste-Request-Cold-Cache: pre-load via build(deps) im extension-pickup
34
- // Pfad (boot-time via runDevApp/runProdApp).
29
+ // **In-memory cache with push invalidation:**
30
+ // Closure state per feature instance stores each tenant's effective sets.
31
+ // `r.entityHook` on tier-assignment postSave/postDelete keeps the cache
32
+ // current. The extension-pickup path pre-loads the cache through build(deps)
33
+ // at boot via runDevApp/runProdApp.
35
34
  //
36
- // **SYSTEM_TENANT_ID-Convention:**
37
- // resolver-callback bei call mit SYSTEM_TENANT_ID returnt union aller
38
- // tier-features (für event-dispatcher async-pass + operator-tooling).
39
- // Siehe DispatcherOptions.effectiveFeatures-doc.
35
+ // **SYSTEM_TENANT_ID convention:**
36
+ // A resolver callback invoked with SYSTEM_TENANT_ID returns the union of all
37
+ // tier features for asynchronous event dispatch and operator tooling.
38
+ // See the DispatcherOptions.effectiveFeatures documentation.
40
39
  //
41
- // **Boot-Dependencies:** config + tenant.
42
- // kumiko-lint-ignore app-feature-structure Phase-3 conversion tracked in #2312 (feature.ts > 300 lines)
40
+ // **Boot dependencies:** config + tenant.
41
+ // kumiko-lint-ignore app-feature-structure feature.ts is over 300 lines and not yet split
43
42
  import { buildEntityTable, createEventStoreExecutor, createTenantDb, fetchOne, selectMany, } from "@cosmicdrift/kumiko-framework/db";
44
43
  import { defineEntityCreateHandler, defineEntityListHandler, defineEntityUpdateHandler, defineFeature, defineQueryHandler, HookPhases, SYSTEM_TENANT_ID, TENANT_TIER_RESOLVER_EXT, } from "@cosmicdrift/kumiko-framework/engine";
45
44
  import { getUnscopedAggregateStreamMaxVersion } from "@cosmicdrift/kumiko-framework/event-store";
@@ -61,25 +60,25 @@ import { TIER_ENGINE_I18N } from "./web/i18n.js";
61
60
  // in the App's drizzle/schema.generated.ts.
62
61
  const tierAssignmentTable = buildEntityTable("tier-assignment", tierAssignmentEntity);
63
62
  const log = createFallbackLogger("tier-engine");
64
- // Event-store-executor für direct-write aus dem auto-default-tier-hook.
65
- // Pattern wie tenant/seeding.ts: hook sieht AppContext (kein ctx.write),
66
- // muss aber atomisch mit tenant-create im selben TX schreiben → executor
67
- // direkt aufrufen, nicht via dispatcher.
63
+ // Event-store executor for direct writes from the auto-default-tier hook.
64
+ // Like tenant/seeding.ts, the hook receives AppContext (not ctx.write), but it
65
+ // must write atomically with tenant creation in the same transaction. Call the
66
+ // executor directly rather than going through the dispatcher.
68
67
  const tierAssignmentExecutor = createEventStoreExecutor(tierAssignmentTable, tierAssignmentEntity, {
69
68
  entityName: "tier-assignment",
70
69
  });
71
70
  const adminAccess = { access: { roles: ["TenantAdmin", "SystemAdmin"] } };
72
- // Tier-Wechsel ist Plattform-/Billing-Hoheit — ein Tenant-Admin darf den
73
- // eigenen Tier NIE setzen (sonst Gratis-Self-Upgrade). Daher sind die
74
- // Writes SystemAdmin-only; Reads (list, get-active-tier) bleiben
75
- // TenantAdmin-sichtbar. Auto-default-Hook + Billing schreiben als System,
76
- // hängen also nicht an diesem Handler-Access.
71
+ // Tier changes are controlled by the platform and billing: a TenantAdmin must
72
+ // never set its own tier, which would allow a free self-upgrade. Writes are
73
+ // therefore SystemAdmin-only, while reads (list, get-active-tier) remain visible
74
+ // to TenantAdmin. The auto-default hook and billing write as the system, so they
75
+ // are not subject to this handler access.
77
76
  const writeAccess = { access: { roles: ["SystemAdmin"] } };
78
77
  /**
79
- * Compute the union of features across all tiers — verwendet bei
80
- * SYSTEM_TENANT_ID-resolver-call (operator-tooling, async-event-dispatch).
81
- * Operator-UI sieht alle features unabhängig vom tier-cut, async-events
82
- * laufen tier-agnostic durch.
78
+ * Computes the union of features across all tiers for a
79
+ * SYSTEM_TENANT_ID resolver call used by operator tooling and asynchronous
80
+ * event dispatch. The operator UI sees every feature regardless of tier, and
81
+ * asynchronous events run without tier restrictions.
83
82
  */
84
83
  function unionAllTierFeatures(tierMap) {
85
84
  const all = new Set();
@@ -90,9 +89,9 @@ function unionAllTierFeatures(tierMap) {
90
89
  return all;
91
90
  }
92
91
  /**
93
- * Compute the feature-set for a given tier-name. Unknown tier → empty Set
94
- * (defensive — verwendete tier-namen werden nicht an boot-time validiert
95
- * weil tier-engine generic über tier-Werte ist).
92
+ * Computes the feature set for a tier name. An unknown tier returns an empty
93
+ * Set defensively because tier names are not validated at boot; tier-engine is
94
+ * generic over tier values.
96
95
  */
97
96
  function featuresForTier(tierMap, tierName) {
98
97
  const tier = tierMap[tierName];
@@ -101,10 +100,10 @@ function featuresForTier(tierMap, tierName) {
101
100
  return new Set(tier.features);
102
101
  }
103
102
  /**
104
- * Merge always-on features (non-toggleable framework-base) mit tier-cut
105
- * features (toggleable per tier). Canonical Kumiko: dispatcher-gate
106
- * blockt nur features die explizit `r.toggleable()` haben — alle anderen
107
- * sind immer aktiv. Tier-resolver muss das selbe pattern liefern.
103
+ * Merges always-on features (non-toggleable framework base) with tier-specific
104
+ * features (toggleable per tier). The dispatcher gate blocks only features
105
+ * that explicitly register `r.toggleable()`; all others are always active.
106
+ * The tier resolver must provide the same shape.
108
107
  */
109
108
  function mergeAlwaysOn(alwaysOn, tierFeatures) {
110
109
  const merged = new Set(alwaysOn);
@@ -144,13 +143,14 @@ export function createTierEngineFeature(opts = {}) {
144
143
  description: "Lists the tier-assignment rows visible to the caller with tier name and assignment source; use it to see which plan is stored for a tenant.",
145
144
  }));
146
145
  r.queryHandler(getActiveTierQuery);
147
- // \u2500\u2500 Manueller Tier-Grant (SystemAdmin, ohne Billing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
148
- // Cross-tenant set + read f\u00fcr den tier-admin-Screen. tier-options liefert
149
- // dem Client die App-Tier-Namen aus der tierMap-Closure (sonst hartkodiert).
146
+ // ── Manual tier grant (SystemAdmin, without billing) ───────────────────────
147
+ // Cross-tenant set and read for the tier-admin screen. tier-options gives
148
+ // the client the app's tier names from the tierMap closure rather than
149
+ // hard-coding them.
150
150
  //
151
151
  // onAssigned runs after commit (the direct executor write fires no postSave
152
- // hook). Late-bound: without tierMap it stays a no-op, the tierMap block
153
- // below installs the real cache update + publish.
152
+ // hook). It is late-bound: without tierMap it remains a no-op; the tierMap
153
+ // block below installs the actual cache update and publication.
154
154
  const onTierAssigned = { fn: () => { } };
155
155
  r.writeHandler(createSetTenantTierWrite({
156
156
  onAssigned: (tenantId, tier) => onTierAssigned.fn(tenantId, tier),
@@ -208,11 +208,11 @@ export function createTierEngineFeature(opts = {}) {
208
208
  dormant: true,
209
209
  });
210
210
  // ───────────────────────────────────────────────────────────────────
211
- // Resolver-extension (only when tierMap is configured)
211
+ // Resolver extension (only when tierMap is configured)
212
212
  // ───────────────────────────────────────────────────────────────────
213
- // skip: ohne tierMap ist die feature nur Storage (legacy back-compat
214
- // zu `tierEngineFeature`). Resolver-extension + invalidation-hooks
215
- // brauchen die tierMap zum Mapping tier-name → feature-set.
213
+ // skip: without tierMap, the feature provides storage only (backward
214
+ // compatibility with `tierEngineFeature`). The resolver extension and
215
+ // invalidation hooks need tierMap to map tier names to feature sets.
216
216
  if (!opts.tierMap)
217
217
  return;
218
218
  const tierMap = opts.tierMap;
@@ -307,7 +307,7 @@ export function createTierEngineFeature(opts = {}) {
307
307
  // tier-assignment.
308
308
  //
309
309
  // **Cross-tenant write:** the executor needs a systemUser WITH tenantId =
310
- // the new tenant (memory `feedback_event_store_tenant_consistency`).
310
+ // the new tenant.
311
311
  if (opts.defaultTier !== undefined) {
312
312
  const defaultTier = opts.defaultTier;
313
313
  const autoDefaultTierHookReason = "seeds the default tier-assignment stream of the tenant just created";
@@ -352,8 +352,7 @@ export function createTierEngineFeature(opts = {}) {
352
352
  // SystemUser for the NEW tenant — the hook is triggered by the signup
353
353
  // user (another tenant, or SystemAdmin), but the tier-assignment has
354
354
  // to land in the stream of the newly created tenant (= aggregate id
355
- // deterministic on newTenantId). Memory
356
- // `feedback_event_store_tenant_consistency`: by.tenantId must equal
355
+ // deterministic on newTenantId), so by.tenantId must equal
357
356
  // the target tenant.
358
357
  const systemUser = {
359
358
  id: "00000000-0000-4000-8000-000000000001",
@@ -458,8 +457,8 @@ export function createTierEngineFeature(opts = {}) {
458
457
  }
459
458
  // Cache miss: the tenant is not in the cache yet (e.g. brand new after
460
459
  // boot, or the defaultTier hook has not fired yet). The default set
461
- // is least-privileged — typically free-tier features. Memory
462
- // `feedback_security_default_on`: secure by default. The trial is NOT
460
+ // is least-privileged, secure by default: typically free-tier features.
461
+ // The trial is NOT
463
462
  // added here (sync/boot-cached, cannot see the passage of time) — the
464
463
  // trialGate below does that on the disabled-gate path.
465
464
  const fallbackTier = opts.defaultTier;
@@ -1,13 +1,12 @@
1
1
  import * as z from "zod";
2
- // get-active-tier — return the current tier-assignment for the calling tenant.
2
+ // get-active-tier — returns the current tier assignment for the calling tenant.
3
3
  //
4
- // **Convenience-wrapper** über `ctx.queryProjection` für die häufigste Frage
5
- // gegen die Engine: „welcher Tier ist gerade aktiv?". Returns null wenn
6
- // noch kein Tier gesetzt — der Caller (composeApp) mappt null → Default-Tier.
4
+ // Wraps `ctx.queryProjection` for the most common engine query: which tier is
5
+ // currently active. Returns null when no tier is assigned; the caller (composeApp)
6
+ // maps null to the default tier.
7
7
  //
8
- // **Tenant-scope:** ctx.queryProjection filtert automatisch nach tenantId.
9
- // Pro Plattform-Tenant existiert per Konvention genau eine
10
- // tier-assignment-Row.
8
+ // **Tenant scope:** `ctx.queryProjection` automatically filters by tenantId.
9
+ // By convention, each platform tenant has exactly one tier-assignment row.
11
10
  export const getActiveTierQuery = {
12
11
  name: "get-active-tier",
13
12
  description: "Returns the tier-assignment row currently active for the caller's own tenant, or null when none is assigned; use it to answer which plan the caller is on.",
@@ -2,10 +2,10 @@ import { buildEntityTable, createTenantDb, fetchOne } from "@cosmicdrift/kumiko-
2
2
  import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
3
3
  import * as z from "zod";
4
4
  import { tierAssignmentEntity } from "../entity.js";
5
- // Liest das Tier-Assignment eines BELIEBIGEN Tenants (cross-tenant) für den
6
- // tier-admin-Screen. SystemAdmin-only. get-active-tier liest nur den eigenen
7
- // Tenant — hier ein "system"-mode TenantDb auf den Ziel-Tenant (kein Filter),
8
- // damit der Admin das Tier fremder Tenants sehen kann. null wenn noch keins.
5
+ // Reads the tier assignment of ANY tenant (cross-tenant) for the
6
+ // tier-admin screen. SystemAdmin-only. get-active-tier reads only its own
7
+ // tenant; this uses a "system"-mode TenantDb for the target tenant (no filter),
8
+ // so the admin can view another tenant's tier. Returns null if none exists yet.
9
9
  const tierAssignmentTable = buildEntityTable("tier-assignment", tierAssignmentEntity);
10
10
  const GET_TENANT_TIER_REASON = "SystemAdmin reads the tier of the tenant named in the payload";
11
11
  export const getTenantTierQuery = defineQueryHandler({
@@ -5,20 +5,19 @@ export type SetTenantTierOptions = {
5
5
  * and notify the other processes. Without a tierMap there is no resolver
6
6
  * and this is a no-op. */
7
7
  readonly onAssigned?: (tenantId: TenantId, tier: string) => void;
8
- /** Tier-Namen aus der tierMap-Closure — ohne sie (storage-only-Mode) bleibt
9
- * `tier` unvalidiert außer Length/Non-Empty. Mit ihr rejected der Handler
10
- * einen unbekannten Tier-Namen statt ihn stillschweigend durchzuschreiben
11
- * (featuresForTier gibt für unbekannte Namen defensiv ein leeres Set
12
- * zurück — der Tenant verliert sonst lautlos alle Tier-Gates). */
8
+ /** Without the tierMap closure (storage-only mode), `tier` is validated only for
9
+ * length and non-emptiness. With it, the handler rejects unknown tier names
10
+ * instead of silently writing them through. (featuresForTier defensively
11
+ * returns an empty set for unknown names; otherwise the tenant would silently
12
+ * lose all tier gates.) */
13
13
  readonly validTiers?: ReadonlySet<string>;
14
14
  };
15
15
  export declare function createSetTenantTierWrite(opts?: SetTenantTierOptions): import("@cosmicdrift/kumiko-types/define-handler").WriteHandlerDefinition<"set-tenant-tier", z.ZodObject<{
16
16
  tenantId: z.ZodString;
17
17
  tier: z.ZodString;
18
18
  source: z.ZodDefault<z.ZodEnum<{
19
- readonly manual: "manual";
20
- readonly billing: "billing";
21
- readonly default: "default";
19
+ billing: "billing";
20
+ manual: "manual";
22
21
  }>>;
23
22
  }, z.core.$strip>, {
24
23
  tenantId: string;
@@ -5,9 +5,9 @@ import { requireForTenant } from "../../shared/index.js";
5
5
  import { tierAssignmentAggregateId } from "../aggregate-id.js";
6
6
  import { tierAssignmentEntity } from "../entity.js";
7
7
  import { TierAssignmentSources } from "../web/constants.js";
8
- // SystemAdmin setzt das Tier eines BELIEBIGEN Tenants — manueller Grant ohne
9
- // Billing. Cross-tenant, daher SystemAdmin-only (kein TenantAdmin: sonst
10
- // Gratis-Self-Upgrade).
8
+ // A SystemAdmin can set the tier of ANY tenant as a manual grant without
9
+ // billing. This is cross-tenant, so it is restricted to SystemAdmin (not
10
+ // TenantAdmin, which would allow free self-upgrades).
11
11
  //
12
12
  // Cross-tenant mechanics: ctx.forTenant(tenantId) yields a tenant-mode db bound to the target plus
13
13
  // the streamTenantId, so the event lands in the target's stream with the operator as actor.
@@ -38,7 +38,10 @@ export function createSetTenantTierWrite(opts = {}) {
38
38
  .min(1)
39
39
  .max(50)
40
40
  .refine((t) => !opts.validTiers || opts.validTiers.has(t), { message: "unknown tier" }),
41
- source: z.enum(TierAssignmentSources).default(TierAssignmentSources.manual),
41
+ // `default` is reserved for the signup default tier; the billing sync treats it like `billing`.
42
+ source: z
43
+ .enum([TierAssignmentSources.manual, TierAssignmentSources.billing])
44
+ .default(TierAssignmentSources.manual),
42
45
  }),
43
46
  access: { roles: ["SystemAdmin"] },
44
47
  agent: { risk: "high" },
@@ -1,6 +1,6 @@
1
1
  // Generic tier-resolver factory. Extracted from the near-identical
2
- // tier-resolver.ts app copies in show-pony and publicstatus (infra#446) — the
3
- // only per-app variables were the TierName union and its caps/defaults, so
2
+ // tier-resolver.ts app copies in show-pony and publicstatus — the only
3
+ // per-app variables were the TierName union and its caps/defaults, so
4
4
  // both are now factory parameters.
5
5
  import { buildEntityTable } from "@cosmicdrift/kumiko-framework/db";
6
6
  import { tierAssignmentEntity } from "./entity.js";
@@ -1,11 +1,11 @@
1
- // Trial-Phase: ein neuer Tenant bekommt für eine Karenzzeit ab seinem
2
- // Anlage-Datum (inserted_at der tier-assignment-Row — rebuild-stabil aus dem
3
- // Create-Event) zusätzlich die Features eines höheren Tiers, unabhängig vom
4
- // gespeicherten Tier. Rein zeit-abgeleitet: kein Stored-Flag, kein Scheduler,
5
- // automatischer Ablauf. Die App definiert die Policy (welcher Tier, wie lange);
6
- // die tier-engine wendet sie im Resolver an.
7
- // Reine Millis-Arithmetik auf epochMilliseconds (die beide Seiten — Projektions-
8
- // Row und Now — liefern). Kein Date, keine TZ.
1
+ // Trial phase: a new tenant receives the features of a higher tier for a grace
2
+ // period starting at its creation date (`inserted_at` of the tier-assignment Row —
3
+ // stable across rebuilds because it comes from the Create Event), regardless of
4
+ // the stored tier. It is derived solely from time: no stored flag, no scheduler,
5
+ // and automatic expiration. The app defines the policy (which tier, how long);
6
+ // the tier-engine applies it in the resolver.
7
+ // Pure millisecond arithmetic on epochMilliseconds, which both sides—the
8
+ // projection Row and Now—provide. No Date and no time zone.
9
9
  export function isTrialActive(startedAtEpochMs, nowEpochMs, durationHours) {
10
10
  return nowEpochMs < startedAtEpochMs + durationHours * 3_600_000;
11
11
  }
@@ -3,6 +3,7 @@
3
3
  // category in the kumiko isolation model (runtime may import client, client
4
4
  // may only import client) — otherwise the runtime isolation guard throws on
5
5
  // the client imports. Same pattern as text-content/constants.
6
+ import { isOneOf } from "@cosmicdrift/kumiko-types/type-guards";
6
7
  // Feature name
7
8
  export const TIER_ENGINE_FEATURE = "tier-engine";
8
9
  // Qualified write handler names (QN format: scope:type:name).
@@ -18,9 +19,8 @@ export const TierAssignmentSources = {
18
19
  billing: "billing",
19
20
  default: "default",
20
21
  };
21
- const TIER_ASSIGNMENT_SOURCE_VALUES = Object.values(TierAssignmentSources);
22
22
  export function isTierAssignmentSource(value) {
23
- return typeof value === "string" && TIER_ASSIGNMENT_SOURCE_VALUES.includes(value);
23
+ return isOneOf(Object.values(TierAssignmentSources), value);
24
24
  }
25
25
  // Qualified query handler names.
26
26
  export const TierEngineQueries = {
@@ -1,5 +1,5 @@
1
- // Public exports für die Browser-Seite des tier-engine Features. Konsumiert
2
- // über `@cosmicdrift/kumiko-bundled-features/tier-engine/web` — die
3
- // Server-Seite (createTierEngineFeature) lebt unter
4
- // `@cosmicdrift/kumiko-bundled-features/tier-engine` und hat keine React-Deps.
1
+ // Public exports for the browser side of the tier-engine feature. Import via
2
+ // `@cosmicdrift/kumiko-bundled-features/tier-engine/web` — the server side
3
+ // (createTierEngineFeature) is under
4
+ // `@cosmicdrift/kumiko-bundled-features/tier-engine` and has no React deps.
5
5
  export { tierEngineClient } from "./client-plugin.js";
@@ -1,11 +1,11 @@
1
- // #762 — one-time migration tooling for pre-#497 user event streams.
1
+ // One-time migration tooling for older user event streams.
2
2
  //
3
- // #497 made `user` a systemStream entity: every executor op addresses the
3
+ // Making `user` a systemStream entity means every executor op addresses the
4
4
  // stream on SYSTEM_TENANT_ID. Streams created before that live on whichever
5
- // tenant created them ("scattered"), so post-#497 writes version-conflict
6
- // against the empty SYSTEM stream. The raw UPDATE documented in the #497
7
- // changeset breaks as soon as an aggregate has BOTH a legacy stream and
8
- // post-#497 SYSTEM events (split stream — e.g. a skipOptimisticLock
5
+ // tenant created them ("scattered"), so newer writes version-conflict
6
+ // against the empty SYSTEM stream. The raw UPDATE breaks as soon as an
7
+ // aggregate has BOTH a legacy stream and newer SYSTEM events
8
+ // (split stream — e.g. a skipOptimisticLock
9
9
  // lifecycle write appended v1 on SYSTEM while v1..n live on the old
10
10
  // tenant): retenanting then trips events_aggregate_version_uq.
11
11
  //
@@ -54,12 +54,12 @@ async function migrateAggregate(db, aggregateId) {
54
54
  WHERE "aggregate_type" = 'user' AND "aggregate_id" = $1::uuid
55
55
  ORDER BY "id" ASC
56
56
  FOR UPDATE`, [aggregateId]);
57
- // Phase 1: negative interim versions — real versions are always >= 1, so
57
+ // Negative interim versions — real versions are always >= 1, so
58
58
  // nothing can collide with events_aggregate_version_uq mid-migration.
59
59
  for (const [i, ev] of events.entries()) {
60
60
  await raw.unsafe(`UPDATE "kumiko_events" SET "tenant_id" = $1::uuid, "version" = $2 WHERE "id" = $3`, [SYSTEM_TENANT_ID, -(i + 1), ev.id]);
61
61
  }
62
- // Phase 2: final contiguous 1..n.
62
+ // Final contiguous 1..n.
63
63
  for (const [i, ev] of events.entries()) {
64
64
  await raw.unsafe(`UPDATE "kumiko_events" SET "version" = $1 WHERE "id" = $2`, [i + 1, ev.id]);
65
65
  }
@@ -11,14 +11,14 @@ import { UserErrors } from "../web/constants.js";
11
11
  const crud = createEventStoreExecutor(userTable, userEntity, { entityName: "user" });
12
12
  // Only the Auth features (running as SYSTEM) or a SystemAdmin may create users.
13
13
  //
14
- // Email uniqueness has two layers (fw#2134):
14
+ // Email uniqueness has two layers:
15
15
  // 1. A pre-flight fetchOne — fast-fails with a friendly error on the
16
16
  // common case, but is race-prone on its own: two concurrent requests
17
17
  // can both see "no duplicate" and both proceed to crud.create.
18
18
  // 2. The real guard is the unique index over email's blind-index column
19
19
  // (schema/user.ts). A losing concurrent create hits that constraint
20
- // and crud.create returns a UniqueViolationError (framework's F8
21
- // pg-23505 mapping) instead of throwing — remapped below to the same
20
+ // and crud.create returns a UniqueViolationError (framework's pg-23505
21
+ // mapping) instead of throwing — remapped below to the same
22
22
  // emailAlreadyExists shape the pre-flight path returns, so callers see
23
23
  // one consistent error regardless of which layer caught the race.
24
24
  export const createWrite = defineWriteHandler({
@@ -89,7 +89,7 @@ export const createWrite = defineWriteHandler({
89
89
  // schema/user.ts's `read_users_email_unique` (+ its generated `_bidx`
90
90
  // pendant) is the actual race-safety net behind the pre-flight check
91
91
  // above — a losing concurrent create surfaces here as a generic
92
- // UniqueViolationError (framework F8 pg-23505 mapping). Only the email
92
+ // UniqueViolationError (framework pg-23505 mapping). Only the email
93
93
  // constraint gets remapped; any other unique_violation on this entity
94
94
  // passes through unchanged.
95
95
  function isRecord(value) {
@@ -1,8 +1,7 @@
1
1
  /**
2
- * User-Lifecycle-Status (S2.U1). Single source of truth — Auth-Middleware
3
- * (S2.U6), Forget-Job (S2.U5) und Restriction-Handler nutzen diese
4
- * Constants statt Magic-Strings (Memory feedback_role_naming_drift —
5
- * gleiches Pattern wie ROLES.SystemAdmin).
2
+ * User lifecycle status. This is the single source of truth used by the
3
+ * auth middleware, forget job, and restriction handler instead of duplicated
4
+ * magic strings, following the same pattern as ROLES.SystemAdmin.
6
5
  */
7
6
  export declare const USER_STATUS: {
8
7
  readonly Active: "active";
@@ -12,17 +11,18 @@ export declare const USER_STATUS: {
12
11
  };
13
12
  export type UserStatus = (typeof USER_STATUS)[keyof typeof USER_STATUS];
14
13
  /**
15
- * Anonymize-Display-Strings fuer userDeleteHook (S2.H1). Constants statt
16
- * Magic-Strings damit i18n-Mapping moeglich + drift-fest. Default-DE,
17
- * App-Author kann via i18n-System uebersetzen wenn gewuenscht.
14
+ * Display strings anonymized by userDeleteHook. Constants keep i18n mapping
15
+ * possible and prevent drift. The default is German; app authors can
16
+ * translate it through the i18n system if desired.
18
17
  */
19
18
  export declare const USER_DELETED_DISPLAY_NAME = "[Geloescht]";
20
19
  export declare const USER_ANONYMIZED_DISPLAY_NAME = "[Anonymisiert]";
21
20
  /**
22
- * Email-Pseudonyme nach Forget. `<prefix>-<userId>@anonymized.invalid`
23
- * — der userId-Suffix ist als Pseudo-Audit-Marker fuer Operator
24
- * (Tracing-fall) erlaubt; user-id selbst ist UUID, kein PII.
25
- * `.invalid`-TLD ist RFC2606-reserviert — niemals deliverbare Email.
21
+ * Email pseudonyms used after forgetting. `<prefix>-<userId>@anonymized.invalid`
22
+ * — the userId suffix is permitted as a pseudo-audit marker for operator
23
+ * tracing; the user ID itself is a UUID, not PII.
24
+ * The `.invalid` TLD is reserved by RFC2606, so the address can never be
25
+ * delivered.
26
26
  */
27
27
  export declare const USER_DELETED_EMAIL_PREFIX = "deleted";
28
28
  export declare const USER_ANONYMIZED_EMAIL_PREFIX = "anonymized";