@cosmicdrift/kumiko-samples 0.338.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 (1461) hide show
  1. package/LICENSE +57 -0
  2. package/README.md +14 -0
  3. package/package.json +34 -0
  4. package/packages/bundled-features/package.json +647 -0
  5. package/packages/bundled-features/src/admin-shell/changes.json +27 -0
  6. package/packages/bundled-features/src/admin-shell/constants.ts +11 -0
  7. package/packages/bundled-features/src/admin-shell/feature.ts +184 -0
  8. package/packages/bundled-features/src/admin-shell/i18n.ts +54 -0
  9. package/packages/bundled-features/src/admin-shell/index.ts +17 -0
  10. package/packages/bundled-features/src/admin-shell/overview-allowlist.ts +47 -0
  11. package/packages/bundled-features/src/admin-shell/overview-panels.ts +225 -0
  12. package/packages/bundled-features/src/admin-shell/web/client-plugin.tsx +16 -0
  13. package/packages/bundled-features/src/admin-shell/web/i18n.ts +11 -0
  14. package/packages/bundled-features/src/admin-shell/web/index.ts +2 -0
  15. package/packages/bundled-features/src/agent-tools/agent-doc-lint.ts +166 -0
  16. package/packages/bundled-features/src/agent-tools/agent-manifest.ts +460 -0
  17. package/packages/bundled-features/src/agent-tools/changes.json +40 -0
  18. package/packages/bundled-features/src/agent-tools/feature.ts +36 -0
  19. package/packages/bundled-features/src/agent-tools/filter-ops.ts +5 -0
  20. package/packages/bundled-features/src/agent-tools/index.ts +25 -0
  21. package/packages/bundled-features/src/agent-tools/tool-catalog.ts +658 -0
  22. package/packages/bundled-features/src/agent-tools/tool-dispatch.ts +374 -0
  23. package/packages/bundled-features/src/agent-tools/types.ts +222 -0
  24. package/packages/bundled-features/src/audit/changes.json +40 -0
  25. package/packages/bundled-features/src/audit/constants.ts +26 -0
  26. package/packages/bundled-features/src/audit/escape-hatch-audit-sink.ts +52 -0
  27. package/packages/bundled-features/src/audit/feature.ts +145 -0
  28. package/packages/bundled-features/src/audit/handlers/details.query.ts +49 -0
  29. package/packages/bundled-features/src/audit/handlers/list.query.ts +130 -0
  30. package/packages/bundled-features/src/audit/i18n.ts +22 -0
  31. package/packages/bundled-features/src/audit/index.ts +3 -0
  32. package/packages/bundled-features/src/audit/web/client-plugin.tsx +16 -0
  33. package/packages/bundled-features/src/audit/web/i18n.ts +8 -0
  34. package/packages/bundled-features/src/audit/web/index.ts +3 -0
  35. package/packages/bundled-features/src/auth-email-password/auth-paths.ts +28 -0
  36. package/packages/bundled-features/src/auth-email-password/auth-user-row.ts +51 -0
  37. package/packages/bundled-features/src/auth-email-password/changes.json +143 -0
  38. package/packages/bundled-features/src/auth-email-password/constants.ts +146 -0
  39. package/packages/bundled-features/src/auth-email-password/email-templates.ts +198 -0
  40. package/packages/bundled-features/src/auth-email-password/errors.ts +112 -0
  41. package/packages/bundled-features/src/auth-email-password/feature.ts +269 -0
  42. package/packages/bundled-features/src/auth-email-password/handlers/change-password.write.ts +70 -0
  43. package/packages/bundled-features/src/auth-email-password/handlers/confirm-account-unlock.write.ts +61 -0
  44. package/packages/bundled-features/src/auth-email-password/handlers/confirm-token-flow.ts +148 -0
  45. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +290 -0
  46. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept.write.ts +195 -0
  47. package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +232 -0
  48. package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +90 -0
  49. package/packages/bundled-features/src/auth-email-password/handlers/invite-signup-complete.write.ts +221 -0
  50. package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +344 -0
  51. package/packages/bundled-features/src/auth-email-password/handlers/logout.write.ts +16 -0
  52. package/packages/bundled-features/src/auth-email-password/handlers/request-account-unlock.write.ts +40 -0
  53. package/packages/bundled-features/src/auth-email-password/handlers/request-email-verification.write.ts +37 -0
  54. package/packages/bundled-features/src/auth-email-password/handlers/request-password-reset.write.ts +39 -0
  55. package/packages/bundled-features/src/auth-email-password/handlers/reset-password.write.ts +62 -0
  56. package/packages/bundled-features/src/auth-email-password/handlers/self-registration-status.query.ts +26 -0
  57. package/packages/bundled-features/src/auth-email-password/handlers/signup-confirm.write.ts +249 -0
  58. package/packages/bundled-features/src/auth-email-password/handlers/signup-request.write.ts +229 -0
  59. package/packages/bundled-features/src/auth-email-password/handlers/token-request-handler.ts +170 -0
  60. package/packages/bundled-features/src/auth-email-password/handlers/verify-email.write.ts +62 -0
  61. package/packages/bundled-features/src/auth-email-password/i18n.ts +153 -0
  62. package/packages/bundled-features/src/auth-email-password/index.ts +47 -0
  63. package/packages/bundled-features/src/auth-email-password/invite-token-store.ts +78 -0
  64. package/packages/bundled-features/src/auth-email-password/lockout-store.ts +34 -0
  65. package/packages/bundled-features/src/auth-email-password/magic-link-mail.ts +87 -0
  66. package/packages/bundled-features/src/auth-email-password/password-policy.ts +2108 -0
  67. package/packages/bundled-features/src/auth-email-password/reset-token.ts +30 -0
  68. package/packages/bundled-features/src/auth-email-password/seeding.ts +368 -0
  69. package/packages/bundled-features/src/auth-email-password/self-registration-toggle.ts +25 -0
  70. package/packages/bundled-features/src/auth-email-password/signed-token.ts +4 -0
  71. package/packages/bundled-features/src/auth-email-password/signup-token-store.ts +155 -0
  72. package/packages/bundled-features/src/auth-email-password/testing.ts +5 -0
  73. package/packages/bundled-features/src/auth-email-password/unlock-token.ts +28 -0
  74. package/packages/bundled-features/src/auth-email-password/verification-token.ts +29 -0
  75. package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +472 -0
  76. package/packages/bundled-features/src/auth-email-password/web/auth-form-logic.ts +40 -0
  77. package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +112 -0
  78. package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +179 -0
  79. package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +69 -0
  80. package/packages/bundled-features/src/auth-email-password/web/confirm-account-unlock-screen.tsx +96 -0
  81. package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +47 -0
  82. package/packages/bundled-features/src/auth-email-password/web/forgot-password-screen.tsx +111 -0
  83. package/packages/bundled-features/src/auth-email-password/web/index.ts +81 -0
  84. package/packages/bundled-features/src/auth-email-password/web/invite-accept-screen.tsx +272 -0
  85. package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +298 -0
  86. package/packages/bundled-features/src/auth-email-password/web/request-account-unlock-screen.tsx +112 -0
  87. package/packages/bundled-features/src/auth-email-password/web/reset-password-screen.tsx +149 -0
  88. package/packages/bundled-features/src/auth-email-password/web/session-bootstrap-error.tsx +66 -0
  89. package/packages/bundled-features/src/auth-email-password/web/session.tsx +231 -0
  90. package/packages/bundled-features/src/auth-email-password/web/signup-complete-screen.tsx +181 -0
  91. package/packages/bundled-features/src/auth-email-password/web/signup-screen.tsx +128 -0
  92. package/packages/bundled-features/src/auth-email-password/web/tenant-menu-items.tsx +47 -0
  93. package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +123 -0
  94. package/packages/bundled-features/src/auth-email-password/web/use-shell-user.ts +37 -0
  95. package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +149 -0
  96. package/packages/bundled-features/src/auth-email-password/web/verify-email-screen.tsx +99 -0
  97. package/packages/bundled-features/src/auth-foundation/boot-checks.ts +150 -0
  98. package/packages/bundled-features/src/auth-foundation/changes.json +20 -0
  99. package/packages/bundled-features/src/auth-foundation/feature.ts +157 -0
  100. package/packages/bundled-features/src/auth-foundation/index.ts +37 -0
  101. package/packages/bundled-features/src/auth-foundation/resolve-anonymous-access.ts +62 -0
  102. package/packages/bundled-features/src/auth-foundation/types.ts +180 -0
  103. package/packages/bundled-features/src/auth-mfa/base32.ts +51 -0
  104. package/packages/bundled-features/src/auth-mfa/changes.json +62 -0
  105. package/packages/bundled-features/src/auth-mfa/config.ts +26 -0
  106. package/packages/bundled-features/src/auth-mfa/constants.ts +47 -0
  107. package/packages/bundled-features/src/auth-mfa/db/queries.ts +45 -0
  108. package/packages/bundled-features/src/auth-mfa/errors.ts +66 -0
  109. package/packages/bundled-features/src/auth-mfa/feature.ts +251 -0
  110. package/packages/bundled-features/src/auth-mfa/handlers/disable.write.ts +83 -0
  111. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +242 -0
  112. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm.write.ts +123 -0
  113. package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +104 -0
  114. package/packages/bundled-features/src/auth-mfa/handlers/enable-start.write.ts +95 -0
  115. package/packages/bundled-features/src/auth-mfa/handlers/reencrypt.job.ts +223 -0
  116. package/packages/bundled-features/src/auth-mfa/handlers/regenerate-recovery.write.ts +88 -0
  117. package/packages/bundled-features/src/auth-mfa/handlers/status.query.ts +32 -0
  118. package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +203 -0
  119. package/packages/bundled-features/src/auth-mfa/hmac-token-codec.ts +79 -0
  120. package/packages/bundled-features/src/auth-mfa/i18n.ts +50 -0
  121. package/packages/bundled-features/src/auth-mfa/index.ts +30 -0
  122. package/packages/bundled-features/src/auth-mfa/mfa-challenge-token.ts +39 -0
  123. package/packages/bundled-features/src/auth-mfa/mfa-code-verifier.ts +45 -0
  124. package/packages/bundled-features/src/auth-mfa/mfa-preauth-setup-token.ts +38 -0
  125. package/packages/bundled-features/src/auth-mfa/mfa-setup-token.ts +96 -0
  126. package/packages/bundled-features/src/auth-mfa/mfa-status-checker.ts +98 -0
  127. package/packages/bundled-features/src/auth-mfa/mfa-verify-attempts.ts +32 -0
  128. package/packages/bundled-features/src/auth-mfa/otpauth-uri.ts +21 -0
  129. package/packages/bundled-features/src/auth-mfa/recovery-codes.ts +54 -0
  130. package/packages/bundled-features/src/auth-mfa/schema/user-mfa.ts +65 -0
  131. package/packages/bundled-features/src/auth-mfa/screens.ts +124 -0
  132. package/packages/bundled-features/src/auth-mfa/testing.ts +5 -0
  133. package/packages/bundled-features/src/auth-mfa/token-secrets.ts +41 -0
  134. package/packages/bundled-features/src/auth-mfa/totp.ts +67 -0
  135. package/packages/bundled-features/src/auth-mfa/verify-factor.ts +58 -0
  136. package/packages/bundled-features/src/auth-mfa/web/client-plugin.ts +36 -0
  137. package/packages/bundled-features/src/auth-mfa/web/i18n.ts +66 -0
  138. package/packages/bundled-features/src/auth-mfa/web/index.ts +25 -0
  139. package/packages/bundled-features/src/auth-mfa/web/mfa-client.ts +196 -0
  140. package/packages/bundled-features/src/auth-mfa/web/mfa-disable-dialog.tsx +70 -0
  141. package/packages/bundled-features/src/auth-mfa/web/mfa-recovery-codes-reveal.tsx +53 -0
  142. package/packages/bundled-features/src/auth-mfa/web/mfa-regenerate-recovery-dialog.tsx +69 -0
  143. package/packages/bundled-features/src/auth-mfa/web/mfa-setup-preauth-screen.tsx +269 -0
  144. package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +117 -0
  145. package/packages/bundled-features/src/auth-mfa/web/qrcode-browser.d.ts +11 -0
  146. package/packages/bundled-features/src/auth-mfa-user-data/changes.json +1 -0
  147. package/packages/bundled-features/src/auth-mfa-user-data/hooks.ts +60 -0
  148. package/packages/bundled-features/src/auth-mfa-user-data/index.ts +21 -0
  149. package/packages/bundled-features/src/billing-foundation/aggregate-id.ts +74 -0
  150. package/packages/bundled-features/src/billing-foundation/billing-info-query.ts +95 -0
  151. package/packages/bundled-features/src/billing-foundation/changes.json +162 -0
  152. package/packages/bundled-features/src/billing-foundation/checkout-core.ts +395 -0
  153. package/packages/bundled-features/src/billing-foundation/constants.ts +237 -0
  154. package/packages/bundled-features/src/billing-foundation/consumer-protection/confirmation-mail.ts +170 -0
  155. package/packages/bundled-features/src/billing-foundation/consumer-protection/consent-gate.ts +140 -0
  156. package/packages/bundled-features/src/billing-foundation/consumer-protection/consent-locale.ts +18 -0
  157. package/packages/bundled-features/src/billing-foundation/consumer-protection/consent-text.ts +55 -0
  158. package/packages/bundled-features/src/billing-foundation/consumer-protection/issue-confirmation.ts +200 -0
  159. package/packages/bundled-features/src/billing-foundation/consumer-protection/register-consent.ts +97 -0
  160. package/packages/bundled-features/src/billing-foundation/consumer-protection/register-termination.ts +39 -0
  161. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-mail.ts +128 -0
  162. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-pages.ts +339 -0
  163. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-record.ts +206 -0
  164. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-request.ts +377 -0
  165. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-texts.ts +242 -0
  166. package/packages/bundled-features/src/billing-foundation/db/queries/payment-projection.ts +19 -0
  167. package/packages/bundled-features/src/billing-foundation/db/queries/subscription-projection.ts +15 -0
  168. package/packages/bundled-features/src/billing-foundation/entities.ts +132 -0
  169. package/packages/bundled-features/src/billing-foundation/events.ts +215 -0
  170. package/packages/bundled-features/src/billing-foundation/feature.ts +290 -0
  171. package/packages/bundled-features/src/billing-foundation/get-subscription-for-tenant.ts +58 -0
  172. package/packages/bundled-features/src/billing-foundation/handlers/billing-plans.query.ts +54 -0
  173. package/packages/bundled-features/src/billing-foundation/handlers/create-checkout-session.write.ts +132 -0
  174. package/packages/bundled-features/src/billing-foundation/handlers/create-portal-session.write.ts +103 -0
  175. package/packages/bundled-features/src/billing-foundation/handlers/list-subscriptions.query.ts +37 -0
  176. package/packages/bundled-features/src/billing-foundation/handlers/process-event.write.ts +244 -0
  177. package/packages/bundled-features/src/billing-foundation/handlers/process-payment-event.write.ts +122 -0
  178. package/packages/bundled-features/src/billing-foundation/handlers/start-plan-checkout.write.ts +100 -0
  179. package/packages/bundled-features/src/billing-foundation/handlers/switch-plan.write.ts +109 -0
  180. package/packages/bundled-features/src/billing-foundation/handlers/sync-subscription.write.ts +163 -0
  181. package/packages/bundled-features/src/billing-foundation/i18n.ts +133 -0
  182. package/packages/bundled-features/src/billing-foundation/index.ts +92 -0
  183. package/packages/bundled-features/src/billing-foundation/plan-catalog.ts +235 -0
  184. package/packages/bundled-features/src/billing-foundation/projection.ts +227 -0
  185. package/packages/bundled-features/src/billing-foundation/screens.ts +25 -0
  186. package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +175 -0
  187. package/packages/bundled-features/src/billing-foundation/tenant-destroy-hook.ts +81 -0
  188. package/packages/bundled-features/src/billing-foundation/types.ts +478 -0
  189. package/packages/bundled-features/src/billing-foundation/validate-options.ts +111 -0
  190. package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +361 -0
  191. package/packages/bundled-features/src/billing-foundation/web/cancel-contract-dialog.tsx +201 -0
  192. package/packages/bundled-features/src/billing-foundation/web/checkout-consent-dialog.tsx +146 -0
  193. package/packages/bundled-features/src/billing-foundation/web/client-plugin.tsx +21 -0
  194. package/packages/bundled-features/src/billing-foundation/web/index.ts +23 -0
  195. package/packages/bundled-features/src/billing-foundation/webhook-handler.ts +165 -0
  196. package/packages/bundled-features/src/cap-counter/aggregate-id.ts +49 -0
  197. package/packages/bundled-features/src/cap-counter/book-cap-usage.ts +205 -0
  198. package/packages/bundled-features/src/cap-counter/changes.json +47 -0
  199. package/packages/bundled-features/src/cap-counter/constants.ts +34 -0
  200. package/packages/bundled-features/src/cap-counter/enforce-cap.ts +415 -0
  201. package/packages/bundled-features/src/cap-counter/entity.ts +57 -0
  202. package/packages/bundled-features/src/cap-counter/feature.ts +135 -0
  203. package/packages/bundled-features/src/cap-counter/handlers/get-counter.query.ts +37 -0
  204. package/packages/bundled-features/src/cap-counter/handlers/increment-rolling.write.ts +80 -0
  205. package/packages/bundled-features/src/cap-counter/handlers/increment.write.ts +51 -0
  206. package/packages/bundled-features/src/cap-counter/handlers/mark-soft-warned.write.ts +30 -0
  207. package/packages/bundled-features/src/cap-counter/i18n.ts +13 -0
  208. package/packages/bundled-features/src/cap-counter/index.ts +50 -0
  209. package/packages/bundled-features/src/cap-counter/stock-cap-guard.ts +80 -0
  210. package/packages/bundled-features/src/cap-counter/with-cap-enforcement.ts +183 -0
  211. package/packages/bundled-features/src/cap-overview/access.ts +35 -0
  212. package/packages/bundled-features/src/cap-overview/changes.json +57 -0
  213. package/packages/bundled-features/src/cap-overview/constants.ts +26 -0
  214. package/packages/bundled-features/src/cap-overview/feature.ts +87 -0
  215. package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +109 -0
  216. package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +306 -0
  217. package/packages/bundled-features/src/cap-overview/handlers/tenant-options.query.ts +35 -0
  218. package/packages/bundled-features/src/cap-overview/i18n.ts +31 -0
  219. package/packages/bundled-features/src/cap-overview/index.ts +21 -0
  220. package/packages/bundled-features/src/cap-overview/screens.ts +109 -0
  221. package/packages/bundled-features/src/cap-overview/types.ts +66 -0
  222. package/packages/bundled-features/src/cap-overview/usage-math.ts +34 -0
  223. package/packages/bundled-features/src/cap-overview/web/cap-cards-panel.tsx +119 -0
  224. package/packages/bundled-features/src/cap-overview/web/cap-usage-bar.tsx +56 -0
  225. package/packages/bundled-features/src/cap-overview/web/cap-usage-cell.tsx +21 -0
  226. package/packages/bundled-features/src/cap-overview/web/client-plugin.tsx +27 -0
  227. package/packages/bundled-features/src/cap-overview/web/index.ts +10 -0
  228. package/packages/bundled-features/src/channel-email/changes.json +15 -0
  229. package/packages/bundled-features/src/channel-email/email-channel.ts +127 -0
  230. package/packages/bundled-features/src/channel-email/feature.ts +26 -0
  231. package/packages/bundled-features/src/channel-email/index.ts +10 -0
  232. package/packages/bundled-features/src/channel-email/pii-guard.ts +55 -0
  233. package/packages/bundled-features/src/channel-email/smtp-transport.ts +111 -0
  234. package/packages/bundled-features/src/channel-email/types.ts +43 -0
  235. package/packages/bundled-features/src/channel-in-app/changes.json +1 -0
  236. package/packages/bundled-features/src/channel-in-app/constants.ts +11 -0
  237. package/packages/bundled-features/src/channel-in-app/feature.ts +45 -0
  238. package/packages/bundled-features/src/channel-in-app/handlers/inbox.query.ts +30 -0
  239. package/packages/bundled-features/src/channel-in-app/handlers/mark-all-read.write.ts +27 -0
  240. package/packages/bundled-features/src/channel-in-app/handlers/mark-read.write.ts +34 -0
  241. package/packages/bundled-features/src/channel-in-app/handlers/unread-count.query.ts +29 -0
  242. package/packages/bundled-features/src/channel-in-app/in-app-channel.ts +41 -0
  243. package/packages/bundled-features/src/channel-in-app/index.ts +4 -0
  244. package/packages/bundled-features/src/channel-in-app/tables.ts +31 -0
  245. package/packages/bundled-features/src/channel-push/changes.json +1 -0
  246. package/packages/bundled-features/src/channel-push/feature.ts +25 -0
  247. package/packages/bundled-features/src/channel-push/index.ts +3 -0
  248. package/packages/bundled-features/src/channel-push/push-channel.ts +34 -0
  249. package/packages/bundled-features/src/channel-push/types.ts +22 -0
  250. package/packages/bundled-features/src/compliance-profiles/README.md +88 -0
  251. package/packages/bundled-features/src/compliance-profiles/_internal/parse-override.ts +20 -0
  252. package/packages/bundled-features/src/compliance-profiles/changes.json +8 -0
  253. package/packages/bundled-features/src/compliance-profiles/constants.ts +20 -0
  254. package/packages/bundled-features/src/compliance-profiles/feature.ts +114 -0
  255. package/packages/bundled-features/src/compliance-profiles/handlers/for-tenant.query.ts +50 -0
  256. package/packages/bundled-features/src/compliance-profiles/handlers/list-profiles.query.ts +52 -0
  257. package/packages/bundled-features/src/compliance-profiles/handlers/needs-profile.query.ts +75 -0
  258. package/packages/bundled-features/src/compliance-profiles/handlers/set-profile.write.ts +142 -0
  259. package/packages/bundled-features/src/compliance-profiles/handlers/sub-processors.query.ts +46 -0
  260. package/packages/bundled-features/src/compliance-profiles/i18n.ts +31 -0
  261. package/packages/bundled-features/src/compliance-profiles/index.ts +13 -0
  262. package/packages/bundled-features/src/compliance-profiles/resolve-for-tenant.ts +57 -0
  263. package/packages/bundled-features/src/compliance-profiles/schema/profile-selection.ts +53 -0
  264. package/packages/bundled-features/src/compliance-profiles/seeding.ts +101 -0
  265. package/packages/bundled-features/src/compliance-profiles/web/client-plugin.tsx +25 -0
  266. package/packages/bundled-features/src/compliance-profiles/web/compliance-profile-catalog.tsx +55 -0
  267. package/packages/bundled-features/src/compliance-profiles/web/i18n.ts +9 -0
  268. package/packages/bundled-features/src/compliance-profiles/web/index.ts +6 -0
  269. package/packages/bundled-features/src/compliance-profiles-ops/handlers/tenants-missing-profile.query.ts +56 -0
  270. package/packages/bundled-features/src/compliance-profiles-ops/index.ts +34 -0
  271. package/packages/bundled-features/src/config/changes.json +35 -0
  272. package/packages/bundled-features/src/config/constants.ts +30 -0
  273. package/packages/bundled-features/src/config/db/queries/resolver.ts +51 -0
  274. package/packages/bundled-features/src/config/feature.ts +169 -0
  275. package/packages/bundled-features/src/config/handlers/cascade.query.ts +94 -0
  276. package/packages/bundled-features/src/config/handlers/readiness.query.ts +164 -0
  277. package/packages/bundled-features/src/config/handlers/reencrypt.job.ts +274 -0
  278. package/packages/bundled-features/src/config/handlers/reset.write.ts +76 -0
  279. package/packages/bundled-features/src/config/handlers/schema.query.ts +36 -0
  280. package/packages/bundled-features/src/config/handlers/selected-extensions.query.ts +71 -0
  281. package/packages/bundled-features/src/config/handlers/set.write.ts +227 -0
  282. package/packages/bundled-features/src/config/handlers/values.query.ts +92 -0
  283. package/packages/bundled-features/src/config/i18n.ts +4 -0
  284. package/packages/bundled-features/src/config/index.ts +38 -0
  285. package/packages/bundled-features/src/config/read-redaction.ts +64 -0
  286. package/packages/bundled-features/src/config/resolver.ts +687 -0
  287. package/packages/bundled-features/src/config/table.ts +40 -0
  288. package/packages/bundled-features/src/config/web/client-plugin.ts +24 -0
  289. package/packages/bundled-features/src/config/web/i18n.ts +48 -0
  290. package/packages/bundled-features/src/config/web/index.ts +7 -0
  291. package/packages/bundled-features/src/config/write-helpers.ts +377 -0
  292. package/packages/bundled-features/src/crypto-shredding/changes.json +58 -0
  293. package/packages/bundled-features/src/crypto-shredding/constants.ts +11 -0
  294. package/packages/bundled-features/src/crypto-shredding/feature.ts +30 -0
  295. package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +454 -0
  296. package/packages/bundled-features/src/crypto-shredding/index.ts +13 -0
  297. package/packages/bundled-features/src/custom-fields/aggregate-id.ts +34 -0
  298. package/packages/bundled-features/src/custom-fields/changes.json +15 -0
  299. package/packages/bundled-features/src/custom-fields/constants.ts +79 -0
  300. package/packages/bundled-features/src/custom-fields/db/queries/field-access.ts +17 -0
  301. package/packages/bundled-features/src/custom-fields/db/queries/projection.ts +84 -0
  302. package/packages/bundled-features/src/custom-fields/db/queries/quota.ts +20 -0
  303. package/packages/bundled-features/src/custom-fields/db/queries/retention.ts +43 -0
  304. package/packages/bundled-features/src/custom-fields/db/queries/user-data-rights.ts +39 -0
  305. package/packages/bundled-features/src/custom-fields/entity.ts +112 -0
  306. package/packages/bundled-features/src/custom-fields/events.ts +25 -0
  307. package/packages/bundled-features/src/custom-fields/executor.ts +10 -0
  308. package/packages/bundled-features/src/custom-fields/feature.ts +289 -0
  309. package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +82 -0
  310. package/packages/bundled-features/src/custom-fields/handlers/define-system-field.write.ts +45 -0
  311. package/packages/bundled-features/src/custom-fields/handlers/define-tenant-field.write.ts +108 -0
  312. package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +49 -0
  313. package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +74 -0
  314. package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +124 -0
  315. package/packages/bundled-features/src/custom-fields/handlers/update-tenant-field.write.ts +98 -0
  316. package/packages/bundled-features/src/custom-fields/index.ts +40 -0
  317. package/packages/bundled-features/src/custom-fields/lib/define-or-resurrect.ts +52 -0
  318. package/packages/bundled-features/src/custom-fields/lib/field-access.ts +75 -0
  319. package/packages/bundled-features/src/custom-fields/lib/field-definition-row.ts +33 -0
  320. package/packages/bundled-features/src/custom-fields/lib/parse-serialized-field.ts +64 -0
  321. package/packages/bundled-features/src/custom-fields/lib/quota.ts +5 -0
  322. package/packages/bundled-features/src/custom-fields/lib/value-schema.ts +91 -0
  323. package/packages/bundled-features/src/custom-fields/run-retention.ts +201 -0
  324. package/packages/bundled-features/src/custom-fields/schemas.ts +98 -0
  325. package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +27 -0
  326. package/packages/bundled-features/src/custom-fields/web/custom-fields-form-section.tsx +247 -0
  327. package/packages/bundled-features/src/custom-fields/web/i18n.ts +22 -0
  328. package/packages/bundled-features/src/custom-fields/web/index.ts +8 -0
  329. package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +226 -0
  330. package/packages/bundled-features/src/custom-fields/wire-user-data-rights.ts +79 -0
  331. package/packages/bundled-features/src/data-retention/_internal/parse-override.ts +34 -0
  332. package/packages/bundled-features/src/data-retention/changes.json +50 -0
  333. package/packages/bundled-features/src/data-retention/feature.ts +123 -0
  334. package/packages/bundled-features/src/data-retention/handlers/policy-for.query.ts +46 -0
  335. package/packages/bundled-features/src/data-retention/index.ts +20 -0
  336. package/packages/bundled-features/src/data-retention/keep-for.ts +75 -0
  337. package/packages/bundled-features/src/data-retention/override-schema.ts +37 -0
  338. package/packages/bundled-features/src/data-retention/presets.ts +72 -0
  339. package/packages/bundled-features/src/data-retention/resolve-for-tenant.ts +84 -0
  340. package/packages/bundled-features/src/data-retention/resolve-tenant-preset.ts +54 -0
  341. package/packages/bundled-features/src/data-retention/resolver.ts +107 -0
  342. package/packages/bundled-features/src/data-retention/run-retention-cleanup.ts +814 -0
  343. package/packages/bundled-features/src/data-retention/schema/tenant-retention-override.ts +50 -0
  344. package/packages/bundled-features/src/delivery/address-opt-out.ts +204 -0
  345. package/packages/bundled-features/src/delivery/attempt-log.ts +66 -0
  346. package/packages/bundled-features/src/delivery/changes.json +86 -0
  347. package/packages/bundled-features/src/delivery/channel-context.ts +17 -0
  348. package/packages/bundled-features/src/delivery/constants.ts +36 -0
  349. package/packages/bundled-features/src/delivery/db/queries/address-opt-outs.ts +23 -0
  350. package/packages/bundled-features/src/delivery/db/queries/preferences.ts +32 -0
  351. package/packages/bundled-features/src/delivery/delivery-service.ts +625 -0
  352. package/packages/bundled-features/src/delivery/events.ts +24 -0
  353. package/packages/bundled-features/src/delivery/feature.ts +206 -0
  354. package/packages/bundled-features/src/delivery/handlers/log.query.ts +177 -0
  355. package/packages/bundled-features/src/delivery/handlers/preferences.query.ts +42 -0
  356. package/packages/bundled-features/src/delivery/handlers/resubscribe-address.write.ts +42 -0
  357. package/packages/bundled-features/src/delivery/handlers/resubscribe-user.write.ts +41 -0
  358. package/packages/bundled-features/src/delivery/handlers/set-preference.write.ts +47 -0
  359. package/packages/bundled-features/src/delivery/handlers/unsubscribe-address.write.ts +40 -0
  360. package/packages/bundled-features/src/delivery/handlers/unsubscribe-user.write.ts +43 -0
  361. package/packages/bundled-features/src/delivery/i18n.ts +11 -0
  362. package/packages/bundled-features/src/delivery/index.ts +52 -0
  363. package/packages/bundled-features/src/delivery/jobs.ts +169 -0
  364. package/packages/bundled-features/src/delivery/public-names.ts +60 -0
  365. package/packages/bundled-features/src/delivery/tables.ts +155 -0
  366. package/packages/bundled-features/src/delivery/testing.ts +53 -0
  367. package/packages/bundled-features/src/delivery/types.ts +121 -0
  368. package/packages/bundled-features/src/delivery/unsubscribe.ts +429 -0
  369. package/packages/bundled-features/src/delivery/upsert-preference.ts +154 -0
  370. package/packages/bundled-features/src/delivery/web/client-plugin.tsx +19 -0
  371. package/packages/bundled-features/src/delivery/web/delivery-status-cell.tsx +26 -0
  372. package/packages/bundled-features/src/delivery/web/index.ts +3 -0
  373. package/packages/bundled-features/src/derivatives-sharp/changes.json +19 -0
  374. package/packages/bundled-features/src/derivatives-sharp/feature.ts +22 -0
  375. package/packages/bundled-features/src/derivatives-sharp/index.ts +2 -0
  376. package/packages/bundled-features/src/derivatives-sharp/render.ts +431 -0
  377. package/packages/bundled-features/src/document-ingest-foundation/boot-checks.ts +58 -0
  378. package/packages/bundled-features/src/document-ingest-foundation/changes.json +44 -0
  379. package/packages/bundled-features/src/document-ingest-foundation/entity.ts +59 -0
  380. package/packages/bundled-features/src/document-ingest-foundation/events.ts +43 -0
  381. package/packages/bundled-features/src/document-ingest-foundation/executor.ts +12 -0
  382. package/packages/bundled-features/src/document-ingest-foundation/feature.ts +226 -0
  383. package/packages/bundled-features/src/document-ingest-foundation/file-ref-liveness.ts +10 -0
  384. package/packages/bundled-features/src/document-ingest-foundation/forget-extract-with-file-ref.ts +84 -0
  385. package/packages/bundled-features/src/document-ingest-foundation/index.ts +34 -0
  386. package/packages/bundled-features/src/document-ingest-foundation/pages.ts +34 -0
  387. package/packages/bundled-features/src/document-ingest-foundation/providers.ts +87 -0
  388. package/packages/bundled-features/src/document-ingest-foundation/tenant-destroy-hook.ts +34 -0
  389. package/packages/bundled-features/src/document-ingest-foundation/write-document-extract.ts +57 -0
  390. package/packages/bundled-features/src/feature-toggles/changes.json +31 -0
  391. package/packages/bundled-features/src/feature-toggles/compose-tier-resolver.ts +134 -0
  392. package/packages/bundled-features/src/feature-toggles/constants.ts +40 -0
  393. package/packages/bundled-features/src/feature-toggles/events.ts +18 -0
  394. package/packages/bundled-features/src/feature-toggles/feature.ts +173 -0
  395. package/packages/bundled-features/src/feature-toggles/global-feature-state-table.ts +47 -0
  396. package/packages/bundled-features/src/feature-toggles/handlers/list.query.ts +45 -0
  397. package/packages/bundled-features/src/feature-toggles/handlers/registered.query.ts +87 -0
  398. package/packages/bundled-features/src/feature-toggles/handlers/set.write.ts +194 -0
  399. package/packages/bundled-features/src/feature-toggles/i18n.ts +11 -0
  400. package/packages/bundled-features/src/feature-toggles/index.ts +20 -0
  401. package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +135 -0
  402. package/packages/bundled-features/src/feature-toggles/toggle-sync-signal.ts +64 -0
  403. package/packages/bundled-features/src/feature-toggles/web/client-plugin.tsx +18 -0
  404. package/packages/bundled-features/src/feature-toggles/web/i18n.ts +17 -0
  405. package/packages/bundled-features/src/feature-toggles/web/index.ts +5 -0
  406. package/packages/bundled-features/src/file-derivatives/changes.json +27 -0
  407. package/packages/bundled-features/src/file-derivatives/feature.ts +236 -0
  408. package/packages/bundled-features/src/file-derivatives/handlers/public-variant-by-file-ref.query.ts +57 -0
  409. package/packages/bundled-features/src/file-derivatives/handlers/public-variant.query.ts +156 -0
  410. package/packages/bundled-features/src/file-derivatives/index.ts +11 -0
  411. package/packages/bundled-features/src/file-derivatives/presets.ts +10 -0
  412. package/packages/bundled-features/src/file-foundation/changes.json +9 -0
  413. package/packages/bundled-features/src/file-foundation/feature.ts +72 -0
  414. package/packages/bundled-features/src/file-foundation/index.ts +9 -0
  415. package/packages/bundled-features/src/file-provider-inmemory/changes.json +1 -0
  416. package/packages/bundled-features/src/file-provider-inmemory/feature.ts +84 -0
  417. package/packages/bundled-features/src/file-provider-inmemory/index.ts +3 -0
  418. package/packages/bundled-features/src/file-provider-s3/changes.json +1 -0
  419. package/packages/bundled-features/src/file-provider-s3/feature.ts +176 -0
  420. package/packages/bundled-features/src/file-provider-s3/index.ts +3 -0
  421. package/packages/bundled-features/src/file-provider-s3-env/changes.json +1 -0
  422. package/packages/bundled-features/src/file-provider-s3-env/feature.ts +58 -0
  423. package/packages/bundled-features/src/file-provider-s3-env/index.ts +3 -0
  424. package/packages/bundled-features/src/files/README.md +50 -0
  425. package/packages/bundled-features/src/files/changes.json +1 -0
  426. package/packages/bundled-features/src/files/feature.ts +7 -0
  427. package/packages/bundled-features/src/files/index.ts +1 -0
  428. package/packages/bundled-features/src/files-provider-s3/changes.json +1 -0
  429. package/packages/bundled-features/src/files-provider-s3/env-helper.ts +49 -0
  430. package/packages/bundled-features/src/files-provider-s3/index.ts +3 -0
  431. package/packages/bundled-features/src/files-provider-s3/s3-provider.ts +196 -0
  432. package/packages/bundled-features/src/files-tenant-data/changes.json +9 -0
  433. package/packages/bundled-features/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +168 -0
  434. package/packages/bundled-features/src/files-tenant-data/hooks.ts +203 -0
  435. package/packages/bundled-features/src/files-tenant-data/index.ts +68 -0
  436. package/packages/bundled-features/src/folders/aggregate-id.ts +23 -0
  437. package/packages/bundled-features/src/folders/changes.json +9 -0
  438. package/packages/bundled-features/src/folders/constants.ts +40 -0
  439. package/packages/bundled-features/src/folders/entity.ts +87 -0
  440. package/packages/bundled-features/src/folders/executor.ts +11 -0
  441. package/packages/bundled-features/src/folders/feature.ts +192 -0
  442. package/packages/bundled-features/src/folders/handlers/clear-folder.write.ts +51 -0
  443. package/packages/bundled-features/src/folders/handlers/delete-folder.write.ts +43 -0
  444. package/packages/bundled-features/src/folders/handlers/set-folder.write.ts +99 -0
  445. package/packages/bundled-features/src/folders/index.ts +23 -0
  446. package/packages/bundled-features/src/folders/schemas.ts +18 -0
  447. package/packages/bundled-features/src/folders/web/client-plugin.tsx +16 -0
  448. package/packages/bundled-features/src/folders/web/folder-manager.tsx +562 -0
  449. package/packages/bundled-features/src/folders/web/folder-section.tsx +205 -0
  450. package/packages/bundled-features/src/folders/web/i18n.ts +34 -0
  451. package/packages/bundled-features/src/folders/web/index.ts +6 -0
  452. package/packages/bundled-features/src/folders/web/tree.ts +65 -0
  453. package/packages/bundled-features/src/folders-user-data/changes.json +1 -0
  454. package/packages/bundled-features/src/folders-user-data/hooks.ts +76 -0
  455. package/packages/bundled-features/src/folders-user-data/index.ts +33 -0
  456. package/packages/bundled-features/src/form-draft/changes.json +1 -0
  457. package/packages/bundled-features/src/form-draft/constants.ts +50 -0
  458. package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +72 -0
  459. package/packages/bundled-features/src/form-draft/db/queries/draft-count.ts +21 -0
  460. package/packages/bundled-features/src/form-draft/db/queries/owned-file-refs.ts +74 -0
  461. package/packages/bundled-features/src/form-draft/entity.ts +59 -0
  462. package/packages/bundled-features/src/form-draft/executor.ts +7 -0
  463. package/packages/bundled-features/src/form-draft/feature.ts +59 -0
  464. package/packages/bundled-features/src/form-draft/handlers/cleanup.job.ts +200 -0
  465. package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +110 -0
  466. package/packages/bundled-features/src/form-draft/handlers/get.query.ts +38 -0
  467. package/packages/bundled-features/src/form-draft/handlers/list.query.ts +54 -0
  468. package/packages/bundled-features/src/form-draft/handlers/save.write.ts +86 -0
  469. package/packages/bundled-features/src/form-draft/index.ts +28 -0
  470. package/packages/bundled-features/src/form-draft/lookup.ts +62 -0
  471. package/packages/bundled-features/src/form-draft/release-file-refs.ts +69 -0
  472. package/packages/bundled-features/src/form-draft/schemas.ts +61 -0
  473. package/packages/bundled-features/src/form-draft-user-data/changes.json +1 -0
  474. package/packages/bundled-features/src/form-draft-user-data/hooks.ts +57 -0
  475. package/packages/bundled-features/src/form-draft-user-data/index.ts +21 -0
  476. package/packages/bundled-features/src/foundation-shared/changes.json +1 -0
  477. package/packages/bundled-features/src/foundation-shared/config-helpers.ts +97 -0
  478. package/packages/bundled-features/src/foundation-shared/host-allowlist.ts +17 -0
  479. package/packages/bundled-features/src/foundation-shared/index.ts +14 -0
  480. package/packages/bundled-features/src/foundation-shared/mail-host-policy.ts +60 -0
  481. package/packages/bundled-features/src/inbound-mail-foundation/aggregate-id.ts +40 -0
  482. package/packages/bundled-features/src/inbound-mail-foundation/changes.json +32 -0
  483. package/packages/bundled-features/src/inbound-mail-foundation/connect-routes.ts +253 -0
  484. package/packages/bundled-features/src/inbound-mail-foundation/constants.ts +80 -0
  485. package/packages/bundled-features/src/inbound-mail-foundation/db/queries/inbound-projections.ts +38 -0
  486. package/packages/bundled-features/src/inbound-mail-foundation/entities.ts +222 -0
  487. package/packages/bundled-features/src/inbound-mail-foundation/events.ts +147 -0
  488. package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +265 -0
  489. package/packages/bundled-features/src/inbound-mail-foundation/handlers/account-state.ts +23 -0
  490. package/packages/bundled-features/src/inbound-mail-foundation/handlers/connect-account.write.ts +118 -0
  491. package/packages/bundled-features/src/inbound-mail-foundation/handlers/disconnect-account.write.ts +72 -0
  492. package/packages/bundled-features/src/inbound-mail-foundation/handlers/ingest-message.write.ts +339 -0
  493. package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-accounts.query.ts +44 -0
  494. package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-messages.query.ts +59 -0
  495. package/packages/bundled-features/src/inbound-mail-foundation/handlers/scope-visibility.ts +14 -0
  496. package/packages/bundled-features/src/inbound-mail-foundation/handlers/update-account.write.ts +80 -0
  497. package/packages/bundled-features/src/inbound-mail-foundation/index.ts +96 -0
  498. package/packages/bundled-features/src/inbound-mail-foundation/oauth-state.ts +103 -0
  499. package/packages/bundled-features/src/inbound-mail-foundation/projection.ts +155 -0
  500. package/packages/bundled-features/src/inbound-mail-foundation/provider-factory.ts +53 -0
  501. package/packages/bundled-features/src/inbound-mail-foundation/retention-sweep.ts +168 -0
  502. package/packages/bundled-features/src/inbound-mail-foundation/tenant-destroy-hook.ts +88 -0
  503. package/packages/bundled-features/src/inbound-mail-foundation/types.ts +257 -0
  504. package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor.ts +678 -0
  505. package/packages/bundled-features/src/inbound-provider-imap/changes.json +14 -0
  506. package/packages/bundled-features/src/inbound-provider-imap/credential-document.ts +51 -0
  507. package/packages/bundled-features/src/inbound-provider-imap/feature.ts +286 -0
  508. package/packages/bundled-features/src/inbound-provider-imap/imap-client.ts +216 -0
  509. package/packages/bundled-features/src/inbound-provider-imap/index.ts +17 -0
  510. package/packages/bundled-features/src/inbound-provider-inmemory/changes.json +1 -0
  511. package/packages/bundled-features/src/inbound-provider-inmemory/feature.ts +154 -0
  512. package/packages/bundled-features/src/inbound-provider-inmemory/index.ts +12 -0
  513. package/packages/bundled-features/src/jobs/changes.json +47 -0
  514. package/packages/bundled-features/src/jobs/constants.ts +33 -0
  515. package/packages/bundled-features/src/jobs/db/queries/retention.ts +60 -0
  516. package/packages/bundled-features/src/jobs/db/queries/stale-run-sweep.ts +84 -0
  517. package/packages/bundled-features/src/jobs/events.ts +36 -0
  518. package/packages/bundled-features/src/jobs/feature.ts +256 -0
  519. package/packages/bundled-features/src/jobs/handlers/catalog.query.ts +42 -0
  520. package/packages/bundled-features/src/jobs/handlers/detail.query.ts +69 -0
  521. package/packages/bundled-features/src/jobs/handlers/list.query.ts +79 -0
  522. package/packages/bundled-features/src/jobs/handlers/projection-rebuild.job.ts +43 -0
  523. package/packages/bundled-features/src/jobs/handlers/reindex-entity.job.ts +56 -0
  524. package/packages/bundled-features/src/jobs/handlers/retention-cleanup.job.ts +23 -0
  525. package/packages/bundled-features/src/jobs/handlers/retry.write.ts +100 -0
  526. package/packages/bundled-features/src/jobs/handlers/stale-run-sweep.job.ts +30 -0
  527. package/packages/bundled-features/src/jobs/handlers/tenant-failures.query.ts +73 -0
  528. package/packages/bundled-features/src/jobs/handlers/trigger.write.ts +85 -0
  529. package/packages/bundled-features/src/jobs/i18n.ts +54 -0
  530. package/packages/bundled-features/src/jobs/index.ts +7 -0
  531. package/packages/bundled-features/src/jobs/is-manual-trigger.ts +5 -0
  532. package/packages/bundled-features/src/jobs/job-instant.ts +9 -0
  533. package/packages/bundled-features/src/jobs/job-run-logger.ts +457 -0
  534. package/packages/bundled-features/src/jobs/job-run-table.ts +101 -0
  535. package/packages/bundled-features/src/jobs/tenant-job-failure-table.ts +38 -0
  536. package/packages/bundled-features/src/jobs/web/client-plugin.tsx +16 -0
  537. package/packages/bundled-features/src/jobs/web/i18n.ts +8 -0
  538. package/packages/bundled-features/src/jobs/web/index.ts +2 -0
  539. package/packages/bundled-features/src/ledger/changes.json +16 -0
  540. package/packages/bundled-features/src/ledger/constants.ts +60 -0
  541. package/packages/bundled-features/src/ledger/entity.ts +177 -0
  542. package/packages/bundled-features/src/ledger/executor.ts +18 -0
  543. package/packages/bundled-features/src/ledger/feature.ts +180 -0
  544. package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +134 -0
  545. package/packages/bundled-features/src/ledger/handlers/create-transaction.write.ts +48 -0
  546. package/packages/bundled-features/src/ledger/handlers/reports.query.ts +84 -0
  547. package/packages/bundled-features/src/ledger/handlers/reverse-transaction.write.ts +95 -0
  548. package/packages/bundled-features/src/ledger/index.ts +71 -0
  549. package/packages/bundled-features/src/ledger/recurring.ts +149 -0
  550. package/packages/bundled-features/src/ledger/reports.ts +164 -0
  551. package/packages/bundled-features/src/ledger/schemas.ts +71 -0
  552. package/packages/bundled-features/src/ledger/subject-reference.ts +10 -0
  553. package/packages/bundled-features/src/ledger/web/index.ts +36 -0
  554. package/packages/bundled-features/src/legal-pages/README.md +238 -0
  555. package/packages/bundled-features/src/legal-pages/changes.json +8 -0
  556. package/packages/bundled-features/src/legal-pages/constants.ts +54 -0
  557. package/packages/bundled-features/src/legal-pages/feature.ts +287 -0
  558. package/packages/bundled-features/src/legal-pages/index.ts +16 -0
  559. package/packages/bundled-features/src/legal-pages/markdown.ts +7 -0
  560. package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +81 -0
  561. package/packages/bundled-features/src/legal-pages/web/index.ts +4 -0
  562. package/packages/bundled-features/src/mail-foundation/changes.json +1 -0
  563. package/packages/bundled-features/src/mail-foundation/feature.ts +233 -0
  564. package/packages/bundled-features/src/mail-foundation/index.ts +17 -0
  565. package/packages/bundled-features/src/mail-transport-inmemory/changes.json +1 -0
  566. package/packages/bundled-features/src/mail-transport-inmemory/feature.ts +97 -0
  567. package/packages/bundled-features/src/mail-transport-inmemory/index.ts +3 -0
  568. package/packages/bundled-features/src/mail-transport-smtp/changes.json +20 -0
  569. package/packages/bundled-features/src/mail-transport-smtp/feature.ts +268 -0
  570. package/packages/bundled-features/src/mail-transport-smtp/index.ts +8 -0
  571. package/packages/bundled-features/src/managed-pages/branding.ts +173 -0
  572. package/packages/bundled-features/src/managed-pages/changes.json +25 -0
  573. package/packages/bundled-features/src/managed-pages/css-gate.ts +24 -0
  574. package/packages/bundled-features/src/managed-pages/feature.ts +267 -0
  575. package/packages/bundled-features/src/managed-pages/handlers/branding.query.ts +37 -0
  576. package/packages/bundled-features/src/managed-pages/handlers/by-slug.query.ts +40 -0
  577. package/packages/bundled-features/src/managed-pages/handlers/by-tenant-published.query.ts +55 -0
  578. package/packages/bundled-features/src/managed-pages/handlers/page-crud.ts +49 -0
  579. package/packages/bundled-features/src/managed-pages/handlers/set.write.ts +133 -0
  580. package/packages/bundled-features/src/managed-pages/i18n.ts +62 -0
  581. package/packages/bundled-features/src/managed-pages/index.ts +30 -0
  582. package/packages/bundled-features/src/managed-pages/screens/branding-screen.ts +115 -0
  583. package/packages/bundled-features/src/managed-pages/screens/page-screens.ts +89 -0
  584. package/packages/bundled-features/src/managed-pages/seeding.ts +99 -0
  585. package/packages/bundled-features/src/managed-pages/table.ts +80 -0
  586. package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +22 -0
  587. package/packages/bundled-features/src/managed-pages/web/i18n.ts +19 -0
  588. package/packages/bundled-features/src/managed-pages/web/index.ts +3 -0
  589. package/packages/bundled-features/src/metrics/changes.json +21 -0
  590. package/packages/bundled-features/src/metrics/compute.ts +243 -0
  591. package/packages/bundled-features/src/metrics/constants.ts +22 -0
  592. package/packages/bundled-features/src/metrics/default-metrics.ts +133 -0
  593. package/packages/bundled-features/src/metrics/feature.ts +159 -0
  594. package/packages/bundled-features/src/metrics/i18n.ts +18 -0
  595. package/packages/bundled-features/src/metrics/index.ts +33 -0
  596. package/packages/bundled-features/src/metrics/types.ts +81 -0
  597. package/packages/bundled-features/src/metrics/validate.ts +73 -0
  598. package/packages/bundled-features/src/metrics/window.ts +89 -0
  599. package/packages/bundled-features/src/notes-history/changes.json +30 -0
  600. package/packages/bundled-features/src/notes-history/constants.ts +34 -0
  601. package/packages/bundled-features/src/notes-history/entity.ts +128 -0
  602. package/packages/bundled-features/src/notes-history/executor.ts +22 -0
  603. package/packages/bundled-features/src/notes-history/feature.ts +150 -0
  604. package/packages/bundled-features/src/notes-history/handlers/add-note.write.ts +118 -0
  605. package/packages/bundled-features/src/notes-history/i18n.ts +3 -0
  606. package/packages/bundled-features/src/notes-history/index.ts +25 -0
  607. package/packages/bundled-features/src/notes-history/schemas.ts +17 -0
  608. package/packages/bundled-features/src/notes-history/web/client-plugin.tsx +16 -0
  609. package/packages/bundled-features/src/notes-history/web/i18n.ts +22 -0
  610. package/packages/bundled-features/src/notes-history/web/index.ts +8 -0
  611. package/packages/bundled-features/src/notes-history/web/notes-section.tsx +190 -0
  612. package/packages/bundled-features/src/notes-history-user-data/changes.json +8 -0
  613. package/packages/bundled-features/src/notes-history-user-data/hooks.ts +131 -0
  614. package/packages/bundled-features/src/notes-history-user-data/index.ts +34 -0
  615. package/packages/bundled-features/src/page-render/branding.ts +100 -0
  616. package/packages/bundled-features/src/page-render/cached-page-response.ts +25 -0
  617. package/packages/bundled-features/src/page-render/changes.json +14 -0
  618. package/packages/bundled-features/src/page-render/css-sanitize.ts +344 -0
  619. package/packages/bundled-features/src/page-render/index.ts +22 -0
  620. package/packages/bundled-features/src/page-render/layout.ts +115 -0
  621. package/packages/bundled-features/src/page-render/markdown.ts +31 -0
  622. package/packages/bundled-features/src/page-render/security-headers.ts +19 -0
  623. package/packages/bundled-features/src/page-render/web.ts +14 -0
  624. package/packages/bundled-features/src/personal-access-tokens/changes.json +25 -0
  625. package/packages/bundled-features/src/personal-access-tokens/constants.ts +45 -0
  626. package/packages/bundled-features/src/personal-access-tokens/expiry.ts +7 -0
  627. package/packages/bundled-features/src/personal-access-tokens/feature.ts +184 -0
  628. package/packages/bundled-features/src/personal-access-tokens/handlers/available-scopes.query.ts +29 -0
  629. package/packages/bundled-features/src/personal-access-tokens/handlers/create.write.ts +124 -0
  630. package/packages/bundled-features/src/personal-access-tokens/handlers/list.query.ts +117 -0
  631. package/packages/bundled-features/src/personal-access-tokens/handlers/revoke.write.ts +62 -0
  632. package/packages/bundled-features/src/personal-access-tokens/hash.ts +17 -0
  633. package/packages/bundled-features/src/personal-access-tokens/i18n.ts +64 -0
  634. package/packages/bundled-features/src/personal-access-tokens/index.ts +43 -0
  635. package/packages/bundled-features/src/personal-access-tokens/pat-revoked-event.ts +23 -0
  636. package/packages/bundled-features/src/personal-access-tokens/resolver.ts +53 -0
  637. package/packages/bundled-features/src/personal-access-tokens/revoke-for-user.ts +62 -0
  638. package/packages/bundled-features/src/personal-access-tokens/roles.ts +37 -0
  639. package/packages/bundled-features/src/personal-access-tokens/schema/api-token.ts +93 -0
  640. package/packages/bundled-features/src/personal-access-tokens/scopes.ts +43 -0
  641. package/packages/bundled-features/src/personal-access-tokens/screens.ts +131 -0
  642. package/packages/bundled-features/src/presets/changes.json +8 -0
  643. package/packages/bundled-features/src/presets/dsgvo-self-service.ts +33 -0
  644. package/packages/bundled-features/src/presets/index.ts +2 -0
  645. package/packages/bundled-features/src/presets/security-baseline.ts +19 -0
  646. package/packages/bundled-features/src/rate-limiting/changes.json +14 -0
  647. package/packages/bundled-features/src/rate-limiting/constants.ts +10 -0
  648. package/packages/bundled-features/src/rate-limiting/feature.ts +30 -0
  649. package/packages/bundled-features/src/rate-limiting/handlers/bucket-access.ts +45 -0
  650. package/packages/bundled-features/src/rate-limiting/handlers/status.query.ts +60 -0
  651. package/packages/bundled-features/src/rate-limiting/i18n.ts +10 -0
  652. package/packages/bundled-features/src/rate-limiting/index.ts +2 -0
  653. package/packages/bundled-features/src/readiness/changes.json +1 -0
  654. package/packages/bundled-features/src/readiness/constants.ts +7 -0
  655. package/packages/bundled-features/src/readiness/feature.ts +31 -0
  656. package/packages/bundled-features/src/readiness/handlers/status.query.ts +55 -0
  657. package/packages/bundled-features/src/readiness/index.ts +3 -0
  658. package/packages/bundled-features/src/renderer-foundation/README.md +86 -0
  659. package/packages/bundled-features/src/renderer-foundation/api.ts +106 -0
  660. package/packages/bundled-features/src/renderer-foundation/changes.json +8 -0
  661. package/packages/bundled-features/src/renderer-foundation/constants.ts +25 -0
  662. package/packages/bundled-features/src/renderer-foundation/feature.ts +52 -0
  663. package/packages/bundled-features/src/renderer-foundation/index.ts +28 -0
  664. package/packages/bundled-features/src/renderer-foundation/types.ts +131 -0
  665. package/packages/bundled-features/src/renderer-simple/changes.json +1 -0
  666. package/packages/bundled-features/src/renderer-simple/feature.ts +57 -0
  667. package/packages/bundled-features/src/renderer-simple/index.ts +2 -0
  668. package/packages/bundled-features/src/renderer-simple/resolve-variables.ts +57 -0
  669. package/packages/bundled-features/src/renderer-simple/simple-renderer.ts +65 -0
  670. package/packages/bundled-features/src/secrets/changes.json +29 -0
  671. package/packages/bundled-features/src/secrets/constants.ts +12 -0
  672. package/packages/bundled-features/src/secrets/db/queries/read.ts +16 -0
  673. package/packages/bundled-features/src/secrets/feature.ts +197 -0
  674. package/packages/bundled-features/src/secrets/handlers/delete.write.ts +29 -0
  675. package/packages/bundled-features/src/secrets/handlers/list.query.ts +40 -0
  676. package/packages/bundled-features/src/secrets/handlers/rotate.job.ts +166 -0
  677. package/packages/bundled-features/src/secrets/handlers/set.write.ts +60 -0
  678. package/packages/bundled-features/src/secrets/i18n.ts +10 -0
  679. package/packages/bundled-features/src/secrets/index.ts +23 -0
  680. package/packages/bundled-features/src/secrets/secrets-context.ts +261 -0
  681. package/packages/bundled-features/src/secrets/table.ts +69 -0
  682. package/packages/bundled-features/src/secrets/write-gate.ts +62 -0
  683. package/packages/bundled-features/src/seo/changes.json +20 -0
  684. package/packages/bundled-features/src/seo/constants.ts +60 -0
  685. package/packages/bundled-features/src/seo/feature.ts +317 -0
  686. package/packages/bundled-features/src/seo/handlers/seo-config.query.ts +38 -0
  687. package/packages/bundled-features/src/seo/index.ts +24 -0
  688. package/packages/bundled-features/src/seo/llms-txt.ts +33 -0
  689. package/packages/bundled-features/src/seo/robots-txt.ts +33 -0
  690. package/packages/bundled-features/src/seo/schema-builders.ts +57 -0
  691. package/packages/bundled-features/src/seo/sitemap.ts +33 -0
  692. package/packages/bundled-features/src/sessions/changes.json +45 -0
  693. package/packages/bundled-features/src/sessions/constants.ts +58 -0
  694. package/packages/bundled-features/src/sessions/db/queries/cleanup.ts +21 -0
  695. package/packages/bundled-features/src/sessions/feature.ts +240 -0
  696. package/packages/bundled-features/src/sessions/handlers/cleanup.job.ts +83 -0
  697. package/packages/bundled-features/src/sessions/handlers/detail.query.ts +51 -0
  698. package/packages/bundled-features/src/sessions/handlers/list.query.ts +92 -0
  699. package/packages/bundled-features/src/sessions/handlers/mine.query.ts +67 -0
  700. package/packages/bundled-features/src/sessions/handlers/revoke-all-for-user.write.ts +122 -0
  701. package/packages/bundled-features/src/sessions/handlers/revoke-all-others.write.ts +68 -0
  702. package/packages/bundled-features/src/sessions/handlers/revoke.write.ts +94 -0
  703. package/packages/bundled-features/src/sessions/i18n.ts +33 -0
  704. package/packages/bundled-features/src/sessions/index.ts +25 -0
  705. package/packages/bundled-features/src/sessions/schema/user-session.ts +91 -0
  706. package/packages/bundled-features/src/sessions/screens.ts +157 -0
  707. package/packages/bundled-features/src/sessions/session-callbacks.ts +302 -0
  708. package/packages/bundled-features/src/sessions/session-revoked-event.ts +37 -0
  709. package/packages/bundled-features/src/sessions/testing.ts +55 -0
  710. package/packages/bundled-features/src/shared/assert-erased.ts +26 -0
  711. package/packages/bundled-features/src/shared/changes.json +14 -0
  712. package/packages/bundled-features/src/shared/chunked-entity-migration.ts +89 -0
  713. package/packages/bundled-features/src/shared/classify-stored-envelope.ts +21 -0
  714. package/packages/bundled-features/src/shared/decrypt-stored-pii.ts +26 -0
  715. package/packages/bundled-features/src/shared/encrypt-for-direct-write.ts +29 -0
  716. package/packages/bundled-features/src/shared/entities-of.ts +17 -0
  717. package/packages/bundled-features/src/shared/grace-period.ts +21 -0
  718. package/packages/bundled-features/src/shared/has-where-rule.ts +11 -0
  719. package/packages/bundled-features/src/shared/identity-v3-hash.ts +97 -0
  720. package/packages/bundled-features/src/shared/index.ts +53 -0
  721. package/packages/bundled-features/src/shared/is-tenant-db.ts +9 -0
  722. package/packages/bundled-features/src/shared/lockout-counter.ts +108 -0
  723. package/packages/bundled-features/src/shared/map-with-concurrency.ts +38 -0
  724. package/packages/bundled-features/src/shared/parent-visibility.ts +104 -0
  725. package/packages/bundled-features/src/shared/password-hashing.ts +55 -0
  726. package/packages/bundled-features/src/shared/row-bound-grant.ts +128 -0
  727. package/packages/bundled-features/src/shared/run-in-sub-transaction.ts +35 -0
  728. package/packages/bundled-features/src/shared/session-locale-field.ts +9 -0
  729. package/packages/bundled-features/src/shared/session-timezone-field.ts +8 -0
  730. package/packages/bundled-features/src/shared/signed-token.ts +101 -0
  731. package/packages/bundled-features/src/shared/signup-handover.ts +67 -0
  732. package/packages/bundled-features/src/shared/single-use-token-store.ts +148 -0
  733. package/packages/bundled-features/src/shared/system-query.ts +5 -0
  734. package/packages/bundled-features/src/shared/token-burn-store.ts +57 -0
  735. package/packages/bundled-features/src/step-dispatcher/changes.json +32 -0
  736. package/packages/bundled-features/src/step-dispatcher/feature.ts +299 -0
  737. package/packages/bundled-features/src/step-dispatcher/index.ts +25 -0
  738. package/packages/bundled-features/src/step-dispatcher/mail-runner.ts +39 -0
  739. package/packages/bundled-features/src/step-dispatcher/webhook-runner.ts +221 -0
  740. package/packages/bundled-features/src/subscription-mollie/changes.json +28 -0
  741. package/packages/bundled-features/src/subscription-mollie/constants.ts +33 -0
  742. package/packages/bundled-features/src/subscription-mollie/feature.ts +169 -0
  743. package/packages/bundled-features/src/subscription-mollie/index.ts +14 -0
  744. package/packages/bundled-features/src/subscription-mollie/plugin-methods.ts +97 -0
  745. package/packages/bundled-features/src/subscription-mollie/verify-webhook.ts +259 -0
  746. package/packages/bundled-features/src/subscription-stripe/changes.json +80 -0
  747. package/packages/bundled-features/src/subscription-stripe/constants.ts +35 -0
  748. package/packages/bundled-features/src/subscription-stripe/feature.ts +251 -0
  749. package/packages/bundled-features/src/subscription-stripe/index.ts +18 -0
  750. package/packages/bundled-features/src/subscription-stripe/plugin-methods.ts +646 -0
  751. package/packages/bundled-features/src/subscription-stripe/runtime.ts +193 -0
  752. package/packages/bundled-features/src/subscription-stripe/verify-webhook.ts +436 -0
  753. package/packages/bundled-features/src/tags/aggregate-id.ts +23 -0
  754. package/packages/bundled-features/src/tags/changes.json +16 -0
  755. package/packages/bundled-features/src/tags/constants.ts +61 -0
  756. package/packages/bundled-features/src/tags/entity.ts +99 -0
  757. package/packages/bundled-features/src/tags/executor.ts +24 -0
  758. package/packages/bundled-features/src/tags/feature.ts +219 -0
  759. package/packages/bundled-features/src/tags/handlers/assign-tag.write.ts +101 -0
  760. package/packages/bundled-features/src/tags/handlers/create-tag.write.ts +27 -0
  761. package/packages/bundled-features/src/tags/handlers/delete-tag.write.ts +60 -0
  762. package/packages/bundled-features/src/tags/handlers/remove-tag.write.ts +53 -0
  763. package/packages/bundled-features/src/tags/handlers/update-tag.write.ts +36 -0
  764. package/packages/bundled-features/src/tags/i18n.ts +9 -0
  765. package/packages/bundled-features/src/tags/index.ts +48 -0
  766. package/packages/bundled-features/src/tags/schemas.ts +61 -0
  767. package/packages/bundled-features/src/tags/screens.ts +70 -0
  768. package/packages/bundled-features/src/tags/web/client-plugin.tsx +30 -0
  769. package/packages/bundled-features/src/tags/web/entity-tags.tsx +54 -0
  770. package/packages/bundled-features/src/tags/web/i18n.ts +34 -0
  771. package/packages/bundled-features/src/tags/web/index.ts +18 -0
  772. package/packages/bundled-features/src/tags/web/tag-chip.tsx +65 -0
  773. package/packages/bundled-features/src/tags/web/tag-filter.tsx +100 -0
  774. package/packages/bundled-features/src/tags/web/tag-manager.tsx +391 -0
  775. package/packages/bundled-features/src/tags/web/tag-picker.tsx +55 -0
  776. package/packages/bundled-features/src/tags/web/tag-section.tsx +179 -0
  777. package/packages/bundled-features/src/tags/web/tags-cell.tsx +46 -0
  778. package/packages/bundled-features/src/template-resolver/README.md +255 -0
  779. package/packages/bundled-features/src/template-resolver/api.ts +202 -0
  780. package/packages/bundled-features/src/template-resolver/changes.json +16 -0
  781. package/packages/bundled-features/src/template-resolver/constants.ts +54 -0
  782. package/packages/bundled-features/src/template-resolver/feature.ts +99 -0
  783. package/packages/bundled-features/src/template-resolver/handlers/by-slug.query.ts +61 -0
  784. package/packages/bundled-features/src/template-resolver/handlers/by-tenant.query.ts +63 -0
  785. package/packages/bundled-features/src/template-resolver/handlers/collection-item.query.ts +53 -0
  786. package/packages/bundled-features/src/template-resolver/handlers/collection-list.query.ts +56 -0
  787. package/packages/bundled-features/src/template-resolver/handlers/collection-set.write.ts +117 -0
  788. package/packages/bundled-features/src/template-resolver/handlers/collection-shared.ts +90 -0
  789. package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +44 -0
  790. package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +60 -0
  791. package/packages/bundled-features/src/template-resolver/handlers/set.write.ts +126 -0
  792. package/packages/bundled-features/src/template-resolver/handlers/shared.ts +51 -0
  793. package/packages/bundled-features/src/template-resolver/handlers/toggle-status.write.ts +46 -0
  794. package/packages/bundled-features/src/template-resolver/handlers/upsert-system.write.ts +81 -0
  795. package/packages/bundled-features/src/template-resolver/handlers/upsert-tenant.write.ts +105 -0
  796. package/packages/bundled-features/src/template-resolver/index.ts +44 -0
  797. package/packages/bundled-features/src/template-resolver/qualified-names.ts +40 -0
  798. package/packages/bundled-features/src/template-resolver/seeding.ts +323 -0
  799. package/packages/bundled-features/src/template-resolver/table.ts +90 -0
  800. package/packages/bundled-features/src/template-resolver/testing.ts +199 -0
  801. package/packages/bundled-features/src/template-resolver/user-content-table.ts +68 -0
  802. package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +516 -0
  803. package/packages/bundled-features/src/template-resolver/web/i18n.ts +25 -0
  804. package/packages/bundled-features/src/template-resolver/web/index.ts +8 -0
  805. package/packages/bundled-features/src/template-resolver-user-data/hooks.ts +40 -0
  806. package/packages/bundled-features/src/template-resolver-user-data/index.ts +25 -0
  807. package/packages/bundled-features/src/tenant/cancel-pending-invitation.ts +43 -0
  808. package/packages/bundled-features/src/tenant/changes.json +105 -0
  809. package/packages/bundled-features/src/tenant/command-schemas.ts +37 -0
  810. package/packages/bundled-features/src/tenant/constants.ts +78 -0
  811. package/packages/bundled-features/src/tenant/feature.ts +213 -0
  812. package/packages/bundled-features/src/tenant/handlers/active-tenant-ids.query.ts +30 -0
  813. package/packages/bundled-features/src/tenant/handlers/add-member.write.ts +64 -0
  814. package/packages/bundled-features/src/tenant/handlers/cancel-invitation.write.ts +68 -0
  815. package/packages/bundled-features/src/tenant/handlers/create.write.ts +37 -0
  816. package/packages/bundled-features/src/tenant/handlers/invitations.query.ts +58 -0
  817. package/packages/bundled-features/src/tenant/handlers/is-system-admin.ts +5 -0
  818. package/packages/bundled-features/src/tenant/handlers/list.query.ts +30 -0
  819. package/packages/bundled-features/src/tenant/handlers/me.query.ts +38 -0
  820. package/packages/bundled-features/src/tenant/handlers/member-directory.query.ts +108 -0
  821. package/packages/bundled-features/src/tenant/handlers/members.query.ts +73 -0
  822. package/packages/bundled-features/src/tenant/handlers/memberships.query.ts +58 -0
  823. package/packages/bundled-features/src/tenant/handlers/remove-member.write.ts +142 -0
  824. package/packages/bundled-features/src/tenant/handlers/resolve-user-ids.query.ts +44 -0
  825. package/packages/bundled-features/src/tenant/handlers/team-list.query.ts +257 -0
  826. package/packages/bundled-features/src/tenant/handlers/tenant-directory.query.ts +71 -0
  827. package/packages/bundled-features/src/tenant/handlers/toggle-enabled.write.ts +37 -0
  828. package/packages/bundled-features/src/tenant/handlers/update-member-roles.write.ts +208 -0
  829. package/packages/bundled-features/src/tenant/handlers/update.write.ts +55 -0
  830. package/packages/bundled-features/src/tenant/i18n.ts +61 -0
  831. package/packages/bundled-features/src/tenant/index.ts +24 -0
  832. package/packages/bundled-features/src/tenant/invitation-table.ts +104 -0
  833. package/packages/bundled-features/src/tenant/invited-membership.ts +97 -0
  834. package/packages/bundled-features/src/tenant/is-tenant-serving-public-content.ts +13 -0
  835. package/packages/bundled-features/src/tenant/last-tenant-admin.ts +43 -0
  836. package/packages/bundled-features/src/tenant/membership-roles.ts +34 -0
  837. package/packages/bundled-features/src/tenant/membership-table.ts +32 -0
  838. package/packages/bundled-features/src/tenant/schema/tenant.ts +73 -0
  839. package/packages/bundled-features/src/tenant/screens.ts +221 -0
  840. package/packages/bundled-features/src/tenant/seeding.ts +335 -0
  841. package/packages/bundled-features/src/tenant/testing.ts +8 -0
  842. package/packages/bundled-features/src/tenant/web/client-plugin.tsx +25 -0
  843. package/packages/bundled-features/src/tenant/web/index.ts +4 -0
  844. package/packages/bundled-features/src/tenant/web/member-roles-cell.tsx +21 -0
  845. package/packages/bundled-features/src/tenant/web/member-status-cell.tsx +27 -0
  846. package/packages/bundled-features/src/tenant/web/translate-or-raw.ts +13 -0
  847. package/packages/bundled-features/src/tenant-handover/changes.json +34 -0
  848. package/packages/bundled-features/src/tenant-handover/events.ts +32 -0
  849. package/packages/bundled-features/src/tenant-handover/feature.ts +46 -0
  850. package/packages/bundled-features/src/tenant-handover/grant.ts +43 -0
  851. package/packages/bundled-features/src/tenant-handover/handlers/claim.write.ts +134 -0
  852. package/packages/bundled-features/src/tenant-handover/index.ts +9 -0
  853. package/packages/bundled-features/src/tenant-handover/move-entity-graph.ts +355 -0
  854. package/packages/bundled-features/src/tenant-handover/root-anchor.ts +50 -0
  855. package/packages/bundled-features/src/tenant-handover/signup-handover-provider.ts +62 -0
  856. package/packages/bundled-features/src/tenant-handover/transfer-graph.ts +128 -0
  857. package/packages/bundled-features/src/tenant-lifecycle/boot-checks.ts +79 -0
  858. package/packages/bundled-features/src/tenant-lifecycle/changes.json +8 -0
  859. package/packages/bundled-features/src/tenant-lifecycle/constants.ts +56 -0
  860. package/packages/bundled-features/src/tenant-lifecycle/events.ts +46 -0
  861. package/packages/bundled-features/src/tenant-lifecycle/feature.ts +150 -0
  862. package/packages/bundled-features/src/tenant-lifecycle/handlers/cancel-destruction.write.ts +86 -0
  863. package/packages/bundled-features/src/tenant-lifecycle/handlers/request-destruction.write.ts +94 -0
  864. package/packages/bundled-features/src/tenant-lifecycle/index.ts +7 -0
  865. package/packages/bundled-features/src/tenant-lifecycle/lib/revoke-tenant-sessions.ts +16 -0
  866. package/packages/bundled-features/src/tenant-lifecycle/lifecycle-gate.ts +87 -0
  867. package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +387 -0
  868. package/packages/bundled-features/src/tenant-lifecycle/stages.ts +242 -0
  869. package/packages/bundled-features/src/tenant-settings/changes.json +1 -0
  870. package/packages/bundled-features/src/tenant-settings/config.ts +43 -0
  871. package/packages/bundled-features/src/tenant-settings/constants.ts +21 -0
  872. package/packages/bundled-features/src/tenant-settings/feature.ts +55 -0
  873. package/packages/bundled-features/src/tenant-settings/index.ts +8 -0
  874. package/packages/bundled-features/src/tenant-settings/tenant-defaults.ts +78 -0
  875. package/packages/bundled-features/src/tier-engine/aggregate-id.ts +28 -0
  876. package/packages/bundled-features/src/tier-engine/changes.json +16 -0
  877. package/packages/bundled-features/src/tier-engine/compose-app.ts +153 -0
  878. package/packages/bundled-features/src/tier-engine/constants.ts +28 -0
  879. package/packages/bundled-features/src/tier-engine/entity.ts +55 -0
  880. package/packages/bundled-features/src/tier-engine/feature.ts +549 -0
  881. package/packages/bundled-features/src/tier-engine/handlers/active-tier.query.ts +25 -0
  882. package/packages/bundled-features/src/tier-engine/handlers/get-tenant-tier.query.ts +32 -0
  883. package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +108 -0
  884. package/packages/bundled-features/src/tier-engine/i18n.ts +31 -0
  885. package/packages/bundled-features/src/tier-engine/index.ts +32 -0
  886. package/packages/bundled-features/src/tier-engine/tier-resolver.ts +38 -0
  887. package/packages/bundled-features/src/tier-engine/trial.ts +26 -0
  888. package/packages/bundled-features/src/tier-engine/web/client-plugin.tsx +21 -0
  889. package/packages/bundled-features/src/tier-engine/web/index.ts +7 -0
  890. package/packages/bundled-features/src/user/changes.json +48 -0
  891. package/packages/bundled-features/src/user/command-schemas.ts +15 -0
  892. package/packages/bundled-features/src/user/constants.ts +32 -0
  893. package/packages/bundled-features/src/user/db/queries/stream-tenant-backfill.ts +113 -0
  894. package/packages/bundled-features/src/user/feature.ts +61 -0
  895. package/packages/bundled-features/src/user/handlers/create.write.ts +136 -0
  896. package/packages/bundled-features/src/user/handlers/detail.query.ts +34 -0
  897. package/packages/bundled-features/src/user/handlers/find-for-auth.query.ts +51 -0
  898. package/packages/bundled-features/src/user/handlers/list.query.ts +123 -0
  899. package/packages/bundled-features/src/user/handlers/me.query.ts +38 -0
  900. package/packages/bundled-features/src/user/handlers/update-roles.ts +203 -0
  901. package/packages/bundled-features/src/user/handlers/update.write.ts +112 -0
  902. package/packages/bundled-features/src/user/i18n.ts +23 -0
  903. package/packages/bundled-features/src/user/index.ts +19 -0
  904. package/packages/bundled-features/src/user/principal-status.ts +47 -0
  905. package/packages/bundled-features/src/user/roles-input-schema.ts +20 -0
  906. package/packages/bundled-features/src/user/schema/user.ts +215 -0
  907. package/packages/bundled-features/src/user/screens.ts +54 -0
  908. package/packages/bundled-features/src/user/seeding.ts +139 -0
  909. package/packages/bundled-features/src/user/testing.ts +5 -0
  910. package/packages/bundled-features/src/user-data-rights/COMPLIANCE.md +202 -0
  911. package/packages/bundled-features/src/user-data-rights/README.md +109 -0
  912. package/packages/bundled-features/src/user-data-rights/audit-download.ts +125 -0
  913. package/packages/bundled-features/src/user-data-rights/boot-checks.ts +71 -0
  914. package/packages/bundled-features/src/user-data-rights/changes.json +116 -0
  915. package/packages/bundled-features/src/user-data-rights/constants.ts +63 -0
  916. package/packages/bundled-features/src/user-data-rights/db/queries/export-jobs.ts +28 -0
  917. package/packages/bundled-features/src/user-data-rights/db/queries/forget-cleanup.ts +25 -0
  918. package/packages/bundled-features/src/user-data-rights/deletion-token.ts +58 -0
  919. package/packages/bundled-features/src/user-data-rights/email-templates.ts +175 -0
  920. package/packages/bundled-features/src/user-data-rights/feature.ts +808 -0
  921. package/packages/bundled-features/src/user-data-rights/handlers/cancel-deletion.write.ts +83 -0
  922. package/packages/bundled-features/src/user-data-rights/handlers/confirm-deletion-by-token.write.ts +107 -0
  923. package/packages/bundled-features/src/user-data-rights/handlers/deletion-grace-period.ts +138 -0
  924. package/packages/bundled-features/src/user-data-rights/handlers/download-attempt-list.query.ts +20 -0
  925. package/packages/bundled-features/src/user-data-rights/handlers/download-by-job.query.ts +220 -0
  926. package/packages/bundled-features/src/user-data-rights/handlers/download-by-token.query.ts +259 -0
  927. package/packages/bundled-features/src/user-data-rights/handlers/export-job-detail.query.ts +13 -0
  928. package/packages/bundled-features/src/user-data-rights/handlers/export-job-list.query.ts +14 -0
  929. package/packages/bundled-features/src/user-data-rights/handlers/export-status.query.ts +75 -0
  930. package/packages/bundled-features/src/user-data-rights/handlers/lift-restriction.write.ts +88 -0
  931. package/packages/bundled-features/src/user-data-rights/handlers/list-download-attempts.query.ts +49 -0
  932. package/packages/bundled-features/src/user-data-rights/handlers/my-audit-log.query.ts +87 -0
  933. package/packages/bundled-features/src/user-data-rights/handlers/request-deletion-by-email.write.ts +127 -0
  934. package/packages/bundled-features/src/user-data-rights/handlers/request-deletion.write.ts +117 -0
  935. package/packages/bundled-features/src/user-data-rights/handlers/request-export.write.ts +165 -0
  936. package/packages/bundled-features/src/user-data-rights/handlers/restrict-account.write.ts +133 -0
  937. package/packages/bundled-features/src/user-data-rights/handlers/run-forget-cleanup.write.ts +95 -0
  938. package/packages/bundled-features/src/user-data-rights/i18n.ts +39 -0
  939. package/packages/bundled-features/src/user-data-rights/index.ts +33 -0
  940. package/packages/bundled-features/src/user-data-rights/lib/default-mailers.ts +120 -0
  941. package/packages/bundled-features/src/user-data-rights/lib/deny-if-target-outside-admin-tenant.ts +32 -0
  942. package/packages/bundled-features/src/user-data-rights/lib/is-admin-actor.ts +19 -0
  943. package/packages/bundled-features/src/user-data-rights/lib/mail-transport-resolver.ts +50 -0
  944. package/packages/bundled-features/src/user-data-rights/lib/resolve-tenant-model.ts +34 -0
  945. package/packages/bundled-features/src/user-data-rights/lib/storage-provider-resolver.ts +49 -0
  946. package/packages/bundled-features/src/user-data-rights/lib/update-user-lifecycle.ts +126 -0
  947. package/packages/bundled-features/src/user-data-rights/run-export-jobs.ts +998 -0
  948. package/packages/bundled-features/src/user-data-rights/run-forget-cleanup.ts +665 -0
  949. package/packages/bundled-features/src/user-data-rights/run-user-export.ts +346 -0
  950. package/packages/bundled-features/src/user-data-rights/schema/download-attempt.ts +57 -0
  951. package/packages/bundled-features/src/user-data-rights/schema/download-token.ts +119 -0
  952. package/packages/bundled-features/src/user-data-rights/schema/export-job.ts +174 -0
  953. package/packages/bundled-features/src/user-data-rights/screens.ts +77 -0
  954. package/packages/bundled-features/src/user-data-rights/token-helpers.ts +67 -0
  955. package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +52 -0
  956. package/packages/bundled-features/src/user-data-rights/web/confirm-deletion-screen.tsx +97 -0
  957. package/packages/bundled-features/src/user-data-rights/web/i18n.ts +93 -0
  958. package/packages/bundled-features/src/user-data-rights/web/index.ts +15 -0
  959. package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +185 -0
  960. package/packages/bundled-features/src/user-data-rights/web/public-deletion-gate.tsx +42 -0
  961. package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +104 -0
  962. package/packages/bundled-features/src/user-data-rights/zip-path.ts +94 -0
  963. package/packages/bundled-features/src/user-data-rights-defaults/changes.json +13 -0
  964. package/packages/bundled-features/src/user-data-rights-defaults/feature.ts +136 -0
  965. package/packages/bundled-features/src/user-data-rights-defaults/hooks/api-token.userdata-hook.ts +36 -0
  966. package/packages/bundled-features/src/user-data-rights-defaults/hooks/config-value.userdata-hook.ts +57 -0
  967. package/packages/bundled-features/src/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.ts +36 -0
  968. package/packages/bundled-features/src/user-data-rights-defaults/hooks/feature-mounted.ts +10 -0
  969. package/packages/bundled-features/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +280 -0
  970. package/packages/bundled-features/src/user-data-rights-defaults/hooks/in-app-message.userdata-hook.ts +37 -0
  971. package/packages/bundled-features/src/user-data-rights-defaults/hooks/job-run.userdata-hook.ts +34 -0
  972. package/packages/bundled-features/src/user-data-rights-defaults/hooks/notification-preference.userdata-hook.ts +63 -0
  973. package/packages/bundled-features/src/user-data-rights-defaults/hooks/tenant-invitation.userdata-hook.ts +144 -0
  974. package/packages/bundled-features/src/user-data-rights-defaults/hooks/user-session.userdata-hook.ts +41 -0
  975. package/packages/bundled-features/src/user-data-rights-defaults/hooks/user.userdata-hook.ts +126 -0
  976. package/packages/bundled-features/src/user-data-rights-defaults/index.ts +32 -0
  977. package/packages/bundled-features/src/user-profile/changes.json +21 -0
  978. package/packages/bundled-features/src/user-profile/constants.ts +35 -0
  979. package/packages/bundled-features/src/user-profile/feature.ts +154 -0
  980. package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +99 -0
  981. package/packages/bundled-features/src/user-profile/i18n.ts +46 -0
  982. package/packages/bundled-features/src/user-profile/index.ts +11 -0
  983. package/packages/bundled-features/src/user-profile/web/client-plugin.ts +45 -0
  984. package/packages/bundled-features/src/user-profile/web/index.ts +6 -0
  985. package/packages/bundled-features/src/user-profile/web/profile-screen.tsx +234 -0
  986. package/packages/bundled-features/src/workflow-runner/aggregate-id.ts +20 -0
  987. package/packages/bundled-features/src/workflow-runner/changes.json +20 -0
  988. package/packages/bundled-features/src/workflow-runner/db/queries/due-runs.ts +24 -0
  989. package/packages/bundled-features/src/workflow-runner/event-subscriber.ts +113 -0
  990. package/packages/bundled-features/src/workflow-runner/event-trigger.ts +121 -0
  991. package/packages/bundled-features/src/workflow-runner/feature.ts +96 -0
  992. package/packages/bundled-features/src/workflow-runner/handlers/resume-run.write.ts +358 -0
  993. package/packages/bundled-features/src/workflow-runner/index.ts +12 -0
  994. package/packages/bundled-features/src/workflow-runner/pending-projection.ts +158 -0
  995. package/packages/bundled-features/src/workflow-runner/runner.ts +153 -0
  996. package/packages/bundled-features/src/workflow-runner/tables.ts +95 -0
  997. package/packages/bundled-features/src/workflow-runner/workflow-registry.ts +23 -0
  998. package/samples/apps/admin-console/README.md +90 -0
  999. package/samples/apps/admin-console/package.json +22 -0
  1000. package/samples/apps/admin-console/playwright.config.ts +13 -0
  1001. package/samples/apps/admin-console/src/app/auth-constants.ts +10 -0
  1002. package/samples/apps/admin-console/src/app/client.tsx +29 -0
  1003. package/samples/apps/admin-console/src/app/home-screen.tsx +14 -0
  1004. package/samples/apps/admin-console/src/app/seed-users.ts +42 -0
  1005. package/samples/apps/admin-console/src/app/server.ts +35 -0
  1006. package/samples/apps/admin-console/src/app/shell.tsx +48 -0
  1007. package/samples/apps/admin-console/src/run-config.ts +60 -0
  1008. package/samples/apps/admin-console/tsconfig.json +23 -0
  1009. package/samples/apps/cap-billing-demo/README.md +151 -0
  1010. package/samples/apps/cap-billing-demo/bin/server.ts +37 -0
  1011. package/samples/apps/cap-billing-demo/package.json +16 -0
  1012. package/samples/apps/cap-billing-demo/src/feature.ts +208 -0
  1013. package/samples/apps/cap-billing-demo/src/run-config.ts +51 -0
  1014. package/samples/apps/cap-billing-demo/src/tier-map.ts +46 -0
  1015. package/samples/apps/cap-billing-demo/tsconfig.json +21 -0
  1016. package/samples/apps/config-demo/README.md +81 -0
  1017. package/samples/apps/config-demo/package.json +22 -0
  1018. package/samples/apps/config-demo/playwright.config.ts +11 -0
  1019. package/samples/apps/config-demo/src/app/client.tsx +12 -0
  1020. package/samples/apps/config-demo/src/app/server.ts +31 -0
  1021. package/samples/apps/config-demo/src/app/shell.tsx +31 -0
  1022. package/samples/apps/config-demo/src/features/demo/feature.ts +84 -0
  1023. package/samples/apps/config-demo/src/features/demo/i18n.ts +23 -0
  1024. package/samples/apps/config-demo/src/features/demo/web/index.ts +7 -0
  1025. package/samples/apps/config-demo/tsconfig.json +41 -0
  1026. package/samples/apps/marketing-demo/README.md +89 -0
  1027. package/samples/apps/marketing-demo/package.json +22 -0
  1028. package/samples/apps/marketing-demo/playwright.config.ts +16 -0
  1029. package/samples/apps/marketing-demo/src/app/client.tsx +13 -0
  1030. package/samples/apps/marketing-demo/src/app/seed-data.ts +443 -0
  1031. package/samples/apps/marketing-demo/src/app/seed.ts +143 -0
  1032. package/samples/apps/marketing-demo/src/app/server.ts +25 -0
  1033. package/samples/apps/marketing-demo/src/app/shell.tsx +37 -0
  1034. package/samples/apps/marketing-demo/src/db/queries/seed-counts.ts +18 -0
  1035. package/samples/apps/marketing-demo/src/features/assets/feature.ts +54 -0
  1036. package/samples/apps/marketing-demo/src/features/assets/i18n.ts +103 -0
  1037. package/samples/apps/marketing-demo/src/features/assets/schema/asset.ts +129 -0
  1038. package/samples/apps/marketing-demo/src/features/assets/schema/index.ts +11 -0
  1039. package/samples/apps/marketing-demo/src/features/assets/web/index.ts +10 -0
  1040. package/samples/apps/marketing-demo/src/features/helpdesk/feature.ts +52 -0
  1041. package/samples/apps/marketing-demo/src/features/helpdesk/i18n.ts +100 -0
  1042. package/samples/apps/marketing-demo/src/features/helpdesk/schema/index.ts +13 -0
  1043. package/samples/apps/marketing-demo/src/features/helpdesk/schema/ticket.ts +136 -0
  1044. package/samples/apps/marketing-demo/src/features/helpdesk/web/index.ts +7 -0
  1045. package/samples/apps/marketing-demo/tsconfig.json +23 -0
  1046. package/samples/apps/showcase/README.md +123 -0
  1047. package/samples/apps/showcase/kumiko.config.ts +10 -0
  1048. package/samples/apps/showcase/package.json +23 -0
  1049. package/samples/apps/showcase/playwright.config.ts +13 -0
  1050. package/samples/apps/showcase/src/app/client.tsx +15 -0
  1051. package/samples/apps/showcase/src/app/mount-public-screenshots.ts +26 -0
  1052. package/samples/apps/showcase/src/app/seed-items.ts +129 -0
  1053. package/samples/apps/showcase/src/app/server.ts +30 -0
  1054. package/samples/apps/showcase/src/app/shell.tsx +110 -0
  1055. package/samples/apps/showcase/src/features/demos/feature.ts +168 -0
  1056. package/samples/apps/showcase/src/features/demos/i18n.ts +45 -0
  1057. package/samples/apps/showcase/src/features/demos/index.ts +5 -0
  1058. package/samples/apps/showcase/src/features/demos/web/components/page.tsx +50 -0
  1059. package/samples/apps/showcase/src/features/demos/web/index.ts +30 -0
  1060. package/samples/apps/showcase/src/features/demos/web/pages/banner.tsx +36 -0
  1061. package/samples/apps/showcase/src/features/demos/web/pages/buttons.tsx +55 -0
  1062. package/samples/apps/showcase/src/features/demos/web/pages/dialog.tsx +89 -0
  1063. package/samples/apps/showcase/src/features/demos/web/pages/inputs.tsx +242 -0
  1064. package/samples/apps/showcase/src/features/demos/web/pages/layout.tsx +203 -0
  1065. package/samples/apps/showcase/src/features/demos/web/pages/sidebar-panel.tsx +144 -0
  1066. package/samples/apps/showcase/src/features/demos/web/pages/text.tsx +27 -0
  1067. package/samples/apps/showcase/src/features/demos/web/pages/toast.tsx +71 -0
  1068. package/samples/apps/showcase/src/features/items/feature.ts +109 -0
  1069. package/samples/apps/showcase/src/features/items/i18n.ts +79 -0
  1070. package/samples/apps/showcase/src/features/items/index.ts +6 -0
  1071. package/samples/apps/showcase/src/features/items/schema/index.ts +13 -0
  1072. package/samples/apps/showcase/src/features/items/schema/item.ts +215 -0
  1073. package/samples/apps/showcase/src/features/items/web/index.ts +15 -0
  1074. package/samples/apps/styleguide/README.md +47 -0
  1075. package/samples/apps/styleguide/package.json +22 -0
  1076. package/samples/apps/styleguide/playwright.config.ts +11 -0
  1077. package/samples/apps/styleguide/src/app/client.tsx +28 -0
  1078. package/samples/apps/styleguide/src/app/seed.ts +58 -0
  1079. package/samples/apps/styleguide/src/app/server.ts +51 -0
  1080. package/samples/apps/styleguide/src/app/shell.tsx +66 -0
  1081. package/samples/apps/styleguide/src/features/ai-settings/catalog.ts +82 -0
  1082. package/samples/apps/styleguide/src/features/ai-settings/feature.ts +295 -0
  1083. package/samples/apps/styleguide/src/features/ai-settings/i18n.ts +54 -0
  1084. package/samples/apps/styleguide/src/features/ai-settings/seed.ts +29 -0
  1085. package/samples/apps/styleguide/src/features/ai-settings/web.ts +14 -0
  1086. package/samples/apps/styleguide/src/features/content/feature.ts +39 -0
  1087. package/samples/apps/styleguide/src/features/content/web.tsx +160 -0
  1088. package/samples/apps/styleguide/src/features/demo/feature.ts +288 -0
  1089. package/samples/apps/styleguide/src/features/demo/i18n.ts +38 -0
  1090. package/samples/apps/styleguide/src/features/demo/web.ts +13 -0
  1091. package/samples/apps/styleguide/src/features/examples/feature.ts +173 -0
  1092. package/samples/apps/styleguide/src/features/examples/i18n.ts +69 -0
  1093. package/samples/apps/styleguide/src/features/examples/web.ts +14 -0
  1094. package/samples/apps/styleguide/src/features/gallery/feature.ts +35 -0
  1095. package/samples/apps/styleguide/src/features/gallery/web/Gallery.tsx +832 -0
  1096. package/samples/apps/styleguide/src/features/gallery/web/index.ts +16 -0
  1097. package/samples/apps/styleguide/src/features/shared-i18n.ts +16 -0
  1098. package/samples/apps/styleguide/src/features/widgets/ai-text-demo.ts +70 -0
  1099. package/samples/apps/styleguide/src/features/widgets/feature.ts +314 -0
  1100. package/samples/apps/styleguide/src/features/widgets/i18n.ts +208 -0
  1101. package/samples/apps/styleguide/src/features/widgets/lib/format.ts +32 -0
  1102. package/samples/apps/styleguide/src/features/widgets/web/DashboardFilterEcho.tsx +21 -0
  1103. package/samples/apps/styleguide/src/features/widgets/web/DashboardKpiIcon.tsx +20 -0
  1104. package/samples/apps/styleguide/src/features/widgets/web/FormExamples.tsx +352 -0
  1105. package/samples/apps/styleguide/src/features/widgets/web/Widgets.tsx +656 -0
  1106. package/samples/apps/styleguide/src/features/widgets/web/index.ts +30 -0
  1107. package/samples/apps/styleguide/tsconfig.json +41 -0
  1108. package/samples/apps/ui-walkthrough/README.md +105 -0
  1109. package/samples/apps/ui-walkthrough/kumiko/schema.ts +14 -0
  1110. package/samples/apps/ui-walkthrough/package.json +23 -0
  1111. package/samples/apps/ui-walkthrough/playwright.config.ts +29 -0
  1112. package/samples/apps/ui-walkthrough/scripts/emit-e2e-data.ts +19 -0
  1113. package/samples/apps/ui-walkthrough/src/app/assistant-action.tsx +49 -0
  1114. package/samples/apps/ui-walkthrough/src/app/auth-constants.ts +20 -0
  1115. package/samples/apps/ui-walkthrough/src/app/client.tsx +21 -0
  1116. package/samples/apps/ui-walkthrough/src/app/seed-rental.ts +266 -0
  1117. package/samples/apps/ui-walkthrough/src/app/seed-vehicles.ts +172 -0
  1118. package/samples/apps/ui-walkthrough/src/app/seed.ts +25 -0
  1119. package/samples/apps/ui-walkthrough/src/app/server.ts +56 -0
  1120. package/samples/apps/ui-walkthrough/src/app/shell.tsx +67 -0
  1121. package/samples/apps/ui-walkthrough/src/db/queries/row-counts.ts +24 -0
  1122. package/samples/apps/ui-walkthrough/src/db/queries/task-counts.ts +10 -0
  1123. package/samples/apps/ui-walkthrough/src/features/rental/entities.ts +57 -0
  1124. package/samples/apps/ui-walkthrough/src/features/rental/feature.ts +258 -0
  1125. package/samples/apps/ui-walkthrough/src/features/rental/i18n.ts +214 -0
  1126. package/samples/apps/ui-walkthrough/src/features/rental/index.ts +2 -0
  1127. package/samples/apps/ui-walkthrough/src/features/rental/lease-support.ts +110 -0
  1128. package/samples/apps/ui-walkthrough/src/features/rental/qualified-names.ts +12 -0
  1129. package/samples/apps/ui-walkthrough/src/features/rental/screens.ts +450 -0
  1130. package/samples/apps/ui-walkthrough/src/features/rental/web/index.ts +12 -0
  1131. package/samples/apps/ui-walkthrough/src/features/rental/web/lease-hub-components.tsx +29 -0
  1132. package/samples/apps/ui-walkthrough/src/features/tasks/feature.ts +49 -0
  1133. package/samples/apps/ui-walkthrough/src/features/tasks/i18n.ts +39 -0
  1134. package/samples/apps/ui-walkthrough/src/features/tasks/index.ts +4 -0
  1135. package/samples/apps/ui-walkthrough/src/features/tasks/schema/index.ts +3 -0
  1136. package/samples/apps/ui-walkthrough/src/features/tasks/schema/task.ts +85 -0
  1137. package/samples/apps/ui-walkthrough/src/features/tasks/web/index.ts +10 -0
  1138. package/samples/apps/ui-walkthrough/src/features/translations.ts +17 -0
  1139. package/samples/apps/ui-walkthrough/src/features/vehicles/campaign-support.ts +22 -0
  1140. package/samples/apps/ui-walkthrough/src/features/vehicles/entities.ts +89 -0
  1141. package/samples/apps/ui-walkthrough/src/features/vehicles/feature.ts +95 -0
  1142. package/samples/apps/ui-walkthrough/src/features/vehicles/i18n.ts +222 -0
  1143. package/samples/apps/ui-walkthrough/src/features/vehicles/index.ts +2 -0
  1144. package/samples/apps/ui-walkthrough/src/features/vehicles/qualified-names.ts +7 -0
  1145. package/samples/apps/ui-walkthrough/src/features/vehicles/screens.ts +188 -0
  1146. package/samples/apps/ui-walkthrough/src/features/vehicles/web/index.ts +7 -0
  1147. package/samples/apps/ui-walkthrough/src/run-config.ts +15 -0
  1148. package/samples/apps/ui-walkthrough/tsconfig.json +19 -0
  1149. package/samples/apps/use-all-bundled/README.md +57 -0
  1150. package/samples/apps/use-all-bundled/bin/main.ts +53 -0
  1151. package/samples/apps/use-all-bundled/feature-manifest.json +2963 -0
  1152. package/samples/apps/use-all-bundled/kumiko/migrations/0003_notes-history.rebuild.json +4 -0
  1153. package/samples/apps/use-all-bundled/kumiko/migrations/0005_user-content-entries.rebuild.json +4 -0
  1154. package/samples/apps/use-all-bundled/kumiko/migrations/0007_form-draft.rebuild.json +4 -0
  1155. package/samples/apps/use-all-bundled/kumiko/migrations/0008_ledger-date-column-1924.rebuild.json +4 -0
  1156. package/samples/apps/use-all-bundled/kumiko/migrations/0009_form-draft-owner-required.rebuild.json +4 -0
  1157. package/samples/apps/use-all-bundled/kumiko/migrations/0012_add-user-email-unique-index.rebuild.json +4 -0
  1158. package/samples/apps/use-all-bundled/kumiko/migrations/0015_pii-field-api-v2-bidx.rebuild.json +4 -0
  1159. package/samples/apps/use-all-bundled/kumiko/migrations/0023_add-note-mentions.rebuild.json +4 -0
  1160. package/samples/apps/use-all-bundled/kumiko/migrations/0028_add-ledger-account-code-unique-index.rebuild.json +4 -0
  1161. package/samples/apps/use-all-bundled/kumiko/schema.ts +24 -0
  1162. package/samples/apps/use-all-bundled/kumiko.config.ts +24 -0
  1163. package/samples/apps/use-all-bundled/package.json +30 -0
  1164. package/samples/apps/use-all-bundled/playwright.config.ts +10 -0
  1165. package/samples/apps/use-all-bundled/schema/generate.ts +577 -0
  1166. package/samples/apps/use-all-bundled/schema/migrations/meta/0000_snapshot.json +3055 -0
  1167. package/samples/apps/use-all-bundled/schema/migrations/meta/_journal.json +13 -0
  1168. package/samples/apps/use-all-bundled/schema/schema.generated.ts +88 -0
  1169. package/samples/apps/use-all-bundled/schema/schema.ts +9 -0
  1170. package/samples/apps/use-all-bundled/scripts/check-coverage.ts +203 -0
  1171. package/samples/apps/use-all-bundled/scripts/gen-feature-manifest.ts +85 -0
  1172. package/samples/apps/use-all-bundled/scripts/gen-sample-index.ts +290 -0
  1173. package/samples/apps/use-all-bundled/src/app/auth-constants.ts +16 -0
  1174. package/samples/apps/use-all-bundled/src/app/cap-overview-caps.ts +71 -0
  1175. package/samples/apps/use-all-bundled/src/app/cap-overview-labels-feature.ts +18 -0
  1176. package/samples/apps/use-all-bundled/src/app/client.tsx +126 -0
  1177. package/samples/apps/use-all-bundled/src/app/collection-labels-feature.ts +16 -0
  1178. package/samples/apps/use-all-bundled/src/app/dev-app-options.ts +75 -0
  1179. package/samples/apps/use-all-bundled/src/app/notes-feature.ts +174 -0
  1180. package/samples/apps/use-all-bundled/src/app/screens-feature.ts +39 -0
  1181. package/samples/apps/use-all-bundled/src/app/seed.ts +429 -0
  1182. package/samples/apps/use-all-bundled/src/app/server.ts +5 -0
  1183. package/samples/apps/use-all-bundled/src/app/shell.tsx +62 -0
  1184. package/samples/apps/use-all-bundled/src/run-config.ts +433 -0
  1185. package/samples/apps/use-all-bundled/tsconfig.json +31 -0
  1186. package/samples/apps/user-data-rights-demo/README.md +159 -0
  1187. package/samples/apps/user-data-rights-demo/bin/server.ts +35 -0
  1188. package/samples/apps/user-data-rights-demo/package.json +16 -0
  1189. package/samples/apps/user-data-rights-demo/src/feature.ts +200 -0
  1190. package/samples/apps/user-data-rights-demo/src/run-config.ts +48 -0
  1191. package/samples/apps/user-data-rights-demo/tsconfig.json +21 -0
  1192. package/samples/apps/workspaces/README.md +69 -0
  1193. package/samples/apps/workspaces/package.json +20 -0
  1194. package/samples/apps/workspaces/playwright.config.ts +18 -0
  1195. package/samples/apps/workspaces/src/app/auth-constants.ts +6 -0
  1196. package/samples/apps/workspaces/src/app/client.tsx +11 -0
  1197. package/samples/apps/workspaces/src/app/server.ts +47 -0
  1198. package/samples/apps/workspaces/src/app/shell.tsx +51 -0
  1199. package/samples/apps/workspaces/src/features/demo/feature.ts +89 -0
  1200. package/samples/apps/workspaces/src/features/demo/i18n.ts +20 -0
  1201. package/samples/apps/workspaces/src/features/demo/index.ts +2 -0
  1202. package/samples/apps/workspaces/src/features/demo/schema/index.ts +1 -0
  1203. package/samples/apps/workspaces/src/features/demo/schema/order.ts +43 -0
  1204. package/samples/apps/workspaces/src/features/demo/web/index.ts +7 -0
  1205. package/samples/apps/workspaces/src/features/demo-driver/feature.ts +31 -0
  1206. package/samples/apps/workspaces/src/features/demo-driver/i18n.ts +10 -0
  1207. package/samples/apps/workspaces/src/features/demo-driver/index.ts +2 -0
  1208. package/samples/apps/workspaces/src/features/demo-driver/web/index.ts +7 -0
  1209. package/samples/recipes/access-control/README.md +21 -0
  1210. package/samples/recipes/access-control/package.json +8 -0
  1211. package/samples/recipes/access-control/src/feature.ts +145 -0
  1212. package/samples/recipes/anonymous-access/README.md +21 -0
  1213. package/samples/recipes/anonymous-access/package.json +8 -0
  1214. package/samples/recipes/anonymous-access/src/feature.ts +132 -0
  1215. package/samples/recipes/anonymous-access-multitenant/README.md +21 -0
  1216. package/samples/recipes/anonymous-access-multitenant/package.json +8 -0
  1217. package/samples/recipes/anonymous-access-multitenant/src/feature.ts +65 -0
  1218. package/samples/recipes/anonymous-access-multitenant/src/subdomain-resolver.ts +105 -0
  1219. package/samples/recipes/apex-landing/README.md +32 -0
  1220. package/samples/recipes/apex-landing/package.json +16 -0
  1221. package/samples/recipes/apex-landing/playwright.config.ts +23 -0
  1222. package/samples/recipes/apex-landing/src/constants.ts +7 -0
  1223. package/samples/recipes/apex-landing/src/feature.ts +307 -0
  1224. package/samples/recipes/apex-surface-auth/README.md +114 -0
  1225. package/samples/recipes/apex-surface-auth/package.json +9 -0
  1226. package/samples/recipes/apex-surface-auth/src/feature.ts +113 -0
  1227. package/samples/recipes/api-worker-split/README.md +68 -0
  1228. package/samples/recipes/api-worker-split/bin/api.ts +13 -0
  1229. package/samples/recipes/api-worker-split/bin/kumiko.ts +7 -0
  1230. package/samples/recipes/api-worker-split/bin/worker.ts +24 -0
  1231. package/samples/recipes/api-worker-split/package.json +16 -0
  1232. package/samples/recipes/api-worker-split/src/feature.ts +167 -0
  1233. package/samples/recipes/auth-claims/README.md +21 -0
  1234. package/samples/recipes/auth-claims/package.json +8 -0
  1235. package/samples/recipes/auth-claims/src/feature.ts +123 -0
  1236. package/samples/recipes/auth-foundation-providers/README.md +19 -0
  1237. package/samples/recipes/auth-foundation-providers/package.json +9 -0
  1238. package/samples/recipes/auth-foundation-providers/src/feature.ts +76 -0
  1239. package/samples/recipes/auth-mfa/README.md +67 -0
  1240. package/samples/recipes/auth-mfa/package.json +9 -0
  1241. package/samples/recipes/auth-mfa/src/feature.ts +72 -0
  1242. package/samples/recipes/basic-entity/README.md +64 -0
  1243. package/samples/recipes/basic-entity/package.json +8 -0
  1244. package/samples/recipes/basic-entity/src/feature.ts +45 -0
  1245. package/samples/recipes/boot-check/README.md +54 -0
  1246. package/samples/recipes/boot-check/package.json +8 -0
  1247. package/samples/recipes/boot-check/src/feature.ts +29 -0
  1248. package/samples/recipes/compliance-profiles-demo/README.md +68 -0
  1249. package/samples/recipes/compliance-profiles-demo/package.json +9 -0
  1250. package/samples/recipes/compliance-profiles-demo/src/feature.ts +27 -0
  1251. package/samples/recipes/cross-feature-events/README.md +63 -0
  1252. package/samples/recipes/cross-feature-events/package.json +9 -0
  1253. package/samples/recipes/cross-feature-events/src/feature.ts +122 -0
  1254. package/samples/recipes/crypto-shredding-hr/README.md +74 -0
  1255. package/samples/recipes/crypto-shredding-hr/package.json +8 -0
  1256. package/samples/recipes/crypto-shredding-hr/src/feature.ts +38 -0
  1257. package/samples/recipes/currencies-global/README.md +21 -0
  1258. package/samples/recipes/currencies-global/package.json +8 -0
  1259. package/samples/recipes/currencies-global/src/entities/currency.ts +15 -0
  1260. package/samples/recipes/currencies-global/src/entities/invoice.ts +18 -0
  1261. package/samples/recipes/currencies-global/src/entities/tenant-currency.ts +19 -0
  1262. package/samples/recipes/currencies-global/src/feature.ts +62 -0
  1263. package/samples/recipes/currencies-global/src/handlers/invoice-create.write.ts +68 -0
  1264. package/samples/recipes/currencies-global/src/handlers/invoice-detail.query.ts +19 -0
  1265. package/samples/recipes/currencies-global/src/handlers/tenant-currency-assign.write.ts +40 -0
  1266. package/samples/recipes/currencies-per-tenant/README.md +21 -0
  1267. package/samples/recipes/currencies-per-tenant/package.json +8 -0
  1268. package/samples/recipes/currencies-per-tenant/src/entities/currency.ts +20 -0
  1269. package/samples/recipes/currencies-per-tenant/src/entities/invoice.ts +18 -0
  1270. package/samples/recipes/currencies-per-tenant/src/feature.ts +29 -0
  1271. package/samples/recipes/currencies-per-tenant/src/handlers/currency-create.write.ts +24 -0
  1272. package/samples/recipes/currencies-per-tenant/src/handlers/invoice-create.write.ts +66 -0
  1273. package/samples/recipes/currencies-per-tenant/src/handlers/invoice-detail.query.ts +19 -0
  1274. package/samples/recipes/custom-fields-basic/README.md +84 -0
  1275. package/samples/recipes/custom-fields-basic/package.json +9 -0
  1276. package/samples/recipes/custom-fields-basic/src/feature.ts +98 -0
  1277. package/samples/recipes/custom-handlers/README.md +46 -0
  1278. package/samples/recipes/custom-handlers/package.json +8 -0
  1279. package/samples/recipes/custom-handlers/src/feature.ts +118 -0
  1280. package/samples/recipes/delivery-notifications/README.md +48 -0
  1281. package/samples/recipes/delivery-notifications/package.json +9 -0
  1282. package/samples/recipes/delivery-notifications/src/feature.ts +108 -0
  1283. package/samples/recipes/designer-demo/README.md +16 -0
  1284. package/samples/recipes/designer-demo/package.json +8 -0
  1285. package/samples/recipes/designer-demo/src/feature.ts +55 -0
  1286. package/samples/recipes/e2e-generator/README.md +19 -0
  1287. package/samples/recipes/e2e-generator/package.json +8 -0
  1288. package/samples/recipes/e2e-generator/src/feature.ts +83 -0
  1289. package/samples/recipes/embedded/README.md +33 -0
  1290. package/samples/recipes/embedded/package.json +8 -0
  1291. package/samples/recipes/embedded/src/entities/contact.ts +46 -0
  1292. package/samples/recipes/embedded/src/entities/invoice.ts +35 -0
  1293. package/samples/recipes/embedded/src/entities/product.ts +14 -0
  1294. package/samples/recipes/embedded/src/feature.ts +58 -0
  1295. package/samples/recipes/embedded/src/handlers/contact-create.write.ts +45 -0
  1296. package/samples/recipes/embedded/src/handlers/contact-detail.query.ts +20 -0
  1297. package/samples/recipes/embedded-entity-form/README.md +65 -0
  1298. package/samples/recipes/embedded-entity-form/package.json +14 -0
  1299. package/samples/recipes/embedded-entity-form/src/entities/prospect.ts +21 -0
  1300. package/samples/recipes/embedded-entity-form/src/entities/suggestion.ts +22 -0
  1301. package/samples/recipes/embedded-entity-form/src/feature.ts +120 -0
  1302. package/samples/recipes/embedded-entity-form/src/screens/prospect-accept-screen.ts +13 -0
  1303. package/samples/recipes/embedded-entity-form/src/web/accept-suggestion-drawer.tsx +125 -0
  1304. package/samples/recipes/embedded-entity-form/tsconfig.json +8 -0
  1305. package/samples/recipes/encrypted-tenant-config/README.md +131 -0
  1306. package/samples/recipes/encrypted-tenant-config/package.json +9 -0
  1307. package/samples/recipes/encrypted-tenant-config/src/feature.ts +100 -0
  1308. package/samples/recipes/error-contract/README.md +97 -0
  1309. package/samples/recipes/error-contract/package.json +8 -0
  1310. package/samples/recipes/error-contract/src/feature.ts +238 -0
  1311. package/samples/recipes/event-sourcing/README.md +70 -0
  1312. package/samples/recipes/event-sourcing/package.json +9 -0
  1313. package/samples/recipes/event-sourcing/src/feature.ts +486 -0
  1314. package/samples/recipes/event-sourcing/tsconfig.json +26 -0
  1315. package/samples/recipes/feature-toggles/README.md +21 -0
  1316. package/samples/recipes/feature-toggles/package.json +9 -0
  1317. package/samples/recipes/feature-toggles/src/feature.ts +111 -0
  1318. package/samples/recipes/field-access/README.md +71 -0
  1319. package/samples/recipes/field-access/package.json +8 -0
  1320. package/samples/recipes/field-access/src/feature.ts +32 -0
  1321. package/samples/recipes/files-post-processing/README.md +21 -0
  1322. package/samples/recipes/files-post-processing/package.json +12 -0
  1323. package/samples/recipes/files-post-processing/src/feature.ts +138 -0
  1324. package/samples/recipes/i18n/README.md +36 -0
  1325. package/samples/recipes/i18n/package.json +8 -0
  1326. package/samples/recipes/i18n/src/feature.ts +52 -0
  1327. package/samples/recipes/idempotency/README.md +21 -0
  1328. package/samples/recipes/idempotency/package.json +8 -0
  1329. package/samples/recipes/idempotency/src/feature.ts +50 -0
  1330. package/samples/recipes/inbound-mail-triage/README.md +30 -0
  1331. package/samples/recipes/inbound-mail-triage/package.json +9 -0
  1332. package/samples/recipes/inbound-mail-triage/src/feature.ts +68 -0
  1333. package/samples/recipes/lane-routing/README.md +21 -0
  1334. package/samples/recipes/lane-routing/package.json +8 -0
  1335. package/samples/recipes/lane-routing/src/feature.ts +106 -0
  1336. package/samples/recipes/ledger-banking/README.md +47 -0
  1337. package/samples/recipes/ledger-banking/package.json +9 -0
  1338. package/samples/recipes/ledger-banking/src/usage.ts +86 -0
  1339. package/samples/recipes/ledger-invoicing/README.md +54 -0
  1340. package/samples/recipes/ledger-invoicing/package.json +9 -0
  1341. package/samples/recipes/ledger-invoicing/src/usage.ts +93 -0
  1342. package/samples/recipes/legal-pages/README.md +204 -0
  1343. package/samples/recipes/legal-pages/package.json +9 -0
  1344. package/samples/recipes/legal-pages/src/feature.ts +50 -0
  1345. package/samples/recipes/lifecycle-hooks/README.md +46 -0
  1346. package/samples/recipes/lifecycle-hooks/package.json +8 -0
  1347. package/samples/recipes/lifecycle-hooks/src/feature.ts +104 -0
  1348. package/samples/recipes/managed-config/README.md +136 -0
  1349. package/samples/recipes/managed-config/package.json +9 -0
  1350. package/samples/recipes/managed-config/src/feature.ts +88 -0
  1351. package/samples/recipes/managed-pages/README.md +158 -0
  1352. package/samples/recipes/managed-pages/package.json +9 -0
  1353. package/samples/recipes/managed-pages/src/feature.ts +25 -0
  1354. package/samples/recipes/notes-history-basic/README.md +93 -0
  1355. package/samples/recipes/notes-history-basic/package.json +9 -0
  1356. package/samples/recipes/notes-history-basic/src/feature.ts +72 -0
  1357. package/samples/recipes/notes-history-basic/src/usage.ts +42 -0
  1358. package/samples/recipes/ownership/README.md +21 -0
  1359. package/samples/recipes/ownership/package.json +8 -0
  1360. package/samples/recipes/ownership/src/feature.ts +98 -0
  1361. package/samples/recipes/pipeline-basics/README.md +106 -0
  1362. package/samples/recipes/pipeline-basics/package.json +8 -0
  1363. package/samples/recipes/pipeline-basics/src/feature.ts +424 -0
  1364. package/samples/recipes/pipeline-basics/tsconfig.json +15 -0
  1365. package/samples/recipes/public-share-token/README.md +37 -0
  1366. package/samples/recipes/public-share-token/package.json +8 -0
  1367. package/samples/recipes/public-share-token/src/feature.ts +197 -0
  1368. package/samples/recipes/rate-limiting/README.md +21 -0
  1369. package/samples/recipes/rate-limiting/package.json +8 -0
  1370. package/samples/recipes/rate-limiting/src/feature.ts +26 -0
  1371. package/samples/recipes/realtime-sse/README.md +21 -0
  1372. package/samples/recipes/realtime-sse/package.json +8 -0
  1373. package/samples/recipes/realtime-sse/src/feature.ts +27 -0
  1374. package/samples/recipes/record-detail-layout/README.md +25 -0
  1375. package/samples/recipes/record-detail-layout/package.json +22 -0
  1376. package/samples/recipes/record-detail-layout/src/feature.ts +140 -0
  1377. package/samples/recipes/reference-data/README.md +21 -0
  1378. package/samples/recipes/reference-data/package.json +8 -0
  1379. package/samples/recipes/reference-data/src/feature.ts +37 -0
  1380. package/samples/recipes/relations/README.md +21 -0
  1381. package/samples/recipes/relations/package.json +8 -0
  1382. package/samples/recipes/relations/src/feature.ts +81 -0
  1383. package/samples/recipes/screens-nav/README.md +19 -0
  1384. package/samples/recipes/screens-nav/package.json +8 -0
  1385. package/samples/recipes/screens-nav/src/feature.ts +142 -0
  1386. package/samples/recipes/search/README.md +21 -0
  1387. package/samples/recipes/search/package.json +8 -0
  1388. package/samples/recipes/search/src/feature.ts +72 -0
  1389. package/samples/recipes/secrets-demo/README.md +21 -0
  1390. package/samples/recipes/secrets-demo/package.json +9 -0
  1391. package/samples/recipes/secrets-demo/src/feature.ts +88 -0
  1392. package/samples/recipes/security-baseline/README.md +81 -0
  1393. package/samples/recipes/security-baseline/package.json +9 -0
  1394. package/samples/recipes/security-baseline/src/feature.ts +19 -0
  1395. package/samples/recipes/seed-migration/README.md +81 -0
  1396. package/samples/recipes/seed-migration/package.json +10 -0
  1397. package/samples/recipes/seed-migration/scripts/smoke.ts +125 -0
  1398. package/samples/recipes/seed-migration/seeds/2026-01-01-initial-tenants.ts +32 -0
  1399. package/samples/recipes/seed-migration/seeds/2026-02-01-fix-admin-roles.ts +38 -0
  1400. package/samples/recipes/session-revocation/README.md +49 -0
  1401. package/samples/recipes/session-revocation/package.json +9 -0
  1402. package/samples/recipes/session-revocation/src/feature.ts +50 -0
  1403. package/samples/recipes/state-machine/README.md +21 -0
  1404. package/samples/recipes/state-machine/package.json +9 -0
  1405. package/samples/recipes/state-machine/src/entities/invoice.ts +35 -0
  1406. package/samples/recipes/state-machine/src/events.ts +32 -0
  1407. package/samples/recipes/state-machine/src/feature.ts +89 -0
  1408. package/samples/recipes/state-machine/src/handlers/_helpers.ts +68 -0
  1409. package/samples/recipes/state-machine/src/handlers/create.ts +27 -0
  1410. package/samples/recipes/state-machine/src/handlers/transitions.ts +137 -0
  1411. package/samples/recipes/state-machine/src/reducer.ts +50 -0
  1412. package/samples/recipes/state-machine/tsconfig.json +26 -0
  1413. package/samples/recipes/tags-basic/README.md +100 -0
  1414. package/samples/recipes/tags-basic/package.json +9 -0
  1415. package/samples/recipes/tags-basic/src/feature.ts +71 -0
  1416. package/samples/recipes/tags-basic/src/usage.ts +50 -0
  1417. package/samples/recipes/tenant-isolation/README.md +21 -0
  1418. package/samples/recipes/tenant-isolation/package.json +8 -0
  1419. package/samples/recipes/tenant-isolation/src/feature.ts +28 -0
  1420. package/samples/recipes/tenant-settings/README.md +112 -0
  1421. package/samples/recipes/tenant-settings/package.json +9 -0
  1422. package/samples/recipes/tenant-settings/src/feature.ts +35 -0
  1423. package/samples/recipes/tier-admin/README.md +80 -0
  1424. package/samples/recipes/tier-admin/package.json +9 -0
  1425. package/samples/recipes/tier-admin/src/feature.ts +60 -0
  1426. package/samples/recipes/timezones/README.md +97 -0
  1427. package/samples/recipes/timezones/package.json +8 -0
  1428. package/samples/recipes/timezones/src/feature.ts +72 -0
  1429. package/samples/recipes/tsconfig.base.json +23 -0
  1430. package/samples/recipes/user-data-rights/README.md +100 -0
  1431. package/samples/recipes/user-data-rights/package.json +9 -0
  1432. package/samples/recipes/user-data-rights/src/feature.ts +97 -0
  1433. package/samples/recipes/user-profile/README.md +86 -0
  1434. package/samples/recipes/user-profile/package.json +9 -0
  1435. package/samples/recipes/user-profile/src/feature.ts +73 -0
  1436. package/samples/recipes/webhook-step/README.md +47 -0
  1437. package/samples/recipes/webhook-step/package.json +9 -0
  1438. package/samples/recipes/webhook-step/src/feature.ts +203 -0
  1439. package/samples/recipes/webhook-step/tsconfig.json +18 -0
  1440. package/samples/recipes/wizard-form/README.md +79 -0
  1441. package/samples/recipes/wizard-form/package.json +23 -0
  1442. package/samples/recipes/wizard-form/src/entities/listing.ts +27 -0
  1443. package/samples/recipes/wizard-form/src/feature.ts +48 -0
  1444. package/samples/recipes/wizard-form/src/web/index.ts +16 -0
  1445. package/samples/recipes/wizard-form/src/web/listing-review-section.tsx +21 -0
  1446. package/samples/recipes/wizard-form/tsconfig.json +8 -0
  1447. package/samples/recipes/workflow-engine/README.md +21 -0
  1448. package/samples/recipes/workflow-engine/package.json +9 -0
  1449. package/samples/recipes/workflow-engine/src/cron-scheduler.ts +110 -0
  1450. package/samples/recipes/workflow-engine/src/db/queries/suspended-runs.ts +14 -0
  1451. package/samples/recipes/workflow-engine/src/event-trigger.ts +84 -0
  1452. package/samples/recipes/workflow-engine/src/feature.ts +167 -0
  1453. package/samples/recipes/workflow-engine/src/postgres-resume-loop.ts +98 -0
  1454. package/samples/recipes/workflow-engine/src/resume-loop.ts +209 -0
  1455. package/samples/recipes/workflow-engine/src/workflow-runner.ts +97 -0
  1456. package/samples/recipes/workflow-engine/tsconfig.json +21 -0
  1457. package/samples/recipes/writeform-section/README.md +30 -0
  1458. package/samples/recipes/writeform-section/package.json +23 -0
  1459. package/samples/recipes/writeform-section/src/feature.ts +123 -0
  1460. package/samples/recipes/writeform-section/src/note-fixture.ts +8 -0
  1461. package/samples/recipes/writeform-section/tsconfig.json +8 -0
@@ -0,0 +1,202 @@
1
+ # DSGVO Compliance — Operator-Guide
2
+
3
+ Dieses Dokument bündelt die **technischen Fakten** zur DSGVO-Pipeline
4
+ (Art. 15/17/18/20) als Grundlage für:
5
+
6
+ - **Verarbeitungsverzeichnis** (Art. 30) — was wird wo wie lange gespeichert
7
+ - **Datenschutzerklärung** — welche Endpoints decken welchen Artikel ab
8
+ - **AVV mit Sub-Processors** — welche TOM sind eingebaut
9
+ - **Operator-Runbook** — was triggert wann, wer kann was sehen
10
+
11
+ > Juristische Texte (AVV-Wortlaut, Datenschutzerklärung-Bausteine,
12
+ > Verarbeitungsverzeichnis-Strukturierung) gehören zu Marc + Anwalt —
13
+ > dieses Dokument liefert nur die technischen Fakten dafür.
14
+
15
+ ---
16
+
17
+ ## 1. Endpoint → Artikel-Mapping
18
+
19
+ | Artikel | Endpoint / Runner | Wer ruft auf | Was passiert |
20
+ |---------|-------------------|--------------|--------------|
21
+ | **Art. 15 (Auskunft, light)** | `user-data-rights:query:my-audit-log` | User | Liest eigene Framework-Events aus `kumiko_events` (account-weit über alle Memberships). Filterbar nach `eventType`, `aggregateType`, `from`/`to`. Domain-Entities ohne `ctx.appendEvent` erscheinen NICHT — die kommen im Export-Bundle (Art. 20). |
22
+ | **Art. 15 + 20 (Auskunft + Portabilität)** | `user-data-rights:write:request-export` | User | Async Job → ZIP mit user-Profil + fileRefs + alle EXT_USER_DATA-Provider-Daten (cross-tenant) + signed Magic-Link per Email. Idempotent: nur 1 active Job pro User (`ACTIVE_JOB_CONSTRAINT`). |
23
+ | **Art. 15 + 20** | `GET /user-export/by-token` (interstitial) + `POST /user-export/by-token` (exchange) | Anonym (Magic-Link-Pfad) | Email-Link trägt den Token als URL-Fragment (`#token=`, nie an den Server gesendet, issue #1271); Interstitial-Script liest das Fragment client-seitig und tauscht es per POST-Body gegen die signed Storage-URL. Kein `?token=`-Query-Fallback (#1512) — Query-Param landet unveränderlich in Proxy-/Access-Logs. Multi-use innerhalb TTL. Audit: `lastUsedAt`, `lastUsedFromIp`, `lastUsedUserAgent`. |
24
+ | **Art. 15 + 20** | `GET /user-export/by-job/:jobId` | User (Session-Auth) | UI-Klick-Pfad. Cross-tenant-same-user: User in Tenant B kann Job aus Tenant A laden wenn er der Owner ist. |
25
+ | **Art. 17 (Löschung)** | `user-data-rights:write:request-deletion` | User | Soft-Delete: `status=DeletionRequested` + `gracePeriodEnd = now + profile.gracePeriod`. Cron `run-forget-cleanup` führt nach Grace die Anonymisierung durch. |
26
+ | **Art. 17** | `user-data-rights:write:cancel-deletion` | User | Während Grace: status zurück auf `Active`. |
27
+ | **Art. 17** | `run-forget-cleanup` (Cron) | System | Findet User mit `status=DeletionRequested AND gracePeriodEnd < now`. Pro User Sub-TX über alle EXT_USER_DATA-Provider mit Strategy aus `retention.policyFor`. user-Hook anonymisiert (PII raus, Sentinel-Email). |
28
+ | **Art. 18 (Restriction)** | `user-data-rights:write:restrict-account` | Admin / SystemAdmin | Status-Flip → Auth-Middleware-Guard blockt Logins. `sessions.revokeAllForUser` killt aktive Sessions. |
29
+ | **Art. 18** | `user-data-rights:write:lift-restriction` | Admin / SystemAdmin | Restriction aufheben. |
30
+ | **Operator (DPO)** | `user-data-rights:query:list-download-attempts` | Admin / SystemAdmin | Brute-Force-Detection: zeigt invalid Download-Versuche (notFound / expired / failed / signedUrlNotSupported) gefiltert nach Result, IP, Zeitraum. |
31
+
32
+ ---
33
+
34
+ ## 2. Speicherorte (Verarbeitungsverzeichnis Art. 30)
35
+
36
+ | Tabelle | Inhalt | Personenbezug | Retention | Zweck |
37
+ |---------|--------|---------------|-----------|-------|
38
+ | `read_users` | User-Profil (email, displayName, passwordHash, locale, status, gracePeriodEnd, roles) | direkt | per Domain (typ. blockDelete bei Aufbewahrungspflicht, sonst hardDelete via Forget-Pipeline) | Authentifizierung, Nutzer-Profil |
39
+ | `read_tenant_memberships` | User↔Tenant-Verknüpfung + Rollen | direkt (via userId) | per Tenant-Lifecycle | Mehrmandant-Zuordnung |
40
+ | `kumiko_events` | Event-Store (alle write-Events) | direkt (`createdBy = userId`) | per Domain-Policy via `data-retention` | Audit-Trail (Art. 15-Selbstauskunft Quelle), Event-Sourcing |
41
+ | `read_export_jobs` | Async Export-Status (queued/running/done/failed), userId, requestedAt, doneAt, storageKey | direkt (userId) | per `compliance-profiles` Profil-Default | Idempotenz + Status-Polling |
42
+ | `read_export_download_tokens` | Magic-Link-Hash (SHA-256), TTL, useCount, lastUsedAt, lastUsedFromIp, lastUsedUserAgent | indirekt (Token→Job→User) | `compliance-profiles.userRights.exportDownloadTtl` (default 7d) | Magic-Link-Auth + Multi-Use-Audit |
43
+ | `read_download_attempts` | Invalid Download-Versuche: result, via, tokenHash, ip, userAgent, attemptedAt | indirekt (IP) | **90d hardDelete** (Entity-Default, Disk-Bomb-Schutz) | DPO-Brute-Force-Detection |
44
+ | `read_tenant_compliance_profiles` | Per-Tenant Profile-Wahl + Override | nein | unbounded (Konfiguration) | Region-/Branchen-Defaults |
45
+ | `read_tenant_retention_overrides` | Per-Tenant Retention-Override pro Entity | nein | unbounded (Konfiguration) | Aufbewahrungspflicht-Edge-Cases |
46
+ | Storage-Provider (Local / S3) | Export-ZIPs + File-Binaries | indirekt (Inhalt) | Local: per `exportDownloadTtl` Cleanup. S3: lifecycle-Policy (App-Author-Verantwortung) | Daten-Export-Auslieferung |
47
+
48
+ ### Bekanntes Residuum: `createdBy` / `metadata.userId` in `kumiko_events`
49
+
50
+ Nach der Forget-Pipeline (Art. 17, Abschnitt 1) bleiben `kumiko_events.created_by`
51
+ und `metadata.userId` (Event-Store-Schema `events-schema.ts`, EventMetadata-Feld)
52
+ als Klartext-UUID stehen. Die Forget-Hooks aus `user-data-rights-defaults` fassen
53
+ `kumiko_events` nicht an — `createdBy`/`metadata.userId` sind keine über
54
+ `defineEvent(..., { piiFields })` deklarierten Payload-PII-Felder (siehe
55
+ `packages/framework/src/crypto/event-pii.ts`) und laufen deshalb nicht durch die
56
+ Payload-Verschlüsselung. Löschung dieser Rows erfolgt ausschließlich über die
57
+ zeitbasierte `data-retention`-Policy (`keepFor`, s. `kumiko_events`-Zeile in Abschnitt
58
+ 2 oben), unabhängig vom User-Forget-Antrag.
59
+
60
+ Technische Basis: Der `read_users`-Row zur betroffenen UUID wird beim Forget-Run
61
+ in-place anonymisiert, nicht hard-gelöscht (Sentinel-Pattern, siehe Abschnitt 4
62
+ „Integrität"). Email, Displayname und Passwort-Hash werden dabei entfernt/ersetzt —
63
+ das ist der Schlüssel, der die Verknüpfung kappt: Sobald diese Felder weg sind, gibt
64
+ es keinen Rückweg von der UUID in `created_by` zu einer realen Identität mehr. Die
65
+ UUID bleibt als stabiler, aber orphaned Pseudonym-Wert bestehen, bis die
66
+ Retention-Policy irgendwann das Event selbst löscht.
67
+
68
+ ---
69
+
70
+ ## 3. Compliance-Profile
71
+
72
+ | Profil | gracePeriod | exportDownloadTtl | Stale-After | Sub-Processors |
73
+ |--------|-------------|-------------------|-------------|----------------|
74
+ | `eu-dsgvo` | 30d | 7d | 30d | per Tenant konfigurierbar |
75
+ | `swiss-dsg` | 30d | 7d | 30d | + EDÖB-Meldepfad |
76
+ | `de-hr-dsgvo-hgb` | 30d | 7d | 30d | + HR-Aufbewahrung 10y für HR-Entities (anonymize statt delete) |
77
+ | `minimal-no-region` | 30d | 7d | 30d | Migration-Edge-Case ohne Region |
78
+
79
+ Tenant kann via `compliance-profiles:write:set-profile` + Override (`override.userRights.gracePeriod={ days: N }` etc.) eigene Werte setzen.
80
+
81
+ ---
82
+
83
+ ## 4. Technische und Organisatorische Maßnahmen (TOM)
84
+
85
+ Eingebaute Schutzmaßnahmen — können 1:1 in den AVV-Anhang "Technische
86
+ und Organisatorische Maßnahmen" übernommen werden:
87
+
88
+ ### Vertraulichkeit / Zugriffskontrolle
89
+
90
+ - **Magic-Link-Token-Hashing**: Plain-Token landet NIE in DB / Event-Store. SHA-256-Hash via `crypto.subtle.digest` (Web-Crypto-API). Plain-Token kommt nur ephemeral via Email-Callback an die App-Author-Implementation.
91
+ - **Download-Token Multi-Use within TTL**: kein consume-on-use (Pattern Google Takeout) — User kann ZIP mehrfach laden, aber TTL gilt absolut.
92
+ - **Audit-Felder am Token**: useCount, lastUsedAt, lastUsedFromIp, lastUsedUserAgent. Operator sieht ob Token mehrfach verwendet wurde, von welcher IP.
93
+ - **Account-weite Auskunft via `ctx.db.raw`**: `my-audit-log` umgeht TenantDb-Auto-Filter explizit (Account-weite Sicht für Art. 15 ist Pflicht); Sicherung über hard-coded `WHERE createdBy = ctx.user.id` (kein userId-Parameter, kein Cross-User-Snooping möglich).
94
+ - **Cross-User-Schutz im Download-Pfad**: `download-by-job` checkt `jobRow.userId === session.user.id` — User kann nur eigene Jobs laden.
95
+ - **Restriction killt Sessions**: `restrict-account` triggert `sessions.revokeAllForUser` — restricted User kann existierende Tabs nicht weiternutzen.
96
+
97
+ ### Integrität
98
+
99
+ - **Event-Sourcing first-class**: alle DSGVO-Schreib-Operationen (request-deletion, restrict, lift, request-export) sind Events im `kumiko_events`-Store mit `version_conflict`-Schutz.
100
+ - **Forget-Strategy aus `data-retention`**: Cleanup-Runner konsultiert `retention.policyFor` pro Entity — `blockDelete` für gesetzliche Aufbewahrungspflicht (HR/HGB), `anonymize` als Alternative zu `hardDelete`.
101
+ - **Strategy-respect-Pattern in Default-Hooks**: user-Hook anonymisiert mit Sentinel-Pattern `deleted-<id>@anonymized.invalid` — Unique-Constraint + FK-Refs bleiben intakt.
102
+
103
+ ### Verfügbarkeit / Belastbarkeit
104
+
105
+ - **Best-Effort-Audit beim Download**: Audit-INSERT in `read_download_attempts` ist `try/catch` swallowed — Audit-Failure killt nicht den User-facing 4xx.
106
+ - **Idempotenz im Export-Job**: `ACTIVE_JOB_CONSTRAINT` (UNIQUE-Index auf `(userId, status='active')`) verhindert Doppel-Jobs. Worker-Crash → Job bleibt `running`, Recovery-Pfad via Job-Run-Tracking aus `jobs`-Feature.
107
+ - **Per-User Sub-TX im Forget-Runner**: Ein User-Hook-Throw rollback'd nur diesen User; andere User im Batch laufen weiter.
108
+ - **Best-Effort-Notification-Callbacks**: send-Throw für Job A killt nicht Batch B/C (Memory: Atom 5.fix3).
109
+
110
+ ### Brute-Force-Schutz
111
+
112
+ - **Edge-Rate-Limit auf Download-Endpoint**: `rateLimit: { per: "ip", limit: 30, windowSeconds: 60 }` für `download-by-token`.
113
+ - **Download-Attempt-Audit** mit 90d hardDelete: invalid Versuche werden persistiert für DPO-Detection, Tabelle ist begrenzt → kein Disk-Bomb durch Brute-Force.
114
+ - **Token-Hash-Suchraum**: 32-Byte-Random = 256 Bit, Brute-Force über Edge-Limit praktisch nicht möglich.
115
+
116
+ ### Zweckbindung / Datenminimierung
117
+
118
+ - **Export-Bundle Default-PII-Filter**: user-Hook entfernt `passwordHash`, `roles`, `status` aus dem Bundle (App-Author kann das per Custom-Hook überschreiben).
119
+ - **fileRefs separat**: Export-Bundle enthält Datei-Metadaten (id, fileName, mimeType, size); Binaries werden via signed-URL separat ins ZIP gepackt — kein Inline-Base64-Memory-Druck.
120
+
121
+ ### Auftragskontrolle (gegenüber Sub-Processors)
122
+
123
+ - **Storage-Provider als Plugin** (`file-foundation` + `file-provider-{s3,inmemory}`): App-Author wählt Provider; AVV mit S3-Hoster (Hetzner / AWS) ist vom Provider abhängig.
124
+ - **Email-Transport als Plugin** (`mail-foundation` + `mail-transport-{smtp,inmemory}`): SMTP / SES / Resend per Plugin austauschbar.
125
+ - **`compliance-profiles:query:sub-processors`**: Per-Tenant Liste der aktiven Sub-Processors, abrufbar für AVV-Anhang.
126
+
127
+ ---
128
+
129
+ ## 5. Cron-Jobs / Operationale Trigger
130
+
131
+ | Job | Trigger | Was passiert | Operator-Sichtbarkeit |
132
+ |-----|---------|--------------|------------------------|
133
+ | `run-forget-cleanup` | Cron (per App-Author konfigurierbar, typisch täglich) | Findet User mit abgelaufener Grace, ruft `EXT_USER_DATA.delete` pro Provider, anonymisiert User, sendet `sendDeletionExecutedEmail`-Callback | `read_job_runs` (success/fail), Hook-Errors als `errors[]` im Result |
134
+ | `run-export-jobs` | Cron + Event-getriggert | Findet pending Export-Jobs, ruft `runUserExport` → ZIP-Bau → Storage-Upload → Magic-Link-Token → `sendExportReadyEmail` | `read_job_runs`, `read_export_jobs.status` |
135
+ | `data-retention-cleanup` | Cron (in `data-retention`) | Cleant abgelaufene Rows pro Entity per `retention.keepFor` | `read_job_runs` |
136
+ | Token-Cleanup (implizit) | Per `compliance-profiles.userRights.exportDownloadTtl` | Worker-Job entfernt expired Magic-Link-Tokens + Storage-Binaries | `read_export_download_tokens` |
137
+ | Download-Attempt-Cleanup | Per Entity-Default 90d | Cleant `read_download_attempts` | — |
138
+
139
+ App-Author registriert die Cron-Trigger im run-config; `jobs`-Feature
140
+ persistiert Run-Tracking + Retry-Pfad.
141
+
142
+ ---
143
+
144
+ ## 6. Doku-Snippets für Marc
145
+
146
+ ### Datenschutzerklärung — Betroffenenrechte
147
+
148
+ > **Recht auf Auskunft (Art. 15 DSGVO):** Sie können jederzeit eine
149
+ > Kopie aller bei uns über Sie gespeicherten Daten anfordern. Über die
150
+ > Funktion "Daten exportieren" in den Account-Einstellungen erhalten
151
+ > Sie ein vollständiges JSON-/ZIP-Bundle Ihrer Profildaten, hochgeladenen
152
+ > Dateien und [App-Author: Domain-Daten ergänzen] per signed Magic-Link
153
+ > auf Ihre hinterlegte E-Mail-Adresse. Der Link ist 7 Tage gültig.
154
+
155
+ > **Recht auf Löschung (Art. 17 DSGVO):** Über "Account löschen" können
156
+ > Sie Ihren Account jederzeit zur Löschung vormerken. Es gilt eine
157
+ > Karenzzeit von 30 Tagen, in der Sie den Antrag widerrufen können
158
+ > (Funktion "Löschung widerrufen"). Nach Ablauf werden Ihre Daten
159
+ > automatisch gelöscht oder anonymisiert. Daten mit gesetzlicher
160
+ > Aufbewahrungspflicht (z. B. Rechnungen nach §147 AO) bleiben bis zum
161
+ > Fristablauf gesperrt erhalten und werden danach automatisch gelöscht.
162
+
163
+ > **Recht auf Einschränkung (Art. 18 DSGVO):** Auf begründeten Antrag
164
+ > kann Ihr Account temporär gesperrt werden. Während der Sperre können
165
+ > Sie sich nicht mehr einloggen, Ihre Daten werden aber nicht gelöscht
166
+ > oder verändert.
167
+
168
+ ### AVV-TOM-Anhang
169
+
170
+ Für den AVV-Anhang "Technische und Organisatorische Maßnahmen" siehe
171
+ **Abschnitt 4** dieses Dokuments — komplette Liste mit Verweisen auf
172
+ die Code-Implementierung.
173
+
174
+ ### Verarbeitungsverzeichnis
175
+
176
+ Spalte "Speicherorte / Empfänger" → siehe **Abschnitt 2** (Tabellen-
177
+ Übersicht). Spalte "Löschfristen" → siehe **Abschnitt 3** + Spalte
178
+ "Retention" in Abschnitt 2.
179
+
180
+ ---
181
+
182
+ ## 7. Was NICHT in diesem Framework abgedeckt ist
183
+
184
+ Bewusst ausserhalb — App-Author-Verantwortung:
185
+
186
+ - **Auswahl + AVV mit konkretem Storage-Provider** (Hetzner / AWS / etc.)
187
+ - **Auswahl + AVV mit konkretem Email-Provider** (SMTP-Host / SES / Resend)
188
+ - **Datenpannen-Meldung** an Aufsichtsbehörde (organisatorisch, nicht technisch)
189
+ - **DSFA** (Datenschutz-Folgenabschätzung) — Framework liefert die TOM-Inputs, App-Author macht die Bewertung
190
+ - **Cookie-Consent-Layer** (das ist Frontend-Sache + separate consent-Feature, nicht Teil von user-data-rights)
191
+ - **Tenant-Lifecycle-Destroy** (Account-Löschung des Tenants selbst, nicht der User darin) — kommt als separates `tenant-lifecycle`-Feature in Sprint 5
192
+
193
+ ---
194
+
195
+ ## Referenzen
196
+
197
+ - Code: `packages/bundled-features/src/user-data-rights/`
198
+ - Default-Hooks: `packages/bundled-features/src/user-data-rights-defaults/`
199
+ - Compliance-Profile: `packages/bundled-features/src/compliance-profiles/`
200
+ - Retention-Engine: `packages/bundled-features/src/data-retention/`
201
+ - Sample-App: `samples/apps/user-data-rights-demo/`
202
+ - Tests: `packages/bundled-features/src/user-data-rights/__tests__/` (188 Tests)
@@ -0,0 +1,109 @@
1
+ # user-data-rights
2
+
3
+ DSGVO Art. 15 (Auskunft) + Art. 17 (Löschung) + Art. 18 (Restriction) +
4
+ Art. 20 (Portabilität) als Core-Feature.
5
+
6
+ **Status:** S2 abgeschlossen — alle Endpoints, Hooks, Default-Provider,
7
+ Cron-Pipeline, Tests + Sample wired.
8
+
9
+ ## Pattern
10
+
11
+ Statt jedes Feature seine eigene Forget-/Export-Logik schreibt, hängt
12
+ es sich via `r.useExtension(EXT_USER_DATA, "<entity>", { export, delete })`
13
+ an. user-data-rights orchestriert Export- und Forget-Pipeline:
14
+
15
+ ```ts
16
+ defineFeature("tasks", (r) => {
17
+ r.requires("user-data-rights");
18
+ r.useExtension(EXT_USER_DATA, "task", {
19
+ export: async (ctx) => ({
20
+ entity: "task",
21
+ rows: await ctx.db.select().from(tasksTable)
22
+ .where(eq(tasksTable.authorId, ctx.userId)),
23
+ }),
24
+ delete: async (ctx, strategy) => {
25
+ if (strategy === "anonymize") {
26
+ await ctx.db.update(tasksTable).set({ authorId: null })
27
+ .where(eq(tasksTable.authorId, ctx.userId));
28
+ } else {
29
+ await ctx.db.delete(tasksTable)
30
+ .where(eq(tasksTable.authorId, ctx.userId));
31
+ }
32
+ },
33
+ });
34
+ });
35
+ ```
36
+
37
+ Hook-Signaturen in `framework/src/engine/extensions/user-data.ts`:
38
+
39
+ - `UserDataExportHook(ctx) => Promise<UserDataExportSnippet | null>`
40
+ - `UserDataDeleteHook(ctx, strategy) => Promise<void>`
41
+ - `UserDataDeleteStrategy = "delete" | "anonymize"`
42
+
43
+ ## Endpoints
44
+
45
+ | Article | Handler | Zweck |
46
+ |---------|---------|-------|
47
+ | Art. 15 | `user-data-rights:query:my-audit-log` | User sieht eigene Framework-Events (account-weit über alle Memberships). Domain-Entities ohne `ctx.appendEvent` erscheinen NICHT — nur im Export-Bundle. |
48
+ | Art. 15+20 | `user-data-rights:write:request-export` | Async Job → ZIP mit user-Profil + fileRefs + alle EXT_USER_DATA-Provider-Daten + signed Magic-Link |
49
+ | Art. 17 | `user-data-rights:write:request-deletion` | Soft-Delete mit Grace-Period, anschließend Cron anonymisiert User + cleant Domain-Entities |
50
+ | Art. 17 | `user-data-rights:write:cancel-deletion` | User widerruft seinen Forget-Request während der Grace |
51
+ | Art. 18 | `user-data-rights:write:restrict-account` | Auth-Middleware blockt Logins bis Lift |
52
+ | Art. 18 | `user-data-rights:write:lift-restriction` | Admin/SystemAdmin hebt Restriction auf |
53
+ | Operator | `user-data-rights:query:list-download-attempts` | DPO-Sicht auf invalid Download-Versuche (Brute-Force-Detection, Admin/SystemAdmin only) |
54
+
55
+ Plus 2 anonyme HTTP-Routes für Export-Download (Magic-Link-Pfad +
56
+ session-auth-Pfad), siehe `handlers/download-by-{token,job}.query.ts`.
57
+
58
+ ## Cross-Feature-API
59
+
60
+ **Exposes:**
61
+ - `userDataRights.runExport` — über die public Runner-Exports
62
+ (`runUserExport`, `runForgetCleanup`)
63
+ - `userDataRights.runForget`
64
+
65
+ **Uses:**
66
+ - `compliance.forTenant` (Grace-Period aus Profile)
67
+ - `retention.policyFor` (blockDelete-Konsultation, anonymize statt delete)
68
+ - `sessions.revokeAllForUser` (Restriction killt aktive Sessions)
69
+
70
+ ## Default-Hooks (`user-data-rights-defaults`)
71
+
72
+ Optional-mountbares Sub-Feature liefert Default-Hooks für
73
+ Core-Entities `user` (anonymize: email→`deleted-<id>@anonymized.invalid`,
74
+ displayName→`(deleted)`, passwordHash=null) und `fileRef` (delete: row +
75
+ storage-binary; anonymize: insertedById=null). App-Author kann es
76
+ weglassen wenn er Custom-Hooks registrieren will.
77
+
78
+ ## Audit-Trail
79
+
80
+ | Tabelle | Zweck | Retention |
81
+ |---------|-------|-----------|
82
+ | `kumiko_events` | Framework-Event-Store, Quelle für `my-audit-log` | per Domain-Policy |
83
+ | `read_export_jobs` | Async Export-Status (queued / done / failed) | per `compliance-profiles` |
84
+ | `read_export_download_tokens` | Magic-Link-Hash + TTL + lastUsed-Audit | per `compliance-profiles` (default `exportDownloadTtl`) |
85
+ | `read_download_attempts` | Invalid-Download-Versuche für DPO-Brute-Force-Detection | **90d hardDelete** (Entity-Default — schützt vor Disk-Bomb bei aktiven Angriffen) |
86
+
87
+ ## Tests
88
+
89
+ 18 Testdateien, 188 Tests, alle grün:
90
+
91
+ | Datei | Pinst |
92
+ |-------|-------|
93
+ | `audit-log.integration.test.ts` | Cross-User-Isolation, Account-weite Sicht, eventType-Filter, Admin-only operator-query, download-attempt 90d-retention |
94
+ | `cross-data-matrix.integration.test.ts` | 3-Provider-Pipeline (user + fileRef + custom-domain), Cross-Tenant Forget mit user-anonymize, Other-User-Isolation |
95
+ | `download.integration.test.ts` | HTTP-e2e via `r.httpRoute`: Magic-Link, multi-use, expired, failed-job, storage-cleared, cross-tenant-same-user, malicious-filename |
96
+ | `request-export.integration.test.ts` | Idempotency, active-job-constraint, cross-tenant-anyMember-userId-pattern |
97
+ | `request-deletion-callback.integration.test.ts` + `request-cancel-deletion.integration.test.ts` | Grace + Cancel-Pfad + Email-Callback best-effort |
98
+ | `restriction-flow.integration.test.ts` | Status-Flip + Auth-Middleware-Block + Lift |
99
+ | `run-{export-jobs,forget-cleanup,user-export}.integration.test.ts` | Worker-Logic + Idempotency + Email-Callbacks |
100
+ | `policy-to-strategy.test.ts` | Retention.strategy → UserDataDeleteStrategy mapping |
101
+ | `user-data-rights.integration.test.ts` | Boot-Smoke + Feature-Meta |
102
+ | `token-helpers.test.ts` + `zip-path.test.ts` | Token-Hashing + Path-Traversal-Schutz |
103
+ | `export-job-{idempotency,schema}.test.ts` | Active-job-uniqueness + Schema-Constraints |
104
+
105
+ ## Sample
106
+
107
+ `samples/apps/user-data-rights-demo` — runnable Demo mit todos-Domain,
108
+ EXT_USER_DATA-Hook für strategy-aware delete (anonymize → authorId=null,
109
+ delete → DROP), 3 living-doc Integration-Tests.
@@ -0,0 +1,125 @@
1
+ // Audit-Helper fuer Download-Endpoint (S2.U3 Atom 4b).
2
+ //
3
+ // Beim Download (Token-Pfad oder Job-Pfad) werden Audit-Felder am
4
+ // Token-Row aktualisiert:
5
+ // - useCount + 1
6
+ // - lastUsedAt = now
7
+ // - lastUsedFromIp = caller-IP (X-Forwarded-For oder Connection-IP)
8
+ // - lastUsedUserAgent = UA-Header
9
+ //
10
+ // **Best-Effort-Update:** version-conflicts (zwei parallel-Downloads
11
+ // raceen um den update) werden silent geswallowt — Audit ist "letzter
12
+ // Use", nicht "alle Uses". Der zweite Download succeeded trotzdem
13
+ // (kein download-block bei race).
14
+ //
15
+ // **ES via tokenCrud.update:** kein direct-UPDATE. Memory
16
+ // `feedback_no_fake_dispatcher` + `feedback_event_store_tenant_consistency`.
17
+
18
+ import type { DbRunner } from "@cosmicdrift/kumiko-framework/db";
19
+ import { createEventStoreExecutor, createTenantDb } from "@cosmicdrift/kumiko-framework/db";
20
+ import { createSystemUser, type TenantId } from "@cosmicdrift/kumiko-framework/engine";
21
+ import type { getTemporal } from "@cosmicdrift/kumiko-framework/time";
22
+ import { tokenCrud } from "./run-export-jobs.js";
23
+ import { downloadAttemptEntity, downloadAttemptsTable } from "./schema/download-attempt.js";
24
+
25
+ const attemptCrud = createEventStoreExecutor(downloadAttemptsTable, downloadAttemptEntity, {
26
+ entityName: "download-attempt",
27
+ });
28
+
29
+ type Instant = InstanceType<ReturnType<typeof getTemporal>["Instant"]>;
30
+
31
+ export interface RecordDownloadUseArgs {
32
+ readonly db: DbRunner;
33
+ readonly tokenId: string;
34
+ readonly tokenVersion: number;
35
+ readonly tokenUseCount: number;
36
+ /**
37
+ * Tenant fuer die system-mode-TenantDb. ExportDownloadToken ist
38
+ * tenant-agnostisch (1:1 zum tenant-agnostic Job), aber der event-
39
+ * store-Stream-Lookup braucht einen Tenant-Context. Wir nutzen
40
+ * job.requestedFromTenantId — dieselbe Identitaet wie beim
41
+ * Token-Create im Worker (Atom 4a).
42
+ */
43
+ readonly tenantId: TenantId;
44
+ readonly now: Instant;
45
+ readonly ip: string | null;
46
+ readonly userAgent: string | null;
47
+ }
48
+
49
+ /**
50
+ * Audit-Update: useCount, lastUsedAt, IP, UA. Best-effort —
51
+ * version-conflicts (parallel-downloads) werden swallowed, Download
52
+ * succeeded trotzdem.
53
+ */
54
+ export async function recordDownloadUse(args: RecordDownloadUseArgs): Promise<void> {
55
+ const { db, tokenId, tokenVersion, tokenUseCount, tenantId, now, ip, userAgent } = args;
56
+ const executor = createSystemUser(tenantId);
57
+ const tdb = createTenantDb(db, tenantId, "system");
58
+
59
+ await tokenCrud
60
+ .update(
61
+ {
62
+ id: tokenId,
63
+ version: tokenVersion,
64
+ changes: {
65
+ useCount: tokenUseCount + 1,
66
+ lastUsedAt: now,
67
+ lastUsedFromIp: ip,
68
+ lastUsedUserAgent: userAgent,
69
+ },
70
+ },
71
+ executor,
72
+ tdb,
73
+ )
74
+ .catch(() => {
75
+ // version-conflict bei parallelen Downloads → der erste hat
76
+ // bereits useCount inkrementiert. Wir behalten den Audit-Eintrag
77
+ // des ersten Downloads (lastUsedAt etc.). Kein download-block.
78
+ });
79
+ }
80
+
81
+ // extractCallerIp lebt in feature.ts (extractAuditMeta) — query-handler
82
+ // haben keinen direkten Header-Zugriff (transport-agnostic), httpRoute-
83
+ // Wrapper extrahiert + steckt in payload.auditMeta.
84
+
85
+ export type DownloadAttemptResult = "notFound" | "expired" | "failed" | "signedUrlNotSupported";
86
+
87
+ export interface RecordInvalidAttemptArgs {
88
+ readonly db: DbRunner;
89
+ readonly tenantId: TenantId;
90
+ readonly now: Instant;
91
+ readonly result: DownloadAttemptResult;
92
+ readonly via: "token" | "job";
93
+ readonly tokenHash: string | null;
94
+ readonly jobId: string | null;
95
+ readonly attemptedByUserId: string | null;
96
+ readonly ip: string | null;
97
+ readonly userAgent: string | null;
98
+ }
99
+
100
+ // Best-effort INSERT in read_download_attempts. Throws im Audit-Pfad
101
+ // duerfen den Download-Endpoint nicht killen (User soll seinen 404
102
+ // bekommen, nicht 500); failures werden silent geswallowt.
103
+ export async function recordInvalidAttempt(args: RecordInvalidAttemptArgs): Promise<void> {
104
+ const { db, tenantId, now } = args;
105
+ const executor = createSystemUser(tenantId);
106
+ const tdb = createTenantDb(db, tenantId, "system");
107
+ await attemptCrud
108
+ .create(
109
+ {
110
+ result: args.result,
111
+ via: args.via,
112
+ tokenHash: args.tokenHash,
113
+ jobId: args.jobId,
114
+ attemptedByUserId: args.attemptedByUserId,
115
+ ip: args.ip,
116
+ userAgent: args.userAgent,
117
+ attemptedAt: now,
118
+ },
119
+ executor,
120
+ tdb,
121
+ )
122
+ .catch(() => {
123
+ // best-effort
124
+ });
125
+ }
@@ -0,0 +1,71 @@
1
+ import {
2
+ EXT_USER_DATA,
3
+ type FeatureDefinition,
4
+ type ResolvedPiiFlags,
5
+ } from "@cosmicdrift/kumiko-framework/engine";
6
+ import { entitiesOf } from "../shared/index.js";
7
+
8
+ // V2: export-without-erase gate. A feature that registers an EXT_USER_DATA
9
+ // export hook without a matching delete hook exports data under Art.20 but
10
+ // never erases it on forget — an Art.17 violation. Hard boot failure: no app
11
+ // should ship a GDPR export path with no erase path. Registry-level signal
12
+ // only; runtime no-ops (a delete hook that silently skips) are not detectable
13
+ // here — those are covered by the export/forget integration tests.
14
+ //
15
+ // Registered as an `r.bootCheck()` by this feature (#1314) — EXT_USER_DATA is
16
+ // owned by user-data-rights (r.extendsRegistrar(EXT_USER_DATA, {})), so any
17
+ // r.useExtension(EXT_USER_DATA, ...) usage across the app already requires
18
+ // user-data-rights to be mounted (boot-validator's extension-provider check
19
+ // fails otherwise); running this from user-data-rights' own bootCheck is
20
+ // equivalent to the framework-internal call it replaces.
21
+ export function validateGdprHookCompleteness(features: readonly FeatureDefinition[]): void {
22
+ for (const feature of features) {
23
+ for (const usage of feature.extensionUsages) {
24
+ if (usage.extensionName !== EXT_USER_DATA) continue;
25
+ const hasExport = typeof usage.options?.["export"] === "function";
26
+ const hasDelete = typeof usage.options?.["delete"] === "function";
27
+ if (hasExport && !hasDelete) {
28
+ throw new Error(
29
+ `[kumiko:boot] Feature "${feature.name}" exports entity "${usage.entityName}" via EXT_USER_DATA but registers no delete hook — data is included in Art.20 exports but never erased on forget (Art.17 violation). Add a delete hook. If erasure is intentionally handled elsewhere (e.g. crypto-shredding key-erase, parent cascade), register a no-op delete: async () => {} with a comment explaining why.`,
30
+ );
31
+ }
32
+ }
33
+ }
34
+ }
35
+
36
+ // V3: PII-entity-without-hook gate. V2 checks registered hooks for
37
+ // completeness; V3 catches the entity nobody registered at all — fields
38
+ // annotated as user-subject data (pii / userOwned / subjectRef) yet
39
+ // invisible to the Art.15/20 export and Art.17 forget pipeline. Hard boot
40
+ // failure: a
41
+ // subject-data entity that skips the pipeline is exactly the "feature built
42
+ // past GDPR" leak this gate exists to stop. No "is user-data-rights mounted"
43
+ // guard needed here (unlike the framework-internal predecessor) — this runs
44
+ // as user-data-rights' own bootCheck, so it's only reachable when mounted.
45
+ // Matching is by entity name across all features (usage.entityName is
46
+ // unqualified); a same-named entity in another feature can mask a gap —
47
+ // accepted, as the common case is a distinct entity name.
48
+ export function validateGdprPiiHookCoverage(features: readonly FeatureDefinition[]): void {
49
+ const hookedEntities = new Set<string>();
50
+ for (const f of features) {
51
+ for (const usage of f.extensionUsages) {
52
+ if (usage.extensionName === EXT_USER_DATA) hookedEntities.add(usage.entityName);
53
+ }
54
+ }
55
+
56
+ for (const feature of features) {
57
+ for (const [entityName, entity] of entitiesOf(feature)) {
58
+ if (hookedEntities.has(entityName)) continue;
59
+ const subjectFields = Object.entries(entity.fields)
60
+ .filter(([, field]) => {
61
+ const annot = field as ResolvedPiiFlags; // @cast-boundary schema-walk
62
+ return Boolean(annot.pii) || Boolean(annot.userOwned) || Boolean(annot.subjectRef);
63
+ })
64
+ .map(([name]) => name);
65
+ if (subjectFields.length === 0) continue;
66
+ throw new Error(
67
+ `[kumiko:boot] Entity "${entityName}" (feature "${feature.name}") has user-subject fields (${subjectFields.join(", ")}) but no feature registers an EXT_USER_DATA hook for it — the data never appears in Art.15/20 exports and is never erased on forget (Art.17 gap). Register r.useExtension(EXT_USER_DATA, "${entityName}", { export, delete }) in the owning feature or a defaults feature. If this entity is intentionally out of the pipeline (e.g. crypto-shredding key-erase covers it), register a no-op hook { export: async () => null, delete: async () => {} } with a comment explaining why.`,
68
+ );
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,116 @@
1
+ [
2
+ {
3
+ "version": "0.338.0",
4
+ "type": "fix",
5
+ "title": "Forget cleanup covers tenants the user already left",
6
+ "detail": "`runForgetCleanup` builds the per-user tenant list from live memberships plus the user's `tenant-membership.created` history (read from the event payload, so cross-tenant SystemAdmin adds count too), deduplicated. Delete hooks, such as the notes-history mention shred, therefore also run in tenants the user left before the request. The `tenantIdsBeforeDelete` list passed to the deletion-executed mail still contains only the live memberships. Mentions written before notes recorded structured mention rows for non-members are not covered."
7
+ },
8
+ {
9
+ "version": "0.335.0",
10
+ "type": "fix",
11
+ "title": "Public deletion and download handlers rate-limit per IP and handler"
12
+ },
13
+ {
14
+ "version": "0.335.0",
15
+ "type": "fix",
16
+ "title": "Export cleanup reports a last-run timestamp gauge and still reports backlog age when the pass throws",
17
+ "detail": "The export storage-cleanup pass now also reports an `export_cleanup_last_run_timestamp` gauge (Unix seconds, set only when a pass completes) so a stalled cron can be alerted on with `time() - metric > interval + buffer`; the backlog gauge keeps its last value when the cron stops, so `absent()` never fires. The backlog gauge is now reported even when the pass throws. The workflow-runner event wakeup uses the framework `getTemporal()` instead of the global `Temporal`, and a redelivered `workflow.waiting-for-event` no longer resets an already matched trigger."
18
+ },
19
+ {
20
+ "version": "0.335.0",
21
+ "type": "fix",
22
+ "title": "Backlog gauge covers failed export orphans, explainer labels translated, unattributed escape-hatch actor constant",
23
+ "detail": "`OWNER_INVITE_ROLE_OPTIONS` is now exported from the tenant barrel so apps can compose it into custom invite screens. The privacy-center and profile deletion explainer descriptions are registered as `i18nKey()` labels with server-side English translations. The export storage-cleanup backlog gauge now also covers failed jobs with an orphaned ZIP. Escape-hatch audit events from the forget-cleanup, user-export and tenant-lifecycle runners use the exported `UNATTRIBUTED_ACTOR` constant (value `\"system\"`, unchanged) when no actor is passed. Deletion requests no longer query the tenant compliance profile for users that are not active."
24
+ },
25
+ {
26
+ "version": "0.335.0",
27
+ "type": "fix",
28
+ "title": "cancel-deletion actions declare the x icon instead of resolving to the destructive trash icon"
29
+ },
30
+ {
31
+ "version": "0.330.0",
32
+ "type": "fix",
33
+ "title": "The privacy-center restriction and deletion dialog titles are registered in English by the feature",
34
+ "detail": "The new i18n-parity test in `use-all-bundled` harvests the English copy from the real registrations (feature translations, client plugins, renderer defaults, mail templates) and fails with `key -> locale` when `locale-de` or `locale-es` lacks a key or an en-catalog drifts. This added the missing German and Spanish copy for billing plans, the privacy-center status field and many more keys, and removed 110 translation keys no feature registers any more. German uses \"Ereignisprotokoll\" for the audit log everywhere. `userDataRights.privacyCenter.restriction.dialogTitle` and `.deletion.dialogTitle` are registered in English by the feature."
35
+ },
36
+ {
37
+ "version": "0.320.0",
38
+ "type": "fix",
39
+ "title": "Audit IP comes from the framework's trustedProxyHops-aware resolver, not a self-parsed X-Forwarded-For",
40
+ "detail": "`extractAuditMeta` no longer reads `X-Forwarded-For`/`X-Real-IP` itself —\nit takes the `clientIp` the `/user-export/by-token` httpRoute handler now\nreceives from `HttpRouteHandlerDeps`, mapping the resolver's `unknown`\nsentinel to `null`. Closes the spoofed-first-XFF-entry gap for that\nroute. A caller invoking `/api/query`'s `download-by-token` handler\ndirectly (not through this httpRoute) can still pass its own `auditMeta`\nin the payload — a pre-existing, documented tradeoff (the handler's own\ncomment: audit data isn't security-relevant), unchanged by this fix."
41
+ },
42
+ {
43
+ "version": "0.313.0",
44
+ "type": "fix",
45
+ "title": "Privacy-center screen subtitle is now translatable",
46
+ "detail": "The Privacy screen's description was hardcoded English prose baked\ninto feature.ts instead of an i18n key, so it never localized. It's\nnow userDataRights.privacyCenter.subtitle, registered in i18n.ts with\nde/es translations."
47
+ },
48
+ {
49
+ "version": "0.308.0",
50
+ "type": "fix",
51
+ "title": "The privacy-center screen's \"restrict\" action declares an explicit icon",
52
+ "detail": "The boot validator now requires every projectionDetail action to resolve an icon (fw#3234); \"restrict\" resolved none from the shared id-derived map, so it now declares `icon: \"lock\"` explicitly. \"request-deletion\" needed no change — it now resolves via the shared map's new `deletion: \"trash\"` entry (@cosmicdrift/kumiko-types)."
53
+ },
54
+ {
55
+ "version": "0.289.0",
56
+ "type": "improvement",
57
+ "title": "Deletion tokens are genuinely single-use, and a losing redeem no longer leaks status",
58
+ "detail": "`redeemDeletionToken` previously carried an `unsafeSkip` and a separate status check before the lifecycle write, so two concurrent redemptions of the same token could both get through. The lifecycle transition now rides the executor's `expect:` precondition inside the anchor spend, so exactly one redemption wins.\nExternally visible: the loser of a concurrent redeem now receives the same generic `invalid_or_expired_token` reason on the anonymous path as an unknown token, instead of `cannot_process_deletion`. That was the point — the old reason distinguished \"known token, wrong state\" from \"unknown token\" to an unauthenticated caller. Integrators matching on the old string on that endpoint should expect the generic one.\n`pendingDeletionRequestId` is now cleared on confirm as well, closing a pre-existing gap. `skipOptimisticLock: true` stays in the lifecycle path and now carries the reason it is correct there: callers structurally never hold a row version to pass through."
59
+ },
60
+ {
61
+ "version": "0.287.0",
62
+ "type": "improvement",
63
+ "title": "export-cleanup cron now emits an export_cleanup_backlog_age gauge to surface stalled runs",
64
+ "detail": "storageCleanupPass deletes expired export bundles via provider.delete, but the storage provider only exposes list() (no timestamps), so a silent failure left unencrypted PII bundles sitting in the bucket with no signal. runExportJobs now accepts an optional MetricsHandle and, after the cleanup loop, reports the age in seconds of the oldest done-status job whose expiresAt+grace has passed while downloadStorageKey is still set (0 if none) via the new EXPORT_CLEANUP_BACKLOG_AGE_METRIC (\"export_cleanup_backlog_age\", a gauge — no _total/_seconds suffix per validateMetricName, unit: \"seconds\" carried in the r.metric() definition instead). feature.ts's job handler builds the handle itself with createMetricsHandle(ctx.meter, \"user-data-rights\") since JobContext has no bound ctx.metrics (that only exists on HandlerContext, built per write/query dispatch) — falls back to createNoopMetricsHandle() when ctx.meter is unset. Metric emission is wrapped in try/catch so an observability hiccup never fails an otherwise-successful cleanup pass. Scope is deliberately done-status only; failed-status cleanup candidates have no expiresAt/TTL."
65
+ },
66
+ {
67
+ "version": "0.287.0",
68
+ "type": "fix",
69
+ "title": "GDPR forget only hard-deletes files that are PII of the forgotten person",
70
+ "detail": "fileRefDeleteHook picked rows via insertedById (who uploaded the file) and treated every matched row the same on strategy=\"delete\", so forgetting an uploader hard-deleted third-party business files they had merely uploaded (e.g. a dealer's vehicle photos uploaded by an employee). FileFieldDef/ImageFieldDef/FilesFieldDef/ImagesFieldDef now support \"& ResolvedPiiFlags\" like every other field type (createFileField/createImageField/createFilesField/createImagesField thread personal/reason through expandPersonalAnnotations), and fileRefDeleteHook's strategy=\"delete\" branch splits rows per-row via the new isPersonalFileRow/isPersonalPiiField predicates: pii/userOwned/recordOwned fields take the existing hard-delete path (storageProvider.delete() + derivatives + row), every other row (explicit personal:false, tenantOwned, subjectRef, no annotation, or an unresolvable entity/field) goes through severPersonLink instead, same as the existing strategy=\"anonymize\" path. Unattached uploads (no entityType/fieldName) still hard-delete. Derivatives have no own file_refs row, so they keep following their original's decision (the #2461 \"GDPR derivatives survive forget\" test stays green). POST /files now resolves entityType/fieldName against the registry and rejects the upload with 400 when they're set but don't resolve to a real field, closing the gap that let a client attach a file to a field the forget-hook could never look up; both unset (unattached upload) still passes. No new column or migration — the decision uses the entityType/fieldName file_refs already stores."
71
+ },
72
+ {
73
+ "version": "0.285.2",
74
+ "type": "fix",
75
+ "title": "export ZIPs write to exports/{tenantId}/{jobId}.zip, enabling one bucket-wide S3 lifecycle rule",
76
+ "detail": "buildExportStorageKey previously put the tenant first ({tenantId}/exports/{jobId}.zip), so no S3 prefix rule could target \"all tenants, then /exports/\" without also matching normal user uploads in the same bucket. The key now starts with the fixed exports/ segment via the new @cosmicdrift/kumiko-framework/files tenantExportPrefix() helper, tenant stays as the second segment. downloadStorageKey is stored per job and never recomputed, so existing rows keep resolving through their old key — no migration needed. tenantStoragePrefixes() (also new in framework/files) lists every prefix a tenant's binaries can live under; files-tenant-data's fileRefStorageDestroyHook now sweeps all of them on tenant-destroy instead of only {tenantId}/, closing a gap where a destroyed tenant's decrypted GDPR export bundles would have survived under the new exports/ prefix."
77
+ },
78
+ {
79
+ "version": "0.241.0",
80
+ "type": "breaking",
81
+ "title": "privacy-center is now a declarative screen; userDataRightsClient's privacyCenter.showDeletion option is removed (fw#2312).",
82
+ "detail": "`privacy-center` is now a declarative `projectionDetail` screen instead of a custom React component: the Restriction and Deletion sections render through the generic renderer (`EditFieldsSection` + `actions: RowAction[]`), preserving the original confirmation dialogs (`RowActionWriteHandler.confirm`) and visibility rules (`visible: {field, eq/ne}`) 1:1. The Export section (Art. 20) stays a custom `EditExtensionSection` — it needs polling + a signed-URL download — registered via the new `ClientFeatureDefinition.extensionSectionComponents` under `EXPORT_SECTION_EXTENSION_NAME`. `PrivacyCenterScreen` is a dead export (the renderer selects the screen by `screen.type`, not the client component registry). The single `status` field now renders through the `enumOption` format instead of the raw enum string; `gracePeriodEnd` is hidden when no deletion is pending instead of showing an empty date. Known UI regression, accepted for this pass: the confirm-dialog title is now always the action's `label` (the renderer hardcodes this) — the original's distinct `dialogTitle` copy and its dynamic composed banner sentence (e.g. \"Your account will be deleted on {date}\") are gone, replaced by the translated `status` label plus a separately labeled `gracePeriodEnd` date.",
83
+ "migration": "A declarative screen is registered once and can no longer be toggled per-app on the client: `userDataRightsClient(options)`'s `privacyCenter: { showDeletion }` option is removed. Move the flag server-side instead — replace `createUserDataRightsFeature({})` with `createUserDataRightsFeature({ privacyCenterShowDeletion: false })` (default `true`) — it conditionally omits the Deletion section and its `request-deletion`/`cancel-deletion` actions from the screen definition. Then drop the now-unused `privacyCenter` option from the matching `userDataRightsClient({ privacyCenter: { showDeletion: false } })` call. Known affected consumer: `money-horse` (`src/app/client-features.tsx:74`)."
84
+ },
85
+ {
86
+ "version": "0.165.3",
87
+ "type": "improvement",
88
+ "title": "Forget cleanup purges derived Meili docs for searchable subject-PII (fw#1610).",
89
+ "detail": "run-forget-cleanup (and the forget cron path) call purgeSearchDocumentsForSubject after crypto-shred so searchable userOwned fields do not linger in Meili as plaintext after Art. 17."
90
+ },
91
+ {
92
+ "version": "0.165.1",
93
+ "type": "fix",
94
+ "title": "restrict-account runs the same cross-tenant membership check as lift-restriction (fw#1543).",
95
+ "detail": "Any Admin/TenantAdmin — not just SystemAdmin — could restrict a user's account and force-revoke their sessions regardless of tenant, as long as they held an admin role in some tenant. Also: the GET /user-export/by-token fallback now forwards x-forwarded-for to the internal query call, so the per-IP 30/min limit stops collapsing into one global bucket."
96
+ },
97
+ {
98
+ "version": "0.165.0",
99
+ "type": "breaking",
100
+ "title": "Export download: removed ?token= query param",
101
+ "detail": "GET /user-export/by-token no longer accepts the token as a query parameter. Only POST body (read from URL fragment) is supported now. Old email links with ?token= in the URL will stop working.",
102
+ "migration": "Replace any existing export links that use ?token= in the URL with POST-based links. The token is now only read from the URL fragment (#token), which browsers never send to the server."
103
+ },
104
+ {
105
+ "version": "0.122.0",
106
+ "type": "fix",
107
+ "title": "user-data-rights: export-download-token re-runs rotate the token in place on the same agg…",
108
+ "detail": "user-data-rights: export-download-token re-runs rotate the token in place on the same aggregate (update) instead of creating a second aggregate for the same jobId. A second `created` event without a `deleted` in between made every projection rebuild collide on the `one_per_job` unique index (fw#832). Operator recovery after a lost plain token is now just \"flip the job back to pending\" — never delete the token row read-side. - @cosmicdrift/kumiko-framework@0.122.0 - @cosmicdrift/kumiko-headless@0.122.0 - @cosmicdrift/kumiko-renderer@0.122.0 - @cosmicdrift/kumiko-dispatcher-live@0.122.0 - @cosmicdrift/kumiko-renderer-web@0.122.0"
109
+ },
110
+ {
111
+ "version": "0.119.0",
112
+ "type": "improvement",
113
+ "title": "Crypto-shredding phase D: forget wire.",
114
+ "detail": "Crypto-shredding phase D: forget wire. New `crypto-shredding` bundled feature with the `forget-subject` operator command (DPO/SystemAdmin) — erases a user/tenant subject key and appends a `subject-forgotten` audit event. `user-data-rights` forget-cleanup now erases the user's subject key inside the per-user sub-tx (crash-safe, before the status flip). Fixes `list()` returning ciphertext for camelCase encrypted/pii fields and caching plaintext rows."
115
+ }
116
+ ]