@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
@@ -14,11 +14,11 @@ export const MEMBER_STATUS_CELL_COMPONENT = "MemberStatusCell";
14
14
  export const MEMBER_ROLES_CELL_COMPONENT = "MemberRolesCell";
15
15
  /** Closed allowlist for invite-role picker — never free text (escalation guard). */
16
16
  // Admin (rank 2) shares the invite-create screen with TenantAdmin — TenantAdmin
17
- // must not appear here or Admin sees an unassignable option (fw#2414).
17
+ // must not appear here or Admin sees an unassignable option.
18
18
  export const DEFAULT_INVITE_ROLE_OPTIONS = ["User", "Editor", "Admin"];
19
19
  // Full rank list for memberRolesEditScreen: it is prefilled with a member's
20
20
  // *current* roles, so it must represent every rank a membership can hold,
21
- // including TenantAdmin (fw#2452). The screen hides what the caller may not
21
+ // including TenantAdmin. The screen hides what the caller may not
22
22
  // assign via TenantQueries.memberRoleAvailability.
23
23
  export const OWNER_INVITE_ROLE_OPTIONS = [
24
24
  "User",
@@ -1,11 +1,9 @@
1
1
  import * as z from "zod";
2
- // Audit trail for a completed claim (kumiko-framework#3035's audit-entry
3
- // requirement: names the source tenant, destination tenant, entities and
4
- // their counts). Its own aggregate, decoupled from the transferred root's
5
- // stream — same reasoning as
6
- // sessions' SESSION_REVOKED_EVENT: a fresh aggregate id per occurrence needs
7
- // no predecessor version and can never conflict with a concurrent write on
8
- // the entity it describes.
2
+ // Audit trail for a completed claim (audit-entry requirement: names the source tenant, destination
3
+ // tenant, entities and their counts). Its own aggregate, decoupled from the transferred root's
4
+ // stream — same reasoning as sessions' SESSION_REVOKED_EVENT: a fresh aggregate id per occurrence
5
+ // needs no predecessor version and can never conflict with a concurrent write on the entity it
6
+ // describes.
9
7
  //
10
8
  // _SHORT — r.defineEvent(short, schema) in feature.ts, framework prefixes it
11
9
  // to the QN below.
@@ -3,7 +3,7 @@ import { EXT_SIGNUP_HANDOVER } from "../shared/index.js";
3
3
  import { TENANT_HANDOVER_CLAIMED_EVENT_SHORT, tenantHandoverClaimedSchema } from "./events.js";
4
4
  import { createClaimTenantHandoverHandler, } from "./handlers/claim.write.js";
5
5
  import { createSignupHandoverProvider } from "./signup-handover-provider.js";
6
- // tenant-handover — Option A from kumiko-framework#3035: the ONE write a
6
+ // tenant-handover — the ONE write a
7
7
  // try-before-signup (or guest-checkout, demo-to-account) flow needs once an
8
8
  // anonymous run is done and the visitor has a fresh tenant. No general
9
9
  // tenant-merge tool, no copy — this is an ownership change on rows a
@@ -1,4 +1,4 @@
1
- // Try-before-signup ownership handover (kumiko-framework#3035), expressed as a
1
+ // Try-before-signup ownership handover, expressed as a
2
2
  // row-bound grant: the subject is the transferred run's own row id, the
3
3
  // anchor is the SOURCE tenant id it currently lives under. Redeeming the
4
4
  // grant is the ownership change itself — the claim handler's commitAnchor
@@ -17,7 +17,7 @@ function notTransferable(entityType) {
17
17
  details: { entityType },
18
18
  }));
19
19
  }
20
- // The try-before-signup ownership handover (kumiko-framework#3035): claims an
20
+ // The try-before-signup ownership handover: claims an
21
21
  // anonymous run into the caller's own tenant, legitimized by a row-bound
22
22
  // grant the anonymous flow minted (see ../grant.ts). Idempotent — a second
23
23
  // call with the same token fails the same way a forged one would, because
@@ -1,4 +1,4 @@
1
- // The actual ownership change (kumiko-framework#3035): raw SQL against the
1
+ // The actual ownership change: raw SQL against the
2
2
  // read-model tables, because moving a row across the tenant boundary is
3
3
  // exactly the kind of write the framework's entity write map cannot express
4
4
  // (it is single-tenant-scoped by design — that boundary is the whole point
@@ -15,10 +15,10 @@
15
15
  // `transaction()` call, rolling back everything the handler already did).
16
16
  // `moveRootRow` — called as row-bound-grant's `commitAnchor` — is therefore
17
17
  // the ONLY statement that must itself combine the anchor-spend with the
18
- // first write (#3023's hard rule: a write issued after `ok: true` can lose
19
- // its work to a crash while the grant is already burned). Everything after
18
+ // first write: a write issued after `ok: true` can lose
19
+ // its work to a crash while the grant is already burned. Everything after
20
20
  // it rides the same transaction: if a later step throws (an undeclared
21
- // child entity, kumiko-framework#3035's named-error requirement), the WHOLE
21
+ // child entity, the named-error requirement), the WHOLE
22
22
  // transaction — root row included — rolls back, so a caller can safely
23
23
  // retry the same token after fixing the app's `transferable` declarations.
24
24
  import { entityTableFromRegistry, executeRawQuery, extractTableName, physicalColumnName, toPostgresArrayLiteral, } from "@cosmicdrift/kumiko-framework/db";
@@ -41,8 +41,7 @@ export async function moveRootRow(args) {
41
41
  // history + storage-usage counters — fileRef is a standard ES entity (see
42
42
  // files-storage-tracking.md), so without those two follow-ups a later write
43
43
  // against a moved fileRef can't load its stream, and a projection rebuild
44
- // would put the row back into the source tenant (kumiko-framework#3131-adjacent
45
- // gap, item 4).
44
+ // would put the row back into the source tenant.
46
45
  async function moveFileRefs(args) {
47
46
  if (args.entityIds.length === 0)
48
47
  return 0;
@@ -136,7 +135,7 @@ async function moveEdgeRows(args) {
136
135
  // Everything the root ownership write does NOT cover: the root's own event
137
136
  // history + attached files, plus the rows, event history and attached files of
138
137
  // every descendant the declared transfer graph reaches, however deep and by
139
- // however many paths (#3088, #3131).
138
+ // however many paths.
140
139
  // Returns a count per moved entity name (the
141
140
  // write handler turns this into the audit entry) — `fileRef` is a single
142
141
  // pooled count across root + every child, since it is not itself part of the
@@ -170,7 +169,7 @@ export async function moveTransferGraph(args) {
170
169
  transferredBy,
171
170
  }));
172
171
  const adjacency = resolveTransferAdjacency(registry, rootEntityName);
173
- // A worklist, not a level-wise walk (#3131): each batch of rows that actually
172
+ // A worklist, not a level-wise walk: each batch of rows that actually
174
173
  // changed hands becomes the parent ids for the edges leading away from its
175
174
  // type. The same edge therefore runs again whenever a later round discovers
176
175
  // more rows of its parent type, which is what a type reachable by two paths
@@ -180,7 +179,7 @@ export async function moveTransferGraph(args) {
180
179
  // every statement filters on `tenantCol = sourceTenantId` and RETURNS only
181
180
  // the rows it flipped, so a row enters this worklist exactly once and the
182
181
  // source tenant holds finitely many. Do not add an edge-level visited set to
183
- // "bound" this — that is precisely the bug #3131 removed.
182
+ // "bound" this — that would reintroduce the bug.
184
183
  let pending = [
185
184
  { entityName: rootEntityName, rowIds: [rootRowId] },
186
185
  ];
@@ -1,6 +1,5 @@
1
1
  // tenant-handover's implementation of the shared signup-handover extension
2
- // point (kumiko-framework#3035 follow-up, offlot-app#454): lets
3
- // auth-email-password's signup-request verify a grant against its root row
2
+ // point: lets auth-email-password's signup-request verify a grant against its root row
4
3
  // WITHOUT spending the anchor (the anchor is spent once, by the claim
5
4
  // signup-confirm runs afterwards, via a fresh short-lived grant this module
6
5
  // mints) — see shared/signup-handover.ts for the extension contract and
@@ -1,15 +1,14 @@
1
1
  // Resolves the declared transfer graph for a root entity type: the root
2
2
  // itself, plus every registered entity that reaches it through a declared
3
- // schema edge (kumiko-framework#3035, #3088; framework CLAUDE.md premise 4 —
4
- // the graph depth is read off the existing declarations, never a hand-
5
- // maintained per-app list).
3
+ // schema edge (framework CLAUDE.md premise 4 — the graph depth is read off
4
+ // the existing declarations, never a hand-maintained per-app list).
6
5
  //
7
6
  // The edge definition (parentRef + single-valued reference fields, minus
8
7
  // `handover: "stay"`) lives in the framework so the boot validator's depth
9
8
  // limit and the mover's traversal measure the same graph. What comes out is
10
9
  // static adjacency, not a walk: the mover drives the actual traversal from the
11
- // row ids it moves (#3131), because how deep a type sits depends on the rows
12
- // found, not on the schema alone.
10
+ // row ids it moves, because how deep a type sits depends on the rows found,
11
+ // not on the schema alone.
13
12
  //
14
13
  // `transferable: true` stays the only gate on what actually moves, and it is
15
14
  // enforced by the caller against edges that turn out to have rows rather than
@@ -4,7 +4,7 @@ import { entitiesOf } from "../shared/index.js";
4
4
  const log = createFallbackLogger("kumiko:boot");
5
5
  // V4: tenantOwned-entity-without-hook gate. Mirrors user-data-rights' V3
6
6
  // (validateGdprPiiHookCoverage) but for EXT_TENANT_DATA. Registered as this
7
- // feature's own `r.bootCheck()` (#1314, moved off the framework-internal
7
+ // feature's own `r.bootCheck()` (moved off the framework-internal
8
8
  // boot-validator) — tenant-lifecycle owns EXT_TENANT_DATA
9
9
  // (r.extendsRegistrar), so its own mount is the trigger, matching the
10
10
  // original guard's "tenant-lifecycle mounted" gate exactly (unlike gating on
@@ -27,3 +27,4 @@ export declare const TenantLifecycleHandlers: {
27
27
  export declare const TENANT_DESTRUCTION_STAGES: readonly ["external-resources", "search-indices", "cache", "app-data", "subject-keys", "files", "infra-resources", "tenant-row"];
28
28
  export type TenantDestructionStageName = (typeof TENANT_DESTRUCTION_STAGES)[number];
29
29
  export declare const DESTRUCTION_STAGE_TICK_BUDGET_MS = 30000;
30
+ export declare const DESTRUCTION_STAGE_MIN_SLICE_MS = 2000;
@@ -38,3 +38,7 @@ export const TENANT_DESTRUCTION_STAGES = [
38
38
  // The sweep cron fires every minute with concurrency "skip", so a tick must
39
39
  // finish well inside that window or the next one is skipped.
40
40
  export const DESTRUCTION_STAGE_TICK_BUDGET_MS = 30_000;
41
+ // Lower bound of a tenant's share of the tick budget. Below it a chunking hook
42
+ // without a guaranteed first batch processes nothing, and a no-progress stage
43
+ // counts as a failed attempt, which would abandon the pipeline under load.
44
+ export const DESTRUCTION_STAGE_MIN_SLICE_MS = 2_000;
@@ -31,7 +31,7 @@ export function createTenantLifecycleFeature() {
31
31
  // AND fulfils tenantLifecycleStatus so teardown state is visible with no per-app wiring.
32
32
  r.extendsRegistrar(EXT_TENANT_LIFECYCLE_STATUS, {});
33
33
  r.useExtension(EXT_TENANT_LIFECYCLE_STATUS, "tenant-lifecycle", tenantLifecycleStatusPlugin);
34
- // GDPR-storage guard V4 (#1314) — moved off the framework-internal
34
+ // GDPR-storage guard V4 — moved off the framework-internal
35
35
  // boot-validator onto this feature's own r.bootCheck(), since it owns
36
36
  // EXT_TENANT_DATA: its own mount is the trigger, matching the original
37
37
  // guard's "tenant-lifecycle mounted" gate exactly.
@@ -3,7 +3,7 @@ import { createSystemUser, } from "@cosmicdrift/kumiko-framework/engine";
3
3
  import { append, loadAggregate, VersionConflictError, } from "@cosmicdrift/kumiko-framework/event-store";
4
4
  import { getTemporal } from "@cosmicdrift/kumiko-framework/time";
5
5
  import { tenantEntity, tenantTable } from "../tenant/index.js";
6
- import { DESTRUCTION_STAGE_TICK_BUDGET_MS, TENANT_AGGREGATE_TYPE, TENANT_DESTRUCTION_COMPLETED_EVENT_QN, TENANT_DESTRUCTION_FAILED_EVENT_QN, TENANT_DESTRUCTION_STAGE_ABANDONED_EVENT_SHORT, TENANT_DESTRUCTION_STAGE_FAILED_EVENT_SHORT, TENANT_DESTRUCTION_STAGE_PROGRESSED_EVENT_SHORT, TENANT_DESTRUCTION_STAGE_STARTED_EVENT_SHORT, TENANT_DESTRUCTION_STAGE_SUCCEEDED_EVENT_SHORT, TENANT_DESTRUCTION_STARTED_EVENT_SHORT, } from "./constants.js";
6
+ import { DESTRUCTION_STAGE_MIN_SLICE_MS, DESTRUCTION_STAGE_TICK_BUDGET_MS, TENANT_AGGREGATE_TYPE, TENANT_DESTRUCTION_COMPLETED_EVENT_QN, TENANT_DESTRUCTION_FAILED_EVENT_QN, TENANT_DESTRUCTION_STAGE_ABANDONED_EVENT_SHORT, TENANT_DESTRUCTION_STAGE_FAILED_EVENT_SHORT, TENANT_DESTRUCTION_STAGE_PROGRESSED_EVENT_SHORT, TENANT_DESTRUCTION_STAGE_STARTED_EVENT_SHORT, TENANT_DESTRUCTION_STAGE_SUCCEEDED_EVENT_SHORT, TENANT_DESTRUCTION_STARTED_EVENT_SHORT, } from "./constants.js";
7
7
  import { invalidateTenantLifecycleGate, TEARDOWN_GATE_SETTLE_MS } from "./lifecycle-gate.js";
8
8
  import { isDestructionPipelineComplete, pickNextStage, } from "./stages.js";
9
9
  const tenantCrud = createEventStoreExecutor(tenantTable, tenantEntity, { entityName: "tenant" });
@@ -251,7 +251,7 @@ export async function runTenantDestructionSweep(args) {
251
251
  // window and starve the ones behind it. Each slice starts when its tenant
252
252
  // starts: anchoring to a shared tick deadline would hand tenants after an
253
253
  // overrun a zero slice, and a no-progress stage counts as a failed attempt.
254
- const sliceMs = DESTRUCTION_STAGE_TICK_BUDGET_MS / Math.max(1, destroying.length);
254
+ const sliceMs = Math.max(DESTRUCTION_STAGE_MIN_SLICE_MS, DESTRUCTION_STAGE_TICK_BUDGET_MS / Math.max(1, destroying.length));
255
255
  for (const row of destroying) {
256
256
  const tenantDeadlineAt = Date.now() + sliceMs;
257
257
  try {
@@ -11,7 +11,7 @@ export const TENANT_SETTINGS_FEATURE_NAME = "tenant-settings";
11
11
  // strings (mirror tags' Handlers/Queries constants).
12
12
  export const TenantSettingsConfig = {
13
13
  // Shared with engine/constants.ts's TENANT_CURRENCY_CONFIG_KEY — a
14
- // `money` field's `currency: { kind: "tenant" }` declaration (fw#2933)
14
+ // `money` field's `currency: { kind: "tenant" }` declaration
15
15
  // resolves against this same key.
16
16
  currency: TENANT_CURRENCY_CONFIG_KEY,
17
17
  locale: "tenant-settings:config:locale",
@@ -2,7 +2,7 @@ import { type AccessRule, type EntityDefinition, type WriteHandlerDef } from "@c
2
2
  export declare function defineCreateWithTenantDefaults(entityName: string, entity: EntityDefinition, options: {
3
3
  /** Required — this is a write-path helper; making it optional let a
4
4
  * forgetful caller register a create handler with no access rule at
5
- * all (fw#1581). */
5
+ * all. */
6
6
  readonly access: AccessRule;
7
7
  /** Money field names whose `currency` is filled from tenant-settings when missing. */
8
8
  readonly currencyFields?: readonly string[];
@@ -8,6 +8,8 @@
8
8
  // a schema extension that makes those sub-keys optional, instead of the
9
9
  // generic defineEntityCreateHandler.
10
10
  import { buildInsertSchema, createEntityExecutor, } from "@cosmicdrift/kumiko-framework/engine";
11
+ import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
12
+ import { isPlainObject } from "@cosmicdrift/kumiko-types/type-guards";
11
13
  import * as z from "zod";
12
14
  import { TenantSettingsConfig } from "./constants.js";
13
15
  const OPTIONAL_CURRENCY_MONEY = z.object({ amount: z.number(), currency: z.string().optional() });
@@ -31,10 +33,15 @@ export function defineCreateWithTenantDefaults(entityName, entity, options) {
31
33
  schema,
32
34
  access: options.access,
33
35
  handler: async (event, ctx) => {
36
+ if (!isPlainObject(event.payload)) {
37
+ throw new InternalError({
38
+ message: `${entityName}:create payload must be an object after schema validation`,
39
+ });
40
+ }
34
41
  const payload = { ...event.payload };
35
42
  for (const field of options.currencyFields ?? []) {
36
43
  const value = payload[field];
37
- if (value && typeof value === "object" && !value.currency) {
44
+ if (isPlainObject(value) && !value["currency"]) {
38
45
  const currency = await ctx.config?.(TenantSettingsConfig.currency);
39
46
  if (typeof currency === "string")
40
47
  payload[field] = { ...value, currency };
@@ -46,7 +53,7 @@ export function defineCreateWithTenantDefaults(entityName, entity, options) {
46
53
  payload[options.localeField] = locale;
47
54
  }
48
55
  // Re-validate against the unrelaxed entity schema so config-filled
49
- // values still honor select/enum field constraints (fw#1581) — and so
56
+ // values still honor select/enum field constraints — and so
50
57
  // a missing currency after failed/missing tenant-settings mount fails
51
58
  // loud instead of inserting half-filled money rows.
52
59
  const filled = baseSchema.parse(payload);
@@ -1,16 +1,16 @@
1
1
  /**
2
- * Deterministic aggregate-id für ein Tier-Assignment aus dem tenantId.
3
- * Pro Plattform-Tenant existiert genau ein Aggregat — uuidv5 ist
4
- * namespace-deterministic, identische Eingabe ergibt identischen UUID.
2
+ * Deterministic aggregate ID for a tier assignment derived from `tenantId`.
3
+ * Each platform tenant has exactly one aggregate; uuidv5 is namespace-
4
+ * deterministic, so identical input produces the same UUID.
5
5
  *
6
- * **Wann nutzen:** Sprint 5 (`stripe-sync`-Feature) wrapt einen
7
- * idempotent-set-tier-Handler darum: zweiter Stripe-Webhook-Retry mit
8
- * derselben tenantId → derselbe aggregate-Stream → version_conflict
9
- * vom Event-Store statt pg-23505 von der Read-Model-DB. ES-saubere
10
- * Path-Uniqueness statt DB-Constraint.
6
+ * **When to use:** The `stripe-sync` feature wraps an idempotent
7
+ * set-tier handler with this function: a second Stripe webhook retry for
8
+ * the same `tenantId` targets the same aggregate stream, causing
9
+ * `version_conflict` from the event store instead of `pg-23505` from the
10
+ * read-model database. This enforces path uniqueness rather than a database
11
+ * constraint.
11
12
  *
12
- * **Sprint 1 nutzt das nicht aktiv** — Standard-CRUD-Handlers vergeben
13
- * UUID via `gen_random_uuid()`. Die Funktion lebt hier als Utility-
14
- * Export bereit für Sprint 5.
13
+ * Standard CRUD handlers instead generate UUIDs via `gen_random_uuid()`.
14
+ * This utility is exported for use by the `stripe-sync` feature.
15
15
  */
16
16
  export declare function tierAssignmentAggregateId(tenantId: string): string;
@@ -1,24 +1,23 @@
1
1
  import { v5 as uuidv5 } from "uuid";
2
- // Fixed UUID-namespace für die tier-assignment-aggregate-id-Ableitung.
3
- // Generiert einmalig (2026-05-02), in Stein gemeißelt: ein Wechsel würde
4
- // jeden existing aggregate-Stream re-keyen → kaputter event-replay,
5
- // kaputte projection-rebuilds, verlorener Tier-Wechsel-Audit. Der
6
- // drift-pin-Test in feature.test.ts pinnt diese Konstante.
2
+ // Fixed UUID namespace for deriving tier-assignment aggregate IDs.
3
+ // Generated once and immutable: changing it would re-key every existing
4
+ // aggregate stream, breaking event replay and projection rebuilds and losing
5
+ // the tier-change audit. The drift-pin test in feature.test.ts pins this constant.
7
6
  const TIER_ASSIGNMENT_NAMESPACE = "8e91d2fc-8b7a-4d3e-9f4a-1c5d6e7f8a9b";
8
7
  /**
9
- * Deterministic aggregate-id für ein Tier-Assignment aus dem tenantId.
10
- * Pro Plattform-Tenant existiert genau ein Aggregat — uuidv5 ist
11
- * namespace-deterministic, identische Eingabe ergibt identischen UUID.
8
+ * Deterministic aggregate ID for a tier assignment derived from `tenantId`.
9
+ * Each platform tenant has exactly one aggregate; uuidv5 is namespace-
10
+ * deterministic, so identical input produces the same UUID.
12
11
  *
13
- * **Wann nutzen:** Sprint 5 (`stripe-sync`-Feature) wrapt einen
14
- * idempotent-set-tier-Handler darum: zweiter Stripe-Webhook-Retry mit
15
- * derselben tenantId → derselbe aggregate-Stream → version_conflict
16
- * vom Event-Store statt pg-23505 von der Read-Model-DB. ES-saubere
17
- * Path-Uniqueness statt DB-Constraint.
12
+ * **When to use:** The `stripe-sync` feature wraps an idempotent
13
+ * set-tier handler with this function: a second Stripe webhook retry for
14
+ * the same `tenantId` targets the same aggregate stream, causing
15
+ * `version_conflict` from the event store instead of `pg-23505` from the
16
+ * read-model database. This enforces path uniqueness rather than a database
17
+ * constraint.
18
18
  *
19
- * **Sprint 1 nutzt das nicht aktiv** — Standard-CRUD-Handlers vergeben
20
- * UUID via `gen_random_uuid()`. Die Funktion lebt hier als Utility-
21
- * Export bereit für Sprint 5.
19
+ * Standard CRUD handlers instead generate UUIDs via `gen_random_uuid()`.
20
+ * This utility is exported for use by the `stripe-sync` feature.
22
21
  */
23
22
  // @wrapper-known uuid-domain
24
23
  export function tierAssignmentAggregateId(tenantId) {
@@ -2,17 +2,17 @@ import type { FeatureDefinition } from "@cosmicdrift/kumiko-framework/engine";
2
2
  /**
3
3
  * Tier definition — a named bundle of features + caps.
4
4
  *
5
- * **Generic über `TCaps`:** die App definiert ihren Cap-Shape als konkreten
6
- * Type (z.B. `{ apps: number, mailsPerMonth: number, aiTokens: number }`)
7
- * und der composeApp-Aufruf liefert exakt diesen Shape zurück. Keine
8
- * `as Record<string, unknown>`-Casts in App-Code, alle Cap-Reads sind
9
- * compile-time-checked.
5
+ * **Generic over `TCaps`:** the app defines its cap shape as a concrete
6
+ * type (e.g. `{ apps: number, mailsPerMonth: number, aiTokens: number }`)
7
+ * and the composeApp call returns exactly that shape. No
8
+ * `as Record<string, unknown>` casts are needed in app code; all cap reads
9
+ * are compile-time checked.
10
10
  *
11
- * Die Tier-Engine selbst ist **agnostisch** zu konkreten Tier-Werten und
12
- * Cap-Dimensionen. Jede App definiert ihre TierMap: kumiko.rocks hat
13
- * free/pro/business/enterprise/self-host, PublicStatus hat
14
- * free/starter/team/agency. Die Engine speichert nur den Tier-Namen als
15
- * String und vertraut der App's TierMap, was das beim Boot bedeutet.
11
+ * The tier engine itself is **agnostic** to concrete tier values and cap
12
+ * dimensions. Each app defines its TierMap: kumiko.rocks has
13
+ * free/pro/business/enterprise/self-host, while PublicStatus has
14
+ * free/starter/team/agency. The engine stores only the tier name as a
15
+ * string and trusts the app's TierMap to define what it means at boot.
16
16
  */
17
17
  export type TierDefinition<TCaps extends Readonly<Record<string, unknown>>> = {
18
18
  /** Feature names to mount on top of the base set (no add-ons applied). */
@@ -24,9 +24,9 @@ export type TierDefinition<TCaps extends Readonly<Record<string, unknown>>> = {
24
24
  * Add-On definition — a tier-orthogonal feature bundle that can be added
25
25
  * to any tier (BYOK-Encryption, Dedicated-Stack, Custom-SLA, ...).
26
26
  *
27
- * `capOverrides` ist `Partial<TCaps>` weil ein Add-On nur einzelne Cap-
28
- * Werte überschreibt (z.B. „Dedicated-Stack erhöht mailsPerMonth auf
29
- * 100k"), nicht den ganzen Shape neu definiert.
27
+ * `capOverrides` is `Partial<TCaps>` because an add-on overrides only
28
+ * individual cap values (e.g. “Dedicated-Stack increases mailsPerMonth to
29
+ * 100k”), rather than redefining the entire shape.
30
30
  */
31
31
  export type AddOnDefinition<TCaps extends Readonly<Record<string, unknown>>> = {
32
32
  /** Feature names to mount additionally when this add-on is active. */
@@ -60,7 +60,7 @@ export type ComposedApp<TCaps extends Readonly<Record<string, unknown>>> = {
60
60
  * composeApp — compute the feature-set + caps for a platform-tenant.
61
61
  *
62
62
  * **Contract:**
63
- * 1. base features always mount (Tier-Engine itself ist Teil davon)
63
+ * 1. base features always mount (the Tier-Engine itself is part of them)
64
64
  * 2. plus tier-specific features (from tierMap[tier].features)
65
65
  * 3. plus add-on features (from addOnMap[addOn].features for each active add-on)
66
66
  * 4. caps = tier.caps ⊕ add-on.capOverrides (later add-ons override earlier)
@@ -2,7 +2,7 @@
2
2
  * composeApp — compute the feature-set + caps for a platform-tenant.
3
3
  *
4
4
  * **Contract:**
5
- * 1. base features always mount (Tier-Engine itself ist Teil davon)
5
+ * 1. base features always mount (the Tier-Engine itself is part of them)
6
6
  * 2. plus tier-specific features (from tierMap[tier].features)
7
7
  * 3. plus add-on features (from addOnMap[addOn].features for each active add-on)
8
8
  * 4. caps = tier.caps ⊕ add-on.capOverrides (later add-ons override earlier)
@@ -1,27 +1,26 @@
1
1
  import { createEntity, createSelectField, createTextField, } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import { TierAssignmentSources } from "./web/constants.js";
3
- // tier-assignment — pro Plattform-Tenant genau ein Aggregat. Aggregate-ID
4
- // wird deterministisch aus tenantId abgeleitet (uuidv5, siehe aggregate-id.ts).
3
+ // tier-assignment — exactly one aggregate per platform tenant. The aggregate ID
4
+ // is derived deterministically from tenantId (uuidv5; see aggregate-id.ts).
5
5
  //
6
- // **Tenant-Scope:** automatisch via Kumiko's tenant-scoped projection — die
7
- // `tenantId`-Spalte wird vom Framework als Base-Column hinzugefügt, der
8
- // CrudExecutor befüllt sie aus `event.user.tenantId`. Pro Plattform-Tenant
9
- // gibt es genau eine Tier-Assignment-Row.
6
+ // **Tenant scope:** applied automatically by Kumiko's tenant-scoped projection —
7
+ // the framework adds `tenantId` as a base column, and the CrudExecutor populates
8
+ // it from `event.user.tenantId`. Each platform tenant has exactly one
9
+ // Tier-Assignment row.
10
10
  //
11
- // **Felder**
12
- // - tier: TierName-String (z.B. "free", "pro", "business", "enterprise",
13
- // "self-host"). Welche Tier-Werte gültig sind, definiert die App in
14
- // ihrer TierMap (siehe compose-app.ts) — die Engine selbst hat keine
15
- // enumerierte Tier-Liste.
11
+ // **Fields**
12
+ // - tier: a TierName string (for example, "free", "pro", "business",
13
+ // "enterprise", or "self-host"). The app defines valid tier values in its
14
+ // TierMap (see compose-app.ts); the engine has no enumerated tier list.
16
15
  //
17
- // **Was bewusst NICHT in der Entity steht**
18
- // - tenantId: kommt automatisch als Base-Column.
19
- // - validFrom/validTo: ES-redundant (Events tragen Timestamps nativ,
20
- // time-travel über `ctx.loadAggregate({ asOf })`).
21
- // - addOns: Sprint 1 hat keine Add-Ons. Sprint 4 fügt sie als separate
22
- // `tier-add-on`-Entity hinzu (1:n Relation, ES-saubere Add/Remove-Events
23
- // mit klarer Audit-Granularität statt JSON-Array-Replace).
24
- // - Caps-Werte: pro-Tier-Cap-Definitionen leben in der TierMap der App.
16
+ // **Intentionally omitted from the entity**
17
+ // - tenantId: added automatically as a base column.
18
+ // - validFrom/validTo: redundant for event sourcing (events carry timestamps
19
+ // natively; time travel uses `ctx.loadAggregate({ asOf })`).
20
+ // - addOns: represented by a separate `tier-add-on` entity (1:n relation),
21
+ // allowing event-sourced Add/Remove events with clear audit granularity
22
+ // instead of replacing a JSON array.
23
+ // - Cap values: per-tier cap definitions belong in the app's TierMap.
25
24
  export const tierAssignmentEntity = createEntity({
26
25
  table: "read_tier_assignments",
27
26
  description: "The pricing tier currently assigned to a tenant, plus where the assignment came from (manual grant, billing sync or signup default) — one row per tenant.",
@@ -2,33 +2,35 @@ import { type FeatureDefinition } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import type { TierMap } from "./compose-app.ts";
3
3
  import { type TrialPolicy } from "./trial.ts";
4
4
  /**
5
- * Options for createTierEngineFeature. Both fields optional — wenn beide
6
- * leer, ist die feature nur Storage (back-compat zu legacy `tierEngineFeature`).
5
+ * Options for createTierEngineFeature. Both fields are optional; when both are
6
+ * omitted, the feature provides storage only (backward compatibility with the
7
+ * legacy `tierEngineFeature`).
7
8
  *
8
- * @template TCaps - App-spezifischer Cap-Shape. Type-leakt durch tierMap →
9
- * future capsFor() resolver returnt diesen Shape exakt.
9
+ * @template TCaps - App-specific capability shape. It flows through tierMap,
10
+ * so a future capsFor() resolver returns this exact shape.
10
11
  */
11
12
  export type CreateTierEngineOptions<TCaps extends Readonly<Record<string, unknown>>> = {
12
13
  /**
13
- * Tier-Name der bei Tenant-signup automatisch geschrieben wird. Erfordert
14
- * dass `tierMap` diesen Tier-Namen kennt (Boot-Validation).
15
- * Wenn weggelassen, kein auto-assign — App schreibt manuell.
14
+ * Tier name written automatically when a tenant signs up. `tierMap` must
15
+ * contain this tier name; this is validated at boot.
16
+ * When omitted, no tier is assigned automatically and the app writes it
17
+ * manually.
16
18
  */
17
19
  readonly defaultTier?: string;
18
20
  /**
19
- * App-spezifische Tier-Map. Wenn gesetzt, registriert das feature sich
20
- * als plugin für `tenantTierResolver`-extension → framework auto-wires
21
- * effectiveFeatures pro tenant.
22
- * Wenn weggelassen, keine Resolver-extension — App muss `composeApp`
23
- * oder eigene resolution-logic nutzen (legacy-pattern).
21
+ * App-specific tier map. When set, the feature registers as a plugin for the
22
+ * `tenantTierResolver` extension, so the framework automatically wires
23
+ * effectiveFeatures per tenant.
24
+ * When omitted, no resolver extension is registered; the app must use
25
+ * `composeApp` or its own resolution logic.
24
26
  */
25
27
  readonly tierMap?: TierMap<TCaps>;
26
28
  /**
27
- * Optionale Trial-Phase: jeder Tenant bekommt für `durationHours` ab seinem
28
- * Anlage-Datum zusätzlich die Features von `trial.tier` freigeschaltet,
29
- * danach fällt er automatisch auf sein gespeichertes Tier zurück. Erfordert
30
- * `tierMap` (der Trial-Tier muss ein Key sein). Zeit-abgeleitet aus
31
- * inserted_at — kein Stored-Flag, kein Scheduler.
29
+ * Optional trial phase: each tenant receives the features of `trial.tier` in
30
+ * addition to its stored tier for `durationHours` after creation, then
31
+ * automatically falls back to its stored tier. Requires `tierMap` to contain
32
+ * the trial tier. The result is derived from inserted_at; no stored flag or
33
+ * scheduler is used.
32
34
  */
33
35
  readonly trial?: TrialPolicy;
34
36
  };