@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
package/LICENSE CHANGED
@@ -1,57 +1,21 @@
1
- Business Source License 1.1
2
-
3
- Parameters
4
-
5
- Licensor: Marc Frost
6
-
7
- Licensed Work: @cosmicdrift/kumiko-framework
8
- The Licensed Work is © 2026 Marc Frost.
9
-
10
- Additional Use Grant:
11
- You may use the Licensed Work in production for any purpose, including
12
- commercially, EXCEPT for the Restricted Use.
13
-
14
- "Restricted Use" is defined as using the Licensed Work to provide a platform
15
- or service to third parties that allows them to host, deploy, or run their
16
- own applications built with the Licensed Work. This includes, but is not
17
- limited to: managed hosting services, software-as-a-service (SaaS) platforms,
18
- platform-as-a-service (PaaS), developer platforms, or any multi-tenant
19
- managed offering of the Licensed Work.
20
-
21
- This restriction does not apply to the Licensor, any entity controlled by,
22
- controlling, or under common control with the Licensor ("Affiliates"), or
23
- contractors acting on their behalf. The Licensor remains free to use the
24
- Licensed Work for any purpose, including for the operation of kumiko.rocks.
25
-
26
- Change Date: 2030-05-05
27
- Change License: Apache License, Version 2.0
28
-
29
-
30
- Terms
31
-
32
- The Licensor hereby grants you the right to copy, modify, create derivative works,
33
- redistribute, and make non-production use of the Licensed Work. The Licensor may
34
- make an Additional Use Grant, above, permitting limited production use.
35
-
36
- Effective on the Change Date, or the fourth anniversary of the first publicly
37
- available distribution of the Licensed Work under this License, whichever comes
38
- first, this License will convert to the Change License.
39
-
40
- This Business Source License governs use of the Licensed Work in all cases, except
41
- as to any use that is explicitly granted in the Additional Use Grant above or
42
- under the Change License after the Change Date.
43
-
44
- If your use of the Licensed Work does not comply with the requirements of this
45
- License, you must cease use of the Licensed Work immediately.
46
-
47
- All copies of the Licensed Work, and all derivative works thereof, must include
48
- this License.
49
-
50
- This License does not grant you any right, title, or interest in any trademark,
51
- logo, or branding of the Licensor, except as required to comply with this License.
52
-
53
- TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON AN
54
- “AS IS” BASIS. LICENSOR DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
55
- WITHOUT LIMITATION WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
56
- TITLE, AND NON-INFRINGEMENT. IN NO EVENT WILL LICENSOR BE LIABLE FOR ANY DAMAGES
57
- ARISING OUT OF OR RELATED TO THIS LICENSE OR THE USE OF THE LICENSED WORK.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Marc Frost
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -68,7 +68,7 @@ function isListHandlerQn(qn, entityName) {
68
68
  function isDetailHandlerQn(qn, entityName) {
69
69
  return qn.endsWith(`:${entityName}:detail`);
70
70
  }
71
- /** #2700: the entity CRUD tools are enumerated off the registry, not off the manifest, so
71
+ /** The entity CRUD tools are enumerated off the registry, not off the manifest, so
72
72
  * `resolveAgentExposure` never runs for them. Only an EXPLICIT opt-out may hide one here —
73
73
  * the resolver's own default is fail-closed on a missing `description`, and CRUD-generated
74
74
  * handlers never carry one, so reusing it would delete every entity tool in every app. */
@@ -37,11 +37,11 @@ export type ToolCallRequest = {
37
37
  /** Receives the cause of unexpected (5xx) failures, which the tool result never carries. */
38
38
  readonly log?: Pick<Logger, "error">;
39
39
  };
40
- /** Executes one LLM-issued tool call. Never throws — a missing tool, a missing argument, a
41
- * disallowed filter field, or a rejected handler call (cap check, validation, ...) all come
42
- * back as `{ ok: false }` so the agent loop can feed the error back to the model instead of
43
- * crashing. Client errors (< 500) keep their message and carry a `code`; 429 adds
44
- * `retryable`. Server-side failures (>= 500, unknown throws) are logged and returned as a
45
- * generic message so internals never reach the model. `request.user` must be the caller's real identity — every server-kind tool runs
46
- * through the same permission-checked dispatcher pipeline as a normal HTTP request. */
40
+ /** Executes one LLM-issued tool call. Never throws: every failure comes back as `{ ok: false }`
41
+ * so the agent loop can feed the error back to the model instead of crashing.
42
+ * Handler and dispatcher failures carry a `code` (429 adds `retryable`); client errors (< 500)
43
+ * keep their message, server failures (>= 500, unknown throws) are logged and returned as a
44
+ * generic message. Local validation errors (unknown tool, bad arguments) have no `code`.
45
+ * `request.user` must be the caller's real identity: server-kind tools run through the same
46
+ * permission-checked pipeline as an HTTP request. */
47
47
  export declare function dispatchToolCall(request: ToolCallRequest): Promise<ToolCallResult>;
@@ -1,5 +1,5 @@
1
1
  import { isKumikoError } from "@cosmicdrift/kumiko-framework/errors";
2
- import { runAsDirectCallEntry } from "@cosmicdrift/kumiko-framework/internal/request-context";
2
+ import { runAsAgentToolCallEntry } from "@cosmicdrift/kumiko-framework/internal/request-context";
3
3
  import { createFallbackLogger } from "@cosmicdrift/kumiko-framework/logging";
4
4
  import { isOneOf } from "@cosmicdrift/kumiko-types/type-guards";
5
5
  import { FILTER_OPS, isRecord } from "./filter-ops.js";
@@ -274,13 +274,13 @@ function dispatchClient(descriptor, input) {
274
274
  return dispatchClientAskUser(input);
275
275
  }
276
276
  }
277
- /** Executes one LLM-issued tool call. Never throws — a missing tool, a missing argument, a
278
- * disallowed filter field, or a rejected handler call (cap check, validation, ...) all come
279
- * back as `{ ok: false }` so the agent loop can feed the error back to the model instead of
280
- * crashing. Client errors (< 500) keep their message and carry a `code`; 429 adds
281
- * `retryable`. Server-side failures (>= 500, unknown throws) are logged and returned as a
282
- * generic message so internals never reach the model. `request.user` must be the caller's real identity — every server-kind tool runs
283
- * through the same permission-checked dispatcher pipeline as a normal HTTP request. */
277
+ /** Executes one LLM-issued tool call. Never throws: every failure comes back as `{ ok: false }`
278
+ * so the agent loop can feed the error back to the model instead of crashing.
279
+ * Handler and dispatcher failures carry a `code` (429 adds `retryable`); client errors (< 500)
280
+ * keep their message, server failures (>= 500, unknown throws) are logged and returned as a
281
+ * generic message. Local validation errors (unknown tool, bad arguments) have no `code`.
282
+ * `request.user` must be the caller's real identity: server-kind tools run through the same
283
+ * permission-checked pipeline as an HTTP request. */
284
284
  export async function dispatchToolCall(request) {
285
285
  const { dispatcher, user, toolName, input, dispatchTable, runId, toolCallId } = request;
286
286
  const classifyFailure = createFailureClassifier(toolName, request.log ?? fallbackLog);
@@ -289,7 +289,7 @@ export async function dispatchToolCall(request) {
289
289
  return { ok: false, error: `Unknown tool "${toolName}"` };
290
290
  }
291
291
  try {
292
- return await runAsDirectCallEntry(async () => {
292
+ return await runAsAgentToolCallEntry(async () => {
293
293
  switch (descriptor.kind) {
294
294
  case "search":
295
295
  return await dispatchSearch(descriptor, dispatcher, user, toolName, input);
@@ -12,7 +12,7 @@ import { redactPiiCiphertext } from "../../shared/index.js";
12
12
  import { eventLabelKeyOf, TECHNICAL_EVENT_TYPES } from "../event-classification.js";
13
13
  import { AUDIT_EVENT_ACTIONS, INCLUDE_TECHNICAL_FILTER, } from "../web/constants.js";
14
14
  const MAX_LIMIT = 100;
15
- // At most 18 digits keeps the id inside bigint, so an oversized cursor or id is a 422, not a 500.
15
+ // At most 18 digits keeps the id inside bigint, so an oversized cursor or id is a validation error (400), not a 500.
16
16
  const CURSOR_PATTERN = /^\d{1,18}$/;
17
17
  export const auditListPayloadShape = {
18
18
  cursor: z.string().regex(CURSOR_PATTERN, "cursor must be a positive integer").optional(),
@@ -85,7 +85,7 @@ export function auditLogDetailLayout(options) {
85
85
  "id",
86
86
  ],
87
87
  },
88
- // No section `title` here (fw#2312 label-dedup fix): each section
88
+ // No section `title` here (label-dedup fix): each section
89
89
  // holds exactly one field, so a title would repeat the field's own
90
90
  // label (rendered by RenderField as the Field's heading) verbatim.
91
91
  { fields: [{ field: "payload", renderer: { format: "json" } }] },
@@ -66,7 +66,7 @@ export function createAuthEmailPasswordFeature(opts = {}) {
66
66
  const strictVerification = opts.emailVerification !== undefined && (opts.emailVerification.mode ?? "strict") === "strict";
67
67
  const feature = defineFeature("auth-email-password", (r) => {
68
68
  r.describe("Provides email+password authentication: the always-on handlers are `login`, `changePassword`, and `logout`; optional flows — password reset, email verification, magic-link self-signup, tenant invite, and account-unlock — are registered only when you pass their respective option objects (`passwordReset`, `emailVerification`, `signup`, `invite`, `accountUnlock`) to `createAuthEmailPasswordFeature(opts)`. All five magic-link flows dispatch their mail through the `delivery` feature via `ctx.notify`, so mounting any of them additionally requires `delivery`. Tokens are HMAC-signed (reset/verify/unlock) or opaque-random in Redis (signup/invite). `accountUnlock` is the self-service escape hatch for `accountLockout`'s monotonic failure-counter (#1266): confirming the mailed token clears the Redis lockout state without touching the user entity. Requires the `user` and `tenant` features, and declares `JWT_SECRET` (≥ 32 chars) in `authEmailPasswordEnvSchema` so a missing secret surfaces at boot validation rather than on the first login attempt.");
69
- // kumiko-lint-ignore i18n-ui-strings uiHints labels are feature-registry metadata for the admin feature catalog, not yet wired to the i18n system, see #2312
69
+ // kumiko-lint-ignore i18n-ui-strings uiHints labels are feature-registry metadata for the admin feature catalog, not yet wired to the i18n system
70
70
  r.uiHints({
71
71
  displayLabel: "Auth \u00b7 Email + Password",
72
72
  category: "identity",
@@ -42,9 +42,9 @@ export const changePasswordWrite = defineWriteHandler({
42
42
  return invalidCredentials();
43
43
  }
44
44
  const newHash = await hashPassword(event.payload.newPassword);
45
- // The user aggregate is systemStream (#497): its event stream lives on
46
- // SYSTEM_TENANT_ID deterministically. Pre-#497 scattered streams need the
47
- // one-time backfillUserStreamTenants migration (#762).
45
+ // The user aggregate is systemStream: its event stream lives on
46
+ // SYSTEM_TENANT_ID deterministically. Previously scattered streams need the
47
+ // one-time backfillUserStreamTenants migration.
48
48
  const writer = createSystemUser(SYSTEM_TENANT_ID);
49
49
  // Apply via user feature's update handler — writeAs(system) satisfies
50
50
  // the privileged-only write rule on passwordHash. Pass the current version
@@ -15,11 +15,11 @@
15
15
  // else — including future branches a maintainer adds — releases
16
16
  // automatically.
17
17
  //
18
- // The user aggregate is systemStream (#497): its event stream lives on
18
+ // The user aggregate uses systemStream: its event stream lives on
19
19
  // SYSTEM_TENANT_ID deterministically, so the write targets exactly one
20
20
  // stream. The former membership-probing (`tryWriteAcrossTenants`) existed
21
- // for pre-#497 scattered streams; those need the one-time
22
- // backfillUserStreamTenants migration (#762) — probing them stopped working
21
+ // for scattered streams; those need the one-time
22
+ // backfillUserStreamTenants migration — probing them stopped working
23
23
  // the moment the executor's stream choke-point landed anyway.
24
24
  import { createSystemUser, declareEscapeHatch, SYSTEM_TENANT_ID, } from "@cosmicdrift/kumiko-framework/engine";
25
25
  import { InternalError, writeFailure } from "@cosmicdrift/kumiko-framework/errors";
@@ -61,8 +61,8 @@ export async function runConfirmTokenFlow(ctx, userId, expiresAtMs, spec) {
61
61
  committed = true;
62
62
  return { isSuccess: true, data: spec.successData };
63
63
  }
64
- // version_conflict = concurrent modification (or an un-migrated pre-#497
65
- // stream, see header) → token-level failure. Anything else (DB down,
64
+ // version_conflict = concurrent modification (or an un-migrated
65
+ // stream) → token-level failure. Anything else (DB down,
66
66
  // access denied) bubbles unchanged so ops sees the real failure class.
67
67
  if (writeRes.error.code === "version_conflict")
68
68
  return spec.invalidToken();
@@ -88,7 +88,7 @@ export function createInviteAcceptWithLoginHandler(opts = {}) {
88
88
  }
89
89
  // Password check against userTable, through the same gates
90
90
  // login.write.ts runs (see login-gates.test.ts for the gate contracts).
91
- // Email uniqueness is partial on live rows (framework#2593) — without
91
+ // Email uniqueness is partial on live rows — without
92
92
  // this filter the lookup can resolve a soft-deleted row.
93
93
  const userRow = await ctx.db.global(userTable).fetchOne({
94
94
  email: invitationEmail,
@@ -1,31 +1,31 @@
1
- // Tenant-Invite Step 2 — Branch 1 (logged-in user accepts).
1
+ // Tenant invitation — logged-in user accepts.
2
2
  //
3
- // User ist eingeloggt (in irgendeinem Tenant), klickt Accept-Link.
3
+ // The user is signed in to some tenant and clicks the Accept link.
4
4
  // Server:
5
5
  // 1. Token → invitationId (Redis)
6
6
  // 2. Burn (single-use)
7
- // 3. Invitation-Row aus DB
8
- // 4. Email-Match: invitation.email === user.email (sonst inviteEmailMismatch)
7
+ // 3. Load the invitation row from the database
8
+ // 4. Email match: invitation.email === user.email (otherwise inviteEmailMismatch)
9
9
  // 5+6. grantInvitedMembershipRole: create the membership, or add the
10
10
  // invited role to an existing one (add-only)
11
- // 7. Invitation-Row → status=accepted
12
- // 8. Redis-Keys löschen (Burn-Key bleibt für Replay-Schutz)
11
+ // 7. Invitation row → status=accepted
12
+ // 8. Delete Redis keys (the burn key remains for replay protection)
13
13
  //
14
- // Branch 1 ist der klassische "shared workspace bei eingeloggter
15
- // Session"-Flow. Branch 2 (anon + existing email) und Branch 3 (anon +
16
- // new email) kommen als separate Handler.
14
+ // This is the classic "shared workspace with a logged-in session" flow.
15
+ // Branch 2 (anonymous + existing email) and Branch 3 (anonymous + new
16
+ // email) are handled separately.
17
17
  import { createEventStoreExecutor, createTenantDb, fetchOne, } from "@cosmicdrift/kumiko-framework/db";
18
18
  import { createSystemUser, defineWriteHandler, } from "@cosmicdrift/kumiko-framework/engine";
19
19
  import { InternalError, writeFailure } from "@cosmicdrift/kumiko-framework/errors";
20
20
  import * as z from "zod";
21
21
  import { decryptStoredPii } from "../../shared/index.js";
22
- // kumiko-lint-ignore cross-feature-import invite-flow lebt in auth-email-password (Magic-Link), DB-row-owner ist tenant-feature
22
+ // kumiko-lint-ignore cross-feature-import the invite flow lives in auth-email-password (Magic-Link), while the DB-row owner is a tenant feature
23
23
  import { INVITATION_STATUS, tenantInvitationEntity, tenantInvitationsTable, } from "../../tenant/invitation-table.js";
24
24
  // kumiko-lint-ignore cross-feature-import membership grant for a privileged cross-tenant add (like provisionSignupAccount)
25
25
  import { grantInvitedMembershipRole } from "../../tenant/invited-membership.js";
26
26
  // kumiko-lint-ignore cross-feature-import global roles granted on invite accept live on the user row
27
27
  import { grantInvitedGlobalRoles, parseInvitedGlobalRoles, } from "../../user/invited-global-roles.js";
28
- // kumiko-lint-ignore cross-feature-import auth handler reads user-row für email-match
28
+ // kumiko-lint-ignore cross-feature-import the auth handler reads the user row for the email match
29
29
  import { userTable } from "../../user/schema/user.js";
30
30
  import { invalidInviteToken, inviteEmailMismatch } from "../errors.js";
31
31
  import { burnInviteToken, deleteInviteToken, getInvitationIdForToken, unburnInviteToken, } from "../invite-token-store.js";
@@ -73,9 +73,9 @@ export function createInviteAcceptHandler() {
73
73
  const invitationEmail = await decryptStoredPii(invitation.email, "email", "auth:invite-accept");
74
74
  const invitationRole = invitation.role;
75
75
  const invitationVersion = invitation.version;
76
- // Email-Match: User muss mit der eingeladenen Email matchen.
77
- // Sonst kann ein Angreifer mit Zugriff zur invitee-Mail seinen
78
- // eigenen Account dem Tenant zuschlagen.
76
+ // Email match: the user must match the invited email.
77
+ // Otherwise, anyone with access to the invitee's email could add
78
+ // their own account to the tenant.
79
79
  const userRow = await ctx.db.global(userTable).fetchOne({
80
80
  id: event.user.id,
81
81
  });
@@ -103,10 +103,10 @@ export function createInviteAcceptHandler() {
103
103
  });
104
104
  if (!globalGrant.isSuccess)
105
105
  return globalGrant;
106
- // Invitation-Status → accepted via event-store-executor.
107
- // Tenant-scoping: ctx.db ist auf event.user.tenantId gescopt
108
- // (= NICHT der invitation-tenant). Eigene TenantDb für den
109
- // invitation-tenant bauen damit der executor die row findet.
106
+ // Invitation status → accepted via event-store-executor.
107
+ // Tenant scoping: ctx.db is scoped to event.user.tenantId
108
+ // (not the invitation tenant). Build a TenantDb for the
109
+ // invitation tenant so the executor can find the row.
110
110
  const invitationTdb = createTenantDb({
111
111
  db: dbConn,
112
112
  tenantId: invitationTenantId,
@@ -11,7 +11,7 @@ export type InviteCreateData = {
11
11
  readonly expiresAt: string;
12
12
  };
13
13
  export type InviteCreateOptions = {
14
- /** TTL für den Activation-Token. Default 7 Tage. */
14
+ /** TTL for the activation token. Default: 7 days. */
15
15
  readonly tokenTtlMinutes?: number;
16
16
  /** App page that receives the magic-link; the handler appends `?token=…`
17
17
  * and dispatches the invite mail via delivery (ctx.notify). Apps with
@@ -25,7 +25,7 @@ export type InviteCreateOptions = {
25
25
  readonly locale?: AuthMailLocale;
26
26
  readonly canAssignRole?: (inviterRoles: readonly string[], targetRole: string) => boolean;
27
27
  /** Opt-in allow-list for app-defined (unranked) roles the elevation guard
28
- * would otherwise reject with unassignable_membership_role (fw#2398).
28
+ * would otherwise reject with unassignable_membership_role.
29
29
  * Rank-aware alternative: declare roles via EXT_ASSIGNABLE_ROLE. */
30
30
  readonly additionalAssignableRoles?: readonly string[];
31
31
  };
@@ -1,10 +1,10 @@
1
1
  // Tenant-Invite Step 1 (create).
2
2
  //
3
- // Admin invitet email → DB-Row entsteht via event-store-executor (oder
4
- // wird re-used bei Re-Invite), Random-Token in Redis bidirektional, und der
5
- // Handler schickt die Invite-Mail an den Invitee via delivery (ctx.notify) —
6
- // wie reset/verify/signup. Der Token geht NICHT an den Admin zurück (er soll
7
- // die Annahme nicht impersonieren können).
3
+ // An admin invites an email address → a DB row is created via
4
+ // event-store-executor (or reused for a re-invite), a random token is stored
5
+ // bidirectionally in Redis, and the handler sends the invite email to the
6
+ // invitee via delivery (ctx.notify), as with reset/verify/signup. The token
7
+ // is NOT returned to the admin, so the admin cannot impersonate acceptance.
8
8
  //
9
9
  // Re-invite for the same (tenantId, email): the existing row is reused
10
10
  // regardless of its prior status (pending/cancelled/accepted), reset to
@@ -12,10 +12,10 @@
12
12
  // still live for that invitation is invalidated first, so the previous
13
13
  // mail's link stops working (see invite-token-store.ts).
14
14
  //
15
- // Always-200 für unbekannten User: bei invitee-Email die nicht in users
16
- // existiert wird trotzdem ein Invite erstellt — Branch-3-Accept-Flow
17
- // erlaubt new-user-signup mit dem Token. Keine Enumeration durchs
18
- // invite-create.
15
+ // Always-200 for an unknown user: an invite is created even when the
16
+ // invitee's email does not exist in users — the Branch-3-Accept-Flow
17
+ // permits new-user-signup with the token. invite-create does not enable
18
+ // enumeration.
19
19
  import { generateToken } from "@cosmicdrift/kumiko-framework/api";
20
20
  import { createEventStoreExecutor } from "@cosmicdrift/kumiko-framework/db";
21
21
  import { access, assignableAppRolesOf, defineWriteHandler, } from "@cosmicdrift/kumiko-framework/engine";
@@ -23,7 +23,7 @@ import { InternalError, writeFailure, } from "@cosmicdrift/kumiko-framework/erro
23
23
  import { isValidLocaleTag } from "@cosmicdrift/kumiko-framework/i18n";
24
24
  import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
25
25
  import * as z from "zod";
26
- // kumiko-lint-ignore cross-feature-import invite-flow lebt in auth-email-password (Magic-Link-Pattern), DB-row-owner ist tenant-feature
26
+ // kumiko-lint-ignore cross-feature-import invite flow lives in auth-email-password (Magic-Link-Pattern); DB-row owner is the tenant feature
27
27
  import { INVITATION_STATUS, tenantInvitationEntity, tenantInvitationsTable, } from "../../tenant/invitation-table.js";
28
28
  // kumiko-lint-ignore cross-feature-import membership version read is owned by the tenant feature
29
29
  import { membershipVersionOf } from "../../tenant/invited-membership.js";
@@ -9,7 +9,7 @@ import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
9
9
  import { UnprocessableError } from "@cosmicdrift/kumiko-framework/errors";
10
10
  import * as z from "zod";
11
11
  import { decryptStoredPii } from "../../shared/index.js";
12
- // kumiko-lint-ignore cross-feature-import invite-flow lebt in auth-email-password (Magic-Link), DB-row-owner ist tenant-feature
12
+ // kumiko-lint-ignore cross-feature-import invite-flow lives in auth-email-password (Magic-Link), DB-row-owner belongs to the tenant feature
13
13
  import { INVITATION_STATUS, tenantInvitationsTable } from "../../tenant/invitation-table.js";
14
14
  // kumiko-lint-ignore cross-feature-import login-style account lookup, same as invite-accept-with-login
15
15
  import { userTable } from "../../user/schema/user.js";
@@ -1,21 +1,21 @@
1
- // Tenant-Invite Step 2 — Branch 3 (anon User, Email NICHT registriert).
1
+ // Tenant-Invite Step 2 — Branch 3 (anonymous user, email NOT registered).
2
2
  //
3
- // Anders als signup-confirm: KEIN neuer Tenant entsteht. Der Tenant
4
- // existiert schon (im invitation-row), wir legen NUR User+Membership an.
3
+ // Unlike signup-confirm, no new tenant is created. The tenant already
4
+ // exists in the invitation row; only the user and membership are created.
5
5
  //
6
6
  // Flow:
7
- // 1. User klickt Invite-Link → /invite/signup?token=...
8
- // 2. Frontend zeigt Password-Form (email kommt aus invitation, kein
9
- // User-Input damit kein Email-Mismatch möglich)
10
- // 3. User submitted password + token
7
+ // 1. User clicks the invite link → /invite/signup?token=...
8
+ // 2. The frontend shows the password form (the email comes from the
9
+ // invitation, not user input, so an email mismatch is impossible)
10
+ // 3. User submits the password and token
11
11
  // 4. Server:
12
12
  // a. Token → invitationId → invitation row
13
- // b. User-Existence-Check: invitation.email darf NICHT in userTable
14
- // existieren (sonst soll Branch 2 oder Branch 1 genutzt werden)
15
- // c. Create user (emailVerified=true wegen Magic-Link)
16
- // d. Add membership im invited Tenant
17
- // e. Invitation → accepted, Token gelöscht
18
- // 5. Response: SessionUser + tenantId für Auto-Login
13
+ // b. User-existence check: invitation.email must NOT exist in userTable
14
+ // (otherwise Branch 2 or Branch 1 must be used)
15
+ // c. Create the user (emailVerified=true because of the magic link)
16
+ // d. Add membership to the invited tenant
17
+ // e. Mark the invitation accepted and delete the token
18
+ // 5. Response: SessionUser + tenantId for automatic login
19
19
  import { createEventStoreExecutor, createTenantDb, fetchOne, } from "@cosmicdrift/kumiko-framework/db";
20
20
  import { buildSessionRoles, createSystemUser, defineWriteHandler, } from "@cosmicdrift/kumiko-framework/engine";
21
21
  import { InternalError, writeFailure } from "@cosmicdrift/kumiko-framework/errors";
@@ -25,7 +25,7 @@ import { decryptStoredPii, registrationLocaleFromRequest } from "../../shared/in
25
25
  import { INVITATION_STATUS, tenantInvitationEntity, tenantInvitationsTable, } from "../../tenant/invitation-table.js";
26
26
  // kumiko-lint-ignore cross-feature-import reserved-role check owned by tenant-feature
27
27
  import { findForbiddenMembershipRole, reservedMembershipRoleError, } from "../../tenant/membership-roles.js";
28
- // kumiko-lint-ignore cross-feature-import membership-seed-helper für privilegierten cross-tenant-add
28
+ // kumiko-lint-ignore cross-feature-import membership-seed-helper for privileged cross-tenant addition
29
29
  import { seedTenantMembership } from "../../tenant/seeding.js";
30
30
  // kumiko-lint-ignore cross-feature-import global roles granted on invite accept live on the user row
31
31
  import { parseInvitedGlobalRoles } from "../../user/invited-global-roles.js";
@@ -74,20 +74,19 @@ export function createInviteSignupCompleteHandler(opts = {}) {
74
74
  const invitationRole = invitation.role;
75
75
  const invitationGlobalRoles = parseInvitedGlobalRoles(invitation.globalRoles);
76
76
  const invitationVersion = invitation.version;
77
- // User-Not-Exists-Check: wenn die Email schon registriert ist,
78
- // muss der User Branch 2 (acceptWithLogin) nutzen. Hier ist
79
- // explizit "neue Email" — sonst hätten wir zwei Wege ein
80
- // Password zu setzen für denselben User.
81
- // Email uniqueness is partial on live rows (framework#2593) — without
82
- // this filter the lookup can resolve a soft-deleted row.
77
+ // If the email is already registered, the user must use Branch 2
78
+ // (acceptWithLogin). This flow explicitly requires a new email;
79
+ // otherwise there would be two ways to set a password for the same user.
80
+ // Email uniqueness is partial on live rows — without this filter,
81
+ // the lookup can resolve a soft-deleted row.
83
82
  const existingUser = await ctx.db.global(userTable).fetchOne({
84
83
  email: invitationEmail,
85
84
  isDeleted: false,
86
85
  });
87
86
  if (existingUser)
88
87
  return invalidInviteToken();
89
- // User anlegen via seedUserWithPassword (gleiches Pattern wie
90
- // signup-confirm), emailVerified=true wegen Magic-Link.
88
+ // Create the user through seedUserWithPassword so the magic-link flow
89
+ // records emailVerified=true.
91
90
  // @cast-boundary db-runner — helpers use only the query API that
92
91
  // DbConnection and DbTx share.
93
92
  const dbConn = ctx.db.unsafeRaw();
@@ -100,9 +99,8 @@ export function createInviteSignupCompleteHandler(opts = {}) {
100
99
  ...registrationLocale,
101
100
  ...(invitationGlobalRoles.length > 0 && { roles: invitationGlobalRoles }),
102
101
  });
103
- // Membership-Add via seed-helper (gleiches Pattern wie
104
- // provisionSignupAccount — bypassed addMember access-check
105
- // weil createSystemUser nicht ["SystemAdmin"] matcht).
102
+ // The seed helper bypasses addMember's access check because
103
+ // createSystemUser does not match ["SystemAdmin"].
106
104
  const forbiddenInviteRole = findForbiddenMembershipRole([invitationRole]);
107
105
  if (forbiddenInviteRole !== undefined) {
108
106
  return writeFailure(reservedMembershipRoleError(forbiddenInviteRole));
@@ -112,7 +110,7 @@ export function createInviteSignupCompleteHandler(opts = {}) {
112
110
  tenantId: invitationTenantId,
113
111
  roles: [invitationRole],
114
112
  });
115
- // Invitation → accepted: TenantDb für invitation-tenant
113
+ // Update the invitation in the invited tenant's database context.
116
114
  const invitationTdb = createTenantDb({
117
115
  db: dbConn,
118
116
  tenantId: invitationTenantId,
@@ -45,7 +45,7 @@ type GateOutcome<T> = GateReject | GateOk<T>;
45
45
  type AuthenticatableUserRow = AuthUserRow & {
46
46
  readonly passwordHash: string;
47
47
  };
48
- /** Uniform response on any credential miss — burns argon2 cost (#774). */
48
+ /** Uniform response on any credential miss — burns argon2 cost. */
49
49
  export declare function gateResolveAuthUser(found: AuthUserRow | null, password: string): Promise<GateOutcome<AuthenticatableUserRow>>;
50
50
  export declare function gateCountUnknownUser(ctx: HandlerContext, email: string, maxFailedAttempts: number, lockoutDurationMinutes: number): Promise<GateOutcome<undefined>>;
51
51
  /**
@@ -14,7 +14,7 @@ function reject(result) {
14
14
  function ok(value) {
15
15
  return { ok: true, value };
16
16
  }
17
- /** Uniform response on any credential miss — burns argon2 cost (#774). */
17
+ /** Uniform response on any credential miss — burns argon2 cost. */
18
18
  export async function gateResolveAuthUser(found, password) {
19
19
  if (!found?.passwordHash || found.isDeleted) {
20
20
  await verifyDummyPassword(password);
@@ -16,7 +16,7 @@ export const selfRegistrationStatusQuery = defineQueryHandler({
16
16
  rateLimit: { per: "ip+handler", limit: 30, windowSeconds: 60 },
17
17
  description: "Reports whether self-registration is currently switched on, readable without signing in, so a signup page can hide its own form instead of collecting an address that would be silently ignored.",
18
18
  handler: async (_query, ctx) => {
19
- // Same fail-open reasoning as signup-request.write.ts (#1468): only
19
+ // Same fail-open reasoning as signup-request.write.ts: only
20
20
  // report disabled when the toggle feature is actually composed.
21
21
  const gated = ctx.registry.getFeature(AUTH_SELF_REGISTRATION_FEATURE) !== undefined;
22
22
  return { enabled: gated ? await ctx.hasFeature(AUTH_SELF_REGISTRATION_FEATURE) : true };