@cosmicdrift/kumiko-samples 0.385.0 → 0.387.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/LICENSE +21 -57
  2. package/README.md +1 -1
  3. package/package.json +2 -2
  4. package/packages/bundled-features/package.json +2 -2
  5. package/packages/bundled-features/src/agent-tools/tool-catalog.ts +1 -1
  6. package/packages/bundled-features/src/agent-tools/tool-dispatch.ts +0 -2
  7. package/packages/bundled-features/src/audit/screens.ts +1 -1
  8. package/packages/bundled-features/src/auth-email-password/auth-user-row.ts +10 -10
  9. package/packages/bundled-features/src/auth-email-password/feature.ts +6 -6
  10. package/packages/bundled-features/src/auth-email-password/handlers/change-password.write.ts +3 -3
  11. package/packages/bundled-features/src/auth-email-password/handlers/confirm-token-flow.ts +5 -5
  12. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +1 -1
  13. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept.write.ts +18 -18
  14. package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +12 -12
  15. package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +1 -1
  16. package/packages/bundled-features/src/auth-email-password/handlers/invite-signup-complete.write.ts +24 -26
  17. package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +1 -1
  18. package/packages/bundled-features/src/auth-email-password/handlers/self-registration-status.query.ts +1 -1
  19. package/packages/bundled-features/src/auth-email-password/handlers/signup-confirm.write.ts +34 -37
  20. package/packages/bundled-features/src/auth-email-password/handlers/signup-request.write.ts +6 -7
  21. package/packages/bundled-features/src/auth-email-password/handlers/switch-tenant-mfa-gate.write.ts +1 -5
  22. package/packages/bundled-features/src/auth-email-password/index.ts +5 -5
  23. package/packages/bundled-features/src/auth-email-password/lockout-store.ts +1 -1
  24. package/packages/bundled-features/src/auth-email-password/seeding.ts +63 -66
  25. package/packages/bundled-features/src/auth-email-password/signup-token-store.ts +8 -8
  26. package/packages/bundled-features/src/auth-email-password/testing.ts +3 -3
  27. package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +57 -57
  28. package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +14 -14
  29. package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +15 -16
  30. package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +11 -12
  31. package/packages/bundled-features/src/auth-email-password/web/confirm-account-unlock-screen.tsx +1 -1
  32. package/packages/bundled-features/src/auth-email-password/web/constants.ts +3 -3
  33. package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +14 -14
  34. package/packages/bundled-features/src/auth-email-password/web/forgot-password-screen.tsx +11 -11
  35. package/packages/bundled-features/src/auth-email-password/web/index.ts +5 -5
  36. package/packages/bundled-features/src/auth-email-password/web/invite-accept-screen.tsx +17 -17
  37. package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +3 -4
  38. package/packages/bundled-features/src/auth-email-password/web/reset-password-screen.tsx +16 -17
  39. package/packages/bundled-features/src/auth-email-password/web/session.tsx +34 -34
  40. package/packages/bundled-features/src/auth-email-password/web/signup-complete-screen.tsx +3 -3
  41. package/packages/bundled-features/src/auth-email-password/web/signup-screen.tsx +14 -14
  42. package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +26 -27
  43. package/packages/bundled-features/src/auth-email-password/web/use-shell-user.ts +12 -13
  44. package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +17 -18
  45. package/packages/bundled-features/src/auth-email-password/web/verify-email-screen.tsx +11 -12
  46. package/packages/bundled-features/src/auth-foundation/boot-checks.ts +4 -4
  47. package/packages/bundled-features/src/auth-foundation/resolve-anonymous-access.ts +4 -4
  48. package/packages/bundled-features/src/auth-foundation/types.ts +2 -2
  49. package/packages/bundled-features/src/auth-mfa/handlers/disable.write.ts +3 -3
  50. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +4 -4
  51. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm.write.ts +2 -2
  52. package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +1 -1
  53. package/packages/bundled-features/src/auth-mfa/handlers/reencrypt.job.ts +1 -1
  54. package/packages/bundled-features/src/auth-mfa/handlers/regenerate-recovery.write.ts +5 -5
  55. package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +1 -1
  56. package/packages/bundled-features/src/auth-mfa/token-secrets.ts +1 -1
  57. package/packages/bundled-features/src/auth-mfa/web/client-plugin.ts +2 -2
  58. package/packages/bundled-features/src/auth-mfa/web/i18n.ts +3 -3
  59. package/packages/bundled-features/src/auth-mfa/web/index.ts +4 -4
  60. package/packages/bundled-features/src/auth-mfa/web/mfa-client.ts +17 -16
  61. package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +6 -6
  62. package/packages/bundled-features/src/billing-foundation/aggregate-id.ts +10 -11
  63. package/packages/bundled-features/src/billing-foundation/entities.ts +27 -27
  64. package/packages/bundled-features/src/billing-foundation/events.ts +22 -21
  65. package/packages/bundled-features/src/billing-foundation/feature.ts +42 -43
  66. package/packages/bundled-features/src/billing-foundation/get-subscription-for-tenant.ts +3 -5
  67. package/packages/bundled-features/src/billing-foundation/handlers/create-checkout-session.write.ts +18 -17
  68. package/packages/bundled-features/src/billing-foundation/handlers/create-portal-session.write.ts +11 -12
  69. package/packages/bundled-features/src/billing-foundation/handlers/list-subscriptions.query.ts +4 -4
  70. package/packages/bundled-features/src/billing-foundation/handlers/process-event.write.ts +20 -20
  71. package/packages/bundled-features/src/billing-foundation/projection.ts +38 -37
  72. package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +3 -3
  73. package/packages/bundled-features/src/billing-foundation/tenant-destroy-hook.ts +7 -8
  74. package/packages/bundled-features/src/billing-foundation/types.ts +64 -65
  75. package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +4 -4
  76. package/packages/bundled-features/src/billing-foundation/webhook-handler.ts +1 -1
  77. package/packages/bundled-features/src/cap-counter/aggregate-id.ts +8 -9
  78. package/packages/bundled-features/src/cap-counter/constants.ts +11 -12
  79. package/packages/bundled-features/src/cap-counter/enforce-cap.ts +64 -67
  80. package/packages/bundled-features/src/cap-counter/entity.ts +29 -29
  81. package/packages/bundled-features/src/cap-counter/feature.ts +34 -35
  82. package/packages/bundled-features/src/cap-counter/handlers/increment-rolling.write.ts +31 -31
  83. package/packages/bundled-features/src/cap-counter/handlers/mark-soft-warned.write.ts +4 -5
  84. package/packages/bundled-features/src/cap-counter/stock-cap-guard.ts +1 -1
  85. package/packages/bundled-features/src/cap-counter/with-cap-enforcement.ts +3 -5
  86. package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +1 -3
  87. package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +1 -1
  88. package/packages/bundled-features/src/channel-email/smtp-transport.ts +34 -31
  89. package/packages/bundled-features/src/channel-in-app/handlers/unread-count.query.ts +3 -4
  90. package/packages/bundled-features/src/compliance-profiles/feature.ts +15 -16
  91. package/packages/bundled-features/src/compliance-profiles/handlers/for-tenant.query.ts +3 -6
  92. package/packages/bundled-features/src/compliance-profiles/handlers/list-profiles.query.ts +5 -5
  93. package/packages/bundled-features/src/compliance-profiles/handlers/needs-profile.query.ts +4 -4
  94. package/packages/bundled-features/src/compliance-profiles/handlers/set-profile.write.ts +13 -14
  95. package/packages/bundled-features/src/compliance-profiles/handlers/sub-processors.query.ts +9 -11
  96. package/packages/bundled-features/src/compliance-profiles/resolve-for-tenant.ts +7 -7
  97. package/packages/bundled-features/src/compliance-profiles/schema/profile-selection.ts +18 -23
  98. package/packages/bundled-features/src/compliance-profiles/seeding.ts +14 -15
  99. package/packages/bundled-features/src/compliance-profiles-ops/handlers/tenants-missing-profile.query.ts +3 -3
  100. package/packages/bundled-features/src/compliance-profiles-ops/index.ts +2 -2
  101. package/packages/bundled-features/src/config/handlers/readiness.query.ts +7 -7
  102. package/packages/bundled-features/src/config/handlers/reencrypt.job.ts +4 -5
  103. package/packages/bundled-features/src/config/handlers/set.write.ts +4 -4
  104. package/packages/bundled-features/src/config/resolver.ts +4 -4
  105. package/packages/bundled-features/src/config/table.ts +10 -10
  106. package/packages/bundled-features/src/config/write-helpers.ts +1 -1
  107. package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +13 -12
  108. package/packages/bundled-features/src/custom-fields/aggregate-id.ts +16 -17
  109. package/packages/bundled-features/src/custom-fields/entity.ts +49 -47
  110. package/packages/bundled-features/src/custom-fields/events.ts +7 -8
  111. package/packages/bundled-features/src/custom-fields/feature.ts +70 -72
  112. package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +9 -8
  113. package/packages/bundled-features/src/custom-fields/handlers/define-tenant-field.write.ts +28 -26
  114. package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +6 -7
  115. package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +12 -13
  116. package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +25 -28
  117. package/packages/bundled-features/src/custom-fields/handlers/update-tenant-field.write.ts +6 -6
  118. package/packages/bundled-features/src/custom-fields/lib/field-access.ts +2 -2
  119. package/packages/bundled-features/src/custom-fields/lib/parse-serialized-field.ts +1 -1
  120. package/packages/bundled-features/src/custom-fields/lib/quota.ts +1 -1
  121. package/packages/bundled-features/src/custom-fields/lib/value-schema.ts +10 -12
  122. package/packages/bundled-features/src/custom-fields/run-retention.ts +3 -3
  123. package/packages/bundled-features/src/custom-fields/schemas.ts +14 -14
  124. package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +2 -5
  125. package/packages/bundled-features/src/custom-fields/web/constants.ts +2 -2
  126. package/packages/bundled-features/src/custom-fields/web/custom-fields-form-section.tsx +26 -26
  127. package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +65 -67
  128. package/packages/bundled-features/src/custom-fields/wire-user-data-rights.ts +3 -3
  129. package/packages/bundled-features/src/data-retention/_internal/parse-override.ts +2 -3
  130. package/packages/bundled-features/src/data-retention/feature.ts +11 -18
  131. package/packages/bundled-features/src/data-retention/handlers/policy-for.query.ts +6 -6
  132. package/packages/bundled-features/src/data-retention/keep-for.ts +17 -17
  133. package/packages/bundled-features/src/data-retention/override-schema.ts +13 -15
  134. package/packages/bundled-features/src/data-retention/presets.ts +18 -23
  135. package/packages/bundled-features/src/data-retention/resolve-for-tenant.ts +1 -1
  136. package/packages/bundled-features/src/data-retention/resolve-tenant-preset.ts +17 -16
  137. package/packages/bundled-features/src/data-retention/resolver.ts +33 -32
  138. package/packages/bundled-features/src/data-retention/run-retention-cleanup.ts +71 -58
  139. package/packages/bundled-features/src/data-retention/schema/tenant-retention-override.ts +13 -11
  140. package/packages/bundled-features/src/delivery/feature.ts +3 -3
  141. package/packages/bundled-features/src/delivery/handlers/log.query.ts +1 -1
  142. package/packages/bundled-features/src/delivery/tables.ts +9 -8
  143. package/packages/bundled-features/src/delivery/unsubscribe.ts +4 -4
  144. package/packages/bundled-features/src/delivery/upsert-preference.ts +3 -4
  145. package/packages/bundled-features/src/document-ingest-foundation/entity.ts +5 -5
  146. package/packages/bundled-features/src/document-ingest-foundation/events.ts +2 -2
  147. package/packages/bundled-features/src/document-ingest-foundation/feature.ts +2 -2
  148. package/packages/bundled-features/src/document-ingest-foundation/pages.ts +1 -1
  149. package/packages/bundled-features/src/document-ingest-foundation/tenant-destroy-hook.ts +4 -4
  150. package/packages/bundled-features/src/feature-toggles/compose-tier-resolver.ts +1 -1
  151. package/packages/bundled-features/src/feature-toggles/feature.ts +1 -1
  152. package/packages/bundled-features/src/feature-toggles/global-feature-state-table.ts +1 -1
  153. package/packages/bundled-features/src/feature-toggles/handlers/registered.query.ts +5 -5
  154. package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +1 -1
  155. package/packages/bundled-features/src/feature-toggles/toggle-sync-signal.ts +1 -1
  156. package/packages/bundled-features/src/feature-toggles/web/constants.ts +1 -1
  157. package/packages/bundled-features/src/file-derivatives/feature.ts +2 -2
  158. package/packages/bundled-features/src/file-derivatives/handlers/public-variant.query.ts +1 -1
  159. package/packages/bundled-features/src/file-derivatives/presets.ts +1 -1
  160. package/packages/bundled-features/src/file-foundation/feature.ts +6 -6
  161. package/packages/bundled-features/src/file-provider-inmemory/feature.ts +16 -16
  162. package/packages/bundled-features/src/file-provider-s3/feature.ts +16 -16
  163. package/packages/bundled-features/src/file-provider-s3/lib/s3-provider.ts +6 -6
  164. package/packages/bundled-features/src/files/feature.ts +6 -6
  165. package/packages/bundled-features/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +5 -5
  166. package/packages/bundled-features/src/files-tenant-data/hooks.ts +24 -26
  167. package/packages/bundled-features/src/files-tenant-data/index.ts +1 -1
  168. package/packages/bundled-features/src/folders/feature.ts +1 -1
  169. package/packages/bundled-features/src/folders/web/folder-manager.tsx +2 -2
  170. package/packages/bundled-features/src/folders/web/tree.ts +5 -5
  171. package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +1 -1
  172. package/packages/bundled-features/src/form-draft/db/queries/owned-file-refs.ts +1 -1
  173. package/packages/bundled-features/src/form-draft/entity.ts +3 -3
  174. package/packages/bundled-features/src/form-draft/feature.ts +4 -5
  175. package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +1 -1
  176. package/packages/bundled-features/src/form-draft/release-file-refs.ts +6 -6
  177. package/packages/bundled-features/src/form-draft/schemas.ts +3 -3
  178. package/packages/bundled-features/src/form-draft/web/constants.ts +0 -2
  179. package/packages/bundled-features/src/inbound-mail-foundation/aggregate-id.ts +19 -19
  180. package/packages/bundled-features/src/inbound-mail-foundation/connect-routes.ts +4 -3
  181. package/packages/bundled-features/src/inbound-mail-foundation/constants.ts +30 -33
  182. package/packages/bundled-features/src/inbound-mail-foundation/entities.ts +47 -48
  183. package/packages/bundled-features/src/inbound-mail-foundation/events.ts +54 -50
  184. package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +39 -39
  185. package/packages/bundled-features/src/inbound-mail-foundation/handlers/account-state.ts +8 -8
  186. package/packages/bundled-features/src/inbound-mail-foundation/handlers/connect-account.write.ts +25 -26
  187. package/packages/bundled-features/src/inbound-mail-foundation/handlers/disconnect-account.write.ts +7 -7
  188. package/packages/bundled-features/src/inbound-mail-foundation/handlers/ingest-message.write.ts +50 -51
  189. package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-accounts.query.ts +8 -8
  190. package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-messages.query.ts +10 -10
  191. package/packages/bundled-features/src/inbound-mail-foundation/handlers/scope-visibility.ts +3 -4
  192. package/packages/bundled-features/src/inbound-mail-foundation/handlers/update-account.write.ts +11 -11
  193. package/packages/bundled-features/src/inbound-mail-foundation/oauth-state.ts +16 -15
  194. package/packages/bundled-features/src/inbound-mail-foundation/projection.ts +31 -29
  195. package/packages/bundled-features/src/inbound-mail-foundation/provider-factory.ts +9 -9
  196. package/packages/bundled-features/src/inbound-mail-foundation/retention-sweep.ts +45 -41
  197. package/packages/bundled-features/src/inbound-mail-foundation/tenant-destroy-hook.ts +14 -16
  198. package/packages/bundled-features/src/inbound-mail-foundation/types.ts +66 -67
  199. package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor.ts +69 -68
  200. package/packages/bundled-features/src/inbound-provider-imap/credential-document.ts +13 -13
  201. package/packages/bundled-features/src/inbound-provider-imap/feature.ts +42 -40
  202. package/packages/bundled-features/src/inbound-provider-imap/imap-client.ts +20 -19
  203. package/packages/bundled-features/src/inbound-provider-inmemory/feature.ts +21 -21
  204. package/packages/bundled-features/src/jobs/db/queries/retention.ts +2 -2
  205. package/packages/bundled-features/src/jobs/db/queries/stale-run-sweep.ts +3 -3
  206. package/packages/bundled-features/src/jobs/events.ts +1 -1
  207. package/packages/bundled-features/src/jobs/feature.ts +6 -7
  208. package/packages/bundled-features/src/jobs/handlers/detail.query.ts +4 -4
  209. package/packages/bundled-features/src/jobs/handlers/list.query.ts +1 -1
  210. package/packages/bundled-features/src/jobs/handlers/projection-rebuild.job.ts +1 -1
  211. package/packages/bundled-features/src/jobs/handlers/reindex-entity.job.ts +1 -1
  212. package/packages/bundled-features/src/jobs/handlers/retry.write.ts +1 -1
  213. package/packages/bundled-features/src/jobs/job-instant.ts +1 -1
  214. package/packages/bundled-features/src/jobs/job-run-logger.ts +14 -15
  215. package/packages/bundled-features/src/jobs/job-run-table.ts +3 -3
  216. package/packages/bundled-features/src/jobs/screens.ts +1 -1
  217. package/packages/bundled-features/src/jobs/tenant-job-failure-table.ts +1 -1
  218. package/packages/bundled-features/src/jobs/tenant-job-run-table.ts +1 -1
  219. package/packages/bundled-features/src/ledger/entity.ts +5 -5
  220. package/packages/bundled-features/src/ledger/feature.ts +3 -3
  221. package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +3 -3
  222. package/packages/bundled-features/src/ledger/recurring.ts +12 -12
  223. package/packages/bundled-features/src/ledger/schemas.ts +1 -1
  224. package/packages/bundled-features/src/ledger/web/constants.ts +2 -2
  225. package/packages/bundled-features/src/ledger/web/index.ts +7 -7
  226. package/packages/bundled-features/src/legal-pages/feature.ts +40 -41
  227. package/packages/bundled-features/src/legal-pages/markdown.ts +3 -3
  228. package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +23 -24
  229. package/packages/bundled-features/src/legal-pages/web/index.ts +0 -2
  230. package/packages/bundled-features/src/mail-foundation/feature.ts +26 -27
  231. package/packages/bundled-features/src/mail-transport-inmemory/feature.ts +27 -28
  232. package/packages/bundled-features/src/mail-transport-smtp/feature.ts +20 -20
  233. package/packages/bundled-features/src/managed-pages/branding.ts +6 -6
  234. package/packages/bundled-features/src/managed-pages/feature.ts +62 -62
  235. package/packages/bundled-features/src/managed-pages/handlers/by-slug.query.ts +5 -6
  236. package/packages/bundled-features/src/managed-pages/handlers/by-tenant-published.query.ts +8 -8
  237. package/packages/bundled-features/src/managed-pages/handlers/set.write.ts +5 -7
  238. package/packages/bundled-features/src/managed-pages/screens/page-screens.ts +11 -11
  239. package/packages/bundled-features/src/managed-pages/seeding.ts +8 -8
  240. package/packages/bundled-features/src/managed-pages/table.ts +16 -15
  241. package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +6 -6
  242. package/packages/bundled-features/src/managed-pages/web/i18n.ts +1 -1
  243. package/packages/bundled-features/src/notes-history/entity.ts +4 -4
  244. package/packages/bundled-features/src/notes-history/feature.ts +2 -2
  245. package/packages/bundled-features/src/notes-history-user-data/hooks.ts +1 -1
  246. package/packages/bundled-features/src/page-render/layout.ts +9 -9
  247. package/packages/bundled-features/src/page-render/markdown.ts +11 -11
  248. package/packages/bundled-features/src/page-render/security-headers.ts +7 -6
  249. package/packages/bundled-features/src/personal-access-tokens/feature.ts +5 -5
  250. package/packages/bundled-features/src/personal-access-tokens/roles.ts +2 -2
  251. package/packages/bundled-features/src/readiness/handlers/status.query.ts +3 -3
  252. package/packages/bundled-features/src/renderer-foundation/api.ts +12 -13
  253. package/packages/bundled-features/src/renderer-foundation/constants.ts +2 -2
  254. package/packages/bundled-features/src/renderer-foundation/feature.ts +7 -7
  255. package/packages/bundled-features/src/renderer-foundation/types.ts +11 -12
  256. package/packages/bundled-features/src/secrets/feature.ts +9 -9
  257. package/packages/bundled-features/src/secrets/web/constants.ts +2 -2
  258. package/packages/bundled-features/src/seo/feature.ts +3 -3
  259. package/packages/bundled-features/src/sessions/constants.ts +1 -1
  260. package/packages/bundled-features/src/sessions/feature.ts +9 -9
  261. package/packages/bundled-features/src/sessions/handlers/revoke-all-for-user.write.ts +2 -2
  262. package/packages/bundled-features/src/sessions/handlers/revoke-all-others.write.ts +2 -2
  263. package/packages/bundled-features/src/sessions/handlers/revoke.write.ts +1 -1
  264. package/packages/bundled-features/src/sessions/schema/user-session.ts +4 -4
  265. package/packages/bundled-features/src/sessions/screens.ts +2 -2
  266. package/packages/bundled-features/src/sessions/session-callbacks.ts +2 -2
  267. package/packages/bundled-features/src/sessions/session-revoked-event.ts +2 -2
  268. package/packages/bundled-features/src/shared/assert-no-where-rule-in-ownership-write.ts +1 -1
  269. package/packages/bundled-features/src/shared/decrypt-stored-pii.ts +1 -1
  270. package/packages/bundled-features/src/shared/encrypt-for-direct-write.ts +1 -1
  271. package/packages/bundled-features/src/shared/map-with-concurrency.ts +5 -4
  272. package/packages/bundled-features/src/shared/parent-visibility.ts +2 -2
  273. package/packages/bundled-features/src/shared/password-hashing.ts +1 -1
  274. package/packages/bundled-features/src/shared/signup-handover.ts +1 -2
  275. package/packages/bundled-features/src/shared/single-use-token-store.ts +1 -1
  276. package/packages/bundled-features/src/subscription-mollie/constants.ts +15 -17
  277. package/packages/bundled-features/src/subscription-mollie/feature.ts +41 -42
  278. package/packages/bundled-features/src/subscription-mollie/index.ts +3 -3
  279. package/packages/bundled-features/src/subscription-mollie/plugin-methods.ts +17 -16
  280. package/packages/bundled-features/src/subscription-mollie/verify-webhook.ts +34 -34
  281. package/packages/bundled-features/src/subscription-stripe/constants.ts +4 -6
  282. package/packages/bundled-features/src/subscription-stripe/feature.ts +44 -43
  283. package/packages/bundled-features/src/subscription-stripe/index.ts +6 -6
  284. package/packages/bundled-features/src/subscription-stripe/plugin-methods.ts +22 -27
  285. package/packages/bundled-features/src/subscription-stripe/runtime.ts +2 -2
  286. package/packages/bundled-features/src/subscription-stripe/verify-webhook.ts +62 -64
  287. package/packages/bundled-features/src/tags/feature.ts +3 -3
  288. package/packages/bundled-features/src/tags/screens.ts +1 -1
  289. package/packages/bundled-features/src/template-resolver/api.ts +10 -10
  290. package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +5 -5
  291. package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +1 -1
  292. package/packages/bundled-features/src/template-resolver/handlers/shared.ts +2 -2
  293. package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +3 -3
  294. package/packages/bundled-features/src/template-resolver/handlers/upsert-system.write.ts +3 -4
  295. package/packages/bundled-features/src/template-resolver/handlers/upsert-tenant.write.ts +4 -5
  296. package/packages/bundled-features/src/template-resolver/seeding.ts +4 -4
  297. package/packages/bundled-features/src/template-resolver/table.ts +13 -14
  298. package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +2 -2
  299. package/packages/bundled-features/src/tenant/feature.ts +7 -7
  300. package/packages/bundled-features/src/tenant/handlers/member-directory.query.ts +1 -1
  301. package/packages/bundled-features/src/tenant/handlers/members.query.ts +1 -1
  302. package/packages/bundled-features/src/tenant/handlers/memberships.query.ts +1 -1
  303. package/packages/bundled-features/src/tenant/handlers/team-list.query.ts +1 -1
  304. package/packages/bundled-features/src/tenant/handlers/tenant-directory.query.ts +1 -1
  305. package/packages/bundled-features/src/tenant/invitation-table.ts +37 -40
  306. package/packages/bundled-features/src/tenant/membership-table.ts +3 -3
  307. package/packages/bundled-features/src/tenant/schema/tenant.ts +7 -9
  308. package/packages/bundled-features/src/tenant/screens.ts +1 -1
  309. package/packages/bundled-features/src/tenant/seeding.ts +19 -18
  310. package/packages/bundled-features/src/tenant/testing.ts +5 -6
  311. package/packages/bundled-features/src/tenant/web/constants.ts +2 -2
  312. package/packages/bundled-features/src/tenant-handover/events.ts +5 -7
  313. package/packages/bundled-features/src/tenant-handover/feature.ts +1 -1
  314. package/packages/bundled-features/src/tenant-handover/grant.ts +1 -1
  315. package/packages/bundled-features/src/tenant-handover/handlers/claim.write.ts +1 -1
  316. package/packages/bundled-features/src/tenant-handover/move-entity-graph.ts +8 -9
  317. package/packages/bundled-features/src/tenant-handover/signup-handover-provider.ts +1 -2
  318. package/packages/bundled-features/src/tenant-handover/transfer-graph.ts +4 -5
  319. package/packages/bundled-features/src/tenant-lifecycle/boot-checks.ts +1 -1
  320. package/packages/bundled-features/src/tenant-lifecycle/feature.ts +1 -1
  321. package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +2 -2
  322. package/packages/bundled-features/src/tenant-lifecycle/stages.ts +1 -1
  323. package/packages/bundled-features/src/tenant-settings/constants.ts +1 -1
  324. package/packages/bundled-features/src/tenant-settings/tenant-defaults.ts +12 -5
  325. package/packages/bundled-features/src/tier-engine/aggregate-id.ts +15 -16
  326. package/packages/bundled-features/src/tier-engine/compose-app.ts +14 -14
  327. package/packages/bundled-features/src/tier-engine/entity.ts +18 -19
  328. package/packages/bundled-features/src/tier-engine/feature.ts +88 -87
  329. package/packages/bundled-features/src/tier-engine/handlers/active-tier.query.ts +6 -7
  330. package/packages/bundled-features/src/tier-engine/handlers/get-tenant-tier.query.ts +4 -4
  331. package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +8 -8
  332. package/packages/bundled-features/src/tier-engine/tier-resolver.ts +2 -2
  333. package/packages/bundled-features/src/tier-engine/trial.ts +13 -13
  334. package/packages/bundled-features/src/tier-engine/web/index.ts +4 -4
  335. package/packages/bundled-features/src/user/db/queries/stream-tenant-backfill.ts +8 -8
  336. package/packages/bundled-features/src/user/handlers/create.write.ts +4 -4
  337. package/packages/bundled-features/src/user/schema/user.ts +45 -44
  338. package/packages/bundled-features/src/user/seeding.ts +40 -40
  339. package/packages/bundled-features/src/user/testing.ts +3 -3
  340. package/packages/bundled-features/src/user-data-rights/audit-download.ts +27 -28
  341. package/packages/bundled-features/src/user-data-rights/boot-checks.ts +1 -1
  342. package/packages/bundled-features/src/user-data-rights/deletion-token.ts +1 -1
  343. package/packages/bundled-features/src/user-data-rights/feature.ts +112 -113
  344. package/packages/bundled-features/src/user-data-rights/handlers/cancel-deletion.write.ts +9 -9
  345. package/packages/bundled-features/src/user-data-rights/handlers/confirm-deletion-by-token.write.ts +8 -8
  346. package/packages/bundled-features/src/user-data-rights/handlers/download-by-job.query.ts +29 -30
  347. package/packages/bundled-features/src/user-data-rights/handlers/download-by-token.query.ts +40 -42
  348. package/packages/bundled-features/src/user-data-rights/handlers/export-status.query.ts +8 -9
  349. package/packages/bundled-features/src/user-data-rights/handlers/lift-restriction.write.ts +7 -8
  350. package/packages/bundled-features/src/user-data-rights/handlers/list-download-attempts.query.ts +2 -2
  351. package/packages/bundled-features/src/user-data-rights/handlers/my-audit-log.query.ts +4 -4
  352. package/packages/bundled-features/src/user-data-rights/handlers/request-deletion-by-email.write.ts +30 -29
  353. package/packages/bundled-features/src/user-data-rights/handlers/request-deletion.write.ts +15 -18
  354. package/packages/bundled-features/src/user-data-rights/handlers/request-export.write.ts +42 -41
  355. package/packages/bundled-features/src/user-data-rights/handlers/restrict-account.write.ts +22 -19
  356. package/packages/bundled-features/src/user-data-rights/handlers/run-forget-cleanup.write.ts +8 -8
  357. package/packages/bundled-features/src/user-data-rights/index.ts +8 -10
  358. package/packages/bundled-features/src/user-data-rights/lib/default-mailers.ts +3 -3
  359. package/packages/bundled-features/src/user-data-rights/lib/update-user-lifecycle.ts +24 -27
  360. package/packages/bundled-features/src/user-data-rights/run-export-jobs.ts +166 -276
  361. package/packages/bundled-features/src/user-data-rights/run-forget-cleanup.ts +85 -107
  362. package/packages/bundled-features/src/user-data-rights/run-user-export.ts +67 -69
  363. package/packages/bundled-features/src/user-data-rights/schema/download-attempt.ts +11 -11
  364. package/packages/bundled-features/src/user-data-rights/schema/download-token.ts +37 -41
  365. package/packages/bundled-features/src/user-data-rights/schema/export-job.ts +65 -67
  366. package/packages/bundled-features/src/user-data-rights/token-helpers.ts +21 -25
  367. package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +6 -6
  368. package/packages/bundled-features/src/user-data-rights/web/confirm-deletion-screen.tsx +6 -5
  369. package/packages/bundled-features/src/user-data-rights/web/constants.ts +1 -1
  370. package/packages/bundled-features/src/user-data-rights/web/index.ts +5 -5
  371. package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +14 -13
  372. package/packages/bundled-features/src/user-data-rights/web/public-deletion-gate.tsx +13 -12
  373. package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +6 -6
  374. package/packages/bundled-features/src/user-data-rights/zip-path.ts +41 -40
  375. package/packages/bundled-features/src/user-data-rights-defaults/feature.ts +15 -15
  376. package/packages/bundled-features/src/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.ts +3 -5
  377. package/packages/bundled-features/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +45 -51
  378. package/packages/bundled-features/src/user-data-rights-defaults/hooks/job-run.userdata-hook.ts +2 -2
  379. package/packages/bundled-features/src/user-data-rights-defaults/hooks/notification-preference.userdata-hook.ts +1 -1
  380. package/packages/bundled-features/src/user-data-rights-defaults/hooks/user-session.userdata-hook.ts +3 -3
  381. package/packages/bundled-features/src/user-data-rights-defaults/hooks/user.userdata-hook.ts +32 -31
  382. package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +13 -13
  383. package/packages/bundled-features/src/user-profile/index.ts +3 -3
  384. package/packages/bundled-features/src/user-profile/web/client-plugin.ts +1 -1
  385. package/packages/bundled-features/src/user-profile/web/constants.ts +1 -1
  386. package/packages/bundled-features/src/user-profile/web/profile-screen.tsx +1 -1
  387. package/packages/bundled-features/src/workflow-runner/aggregate-id.ts +1 -1
  388. package/packages/bundled-features/src/workflow-runner/event-subscriber.ts +4 -5
  389. package/packages/bundled-features/src/workflow-runner/event-trigger.ts +4 -15
  390. package/packages/bundled-features/src/workflow-runner/feature.ts +2 -2
  391. package/packages/bundled-features/src/workflow-runner/handlers/resume-run.write.ts +4 -4
  392. package/packages/bundled-features/src/workflow-runner/pending-projection.ts +6 -7
  393. package/packages/bundled-features/src/workflow-runner/runner.ts +6 -6
  394. package/packages/bundled-features/src/workflow-runner/tables.ts +6 -6
  395. package/packages/bundled-features/src/workflow-runner/workflow-registry.ts +1 -1
@@ -12,8 +12,8 @@ import { isPrincipalRowBlocked, type UserStatus, userTable } from "../user/index
12
12
  // time would keep a since-revoked admin role for the token's whole (months-long)
13
13
  // life. Returns null when the user has no membership in that tenant: removed
14
14
  // from the tenant → the PAT stops authenticating there. Also null when the
15
- // user's lifecycle status blocks them (fw security-welle2) — collapsed onto
16
- // the same "no roles" outcome as missing-membership so a blocked user's PAT
15
+ // user's lifecycle status blocks them — collapsed onto the same "no roles"
16
+ // outcome as missing-membership so a blocked user's PAT
17
17
  // gets an identical 401 to an unknown token (no status oracle).
18
18
  export async function resolvePatRoles(
19
19
  db: DbConnection,
@@ -22,9 +22,9 @@ export const statusQuery = defineQueryHandler({
22
22
  // One gate for both halves: required keys/secrets of provider-features
23
23
  // count only while their provider is the selected one (r.extensionSelector).
24
24
  const gate = await buildProviderSelectionGate(ctx, ReadinessQueries.status, query.user, ctx.db);
25
- // skipAccessFilter: das Verdict muss ALLE required Keys zählen — der
26
- // Handler selbst ist TenantAdmin-gated, der Per-Key-Filter wäre hier
27
- // eine ready:true-Lüge für SystemAdmin-gated Keys (277/1).
25
+ // skipAccessFilter: the verdict must count ALL required keys—the
26
+ // Handler itself is TenantAdmin-gated; the per-key filter would falsely
27
+ // report ready:true for SystemAdmin-gated keys.
28
28
  const missingConfig = await collectMissingRequiredConfig(
29
29
  ctx,
30
30
  ReadinessQueries.status,
@@ -1,7 +1,7 @@
1
- // RendererFoundationApi — Cross-Feature-Schnittstelle. Konsumenten
2
- // (delivery, mail-Sender, Solon NKA-PDF-Generator) holen sich pro
3
- // Render-Call den passenden Plugin via `createRendererForTenant`.
4
- // Pattern symmetrisch zu ai-foundation's `createLLMProviderForTenant`.
1
+ // RendererFoundationApi — cross-feature interface. Consumers
2
+ // (delivery, mail sender, Solon NKA PDF generator) retrieve the appropriate
3
+ // plugin for each render call via `createRendererForTenant`.
4
+ // The pattern mirrors ai-foundation's `createLLMProviderForTenant`.
5
5
 
6
6
  import type { TenantId } from "@cosmicdrift/kumiko-framework/engine";
7
7
  import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
@@ -32,10 +32,9 @@ export type RendererFoundationApi = {
32
32
  }) => RendererPlugin;
33
33
  };
34
34
 
35
- // Plugin-Pool wird zur Boot-Zeit aus Extension-Usages aufgebaut.
36
- // Aus dem Registry kommen alle registrierten Plugins. Foundation-Feature
37
- // baut den Pool via `collectRendererPlugins(registry)` und steckt das
38
- // Result in extraContext.
35
+ // The plugin pool is built at boot time from extension usages.
36
+ // The registry provides all registered plugins. The foundation feature builds
37
+ // the pool via `collectRendererPlugins(registry)` and puts it in extraContext.
39
38
  export function createRendererFoundationApi(
40
39
  plugins: ReadonlyArray<RendererPlugin>,
41
40
  tenantConfigLookup: (tenantId: TenantId) => Record<string, string> | null = () => null,
@@ -50,7 +49,7 @@ export function createRendererFoundationApi(
50
49
  if (tenantPluginName) {
51
50
  const plugin = plugins.find((p) => p.name === tenantPluginName && p.kinds.includes(kind));
52
51
  if (plugin) return plugin;
53
- // Tenant-Config zeigt auf nicht-registriertes Plugin — fällt durch zu Default
52
+ // The tenant configuration points to an unregistered plugin; fall through to the default.
54
53
  }
55
54
 
56
55
  // 2. Default-Plugin
@@ -60,7 +59,7 @@ export function createRendererFoundationApi(
60
59
  if (plugin) return plugin;
61
60
  }
62
61
 
63
- // 3. Erstes Plugin im Pool das das kind bedient
62
+ // 3. First plugin in the pool that serves the kind
64
63
  const first = byKind.get(kind)?.[0];
65
64
  if (first) return first;
66
65
 
@@ -85,14 +84,14 @@ function indexByKind(plugins: ReadonlyArray<RendererPlugin>): Map<RenderKind, Re
85
84
  return map;
86
85
  }
87
86
 
88
- // Single point of truth für "dieser Handler braucht renderer-foundation".
89
- // Pattern symmetrisch zu requireTemplateResolver + requireTextContent.
87
+ // Single source of truth for handlers that require renderer-foundation.
88
+ // The pattern mirrors requireTemplateResolver + requireTextContent.
90
89
  export function requireRendererFoundation(
91
90
  ctx: { readonly rendererFoundation?: RendererFoundationApi } | object,
92
91
  callerName: string,
93
92
  ): RendererFoundationApi {
94
93
  // @cast-boundary engine-bridge — rendererFoundation kommt per extraContext
95
- // aus App-Bootstrap.
94
+ // from the app bootstrap.
96
95
  const api = (ctx as { rendererFoundation?: RendererFoundationApi }).rendererFoundation;
97
96
  if (!api) {
98
97
  throw new InternalError({
@@ -14,8 +14,8 @@ export {
14
14
  type RenderKind,
15
15
  } from "../template-resolver/index.ts";
16
16
 
17
- // Standard-Default-Plugin pro Kind, wenn Tenant keine explizite Config
18
- // gesetzt hat. App-Bootstrap kann das via TenantConfigKey überschreiben.
17
+ // Standard default plugin for each kind when the tenant has not set explicit configuration.
18
+ // App bootstrap can override this through TenantConfigKey.
19
19
  export const DEFAULT_PLUGIN_BY_KIND: Readonly<Record<RenderKindLocal, string>> = {
20
20
  mail: "mail-html",
21
21
  "document-pdf": "puppeteer",
@@ -24,9 +24,9 @@ export function createRendererFoundationFeature() {
24
24
 
25
25
  r.extendsRegistrar(RENDERER_EXTENSION, {
26
26
  onRegister: () => {
27
- // Plugin-Konformitäts-Check könnte hier: shape-validation der
28
- // options (kinds, render-Funktion present). Aktuell kein
29
- // shape-check — Caller's TypeScript-Type-Sicherheit greift.
27
+ // Plugin conformance check could go here: validate the shape of
28
+ // options (kinds, render function present). No shape check currently —
29
+ // the caller's TypeScript type safety applies.
30
30
  },
31
31
  });
32
32
 
@@ -34,11 +34,11 @@ export function createRendererFoundationFeature() {
34
34
  });
35
35
  }
36
36
 
37
- // Plugin-Pool-Aufbau zur Boot-Zeit. App-Bootstrap ruft das nach
38
- // Feature-Registration auf, baut den Pool, gibt ihn via extraContext
39
- // an die Handlers weiter.
37
+ // Build the plugin pool at boot time. App bootstrap calls this after
38
+ // feature registration, builds the pool, and passes it to handlers via
39
+ // extraContext.
40
40
  //
41
- // Symmetrisch zu collectChannels / collectRenderers in delivery-service.
41
+ // Symmetric to collectChannels / collectRenderers in delivery-service.
42
42
  export function collectRendererPlugins(registry: Registry): RendererPlugin[] {
43
43
  const usages = registry.getExtensionUsages(RENDERER_EXTENSION);
44
44
  return usages.map((usage) => {
@@ -10,9 +10,9 @@ import type {
10
10
  } from "../template-resolver/index.ts";
11
11
  import { type ContentFormat, RENDERER_EXTENSION, type RenderKind } from "./constants.ts";
12
12
 
13
- // RenderRequest — Plugins erhalten das. Resource-Mode wählt der Caller
14
- // (renderer-foundation api) je nach kind oder explizit. Plugin selbst
15
- // entscheidet nicht — es bekommt eine schon aufgelöste Form.
13
+ // RenderRequest — plugins receive this. The caller selects resource mode
14
+ // (renderer-foundation API) by kind or explicitly. Plugins do not decide this;
15
+ // they receive an already-resolved form.
16
16
  export type RenderRequest =
17
17
  | { kind: "mail"; payload: MailPayload }
18
18
  | { kind: "document-pdf"; payload: DocumentPdfPayload; options?: PdfOptions }
@@ -157,13 +157,12 @@ export type ImageOptions = {
157
157
  readonly quality?: number;
158
158
  };
159
159
 
160
- // RendererContext — schmale Surface (Kumiko-Style, matcht FileProviderContext
161
- // + ChannelContext). Plugins, die Service-Access brauchen, holen sich
162
- // templateResolver/etc. via direkten Bundle-Import + ctx.db (cross-feature-
163
- // public-API). KEIN extraContext-Pass-Through — Plugin importiert pure-
164
- // Function-Factories statt App-ctx zu casten.
160
+ // RendererContext — a narrow surface (Kumiko-style, matching FileProviderContext
161
+ // + ChannelContext). Plugins that need services obtain templateResolver/etc. via
162
+ // direct bundle imports + ctx.db (cross-feature public API). No extraContext
163
+ // pass-through: plugins import pure function factories instead of casting App-ctx.
165
164
  //
166
- // **Beispiel renderer-mail-html:**
165
+ // **Example renderer-mail-html:**
167
166
  // import { createTemplateResolverApi } from "@cosmicdrift/kumiko-bundled-features/template-resolver";
168
167
  // const tplApi = createTemplateResolverApi(ctx.db, ctx.registry);
169
168
  // const layout = await tplApi.resolveTemplate({ tenantId: ctx.tenantId, slug, kind });
@@ -178,9 +177,9 @@ export type RendererContext = {
178
177
  readonly filesForTenant?: (tenantId: string) => FileContext | undefined;
179
178
  };
180
179
 
181
- // RendererPlugin-Contract — pro Plugin (renderer-mail-html,
182
- // renderer-puppeteer-client). Plugin deklariert welche kinds es bedienen
183
- // kann; Foundation-Resolver wählt basierend auf Tenant-Config + kind.
180
+ // RendererPlugin contract — per plugin (renderer-mail-html,
181
+ // renderer-puppeteer-client). The plugin declares which kinds it can handle;
182
+ // the Foundation resolver selects one based on tenant config + kind.
184
183
  //
185
184
  // Plugin invariants:
186
185
  // - `kinds` has at least one entry, otherwise the plugin is never picked.
@@ -71,15 +71,15 @@ export const JOIN_REQUEST_TRANSACTION_REASON =
71
71
  "the secret write runs on the request transaction so a failing batch rolls it back together with the config writes";
72
72
 
73
73
  // AppContext carries ctx.secrets via extraContext. requireSecretsContext
74
- // wraps that raw context so every `.get(...)` call auto-includes the
75
- // current user + handler as audit metadata — feature code can't forget
76
- // to log the read (silent bypass of audit was the v1 gap).
74
+ // wraps that raw context so every `.get(...)` call automatically includes
75
+ // the current user and handler as audit metadata, preventing feature code
76
+ // from silently bypassing read auditing.
77
77
  //
78
- // Surface bewusst minimal: HandlerContext-Pfade (Set/Delete-Handler) +
79
- // FileProviderContext-Pfade (S3-Plugin im Worker) liefern dieselben
80
- // zwei Felder, also reicht die schmale ctx-shape — kein voller
81
- // HandlerContext-Import noetig.
82
- // Handler contexts carry the caller as ctx.user, provider contexts set auditUserId (takes precedence).
78
+ // The context shape stays minimal: HandlerContext paths (Set/Delete handlers)
79
+ // and FileProviderContext paths (the S3 plugin in the worker) provide the same
80
+ // two fields, so importing the full HandlerContext is unnecessary.
81
+ // Handler contexts carry the caller as ctx.user; provider contexts set
82
+ // auditUserId, which takes precedence.
83
83
  export function requireSecretsContext(
84
84
  ctx: {
85
85
  readonly secrets?: SecretsContext;
@@ -181,7 +181,7 @@ export function createSecretsFeature(
181
181
  // Backing table: envelope/metadata/last_rotated_at + the (tenant,key)
182
182
  // uniqueIndex are not expressible via the field-DSL (jsonb-without-default,
183
183
  // now()-default), so the physical table is the DDL truth. Without this the
184
- // generated migration omitted those columns → prod-500 (publicstatus#116).
184
+ // generated migration omitted those columns → prod-500.
185
185
  r.entity({ name: "tenant-secret", ...tenantSecretEntity, backingTable: tenantSecretsTable });
186
186
 
187
187
  // Read-audit domain-event. Registered here so ops tools + MSPs can
@@ -1,9 +1,9 @@
1
- // secrets bundle constants — default RBAC for set/delete/list (#2296).
1
+ // secrets bundle constants — default RBAC for set/delete/list.
2
2
 
3
3
  import type { AccessRule } from "@cosmicdrift/kumiko-framework/engine";
4
4
 
5
5
  // Default-RBAC of the set/delete/list handlers, hard-wired to ["TenantAdmin"]
6
- // before #2296. Apps with their own role vocabulary override via
6
+ // before this default was established. Apps with their own role vocabulary override via
7
7
  // createSecretsFeature({ roles }) or createSecretsFeature({ access }) — the
8
8
  // rotate job stays untouched, it's a manual/ops path across all tenants by
9
9
  // design, not a per-tenant RBAC surface.
@@ -1,4 +1,4 @@
1
- // kumiko-lint-ignore app-feature-structure Phase-3 conversion tracked in #2312 (feature.ts > 300 lines)
1
+ // kumiko-lint-ignore app-feature-structure feature.ts is over 300 lines and not yet split
2
2
  import { computeRevisionEtag } from "@cosmicdrift/kumiko-framework/api";
3
3
  import {
4
4
  defineFeature,
@@ -274,8 +274,8 @@ export function createSeoFeature(opts: SeoOptions): FeatureDefinition {
274
274
  });
275
275
  }
276
276
 
277
- // Boot-Check body als named function extrahiert — direkt unit-testbar,
278
- // gleiches "thin job-shell ruft testable function"-Pattern wie
277
+ // Boot-check body extracted as a named function—directly unit-testable,
278
+ // following the same "thin job-shell calls testable function" pattern as
279
279
  // legal-pages' runLegalPagesBootCheck.
280
280
  r.job(
281
281
  "seo-boot-check",
@@ -9,7 +9,7 @@ export const SessionHandlers = {
9
9
  revoke: "sessions:write:user-session:revoke",
10
10
  revokeAllOthers: "sessions:write:user-session:revoke-all-others",
11
11
  /** Privileged: System-Caller (cross-feature) revokes ALL live sessions
12
- * fuer einen User. Genutzt von user-data-rights:restrict-account
12
+ * for a user. Used by user-data-rights:restrict-account
13
13
  * (DSGVO Art. 18 Account-Freeze). */
14
14
  revokeAllForUser: "sessions:write:user-session:revoke-all-for-user",
15
15
  } as const;
@@ -51,7 +51,7 @@ export type SessionsFeatureOptions = {
51
51
  // runtime binding.
52
52
  readonly autoRevokeOnPasswordChange?: SessionMassRevoker;
53
53
  // Session JWT / store_user_sessions TTL. Was previously auth.sessions.expiresInMs
54
- // (#1372) — lives on the sessions feature now that sessionStore is the wiring.
54
+ // — lives on the sessions feature now that sessionStore is the wiring.
55
55
  readonly expiresInMs?: number;
56
56
  // Access preset for the admin list/detail queries and screens; they expose decrypted
57
57
  // IP/user-agent of every session in the tenant. A preset name, not a role array, because
@@ -119,23 +119,23 @@ export function createSessionsFeature(options?: SessionsFeatureOptions): Feature
119
119
  // events (the row columns ARE the audit trail). Registering it as
120
120
  // r.entity would make it a rebuildable implicit projection whose replay
121
121
  // finds zero session events and swaps an empty shadow over the live
122
- // table — wiping every active session on the next projection rebuild
123
- // (#498/#494). r.storeTable keeps the migration DDL but opts the
122
+ // table — wiping every active session on the next projection rebuild.
123
+ // r.storeTable keeps the migration DDL but opts the
124
124
  // table out of implicit rebuild, like jobs/channel-in-app/feature-toggles
125
125
  // which are direct-write stores too.
126
126
  r.storeTable(
127
127
  deriveEntityTableMeta(USER_SESSION_ENTITY_NAME, userSessionEntity, { source: "unmanaged" }),
128
128
  {
129
129
  reason: "read_side.user_sessions_direct_write",
130
- // sessionCreator encrypts ip/userAgent via encryptForDirectWrite (#820).
130
+ // sessionCreator encrypts ip/userAgent via encryptForDirectWrite.
131
131
  piiEncryptedOnWrite: true,
132
132
  },
133
133
  );
134
134
 
135
- // Self-registers as auth-foundation's sessionStore provider (#1371) —
135
+ // Self-registers as auth-foundation's sessionStore provider —
136
136
  // wraps the same createSessionCallbacks() used by the manual
137
- // buildServer({ auth: { ... } }) wiring above; a future issue (#1372)
138
- // removes that manual wiring once the middleware resolves generically
137
+ // buildServer({ auth: { ... } }) wiring above; removes that manual
138
+ // wiring once the middleware resolves generically
139
139
  // via resolveSessionStore().
140
140
  r.useExtension(EXT_SESSION_STORE, "default", {
141
141
  build: (deps): SessionStore => {
@@ -153,7 +153,7 @@ export function createSessionsFeature(options?: SessionsFeatureOptions): Feature
153
153
  },
154
154
  } satisfies SessionStoreProvider);
155
155
 
156
- // Custom domain-event for cross-instance access-invalidation (#1559).
156
+ // Custom domain-event for cross-instance access-invalidation.
157
157
  // r.defineEvent registers the schema so ctx.unsafeAppendEvent (revoke,
158
158
  // revoke-all-others) enforces it at append time. revoke-all-for-user
159
159
  // appends via the low-level append() instead (needs to anchor on
@@ -161,7 +161,7 @@ export function createSessionsFeature(options?: SessionsFeatureOptions): Feature
161
161
  // consult the registry, so that callsite parses against
162
162
  // sessionRevokedSchema explicitly, same guarantee via a different path.
163
163
  // No projection: the payload IS the read, consumed directly off the
164
- // event-store NOTIFY (#1560).
164
+ // event-store NOTIFY.
165
165
  r.defineEvent(SESSION_REVOKED_EVENT_SHORT, sessionRevokedSchema, { piiFields: "none" });
166
166
 
167
167
  const handlers = {
@@ -64,8 +64,8 @@ export const revokeAllForUserWrite = defineWriteHandler({
64
64
  },
65
65
  );
66
66
 
67
- // Lightweight append alongside the direct-write above (#1559) — see
68
- // revoke.write.ts for why this isn't a lifecycle event on
67
+ // Lightweight append alongside the direct-write above; see revoke.write.ts
68
+ // for why this isn't a lifecycle event on
69
69
  // store_user_sessions. Uses the low-level append() (not
70
70
  // ctx.unsafeAppendEvent) because this handler is deliberately
71
71
  // cross-tenant: the privileged caller's own tenantId (what
@@ -46,8 +46,8 @@ export const revokeAllOthersWrite = defineWriteHandler({
46
46
  { userId: event.user.id, revokedAt: null, id: { ne: keepSid } },
47
47
  );
48
48
 
49
- // Lightweight append alongside the direct-write above (#1559) — see
50
- // revoke.write.ts for why this isn't a lifecycle event on
49
+ // Lightweight append alongside the direct-write above; see revoke.write.ts
50
+ // for why this isn't a lifecycle event on
51
51
  // store_user_sessions. Skipped when nothing was revoked (no other
52
52
  // live sessions) — a spurious invalidation would be the failure mode.
53
53
  if (updated.length > 0) {
@@ -50,7 +50,7 @@ export const revokeWrite = defineWriteHandler({
50
50
  );
51
51
 
52
52
  if (updated.length > 0) {
53
- // Lightweight append alongside the direct-write above (#1559) — NOT a
53
+ // Lightweight append alongside the direct-write above — NOT a
54
54
  // lifecycle event for store_user_sessions (that table stays an
55
55
  // unmanaged direct-write store, see feature.ts). Own aggregate id per
56
56
  // revoke, no predecessor to satisfy, no version_conflict against a
@@ -18,9 +18,9 @@ import { USER_SESSION_ENTITY_NAME } from "../constants.ts";
18
18
  // mutate them via ctx.db inside a transaction, but no user request can bypass
19
19
  // the revocation flow by poking the column directly.
20
20
  export const userSessionEntity = createEntity({
21
- // Entity-Key ist "user-session" (mit Dash), toTableName's snake-case-
22
- // Transform käme auf "read_user-sessions" → kein valides SQL ohne Quoting.
23
- // Deshalb expliziter Override auf den read_-konformen Namen.
21
+ // The entity key is "user-session"; snake-casing it would produce
22
+ // "read_user-sessions", which is invalid SQL without quoting. Use an explicit
23
+ // override with a valid read_-prefixed table name.
24
24
  table: "store_user_sessions",
25
25
  // sid-as-PK: the sessionCreator callback generates the UUID, returns it to
26
26
  // the framework; the framework stamps it as `jti`; here the same value is
@@ -84,7 +84,7 @@ export const userSessionEntity = createEntity({
84
84
  // Unmanaged direct-write store (r.storeTable in feature.ts, no event stream —
85
85
  // revocation is a column write, not an aggregate). Handlers write via ctx.db;
86
86
  // source: "unmanaged" makes the meta Writable so those writes compile. See
87
- // feature.ts for the rebuild-exclusion rationale (#494/#498).
87
+ // feature.ts for the rebuild-exclusion rationale.
88
88
  export const userSessionTable = deriveEntityTableMeta(USER_SESSION_ENTITY_NAME, userSessionEntity, {
89
89
  source: "unmanaged",
90
90
  });
@@ -28,7 +28,7 @@ export const createSessionListScreen = (
28
28
  pageSize: MAX_LIST_LIMIT,
29
29
  // Mirrors list.query's own fallback (unrecognised/absent sort → createdAt
30
30
  // desc) — kept in sync by hand, boot-validator only requires the field
31
- // be present once the query accepts `sort` (fw#2230).
31
+ // be present once the query accepts `sort`.
32
32
  defaultSort: { field: "createdAt", dir: "desc" },
33
33
  columns: [
34
34
  { field: "id", label: i18nKey("sessions.list.col.id") },
@@ -90,7 +90,7 @@ export const createSessionDetailScreen = (
90
90
  // The shim (projection-detail-shim.ts) stamps every field as
91
91
  // type:"text" — field.renderer is the only way this screen
92
92
  // type reaches real per-type formatting instead of a raw ISO
93
- // string (fw#2245).
93
+ // string.
94
94
  { field: "createdAt", renderer: { format: "timestamp" } },
95
95
  { field: "expiresAt", renderer: { format: "timestamp" } },
96
96
  { field: "revokedAt", renderer: { format: "timestamp" } },
@@ -256,11 +256,11 @@ export function createSessionCallbacks(opts: SessionCallbacksOptions): SessionCa
256
256
  );
257
257
 
258
258
  // Lightweight append alongside the direct-write above, same pattern
259
- // as revoke.write.ts (#1559) — this callback is the password-change
259
+ // as revoke.write.ts — this callback is the password-change
260
260
  // auto-revoke path (sessions/feature.ts postSave hook) and has no
261
261
  // dispatcher ctx to call unsafeAppendEvent from, so it uses the raw
262
262
  // append() like revoke-all-for-user.write.ts does. Without this, the
263
- // access-invalidation consumer (#1560) never hears about a password
263
+ // access-invalidation consumer never hears about a password
264
264
  // change and an already-open SSE stream survives it — the exact
265
265
  // "stale JWT mid-stream" gap this feature exists to close.
266
266
  if (result.length > 0) {
@@ -2,11 +2,11 @@ import * as z from "zod";
2
2
 
3
3
  // Lightweight custom event appended alongside the direct-write
4
4
  // updateMany() in revoke.write.ts / revoke-all-others.write.ts /
5
- // revoke-all-for-user.write.ts (#1559). store_user_sessions itself stays
5
+ // revoke-all-for-user.write.ts. store_user_sessions itself stays
6
6
  // an unmanaged direct-write store (see feature.ts) — the row columns are
7
7
  // the audit trail, this event is NOT a CRUD/lifecycle event for that
8
8
  // table and carries no projection. Its only job is to give cross-instance
9
- // consumers (access-invalidation, #1560) something to LISTEN for via the
9
+ // consumers (access-invalidation) something to LISTEN for via the
10
10
  // existing event-store NOTIFY, keyed by the affected userId.
11
11
  //
12
12
  // _SHORT/_QN pair mirrors cap-counter's rolling-incremented event:
@@ -1,6 +1,6 @@
1
1
  import type { OwnershipMap } from "@cosmicdrift/kumiko-framework/engine";
2
2
 
3
- // Boot validation rejects `{ kind: "where" }` in access.write too (fw#2626);
3
+ // Boot validation rejects `{ kind: "where" }` in access.write too;
4
4
  // failing at factory time names the option instead of an entity scope.
5
5
  export function assertNoWhereRuleInOwnershipWrite(
6
6
  factoryName: string,
@@ -8,7 +8,7 @@ import {
8
8
  // active KMS that is ciphertext (self-describing: it names its own subject,
9
9
  // so no entity/field context is needed for key selection). `field` must
10
10
  // still match the field name used at encrypt time — it is part of the
11
- // AAD (#1263), so a mismatch fails decrypt loud rather than silently
11
+ // AAD, so a mismatch fails decrypt loud rather than silently
12
12
  // letting ciphertext cut-and-pasted from another field decrypt. An erased
13
13
  // subject yields the sentinel, which matches no real value.
14
14
  export async function decryptStoredPii(
@@ -11,7 +11,7 @@ import { subjectErasedConflict } from "@cosmicdrift/kumiko-framework/errors";
11
11
  // Unmanaged direct-write stores (r.unmanagedTable) skip the executor, so its
12
12
  // PII encryption never runs — every insert of subject-annotated fields must
13
13
  // go through this instead, and the feature declares { piiEncryptedOnWrite:
14
- // true } at the registration site (enforced by the registry, #820).
14
+ // true } at the registration site (enforced by the registry).
15
15
  export async function encryptForDirectWrite(
16
16
  entity: EntityDefinition,
17
17
  entityName: string,
@@ -16,17 +16,18 @@ export async function mapWithConcurrency<T, R>(
16
16
  fn: (item: T, index: number) => Promise<R>,
17
17
  ): Promise<R[]> {
18
18
  const results: R[] = new Array(items.length);
19
- let nextIndex = 0;
19
+ const unclaimed = items.entries();
20
20
  let failed = false;
21
21
  async function worker(): Promise<void> {
22
22
  for (;;) {
23
23
  // skip: another worker already failed — stop claiming new items.
24
24
  if (failed) return;
25
- const index = nextIndex++;
25
+ const claimed = unclaimed.next();
26
26
  // skip: cursor exhausted, normal worker-loop exit
27
- if (index >= items.length) return;
27
+ if (claimed.done) return;
28
+ const [index, item] = claimed.value;
28
29
  try {
29
- results[index] = await fn(items[index] as T, index);
30
+ results[index] = await fn(item, index);
30
31
  } catch (err) {
31
32
  failed = true;
32
33
  throw err;
@@ -91,7 +91,7 @@ export async function hostRowIsGone(
91
91
  return row === undefined || row["isDeleted"] === true;
92
92
  }
93
93
 
94
- // Write-path half of the parentRef gate (fw#2766). Resolves the join entity's
94
+ // Write-path half of the parentRef gate. Resolves the join entity's
95
95
  // own `parentRef` declaration from the registry — the same object the read
96
96
  // path's SQL gate reads — so the field names and the allowedTypes allowlist
97
97
  // exist in exactly one place instead of once per path.
@@ -104,7 +104,7 @@ export async function joinRowParentIsVisible(
104
104
  ): Promise<boolean> {
105
105
  const parentRef = registry.getEntity(joinEntityName)?.parentRef;
106
106
  // A mount whose join entity lost its declaration can't derive a gate —
107
- // deny rather than silently fall back to the pre-#2766 open behaviour.
107
+ // deny rather than silently fall back to the open behaviour.
108
108
  if (parentRef === undefined) return false;
109
109
 
110
110
  const entityType = payload[parentRef.entityTypeField];
@@ -43,7 +43,7 @@ export async function verifyPassword(hashString: string, password: string): Prom
43
43
  }
44
44
  }
45
45
 
46
- // Anti-enumeration timing equaliser (#774). The login handler runs this on
46
+ // Anti-enumeration timing equaliser. The login handler runs this on
47
47
  // the no-user / no-hash path so a missing account costs the same argon2
48
48
  // latency as a real verify — otherwise response timing leaks whether an
49
49
  // email is registered. Derived from hashPassword once and cached, so it
@@ -1,5 +1,4 @@
1
- // Cross-device try-first handover (kumiko-framework#3035 follow-up,
2
- // offlot-app#454): signup-request runs in whichever browser the activation
1
+ // Cross-device try-first handover: signup-request runs in whichever browser the activation
3
2
  // link ends up opened in, which may not be the one holding the anonymous
4
3
  // visitor's tenant-handover grant. This extension point lets
5
4
  // auth-email-password bind a verified grant to the signup token server-side
@@ -25,7 +25,7 @@
25
25
  //
26
26
  // Every key is derived from sha256(token), never the raw token — Redis key
27
27
  // names, MONITOR output, replica traffic, and memory/backup dumps never
28
- // carry the bearer secret in the clear (#2174). The by-subject entry stores
28
+ // carry the bearer secret in the clear. The by-subject entry stores
29
29
  // the *hash* of the live token, not the token itself, so it can only be
30
30
  // used to invalidate (delete the matching forward entry) — never to
31
31
  // recover or resend the original token. A resend therefore always mints a
@@ -1,33 +1,31 @@
1
1
  // Feature name
2
2
  export const SUBSCRIPTION_MOLLIE_FEATURE = "subscription-mollie" as const;
3
3
 
4
- // entityName under den der Plugin gegen "subscriptionProvider"
5
- // registriert. Matcht den path-segment in der webhook-URL
4
+ // Entity name under which the plugin registers against
5
+ // "subscriptionProvider". Matches the path segment in the webhook URL
6
6
  // `/api/subscription/webhook/mollie`.
7
7
  export const MOLLIE_PROVIDER_NAME = "mollie" as const;
8
8
 
9
9
  // =============================================================================
10
- // Mollie-Webhook-Pattern (anders als Stripe!)
10
+ // Mollie webhook pattern (unlike Stripe)
11
11
  // =============================================================================
12
12
  //
13
- // Mollie sendet bei JEDEM event nur die ID im body (form-urlencoded
14
- // oder JSON). Plugin muss IMMER lazy-fetchen via Mollie-API:
15
- // - `id=tr_xxx` → payment-id, fetch payment + subscription
16
- // - `id=sub_xxx` → subscription-id, fetch subscription direkt
13
+ // Mollie sends only the ID in the body for EVERY event (form-urlencoded
14
+ // or JSON). The plugin must ALWAYS fetch lazily via the Mollie API:
15
+ // - `id=tr_xxx` → payment ID, fetch payment + subscription
16
+ // - `id=sub_xxx` → subscription ID, fetch subscription directly
17
17
  //
18
- // **Keine native HMAC-sig-verify** in Mollie-SDK 4.5.0. Mollie's
19
- // Sicherheits-Modell stützt sich auf nicht-guessable IDs (~10^25
20
- // brute-force-space) + API-Lookup-Validation (garbage-id → 401 von
21
- // Mollie-API). Plus: App-Builder kann zusätzlich einen URL-Token-
22
- // Wrapper vor die Foundation-route schalten (eigener extraRoute der
23
- // einen secret-token im URL-Pfad verifiziert + dann an die Foundation
24
- // weiterreicht).
18
+ // **No native HMAC signature verification** in Mollie SDK 4.5.0. Mollie's
19
+ // security model relies on non-guessable IDs (~10^25 brute-force space)
20
+ // plus API lookup validation (garbage ID → 401 from the Mollie API). In
21
+ // addition, the app builder can place a URL-token wrapper before the
22
+ // foundation route (a custom extraRoute that verifies a secret token in
23
+ // the URL path and then forwards to the foundation).
25
24
  //
26
- // **Event-Type-Mapping** ist heuristisch — Mollie hat keine explicit-
27
- // typed events:
25
+ // **Event type mapping** is heuristic—Mollie has no explicitly typed events:
28
26
  // - sub_xxx + status=canceled/completed → SubscriptionEventTypes.canceled
29
27
  // - sub_xxx + status=active/pending → SubscriptionEventTypes.updated
30
28
  // - tr_xxx + sequenceType=first + paid → SubscriptionEventTypes.created
31
29
  // - tr_xxx + sequenceType=recurring + paid → SubscriptionEventTypes.invoicePaid
32
30
  // - tr_xxx + sequenceType=recurring + failed → SubscriptionEventTypes.invoicePaymentFailed
33
- // - alles andere → null (foundation 200 ignored)
31
+ // - everything else → null (foundation 200 ignored)