@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,2963 @@
1
+ {
2
+ "source": "samples/apps/use-all-bundled APP_FEATURES (composeFeatures includeBundled + signup)",
3
+ "featureCount": 76,
4
+ "features": [
5
+ {
6
+ "name": "admin-shell",
7
+ "description": "Registers tenant-admin and platform-admin workspaces with provider nav into owner-feature screens (`tenant:screen:members`, `audit:screen:audit-log`, `tenant:screen:tenant-list`, `jobs:screen:job-runs`, optional `tier-engine:screen:tier-admin`, optional `cap-overview:screen:my-caps`/`cap-overview:screen:tenant-cap-list`) and the two overview dashboards, built from the metrics list (`metrics` option, default DEFAULT_METRICS). Mount after user, tenant, audit, jobs, metrics and metrics-system; pass `workspaceIds` to match app URL conventions (e.g. Studio `d`/`s`, PublicStatus `admin`/`sysadmin`). Client: `adminShellClient()`, `tenantClient()`, `auditClient()`, `jobsClient()`, optional `tierEngineClient()`.",
8
+ "toggleableDefault": null,
9
+ "requires": [
10
+ "user",
11
+ "tenant",
12
+ "audit",
13
+ "jobs",
14
+ "metrics",
15
+ "metrics-system",
16
+ "tier-engine",
17
+ "cap-overview"
18
+ ],
19
+ "optionalRequires": [],
20
+ "configReads": [],
21
+ "exposesApis": [],
22
+ "usesApis": [],
23
+ "extensionsUsed": [],
24
+ "configKeys": [],
25
+ "secrets": [],
26
+ "writeHandlers": [],
27
+ "uiHints": {
28
+ "displayLabel": "Admin Shell",
29
+ "category": "operations",
30
+ "recommended": false
31
+ }
32
+ },
33
+ {
34
+ "name": "agent-tools",
35
+ "description": "Builds a tool catalog and an agent manifest from the mounted registry so an LLM agent can call handlers and understand the app's shape. A handler or entity without a `description` stays invisible to the agent by construction (see `resolveAgentExposure`), while a screen stays visible unless it opts out with `agent: { expose: false }` (see `isAgentVisibleScreen`) — this feature surfaces the resulting gaps at boot and via `kumiko agent lint` so an app author notices before an agent silently can't see a feature.",
36
+ "toggleableDefault": null,
37
+ "requires": [],
38
+ "optionalRequires": [],
39
+ "configReads": [],
40
+ "exposesApis": [],
41
+ "usesApis": [],
42
+ "extensionsUsed": [],
43
+ "configKeys": [],
44
+ "secrets": [],
45
+ "writeHandlers": [],
46
+ "uiHints": {
47
+ "displayLabel": "AI Agent Tools",
48
+ "category": "ai",
49
+ "recommended": false
50
+ }
51
+ },
52
+ {
53
+ "name": "audit",
54
+ "description": "Exposes the framework's event store as a paginated, filterable audit log via the `audit:query:list` handler (accessible to `Admin` and `SystemAdmin` roles). No separate table or projection — the event store is the audit trail by construction: every entity write already records who, when, what entity, and the event payload with PII stripped. Filter by `aggregateType`, `aggregateId`, `eventType`, `userId`, or time range. Also records `audit:event:escape-hatch-used` whenever a handler uses one of the framework's escape hatches (unsafeRaw, acknowledgeCrossTenant, db.global() writes, or a granted identity switch).",
55
+ "toggleableDefault": null,
56
+ "requires": [
57
+ "tenant",
58
+ "user"
59
+ ],
60
+ "optionalRequires": [],
61
+ "configReads": [],
62
+ "exposesApis": [],
63
+ "usesApis": [],
64
+ "extensionsUsed": [],
65
+ "configKeys": [],
66
+ "secrets": [],
67
+ "writeHandlers": [],
68
+ "uiHints": {
69
+ "displayLabel": "Audit Log",
70
+ "category": "compliance",
71
+ "recommended": false
72
+ }
73
+ },
74
+ {
75
+ "name": "auth-email-password",
76
+ "description": "Provides email+password authentication: the always-on handlers are `login`, `changePassword`, and `logout`; optional flows — password reset, email verification, magic-link self-signup, tenant invite, and account-unlock — are registered only when you pass their respective option objects (`passwordReset`, `emailVerification`, `signup`, `invite`, `accountUnlock`) to `createAuthEmailPasswordFeature(opts)`. All five magic-link flows dispatch their mail through the `delivery` feature via `ctx.notify`, so mounting any of them additionally requires `delivery`. Tokens are HMAC-signed (reset/verify/unlock) or opaque-random in Redis (signup/invite). `accountUnlock` is the self-service escape hatch for `accountLockout`'s monotonic failure-counter (#1266): confirming the mailed token clears the Redis lockout state without touching the user entity. Requires the `user` and `tenant` features, and declares `JWT_SECRET` (≥ 32 chars) in `authEmailPasswordEnvSchema` so a missing secret surfaces at boot validation rather than on the first login attempt.",
77
+ "toggleableDefault": null,
78
+ "requires": [
79
+ "user",
80
+ "tenant",
81
+ "delivery"
82
+ ],
83
+ "optionalRequires": [],
84
+ "configReads": [],
85
+ "exposesApis": [],
86
+ "usesApis": [],
87
+ "extensionsUsed": [],
88
+ "configKeys": [],
89
+ "secrets": [],
90
+ "writeHandlers": [
91
+ "auth-email-password:write:change-password",
92
+ "auth-email-password:write:confirm-account-unlock",
93
+ "auth-email-password:write:invite-accept",
94
+ "auth-email-password:write:invite-accept-with-login",
95
+ "auth-email-password:write:invite-create",
96
+ "auth-email-password:write:invite-signup-complete",
97
+ "auth-email-password:write:login",
98
+ "auth-email-password:write:logout",
99
+ "auth-email-password:write:request-account-unlock",
100
+ "auth-email-password:write:request-email-verification",
101
+ "auth-email-password:write:request-password-reset",
102
+ "auth-email-password:write:reset-password",
103
+ "auth-email-password:write:signup-confirm",
104
+ "auth-email-password:write:signup-request",
105
+ "auth-email-password:write:verify-email"
106
+ ],
107
+ "uiHints": {
108
+ "displayLabel": "Auth · Email + Password",
109
+ "category": "identity",
110
+ "recommended": true,
111
+ "configurableOptions": [
112
+ {
113
+ "key": "passwordReset",
114
+ "label": "Password-Reset-Flow",
115
+ "type": "boolean",
116
+ "default": true
117
+ },
118
+ {
119
+ "key": "emailVerification",
120
+ "label": "Email-Verification-Flow",
121
+ "type": "boolean",
122
+ "default": true
123
+ },
124
+ {
125
+ "key": "signup",
126
+ "label": "Self-Signup-Flow",
127
+ "type": "boolean",
128
+ "default": false
129
+ },
130
+ {
131
+ "key": "invite",
132
+ "label": "Tenant-Invite-Flow",
133
+ "type": "boolean",
134
+ "default": false
135
+ },
136
+ {
137
+ "key": "accountUnlock",
138
+ "label": "Account-Unlock-Flow",
139
+ "type": "boolean",
140
+ "default": false
141
+ }
142
+ ]
143
+ }
144
+ },
145
+ {
146
+ "name": "auth-foundation",
147
+ "description": "Declares auth-middleware extension points: `tokenVerifier` (Bearer), `sessionStore` (revocable JWT sid), optional `tenantResolver` + `tenantExistence` for anonymous multi-tenant. Provider-features register via r.useExtension; mount auth-foundation with the matching provider features.",
148
+ "toggleableDefault": null,
149
+ "requires": [],
150
+ "optionalRequires": [],
151
+ "configReads": [],
152
+ "exposesApis": [],
153
+ "usesApis": [],
154
+ "extensionsUsed": [],
155
+ "configKeys": [],
156
+ "secrets": [],
157
+ "writeHandlers": [],
158
+ "uiHints": {
159
+ "displayLabel": "Auth Provider Foundation",
160
+ "category": "identity",
161
+ "recommended": false
162
+ }
163
+ },
164
+ {
165
+ "name": "auth-mfa",
166
+ "description": "TOTP-based two-factor authentication: enable/disable flow with QR-code setup, 8 single-use recovery codes, and (once wired into a login flow) a second login step after password verification. Secrets are envelope-encrypted at rest via the same MasterKeyProvider as `secrets`/`config`.",
167
+ "toggleableDefault": null,
168
+ "requires": [
169
+ "user",
170
+ "config",
171
+ "tenant"
172
+ ],
173
+ "optionalRequires": [],
174
+ "configReads": [],
175
+ "exposesApis": [],
176
+ "usesApis": [],
177
+ "extensionsUsed": [],
178
+ "configKeys": [
179
+ {
180
+ "key": "required",
181
+ "qualifiedName": "auth-mfa:config:required",
182
+ "type": "select",
183
+ "scope": "tenant",
184
+ "default": "optional",
185
+ "encrypted": false,
186
+ "computed": false,
187
+ "validated": false,
188
+ "options": [
189
+ "optional",
190
+ "admins",
191
+ "all"
192
+ ],
193
+ "bounds": null,
194
+ "pattern": null,
195
+ "writeRoles": [
196
+ "TenantAdmin",
197
+ "Admin",
198
+ "SystemAdmin"
199
+ ],
200
+ "readRoles": [
201
+ "all"
202
+ ]
203
+ }
204
+ ],
205
+ "secrets": [],
206
+ "writeHandlers": [
207
+ "auth-mfa:write:disable",
208
+ "auth-mfa:write:enable-confirm",
209
+ "auth-mfa:write:enable-confirm-preauth",
210
+ "auth-mfa:write:enable-start",
211
+ "auth-mfa:write:enable-start-preauth",
212
+ "auth-mfa:write:regenerate-recovery",
213
+ "auth-mfa:write:verify"
214
+ ],
215
+ "uiHints": {
216
+ "displayLabel": "2FA / TOTP",
217
+ "category": "identity",
218
+ "recommended": true
219
+ }
220
+ },
221
+ {
222
+ "name": "auth-mfa-user-data",
223
+ "description": "GDPR (Art. 20 export / Art. 17 erasure) coverage for the `auth-mfa` feature's `user-mfa` entity. Mounts the EXT_USER_DATA export + delete hooks so 2FA enrollment status is included in the user-data export bundle and a user's TOTP secret + recovery codes are hard-deleted (via executor.forget, rebuild-safe) on a data-subject erasure request. Kept separate from `auth-mfa` so consumers without the user-data-rights pipeline don't pull a hard dependency — requires `user-data-rights`, optionalRequires `auth-mfa`.",
224
+ "toggleableDefault": null,
225
+ "requires": [
226
+ "user-data-rights"
227
+ ],
228
+ "optionalRequires": [
229
+ "auth-mfa"
230
+ ],
231
+ "configReads": [],
232
+ "exposesApis": [],
233
+ "usesApis": [],
234
+ "extensionsUsed": [
235
+ {
236
+ "extensionName": "userData",
237
+ "entityName": "user-mfa"
238
+ }
239
+ ],
240
+ "configKeys": [],
241
+ "secrets": [],
242
+ "writeHandlers": []
243
+ },
244
+ {
245
+ "name": "auth-self-registration",
246
+ "description": "Runtime on/off switch for the auth-email-password self-signup flow. Handler-less: composing it registers \"auth-self-registration\" as a toggleable feature (default ON). auth-email-password's signup-request handler and its `signupRegistrationStatus` query both read `ctx.hasFeature(\"auth-self-registration\")` — the query stays reachable when the toggle is off (deliberately not gated itself) so the public signup page can hide its own link/form. Only meaningful when `signup` is configured on `createAuthEmailPasswordFeature` — compose alongside it, then flip via the feature-toggles admin screen.",
247
+ "toggleableDefault": true,
248
+ "requires": [],
249
+ "optionalRequires": [],
250
+ "configReads": [],
251
+ "exposesApis": [],
252
+ "usesApis": [],
253
+ "extensionsUsed": [],
254
+ "configKeys": [],
255
+ "secrets": [],
256
+ "writeHandlers": []
257
+ },
258
+ {
259
+ "name": "billing-foundation",
260
+ "description": "Plugin host for subscription billing — manages the `read_subscriptions` projection table and exposes 5 domain events (subscription created/updated/canceled, invoice paid/failed) appended by the foundation's own `billing-foundation:write:process-event` write-handler after provider plugins verify and normalize each webhook. Also manages a separate `read_payments` projection table (one row per one-off-payment) fed by its own `payment-received` event and `billing-foundation:write:process-payment-event` write-handler. Also ships `billing-foundation:write:create-checkout-session` and `billing-foundation:write:create-portal-session` write-handlers, a `billing-foundation:query:subscription:list` query handler, and a `createSubscriptionWebhookRoute` factory for the `/api/subscription/webhook/:providerName` extraRoute. `createBillingFoundationFeature({ baseUrl, catalog })` additionally derives a `billing-foundation:query:billing-plans` query, `start-plan-checkout`/`switch-plan` write-handlers and a dormant billing-plans dashboard screen/panel from the catalog. Also ships `billing-foundation:write:sync-subscription` (pulls a provider plugin's live subscription state via `retrieveSubscription` and appends drift as a `subscription.updated` event — catches changes made on the provider's own dashboard that never reached us as a webhook) and the `sync-subscriptions` job (manual-trigger + runOnBoot, perTenant) that dispatches it. Low-level building block — use `subscription-stripe` or `subscription-mollie` unless you are writing a new payment provider.",
261
+ "toggleableDefault": null,
262
+ "requires": [
263
+ "tenant-lifecycle",
264
+ "compliance-profiles"
265
+ ],
266
+ "optionalRequires": [],
267
+ "configReads": [],
268
+ "exposesApis": [],
269
+ "usesApis": [],
270
+ "extensionsUsed": [
271
+ {
272
+ "extensionName": "tenantData",
273
+ "entityName": "subscription"
274
+ },
275
+ {
276
+ "extensionName": "tenantData",
277
+ "entityName": "payment"
278
+ }
279
+ ],
280
+ "configKeys": [],
281
+ "secrets": [],
282
+ "writeHandlers": [
283
+ "billing-foundation:write:create-checkout-session",
284
+ "billing-foundation:write:create-portal-session",
285
+ "billing-foundation:write:process-event",
286
+ "billing-foundation:write:process-payment-event",
287
+ "billing-foundation:write:sync-subscription"
288
+ ],
289
+ "uiHints": {
290
+ "displayLabel": "Billing · Foundation",
291
+ "category": "billing",
292
+ "recommended": false
293
+ }
294
+ },
295
+ {
296
+ "name": "cap-counter",
297
+ "description": "Tracks per-tenant usage against configurable limits using two complementary storage models: calendar-period counters (one projection row per tenant/capName/period, reset implicitly by period rollover) and rolling-window counters (append-only event stream, no projection). Use `enforceCap` / `enforceRollingCap` (or the `withCapEnforcement` / `withRollingCapEnforcement` handler wrappers) in your write-handlers to check limits with soft-warn and hard-block tolerances; call `enforceCapAndMaybeNotify` when you also want to trigger a delivery notification on soft-threshold hits.",
298
+ "toggleableDefault": null,
299
+ "requires": [],
300
+ "optionalRequires": [],
301
+ "configReads": [],
302
+ "exposesApis": [],
303
+ "usesApis": [],
304
+ "extensionsUsed": [],
305
+ "configKeys": [],
306
+ "secrets": [],
307
+ "writeHandlers": [
308
+ "cap-counter:write:increment",
309
+ "cap-counter:write:increment-rolling",
310
+ "cap-counter:write:mark-soft-warned"
311
+ ],
312
+ "uiHints": {
313
+ "displayLabel": "Cap Counter · Usage Limits",
314
+ "category": "operations",
315
+ "recommended": false
316
+ }
317
+ },
318
+ {
319
+ "name": "cap-overview",
320
+ "description": "Read-only visibility into per-tenant tier assignment and cap usage. SystemAdmin gets a platform-wide tenant list with usage bars; tenant admins (or the roles in `usageVisibleTo`) get their own tenant's usage as dashboard cards. Reads tier-engine, billing-foundation, and tenant data plus app-owned usage tables via caller-supplied CapSpec callbacks — never writes.",
321
+ "toggleableDefault": null,
322
+ "requires": [
323
+ "tenant",
324
+ "tier-engine",
325
+ "billing-foundation"
326
+ ],
327
+ "optionalRequires": [],
328
+ "configReads": [],
329
+ "exposesApis": [],
330
+ "usesApis": [],
331
+ "extensionsUsed": [],
332
+ "configKeys": [],
333
+ "secrets": [],
334
+ "writeHandlers": [],
335
+ "uiHints": {
336
+ "displayLabel": "Cap Overview · Tier & Usage Visibility",
337
+ "category": "operations",
338
+ "recommended": false
339
+ }
340
+ },
341
+ {
342
+ "name": "cap-overview-labels",
343
+ "description": "Labels for the example caps this sample app mounts into cap-overview.",
344
+ "toggleableDefault": null,
345
+ "requires": [],
346
+ "optionalRequires": [],
347
+ "configReads": [],
348
+ "exposesApis": [],
349
+ "usesApis": [],
350
+ "extensionsUsed": [],
351
+ "configKeys": [],
352
+ "secrets": [],
353
+ "writeHandlers": []
354
+ },
355
+ {
356
+ "name": "channel-email",
357
+ "description": "Wires an `EmailTransport` (typically `mail-transport-smtp` in production, `createInMemoryTransport()` in tests) into the delivery system as the `email` channel. Requires `delivery`; pass an `EmailChannelOptions` with a `transport`, a `renderer: NotificationRenderer` (e.g. backed by `renderer-simple`), and a `resolveEmail` function that maps a user ID to their email address.",
358
+ "toggleableDefault": null,
359
+ "requires": [
360
+ "delivery"
361
+ ],
362
+ "optionalRequires": [],
363
+ "configReads": [],
364
+ "exposesApis": [],
365
+ "usesApis": [],
366
+ "extensionsUsed": [
367
+ {
368
+ "extensionName": "deliveryChannel",
369
+ "entityName": "email"
370
+ }
371
+ ],
372
+ "configKeys": [],
373
+ "secrets": [],
374
+ "writeHandlers": [],
375
+ "uiHints": {
376
+ "displayLabel": "Email Channel",
377
+ "category": "notifications",
378
+ "recommended": false
379
+ }
380
+ },
381
+ {
382
+ "name": "channel-in-app",
383
+ "description": "Persists notifications to an in-app inbox table so users can retrieve them via `handlers.inbox` and track unread state with `handlers.markRead` / `handlers.markAllRead` and `queries.unreadCount`. Requires `delivery`; no external service needed — messages are stored in the app's own database.",
384
+ "toggleableDefault": null,
385
+ "requires": [
386
+ "delivery"
387
+ ],
388
+ "optionalRequires": [],
389
+ "configReads": [],
390
+ "exposesApis": [],
391
+ "usesApis": [],
392
+ "extensionsUsed": [
393
+ {
394
+ "extensionName": "deliveryChannel",
395
+ "entityName": "inApp"
396
+ }
397
+ ],
398
+ "configKeys": [],
399
+ "secrets": [],
400
+ "writeHandlers": [
401
+ "channel-in-app:write:mark-all-read",
402
+ "channel-in-app:write:mark-read"
403
+ ],
404
+ "uiHints": {
405
+ "displayLabel": "In-App Inbox",
406
+ "category": "notifications",
407
+ "recommended": false
408
+ }
409
+ },
410
+ {
411
+ "name": "channel-push",
412
+ "description": "Delivers push notifications through a `PushTransport` (bring your own FCM/APNs adapter or use `createInMemoryPushTransport()` for tests) registered as the `push` channel in the delivery system. Requires `delivery`; supply a `PushChannelOptions` with a transport and a resolver that maps a user ID to their device token.",
413
+ "toggleableDefault": null,
414
+ "requires": [
415
+ "delivery"
416
+ ],
417
+ "optionalRequires": [],
418
+ "configReads": [],
419
+ "exposesApis": [],
420
+ "usesApis": [],
421
+ "extensionsUsed": [
422
+ {
423
+ "extensionName": "deliveryChannel",
424
+ "entityName": "push"
425
+ }
426
+ ],
427
+ "configKeys": [],
428
+ "secrets": [],
429
+ "writeHandlers": [],
430
+ "uiHints": {
431
+ "displayLabel": "Push Channel",
432
+ "category": "notifications",
433
+ "recommended": false
434
+ }
435
+ },
436
+ {
437
+ "name": "collection-labels",
438
+ "description": "Nav labels for the content collections mounted by this sample app.",
439
+ "toggleableDefault": null,
440
+ "requires": [],
441
+ "optionalRequires": [],
442
+ "configReads": [],
443
+ "exposesApis": [],
444
+ "usesApis": [],
445
+ "extensionsUsed": [],
446
+ "configKeys": [],
447
+ "secrets": [],
448
+ "writeHandlers": []
449
+ },
450
+ {
451
+ "name": "compliance-profiles",
452
+ "description": "Lets each tenant select a compliance regime (e.g. `eu-dsgvo`, `swiss-dsg`, `de-hr-dsgvo-hgb`) that bundles user-rights grace periods, breach-disclosure deadlines, sub-processor requirements, and audit-retention rules into a single named profile. Tenant admins call `compliance-profiles:write:set-profile` to choose a profile (with optional JSON override for edge cases); other features resolve the effective profile via the `compliance.forTenant` cross-feature API. Required by `user-data-rights` — mount this feature before it.",
453
+ "toggleableDefault": null,
454
+ "requires": [],
455
+ "optionalRequires": [],
456
+ "configReads": [],
457
+ "exposesApis": [
458
+ "compliance.forTenant"
459
+ ],
460
+ "usesApis": [],
461
+ "extensionsUsed": [],
462
+ "configKeys": [],
463
+ "secrets": [],
464
+ "writeHandlers": [
465
+ "compliance-profiles:write:set-profile"
466
+ ],
467
+ "uiHints": {
468
+ "displayLabel": "Compliance Profiles",
469
+ "category": "compliance",
470
+ "recommended": false
471
+ }
472
+ },
473
+ {
474
+ "name": "compliance-profiles-ops",
475
+ "description": "Platform-wide SystemAdmin counterpart to `compliance-profiles`' `needs-profile` query (#2089): `tenants-missing-profile` lists every enabled tenant with no row in `tenantComplianceProfile` at all, tenant-wide instead of scoped to the caller's own tenant. Mount alongside `compliance-profiles` and `tenant` when an operator UI needs to see which tenants still silently run on `minimal-no-region`.",
476
+ "toggleableDefault": null,
477
+ "requires": [
478
+ "compliance-profiles",
479
+ "tenant"
480
+ ],
481
+ "optionalRequires": [],
482
+ "configReads": [],
483
+ "exposesApis": [],
484
+ "usesApis": [],
485
+ "extensionsUsed": [],
486
+ "configKeys": [],
487
+ "secrets": [],
488
+ "writeHandlers": [],
489
+ "uiHints": {
490
+ "displayLabel": "Compliance Profiles · Operator Visibility",
491
+ "category": "compliance",
492
+ "recommended": false
493
+ }
494
+ },
495
+ {
496
+ "name": "config",
497
+ "description": "Stores per-tenant (and optionally per-user) configuration values with a multi-layer cascade: user-row → tenant-row → system-row → app-override (deploy-time `AppConfigOverrides`) → computed → feature default. Access a value in handlers via `ctx.config(handle)`, declare keys with `r.config({ keys: { ... } })` inside a feature's registry callback, and optionally mark them `encrypted: true` to route storage through the envelope cipher (versioned master key). Use this feature whenever a tenant admin needs to customise behaviour at runtime without a code deploy.",
498
+ "toggleableDefault": null,
499
+ "requires": [],
500
+ "optionalRequires": [],
501
+ "configReads": [],
502
+ "exposesApis": [],
503
+ "usesApis": [],
504
+ "extensionsUsed": [],
505
+ "configKeys": [],
506
+ "secrets": [],
507
+ "writeHandlers": [
508
+ "config:write:reset",
509
+ "config:write:set"
510
+ ],
511
+ "uiHints": {
512
+ "displayLabel": "Tenant Config Store",
513
+ "category": "infrastructure",
514
+ "recommended": true
515
+ }
516
+ },
517
+ {
518
+ "name": "crypto-shredding",
519
+ "description": "Operator-level crypto-shredding trigger. `forget-subject` erases a user or tenant subject key in the configured KMS adapter, making every PII field encrypted under it permanently unreadable (reads render the `[[erased]]` sentinel), and appends a `subject-forgotten` audit event. Requires a KMS adapter (`runProdApp({ kms })`). The automated Art.-17 deletion pipeline in `user-data-rights` erases keys itself; this command covers manual forgets (authority requests, operator recovery, tenant destroy).",
520
+ "toggleableDefault": null,
521
+ "requires": [],
522
+ "optionalRequires": [],
523
+ "configReads": [],
524
+ "exposesApis": [],
525
+ "usesApis": [],
526
+ "extensionsUsed": [],
527
+ "configKeys": [],
528
+ "secrets": [],
529
+ "writeHandlers": [
530
+ "crypto-shredding:write:forget-subject"
531
+ ],
532
+ "uiHints": {
533
+ "displayLabel": "Crypto-Shredding",
534
+ "category": "compliance"
535
+ }
536
+ },
537
+ {
538
+ "name": "custom-fields",
539
+ "description": "Tenant- and system-scoped custom field definitions with generic value storage on any host entity. Registers the `field-definition` entity (event-sourced CRUD via `define-tenant-field`, `define-system-field`, `update-tenant-field`, `delete-tenant-field`, `delete-system-field`) and two value write-handlers (`set-custom-field`, `clear-custom-field`) that emit `custom-fields:event:custom-field-set` / `custom-fields:event:custom-field-cleared` events on the host aggregate's stream. To attach custom fields to your own entity, call `wireCustomFieldsFor(r, entityName, entityTable)` in the host feature — this wires the JSONB projection, `postQuery` flattening hook, and search-payload extension. The host entity must declare a `customFieldsField()` JSONB column.",
540
+ "toggleableDefault": null,
541
+ "requires": [],
542
+ "optionalRequires": [],
543
+ "configReads": [],
544
+ "exposesApis": [],
545
+ "usesApis": [],
546
+ "extensionsUsed": [],
547
+ "configKeys": [],
548
+ "secrets": [],
549
+ "writeHandlers": [
550
+ "custom-fields:write:clear-custom-field",
551
+ "custom-fields:write:define-system-field",
552
+ "custom-fields:write:define-tenant-field",
553
+ "custom-fields:write:delete-system-field",
554
+ "custom-fields:write:delete-tenant-field",
555
+ "custom-fields:write:set-custom-field",
556
+ "custom-fields:write:update-tenant-field"
557
+ ],
558
+ "uiHints": {
559
+ "displayLabel": "Custom Fields",
560
+ "category": "data",
561
+ "recommended": false
562
+ }
563
+ },
564
+ {
565
+ "name": "data-retention",
566
+ "description": "Resolves the effective retention policy for any entity using a 3-layer stack: entity-level default → tenant preset (`dsgvo-basic`, `dsgvo-hgb`, `swiss-dsg`) → per-tenant override stored in `tenantRetentionOverride`. Other features query the resolved policy via the `retention.policyFor` cross-feature API — most notably `user-data-rights`, which uses it to decide whether to anonymize instead of hard-delete a record that is still within a mandatory retention window.",
567
+ "toggleableDefault": null,
568
+ "requires": [],
569
+ "optionalRequires": [],
570
+ "configReads": [],
571
+ "exposesApis": [
572
+ "retention.policyFor"
573
+ ],
574
+ "usesApis": [],
575
+ "extensionsUsed": [],
576
+ "configKeys": [],
577
+ "secrets": [],
578
+ "writeHandlers": [],
579
+ "uiHints": {
580
+ "displayLabel": "Data Retention Policy",
581
+ "category": "compliance",
582
+ "recommended": false
583
+ }
584
+ },
585
+ {
586
+ "name": "delivery",
587
+ "description": "The notification dispatch core: call `ctx.notify(notificationType, { to, route, data, priority, idempotencyKey })` from any handler to fan out a notification across all registered channels (email, in-app, push). It stores per-user channel preferences in the `notification-preference` entity, opt-outs for no-account recipient addresses in `notification-address-opt-out` (keyed by a blind-index hash, never the plaintext address), logs every attempt to `store_delivery_attempts`, and enforces idempotency and rate-limiting — add `channel-email`, `channel-in-app`, or `channel-push` on top to actually send anything. Unsubscribe/resubscribe links are served by `createUnsubscribeRoutes({ secret })` mounted via the app's `extraRoutes` at `/api/delivery/unsubscribe` and `/api/delivery/resubscribe`: `GET /unsubscribe?token=` renders a confirmation page (no write), `POST /unsubscribe` performs the opt-out (RFC 8058 one-click, token from the form body or query), `POST /resubscribe` undoes it (JSON `{token}` or form body only, never the query — reachable by a mail-client link prefetcher) — sign links with `signUnsubscribeToken` / `signAddressUnsubscribeToken` using the same secret. `channel-email` sets `List-Unsubscribe` / `List-Unsubscribe-Post` automatically when a message's `data.unsubscribeUrl` points at the unsubscribe route.",
588
+ "toggleableDefault": null,
589
+ "requires": [
590
+ "tenant"
591
+ ],
592
+ "optionalRequires": [],
593
+ "configReads": [],
594
+ "exposesApis": [],
595
+ "usesApis": [],
596
+ "extensionsUsed": [],
597
+ "configKeys": [],
598
+ "secrets": [],
599
+ "writeHandlers": [
600
+ "delivery:write:resubscribe-address",
601
+ "delivery:write:resubscribe-user",
602
+ "delivery:write:set-preference",
603
+ "delivery:write:unsubscribe-address",
604
+ "delivery:write:unsubscribe-user"
605
+ ],
606
+ "uiHints": {
607
+ "displayLabel": "Notifications · Dispatch Core",
608
+ "category": "notifications",
609
+ "recommended": true
610
+ }
611
+ },
612
+ {
613
+ "name": "derivatives-sharp",
614
+ "description": "Registers an `image/*` renderer against the `derivativeRenderer` extension point declared by `file-derivatives`, backed by sharp. Supports resize/fit (cover, inside, contain), format conversion with quality (webp, avif, jpeg), whole-image blur, and blurring individual regions burned in before resize (see BlurRegion). EXIF orientation is applied and then normalized away, and all other EXIF (including GPS) is dropped. Server-only: sharp is a native binding — never import this from client code.",
615
+ "toggleableDefault": null,
616
+ "requires": [
617
+ "file-derivatives"
618
+ ],
619
+ "optionalRequires": [],
620
+ "configReads": [],
621
+ "exposesApis": [],
622
+ "usesApis": [],
623
+ "extensionsUsed": [
624
+ {
625
+ "extensionName": "derivativeRenderer",
626
+ "entityName": "image/*"
627
+ }
628
+ ],
629
+ "configKeys": [],
630
+ "secrets": [],
631
+ "writeHandlers": [],
632
+ "uiHints": {
633
+ "displayLabel": "File Derivatives · Sharp",
634
+ "category": "storage",
635
+ "recommended": false
636
+ }
637
+ },
638
+ {
639
+ "name": "document-ingest-foundation",
640
+ "description": "Shared PDF/Scan/Image → normalized-text ingest primitive. Owns the `documentExtract` entity (fileRefId, storageKey, per-page text + metadata) as an implicit entity-projection, the per-tenant `ocrLanguage`/`maxPagesPerFile` config keys, the `documentIngestProvider` extension-point providers register accepted mimeTypes/size caps under, and a fileRef.created/fileRef.restored trigger that resolves the provider for a file's mimeType and requests ingest via `documentIngest.requested` tagged with the winning provider — a delete→restore round-trip re-requests ingest the same way a fresh upload does. An orphan-extract guard forgets any `documentExtract` whose fileRef is no longer live at processing time, regardless of how a provider's own write races the fileRef's delete/forget — providers should write through `writeDocumentExtractForLiveFileRef`.",
641
+ "toggleableDefault": null,
642
+ "requires": [
643
+ "config",
644
+ "tenant-lifecycle"
645
+ ],
646
+ "optionalRequires": [],
647
+ "configReads": [],
648
+ "exposesApis": [],
649
+ "usesApis": [],
650
+ "extensionsUsed": [
651
+ {
652
+ "extensionName": "tenantData",
653
+ "entityName": "documentExtract"
654
+ }
655
+ ],
656
+ "configKeys": [
657
+ {
658
+ "key": "max-pages-per-file",
659
+ "qualifiedName": "document-ingest-foundation:config:max-pages-per-file",
660
+ "type": "number",
661
+ "scope": "tenant",
662
+ "default": 50,
663
+ "encrypted": false,
664
+ "computed": false,
665
+ "validated": false,
666
+ "options": null,
667
+ "bounds": {
668
+ "min": 1,
669
+ "max": 500
670
+ },
671
+ "pattern": null,
672
+ "writeRoles": [
673
+ "TenantAdmin",
674
+ "SystemAdmin"
675
+ ],
676
+ "readRoles": [
677
+ "TenantAdmin",
678
+ "SystemAdmin",
679
+ "User"
680
+ ]
681
+ },
682
+ {
683
+ "key": "ocr-language",
684
+ "qualifiedName": "document-ingest-foundation:config:ocr-language",
685
+ "type": "text",
686
+ "scope": "tenant",
687
+ "default": "deu+eng",
688
+ "encrypted": false,
689
+ "computed": false,
690
+ "validated": false,
691
+ "options": null,
692
+ "bounds": null,
693
+ "pattern": {
694
+ "regex": "^[a-z]{3}(\\+[a-z]{3})*$"
695
+ },
696
+ "writeRoles": [
697
+ "TenantAdmin",
698
+ "SystemAdmin"
699
+ ],
700
+ "readRoles": [
701
+ "TenantAdmin",
702
+ "SystemAdmin",
703
+ "User"
704
+ ]
705
+ }
706
+ ],
707
+ "secrets": [],
708
+ "writeHandlers": [],
709
+ "uiHints": {
710
+ "displayLabel": "Document Ingest Foundation",
711
+ "category": "storage",
712
+ "recommended": false
713
+ }
714
+ },
715
+ {
716
+ "name": "feature-toggles",
717
+ "description": "Persists per-feature enabled/disabled state in the `store_global_feature_state` table and exposes a `set` write-handler plus `list`/`registered` query-handlers so operators can flip features at runtime without redeploying. Each API instance keeps an in-memory `GlobalFeatureToggleRuntime` snapshot (initialize it via `createFeatureToggleRuntime`, pass a `() => runtime` accessor to `createFeatureTogglesFeature`) that the dispatcher gate reads on every request; a `toggle-cache-sync` multi-stream projection with `delivery: \"shared\"` syncs the snapshot across instances whenever a `toggle-set` event is appended.",
718
+ "toggleableDefault": null,
719
+ "requires": [],
720
+ "optionalRequires": [],
721
+ "configReads": [],
722
+ "exposesApis": [],
723
+ "usesApis": [],
724
+ "extensionsUsed": [],
725
+ "configKeys": [],
726
+ "secrets": [],
727
+ "writeHandlers": [
728
+ "feature-toggles:write:set"
729
+ ],
730
+ "uiHints": {
731
+ "displayLabel": "Feature Toggles · Operator Switches",
732
+ "category": "operations",
733
+ "recommended": false
734
+ }
735
+ },
736
+ {
737
+ "name": "file-derivatives",
738
+ "description": "Declares the `derivativeRenderer` extension point. `ctx.derivatives.variant(fileRefId, spec, name)` derives a variant of a tracked FileRef the first time it's requested and reuses the stored result afterwards (derive-on-first-use, keyed by a hash of the spec). Mount at least one `derivatives-*` renderer feature alongside this one — without a registered renderer for the FileRef's MIME type, every `variant(...)` call throws. Also declares the `derivativePublicPredicate` extension point (`r.useExtension(EXT_DERIVATIVE_PUBLIC_PREDICATE, '<entityType>', { isPublic })`) and, when `createFileDerivativesFeature({resolveApexTenant})` is passed a host-resolver, mounts an anonymous `GET {basePath}/:fileRefId/:variant` route that serves any variant name the FileRef's field declared in its `variants` for a FileRef whose entityType has a registered predicate returning true — default-deny (404) otherwise, same as an unknown FileRef or an undeclared variant name. The route's only rate-limit (`per: \"ip\"`) depends on the server's `trustedProxyHops` matching the deployment's actual reverse-proxy count — at the default 0 it ignores `x-forwarded-for` entirely, so every caller shares one bucket until that's configured. `publicTenantResolution: \"fileRef\"` keeps resolveApexTenant as the host gate but reads the variant from the FileRef row's own tenant instead of the host's, so one shared platform host serves every tenant's public variants — each FileRef-tenant's own `isPublic` predicate still default-denies. Also declares the `derivativeOverlayResolver` extension point (`r.useExtension(EXT_DERIVATIVE_OVERLAY_RESOLVER, '<entityType>', { resolve })`), used to turn a variant's `overlays[].dataToken` into the actual QR payload for that FileRef's entityType before the variant is rendered — a variant declaring a `qr` overlay throws at request-time if no resolver is registered for the FileRef's entityType.",
739
+ "toggleableDefault": null,
740
+ "requires": [
741
+ "file-foundation",
742
+ "files"
743
+ ],
744
+ "optionalRequires": [],
745
+ "configReads": [],
746
+ "exposesApis": [],
747
+ "usesApis": [],
748
+ "extensionsUsed": [],
749
+ "configKeys": [],
750
+ "secrets": [],
751
+ "writeHandlers": [],
752
+ "uiHints": {
753
+ "displayLabel": "File Derivatives",
754
+ "category": "storage",
755
+ "recommended": false
756
+ }
757
+ },
758
+ {
759
+ "name": "file-foundation",
760
+ "description": "Defines the `fileProvider` extension point and a per-tenant `provider` config key that selects which registered storage plugin to use at runtime. Call `createFileProviderForTenant(ctx, tenantId)` to get a `FileStorageProvider` — use this feature together with at least one `file-provider-*` feature; the `files` feature builds on top of it for tracked `FileRef` entities with GDPR hooks.",
761
+ "toggleableDefault": null,
762
+ "requires": [
763
+ "config"
764
+ ],
765
+ "optionalRequires": [],
766
+ "configReads": [],
767
+ "exposesApis": [],
768
+ "usesApis": [],
769
+ "extensionsUsed": [],
770
+ "configKeys": [
771
+ {
772
+ "key": "provider",
773
+ "qualifiedName": "file-foundation:config:provider",
774
+ "type": "text",
775
+ "scope": "tenant",
776
+ "default": "",
777
+ "encrypted": false,
778
+ "computed": false,
779
+ "validated": false,
780
+ "options": null,
781
+ "bounds": null,
782
+ "pattern": null,
783
+ "writeRoles": [
784
+ "TenantAdmin",
785
+ "SystemAdmin"
786
+ ],
787
+ "readRoles": [
788
+ "TenantAdmin",
789
+ "SystemAdmin",
790
+ "User"
791
+ ]
792
+ }
793
+ ],
794
+ "secrets": [],
795
+ "writeHandlers": [],
796
+ "uiHints": {
797
+ "displayLabel": "File Provider Foundation",
798
+ "category": "storage",
799
+ "recommended": false
800
+ }
801
+ },
802
+ {
803
+ "name": "file-provider-inmemory",
804
+ "description": "Registers an in-process `\"inmemory\"` provider for `file-foundation` that stores file bytes per tenant in a module-level Map. Use `listKeys(tenantId)` and `clearStorage(tenantId)` in demo apps and tests; not for production (data is lost on restart and grows without bound).",
805
+ "toggleableDefault": null,
806
+ "requires": [
807
+ "file-foundation"
808
+ ],
809
+ "optionalRequires": [],
810
+ "configReads": [],
811
+ "exposesApis": [],
812
+ "usesApis": [],
813
+ "extensionsUsed": [
814
+ {
815
+ "extensionName": "fileProvider",
816
+ "entityName": "inmemory"
817
+ }
818
+ ],
819
+ "configKeys": [],
820
+ "secrets": [],
821
+ "writeHandlers": [],
822
+ "uiHints": {
823
+ "displayLabel": "File Provider · In-Memory",
824
+ "category": "storage",
825
+ "recommended": false
826
+ }
827
+ },
828
+ {
829
+ "name": "file-provider-s3",
830
+ "description": "Registers itself as the `\"s3\"` provider for `file-foundation` and owns the per-tenant config keys (`bucket`, `region`, `endpoint`, `forcePathStyle`, `accessKeyId`) and the encrypted `s3.secretAccessKey` secret. Compatible with any S3-compatible object store (AWS S3, Hetzner Object Storage); set credentials via the admin UI or a seed handler before the first file operation.",
831
+ "toggleableDefault": null,
832
+ "requires": [
833
+ "config",
834
+ "secrets",
835
+ "file-foundation"
836
+ ],
837
+ "optionalRequires": [],
838
+ "configReads": [],
839
+ "exposesApis": [],
840
+ "usesApis": [],
841
+ "extensionsUsed": [
842
+ {
843
+ "extensionName": "fileProvider",
844
+ "entityName": "s3"
845
+ }
846
+ ],
847
+ "configKeys": [
848
+ {
849
+ "key": "access-key-id",
850
+ "qualifiedName": "file-provider-s3:config:access-key-id",
851
+ "type": "text",
852
+ "scope": "tenant",
853
+ "default": "",
854
+ "encrypted": false,
855
+ "computed": false,
856
+ "validated": false,
857
+ "options": null,
858
+ "bounds": null,
859
+ "pattern": null,
860
+ "writeRoles": [
861
+ "TenantAdmin",
862
+ "SystemAdmin"
863
+ ],
864
+ "readRoles": [
865
+ "TenantAdmin",
866
+ "SystemAdmin"
867
+ ]
868
+ },
869
+ {
870
+ "key": "bucket",
871
+ "qualifiedName": "file-provider-s3:config:bucket",
872
+ "type": "text",
873
+ "scope": "tenant",
874
+ "default": "",
875
+ "encrypted": false,
876
+ "computed": false,
877
+ "validated": false,
878
+ "options": null,
879
+ "bounds": null,
880
+ "pattern": null,
881
+ "writeRoles": [
882
+ "TenantAdmin",
883
+ "SystemAdmin"
884
+ ],
885
+ "readRoles": [
886
+ "TenantAdmin",
887
+ "SystemAdmin"
888
+ ]
889
+ },
890
+ {
891
+ "key": "endpoint",
892
+ "qualifiedName": "file-provider-s3:config:endpoint",
893
+ "type": "text",
894
+ "scope": "tenant",
895
+ "default": "",
896
+ "encrypted": false,
897
+ "computed": false,
898
+ "validated": false,
899
+ "options": null,
900
+ "bounds": null,
901
+ "pattern": null,
902
+ "writeRoles": [
903
+ "TenantAdmin",
904
+ "SystemAdmin"
905
+ ],
906
+ "readRoles": [
907
+ "TenantAdmin",
908
+ "SystemAdmin"
909
+ ]
910
+ },
911
+ {
912
+ "key": "force-path-style",
913
+ "qualifiedName": "file-provider-s3:config:force-path-style",
914
+ "type": "boolean",
915
+ "scope": "tenant",
916
+ "default": false,
917
+ "encrypted": false,
918
+ "computed": false,
919
+ "validated": false,
920
+ "options": null,
921
+ "bounds": null,
922
+ "pattern": null,
923
+ "writeRoles": [
924
+ "TenantAdmin",
925
+ "SystemAdmin"
926
+ ],
927
+ "readRoles": [
928
+ "all"
929
+ ]
930
+ },
931
+ {
932
+ "key": "region",
933
+ "qualifiedName": "file-provider-s3:config:region",
934
+ "type": "text",
935
+ "scope": "tenant",
936
+ "default": "",
937
+ "encrypted": false,
938
+ "computed": false,
939
+ "validated": false,
940
+ "options": null,
941
+ "bounds": null,
942
+ "pattern": null,
943
+ "writeRoles": [
944
+ "TenantAdmin",
945
+ "SystemAdmin"
946
+ ],
947
+ "readRoles": [
948
+ "TenantAdmin",
949
+ "SystemAdmin"
950
+ ]
951
+ }
952
+ ],
953
+ "secrets": [
954
+ {
955
+ "qualifiedName": "file-provider-s3:secret:s3-secret-access-key",
956
+ "scope": "tenant",
957
+ "label": "S3 secret access key",
958
+ "hint": "Private half of the S3 key pair. Hetzner calls it 'Secret Key', AWS calls it 'Secret Access Key'."
959
+ }
960
+ ],
961
+ "writeHandlers": [],
962
+ "uiHints": {
963
+ "displayLabel": "File Provider · S3",
964
+ "category": "storage",
965
+ "recommended": false
966
+ }
967
+ },
968
+ {
969
+ "name": "file-provider-s3-env",
970
+ "description": "Registers an `\"s3-env\"` provider for `file-foundation` that reads one S3 credential set from `process.env` (`S3_BUCKET`/`S3_REGION`/`S3_ACCESS_KEY`/`S3_SECRET_KEY`, optional `S3_ENDPOINT`/`S3_FORCE_PATH_STYLE`) and serves every tenant from one shared bucket — no per-tenant config or secret seeding. Use this for single-bucket S3-compatible deploys (e.g. Hetzner Object Storage); use `file-provider-s3` instead when each tenant needs its own bucket/credentials.",
971
+ "toggleableDefault": null,
972
+ "requires": [
973
+ "file-foundation"
974
+ ],
975
+ "optionalRequires": [],
976
+ "configReads": [],
977
+ "exposesApis": [],
978
+ "usesApis": [],
979
+ "extensionsUsed": [
980
+ {
981
+ "extensionName": "fileProvider",
982
+ "entityName": "s3-env"
983
+ }
984
+ ],
985
+ "configKeys": [],
986
+ "secrets": [],
987
+ "writeHandlers": [],
988
+ "uiHints": {
989
+ "displayLabel": "File Provider · S3 (env)",
990
+ "category": "storage",
991
+ "recommended": false
992
+ }
993
+ },
994
+ {
995
+ "name": "files",
996
+ "description": "Exposes the `fileRef` entity from the framework core so that uploaded files — tracked in the `file_refs` table by `createFileRoutes` — participate in cross-feature hooks: `user-data-rights-defaults` automatically includes file blobs in GDPR exports and forget flows, and tenant-lifecycle cleanup deletes all refs on tenant destroy. Upload/download routes are registered by the server bootstrap when a `file-provider-*` feature is mounted; this feature carries their access/size policy via `createFilesFeature(opts?)`.",
997
+ "toggleableDefault": null,
998
+ "requires": [],
999
+ "optionalRequires": [],
1000
+ "configReads": [],
1001
+ "exposesApis": [],
1002
+ "usesApis": [],
1003
+ "extensionsUsed": [],
1004
+ "configKeys": [],
1005
+ "secrets": [],
1006
+ "writeHandlers": [],
1007
+ "uiHints": {
1008
+ "displayLabel": "Files · Metadata",
1009
+ "category": "storage",
1010
+ "recommended": false
1011
+ }
1012
+ },
1013
+ {
1014
+ "name": "files-tenant-data",
1015
+ "description": "GDPR coverage for the `files` feature's `fileRef` entity: tenant-destroy row purge (EXT_TENANT_DATA) and full storage-prefix binary wipe (EXT_STORAGE_PROVIDER), plus a manual backfill/GC job that sweeps derivatives orphaned by a forget/tenant-destroy that ran before #2461 wired binary cleanup into those flows. Requires `tenant-lifecycle`, optionalRequires `files`.",
1016
+ "toggleableDefault": null,
1017
+ "requires": [
1018
+ "tenant-lifecycle"
1019
+ ],
1020
+ "optionalRequires": [
1021
+ "files"
1022
+ ],
1023
+ "configReads": [],
1024
+ "exposesApis": [],
1025
+ "usesApis": [],
1026
+ "extensionsUsed": [
1027
+ {
1028
+ "extensionName": "tenantData",
1029
+ "entityName": "fileRef"
1030
+ },
1031
+ {
1032
+ "extensionName": "storageProvider",
1033
+ "entityName": "fileRef"
1034
+ }
1035
+ ],
1036
+ "configKeys": [],
1037
+ "secrets": [],
1038
+ "writeHandlers": [],
1039
+ "uiHints": {
1040
+ "displayLabel": "Files · Tenant-Destroy & Derivative GC",
1041
+ "category": "compliance",
1042
+ "recommended": false
1043
+ }
1044
+ },
1045
+ {
1046
+ "name": "folders",
1047
+ "description": "Generic, host-agnostic hierarchical folders for any entity. Owns two event-sourced entities — the per-tenant `folder` tree (`read_folders`, self-referential via parentId) and SINGLE-membership `folder-assignment` rows keyed by (entityType, entityId) (`read_folder_assignments`) — so filing an entity adds NO column to the host and needs no relational pivot or JOIN. The folder catalog uses the generic entity handlers (create, update [= rename, optimistic-locked], delete, list, detail); set-folder puts/moves an entity into a folder (one folder per entity) and clear-folder unfiles it (both idempotent). Read which folder an entity is in, or which entities a folder holds, by listing `folder-assignment` filtered on `entityId` or `folderId`. Every path uses one access rule — adopt the host's model with createFoldersFeature({ access: { openToAll: { reason } } }) or pin roles. Pass { toggleable: { default: false } } to make the whole feature tier-gatable via the tier-engine (no host hook).",
1048
+ "toggleableDefault": null,
1049
+ "requires": [],
1050
+ "optionalRequires": [],
1051
+ "configReads": [],
1052
+ "exposesApis": [],
1053
+ "usesApis": [],
1054
+ "extensionsUsed": [],
1055
+ "configKeys": [],
1056
+ "secrets": [],
1057
+ "writeHandlers": [
1058
+ "folders:write:clear-folder",
1059
+ "folders:write:folder:create",
1060
+ "folders:write:folder:delete",
1061
+ "folders:write:folder:update",
1062
+ "folders:write:set-folder"
1063
+ ],
1064
+ "uiHints": {
1065
+ "displayLabel": "Folders",
1066
+ "category": "data",
1067
+ "recommended": false
1068
+ }
1069
+ },
1070
+ {
1071
+ "name": "folders-user-data",
1072
+ "description": "GDPR (Art. 20 export / Art. 17 erasure) coverage for the `folders` feature's `folder` + `folder-assignment` entities. Mounts the EXT_USER_DATA export + delete hooks so a tenant's folder tree and its entity-to-folder assignments are included in the user-data export bundle and erased on a tenant-scoped forget (single-user tenants only; multi-user + anonymize are no-ops since folder rows carry no per-user PII). Kept separate from `folders` so folder consumers without the user-data-rights pipeline don't pull a hard dependency — requires `user-data-rights`, optionalRequires `folders`.",
1073
+ "toggleableDefault": null,
1074
+ "requires": [
1075
+ "user-data-rights"
1076
+ ],
1077
+ "optionalRequires": [
1078
+ "folders"
1079
+ ],
1080
+ "configReads": [],
1081
+ "exposesApis": [],
1082
+ "usesApis": [],
1083
+ "extensionsUsed": [
1084
+ {
1085
+ "extensionName": "userData",
1086
+ "entityName": "folder"
1087
+ },
1088
+ {
1089
+ "extensionName": "userData",
1090
+ "entityName": "folder-assignment"
1091
+ }
1092
+ ],
1093
+ "configKeys": [],
1094
+ "secrets": [],
1095
+ "writeHandlers": []
1096
+ },
1097
+ {
1098
+ "name": "form-draft",
1099
+ "description": "Per-user, per-tenant working copy of an in-progress form, saved BEFORE the real domain entity exists. Owns one event-sourced entity, `form-draft` (`read_form_drafts`), keyed by a caller-assigned draftKey (typically screenId + optional hostEntityId), unique per (tenant, owner, draftKey). `save` upserts the draft blob ({ values, stepIndex, savedAt } — savedAt stamped server-side), `discard` deletes it (called once the real submit succeeds), `get` resumes it, `list` finds a user's open drafts for a given screenId (draftKey prefix match) — the fallback when a client-generated draftId is lost. Ownership is enforced by a per-row owner filter in every handler, not by roles — a foreign user's save/discard/get/list for someone else's draftKey never sees or touches that row. Never holds anything that already lives in a domain stream; the consuming app is responsible for discarding once the domain write succeeds. A daily cron job hard-deletes drafts past a configurable retention window (`form-draft:config:retention-days`, SystemAdmin-writable, default 30 days).",
1100
+ "toggleableDefault": null,
1101
+ "requires": [],
1102
+ "optionalRequires": [
1103
+ "config"
1104
+ ],
1105
+ "configReads": [],
1106
+ "exposesApis": [],
1107
+ "usesApis": [],
1108
+ "extensionsUsed": [],
1109
+ "configKeys": [
1110
+ {
1111
+ "key": "retention-days",
1112
+ "qualifiedName": "form-draft:config:retention-days",
1113
+ "type": "number",
1114
+ "scope": "system",
1115
+ "default": 30,
1116
+ "encrypted": false,
1117
+ "computed": false,
1118
+ "validated": false,
1119
+ "options": null,
1120
+ "bounds": {
1121
+ "min": 1
1122
+ },
1123
+ "pattern": null,
1124
+ "writeRoles": [
1125
+ "SystemAdmin"
1126
+ ],
1127
+ "readRoles": [
1128
+ "TenantAdmin",
1129
+ "Admin",
1130
+ "SystemAdmin"
1131
+ ]
1132
+ }
1133
+ ],
1134
+ "secrets": [],
1135
+ "writeHandlers": [
1136
+ "form-draft:write:discard",
1137
+ "form-draft:write:save"
1138
+ ],
1139
+ "uiHints": {
1140
+ "displayLabel": "Form Drafts",
1141
+ "category": "data",
1142
+ "recommended": false
1143
+ }
1144
+ },
1145
+ {
1146
+ "name": "form-draft-user-data",
1147
+ "description": "GDPR (Art. 20 export / Art. 17 erasure) coverage for the `form-draft` feature's `form-draft` entity. Mounts the EXT_USER_DATA export hook so a user's saved drafts are included in the user-data export bundle, and a delete hook that physically removes the user's own draft rows on forget. Kept separate from `form-draft` so form-draft consumers without the user-data-rights pipeline don't pull a hard dependency — requires `user-data-rights`, optionalRequires `form-draft`.",
1148
+ "toggleableDefault": null,
1149
+ "requires": [
1150
+ "user-data-rights"
1151
+ ],
1152
+ "optionalRequires": [
1153
+ "form-draft"
1154
+ ],
1155
+ "configReads": [],
1156
+ "exposesApis": [],
1157
+ "usesApis": [],
1158
+ "extensionsUsed": [
1159
+ {
1160
+ "extensionName": "userData",
1161
+ "entityName": "form-draft"
1162
+ }
1163
+ ],
1164
+ "configKeys": [],
1165
+ "secrets": [],
1166
+ "writeHandlers": []
1167
+ },
1168
+ {
1169
+ "name": "inbound-mail-foundation",
1170
+ "description": "Plugin host for inbound e-mail (inbox federation) — provider plugins (inbound-provider-imap, later M365 Graph / Gmail REST) register at the `inboundMailProvider` extension point with verify/fetch and optional oauth/watch (live push). The foundation owns three event-sourced streams (mail-account lifecycle, inbound-message with exactly-once ingest via deterministic aggregate ids, mail-thread rollup) and their projections `read_mail_accounts`/`read_inbound_messages`/`read_mail_threads`; PII fields are envelope-encrypted per tenant subject key before every append (crypto-shredding on tenant destroy). Wire `createInboundMailConnectRoutes` (OAuth connect + anonymous callback outside /api) and `createInboundMailSupervisor` (IDLE watch with backoff + reconciliation poll) in bin/server.ts. Consume `inbound-mail-foundation:event:inbound-message-received` from app features to attach business processes.",
1171
+ "toggleableDefault": null,
1172
+ "requires": [
1173
+ "tenant-lifecycle"
1174
+ ],
1175
+ "optionalRequires": [],
1176
+ "configReads": [],
1177
+ "exposesApis": [],
1178
+ "usesApis": [],
1179
+ "extensionsUsed": [
1180
+ {
1181
+ "extensionName": "tenantData",
1182
+ "entityName": "mail-account"
1183
+ },
1184
+ {
1185
+ "extensionName": "tenantData",
1186
+ "entityName": "inbound-message"
1187
+ },
1188
+ {
1189
+ "extensionName": "tenantData",
1190
+ "entityName": "mail-thread"
1191
+ }
1192
+ ],
1193
+ "configKeys": [],
1194
+ "secrets": [],
1195
+ "writeHandlers": [
1196
+ "inbound-mail-foundation:write:connect-account",
1197
+ "inbound-mail-foundation:write:disconnect-account",
1198
+ "inbound-mail-foundation:write:ingest-message",
1199
+ "inbound-mail-foundation:write:update-account"
1200
+ ],
1201
+ "uiHints": {
1202
+ "displayLabel": "Inbound Mail · Foundation",
1203
+ "category": "notifications",
1204
+ "recommended": false
1205
+ }
1206
+ },
1207
+ {
1208
+ "name": "inbound-provider-imap",
1209
+ "description": "Registers the `\"imap\"` provider for `inbound-mail-foundation` using imapflow — password/app-password auth covers classic IMAP hosts without any OAuth (plus an XOAUTH2 fallback consuming an access token from the secret slot). Incremental sync via a UIDVALIDITY:lastUid cursor (UIDVALIDITY change triggers a cursor-invalid full resync), initial backfill bounded by the foundation backfill window, and live push via IMAP IDLE for the watch supervisor. Store the per-account connection JSON (host/port/secure/user/password) in the account credential secret slot before the first sync.",
1210
+ "toggleableDefault": null,
1211
+ "requires": [
1212
+ "inbound-mail-foundation",
1213
+ "secrets"
1214
+ ],
1215
+ "optionalRequires": [],
1216
+ "configReads": [],
1217
+ "exposesApis": [],
1218
+ "usesApis": [],
1219
+ "extensionsUsed": [
1220
+ {
1221
+ "extensionName": "inboundMailProvider",
1222
+ "entityName": "imap"
1223
+ }
1224
+ ],
1225
+ "configKeys": [],
1226
+ "secrets": [],
1227
+ "writeHandlers": [],
1228
+ "uiHints": {
1229
+ "displayLabel": "Inbound Mail · IMAP",
1230
+ "category": "notifications",
1231
+ "recommended": false
1232
+ }
1233
+ },
1234
+ {
1235
+ "name": "inbound-provider-inmemory",
1236
+ "description": "Registers a scriptable in-process `\"inmemory\"` provider for `inbound-mail-foundation`. Seed messages with `seedInboundMessage(accountId, msg)` — an active watch pushes them immediately (IDLE simulation) and the cursor-based `fetch` re-delivers them on the reconciliation path, exercising the foundation dedup guarantee. Error injection via `failNextFetchWith`/`failNextVerifyWith`/`emitWatchError`; reset state with `resetInboundInMemory()`. For tests, demos and sample apps — not for production.",
1237
+ "toggleableDefault": null,
1238
+ "requires": [
1239
+ "inbound-mail-foundation"
1240
+ ],
1241
+ "optionalRequires": [],
1242
+ "configReads": [],
1243
+ "exposesApis": [],
1244
+ "usesApis": [],
1245
+ "extensionsUsed": [
1246
+ {
1247
+ "extensionName": "inboundMailProvider",
1248
+ "entityName": "inmemory"
1249
+ }
1250
+ ],
1251
+ "configKeys": [],
1252
+ "secrets": [],
1253
+ "writeHandlers": [],
1254
+ "uiHints": {
1255
+ "displayLabel": "Inbound Mail · In-Memory Provider",
1256
+ "category": "notifications",
1257
+ "recommended": false
1258
+ }
1259
+ },
1260
+ {
1261
+ "name": "jobs",
1262
+ "description": "Persistence and operator tooling for background jobs registered via `r.job(...)`. Every job execution writes directly into `store_job_runs` (current status + duration) and `store_job_run_logs` (per-line log rows) from the BullMQ callbacks — no event stream in between (#2243). A daily `retention-cleanup` job deletes runs (and their logs) older than `retentionDays`; an hourly `stale-run-sweep` job marks runs stuck at status `running` past `staleRunTimeoutHours` as `failed` (#2246 — a crashed worker never fires the completion callback, so nothing else ever revisits the row). Exposes `jobs:write:trigger` (manual run) and `jobs:write:retry` (operator retry of a failed run), plus `jobs:query:list`, `jobs:query:details`, and `jobs:query:catalog` (manual jobs) for the operator UI. A job that declares `tenantVisibleFailure` also records its last failed attempt per tenant and subject in `store_tenant_job_failures`, which the tenant itself reads through `jobs:query:failures` — a translation key only, never the provider's message (fw#3079).",
1263
+ "toggleableDefault": null,
1264
+ "requires": [],
1265
+ "optionalRequires": [],
1266
+ "configReads": [],
1267
+ "exposesApis": [],
1268
+ "usesApis": [],
1269
+ "extensionsUsed": [],
1270
+ "configKeys": [],
1271
+ "secrets": [],
1272
+ "writeHandlers": [
1273
+ "jobs:write:retry",
1274
+ "jobs:write:trigger"
1275
+ ],
1276
+ "uiHints": {
1277
+ "displayLabel": "Jobs · Audit & Operator UI",
1278
+ "category": "operations",
1279
+ "recommended": false
1280
+ }
1281
+ },
1282
+ {
1283
+ "name": "ledger",
1284
+ "description": "Double-entry bookkeeping primitive. Owns two event-sourced entities — the per-tenant `account` chart of accounts (`read_ledger_accounts`, self-referential via parentId, typed asset/liability/equity/income/expense) and immutable `transaction` journal entries (`read_ledger_transactions`) whose balanced posting lines are embedded as jsonb (Σ amount = 0, signed integer minor units). The account catalog uses the generic entity handlers (create, update, list, detail); create-transaction books a balanced entry (Σ=0 and ≥2 distinct accounts enforced at the command boundary, referential integrity against accounts checked) and reverse-transaction books its Storno mirror — there is deliberately NO transaction update/delete, so a posted entry is an immutable fact and the audit trail stays intact. Recurring schedules (`read_ledger_schedules`) layer Dauerauftrag templates on top — a schedule names debit/credit accounts, an amount, a monthly interval and an optional caller-assigned `sourceRef` key (filterable, to find a schedule again), from which the Soll (forecast) is a pure projection (projectSchedule) needing no bookings, and confirm-schedule-period materialises one period as an idempotent, reversal-aware balanced entry referencing scheduleReference(id, period); only confirming writes. Balances and reports (balance sheet, P&L, cashflow) derive as pure queries over the postings. Everything financial — banking, accounting, rent cashflow, credits, invoices — models as accounts + balanced transactions on top. Pin roles with createLedgerFeature({ roles }) or adopt the host model with { access }; pass { toggleable: { default: false } } to tier-gate the whole feature.",
1285
+ "toggleableDefault": null,
1286
+ "requires": [],
1287
+ "optionalRequires": [],
1288
+ "configReads": [],
1289
+ "exposesApis": [],
1290
+ "usesApis": [],
1291
+ "extensionsUsed": [],
1292
+ "configKeys": [],
1293
+ "secrets": [],
1294
+ "writeHandlers": [
1295
+ "ledger:write:account:create",
1296
+ "ledger:write:account:update",
1297
+ "ledger:write:confirm-schedule-period",
1298
+ "ledger:write:create-transaction",
1299
+ "ledger:write:reverse-transaction",
1300
+ "ledger:write:schedule:create",
1301
+ "ledger:write:schedule:update"
1302
+ ],
1303
+ "uiHints": {
1304
+ "displayLabel": "Ledger",
1305
+ "category": "data",
1306
+ "recommended": false
1307
+ }
1308
+ },
1309
+ {
1310
+ "name": "legal-pages",
1311
+ "description": "Opt-in wrapper around `template-resolver` text-blocks that registers public HTML routes (default: `/legal/impressum`, `/legal/datenschutz`, `/legal/imprint`, `/legal/privacy`) with Markdown-to-HTML rendering and a boot-time job that hard-fails in production when the required blocks (default: `imprint/de`, `privacy/de`) are not seeded in `SYSTEM_TENANT`. Both are configurable via `routes`/`requiredBlocks` for apps with a different default language or additional pages. Requires `anonymousAccess: { defaultTenantId: SYSTEM_TENANT_ID }` and `extraContext.templateResolver` to be wired at app bootstrap; for per-tenant imprints or a custom layout call `template-resolver:query:by-slug` directly.",
1312
+ "toggleableDefault": null,
1313
+ "requires": [
1314
+ "template-resolver"
1315
+ ],
1316
+ "optionalRequires": [],
1317
+ "configReads": [],
1318
+ "exposesApis": [],
1319
+ "usesApis": [],
1320
+ "extensionsUsed": [],
1321
+ "configKeys": [],
1322
+ "secrets": [],
1323
+ "writeHandlers": [],
1324
+ "uiHints": {
1325
+ "displayLabel": "Legal Pages",
1326
+ "category": "content",
1327
+ "recommended": false
1328
+ }
1329
+ },
1330
+ {
1331
+ "name": "locale-de",
1332
+ "description": "German UI and mail copy for framework screens. Opt-in; not included by includeBundled.",
1333
+ "toggleableDefault": null,
1334
+ "requires": [],
1335
+ "optionalRequires": [],
1336
+ "configReads": [],
1337
+ "exposesApis": [],
1338
+ "usesApis": [],
1339
+ "extensionsUsed": [],
1340
+ "configKeys": [],
1341
+ "secrets": [],
1342
+ "writeHandlers": []
1343
+ },
1344
+ {
1345
+ "name": "mail-foundation",
1346
+ "description": "Defines the `mailTransport` extension point and a per-tenant `provider` config key that selects which registered transport plugin to use at runtime. Call `createTransportForTenant(ctx, tenantId)` to get an `EmailTransport` ready for sending — use this feature together with at least one `mail-transport-*` feature; use `delivery` + `channel-email` instead when you need the full notification pipeline with delivery attempts and user preferences.",
1347
+ "toggleableDefault": null,
1348
+ "requires": [
1349
+ "config"
1350
+ ],
1351
+ "optionalRequires": [],
1352
+ "configReads": [],
1353
+ "exposesApis": [],
1354
+ "usesApis": [],
1355
+ "extensionsUsed": [],
1356
+ "configKeys": [
1357
+ {
1358
+ "key": "provider",
1359
+ "qualifiedName": "mail-foundation:config:provider",
1360
+ "type": "text",
1361
+ "scope": "tenant",
1362
+ "default": "",
1363
+ "encrypted": false,
1364
+ "computed": false,
1365
+ "validated": false,
1366
+ "options": null,
1367
+ "bounds": null,
1368
+ "pattern": null,
1369
+ "writeRoles": [
1370
+ "TenantAdmin",
1371
+ "SystemAdmin"
1372
+ ],
1373
+ "readRoles": [
1374
+ "TenantAdmin",
1375
+ "SystemAdmin",
1376
+ "User"
1377
+ ]
1378
+ }
1379
+ ],
1380
+ "secrets": [],
1381
+ "writeHandlers": [],
1382
+ "uiHints": {
1383
+ "displayLabel": "Mail Transport Foundation",
1384
+ "category": "notifications",
1385
+ "recommended": false
1386
+ }
1387
+ },
1388
+ {
1389
+ "name": "mail-transport-inmemory",
1390
+ "description": "Registers an in-process `\"inmemory\"` provider for `mail-foundation` that buffers sent mails per tenant instead of contacting an SMTP server. Use `getInbox(tenantId)` and `clearInbox(tenantId)` in demo apps and tests; not for production (buffer is process-memory, lost on restart).",
1391
+ "toggleableDefault": null,
1392
+ "requires": [
1393
+ "mail-foundation"
1394
+ ],
1395
+ "optionalRequires": [],
1396
+ "configReads": [],
1397
+ "exposesApis": [],
1398
+ "usesApis": [],
1399
+ "extensionsUsed": [
1400
+ {
1401
+ "extensionName": "mailTransport",
1402
+ "entityName": "inmemory"
1403
+ }
1404
+ ],
1405
+ "configKeys": [],
1406
+ "secrets": [],
1407
+ "writeHandlers": []
1408
+ },
1409
+ {
1410
+ "name": "mail-transport-smtp",
1411
+ "description": "Registers itself as the `\"smtp\"` provider for `mail-foundation` and owns the per-tenant config keys (`host`, `port`, `secure`, `from`, `authUser`) and the encrypted `smtp.password` secret. Tenants set `mail-foundation`'s `provider` config key to `\"smtp\"` to activate it; set the SMTP credentials via the admin UI or a seed handler before sending the first mail.",
1412
+ "toggleableDefault": null,
1413
+ "requires": [
1414
+ "config",
1415
+ "secrets",
1416
+ "mail-foundation"
1417
+ ],
1418
+ "optionalRequires": [],
1419
+ "configReads": [],
1420
+ "exposesApis": [],
1421
+ "usesApis": [],
1422
+ "extensionsUsed": [
1423
+ {
1424
+ "extensionName": "mailTransport",
1425
+ "entityName": "smtp"
1426
+ }
1427
+ ],
1428
+ "configKeys": [
1429
+ {
1430
+ "key": "auth-user",
1431
+ "qualifiedName": "mail-transport-smtp:config:auth-user",
1432
+ "type": "text",
1433
+ "scope": "tenant",
1434
+ "default": "",
1435
+ "encrypted": false,
1436
+ "computed": false,
1437
+ "validated": false,
1438
+ "options": null,
1439
+ "bounds": null,
1440
+ "pattern": null,
1441
+ "writeRoles": [
1442
+ "TenantAdmin",
1443
+ "SystemAdmin"
1444
+ ],
1445
+ "readRoles": [
1446
+ "TenantAdmin",
1447
+ "SystemAdmin"
1448
+ ]
1449
+ },
1450
+ {
1451
+ "key": "from",
1452
+ "qualifiedName": "mail-transport-smtp:config:from",
1453
+ "type": "text",
1454
+ "scope": "tenant",
1455
+ "default": "",
1456
+ "encrypted": false,
1457
+ "computed": false,
1458
+ "validated": false,
1459
+ "options": null,
1460
+ "bounds": null,
1461
+ "pattern": null,
1462
+ "writeRoles": [
1463
+ "TenantAdmin",
1464
+ "SystemAdmin"
1465
+ ],
1466
+ "readRoles": [
1467
+ "TenantAdmin",
1468
+ "SystemAdmin"
1469
+ ]
1470
+ },
1471
+ {
1472
+ "key": "host",
1473
+ "qualifiedName": "mail-transport-smtp:config:host",
1474
+ "type": "text",
1475
+ "scope": "tenant",
1476
+ "default": "",
1477
+ "encrypted": false,
1478
+ "computed": false,
1479
+ "validated": false,
1480
+ "options": null,
1481
+ "bounds": null,
1482
+ "pattern": null,
1483
+ "writeRoles": [
1484
+ "TenantAdmin",
1485
+ "SystemAdmin"
1486
+ ],
1487
+ "readRoles": [
1488
+ "TenantAdmin",
1489
+ "SystemAdmin"
1490
+ ]
1491
+ },
1492
+ {
1493
+ "key": "port",
1494
+ "qualifiedName": "mail-transport-smtp:config:port",
1495
+ "type": "number",
1496
+ "scope": "tenant",
1497
+ "default": 587,
1498
+ "encrypted": false,
1499
+ "computed": false,
1500
+ "validated": false,
1501
+ "options": null,
1502
+ "bounds": {
1503
+ "min": 1,
1504
+ "max": 65535
1505
+ },
1506
+ "pattern": null,
1507
+ "writeRoles": [
1508
+ "TenantAdmin",
1509
+ "SystemAdmin"
1510
+ ],
1511
+ "readRoles": [
1512
+ "all"
1513
+ ]
1514
+ },
1515
+ {
1516
+ "key": "secure",
1517
+ "qualifiedName": "mail-transport-smtp:config:secure",
1518
+ "type": "boolean",
1519
+ "scope": "tenant",
1520
+ "default": false,
1521
+ "encrypted": false,
1522
+ "computed": false,
1523
+ "validated": false,
1524
+ "options": null,
1525
+ "bounds": null,
1526
+ "pattern": null,
1527
+ "writeRoles": [
1528
+ "TenantAdmin",
1529
+ "SystemAdmin"
1530
+ ],
1531
+ "readRoles": [
1532
+ "all"
1533
+ ]
1534
+ }
1535
+ ],
1536
+ "secrets": [
1537
+ {
1538
+ "qualifiedName": "mail-transport-smtp:secret:smtp-password",
1539
+ "scope": "tenant",
1540
+ "label": "SMTP password",
1541
+ "hint": "Login password at the SMTP server. Brevo/Postmark/SES call it 'API key' or 'SMTP credentials'."
1542
+ }
1543
+ ],
1544
+ "writeHandlers": [],
1545
+ "uiHints": {
1546
+ "displayLabel": "Mail Transport · SMTP",
1547
+ "category": "notifications",
1548
+ "recommended": false
1549
+ }
1550
+ },
1551
+ {
1552
+ "name": "managed-pages",
1553
+ "description": "Tenant-editable, server-rendered public pages with per-tenant branding. Stores one Markdown `page` per `(tenantId, slug, lang)` in the `read_pages` entity table with a `published` gate plus `description`/`ogImage` SEO meta. Registers an anonymous `GET {basePath}/:slug` route that resolves the tenant from the request Host via the app-supplied `resolveApexTenant`, serves only published pages (drafts → 404), renders Markdown through the hardened `page-render` core, and isolates per-tenant content with `Vary: Host`. Ships TenantAdmin/SystemAdmin admin screens (`entityList` + `entityEdit`) backed by convention CRUD handlers (`managed-pages:write:page:{create,update,delete}`, `managed-pages:query:page:{list,detail}`); the app wires nav/workspace onto `managed-pages:screen:page-list`. Also exposes `managed-pages:query:by-tenant-published` (anonymous, SQL-filtered on `published`) for sitemap/discovery consumers such as the `seo` feature. Branding (via `config`, scope tenant): `branding-{title,description,site-url,accent-color,logo-url,layout-preset,custom-css}` keys with write-time validation (hex color, https URLs), a `configEdit` self-service screen (`managed-pages:screen:branding-settings`), and a `managed-pages:query:branding` read that the render path applies as scoped `:root` CSS vars + a logo/title header. Also exposes `managed-pages:write:set` (idempotent slug-keyed upsert, SystemAdmin cross-tenant via `tenantIdOverride`) as a provisioning API. Requires `config` + `anonymousAccess` wired at app bootstrap.",
1554
+ "toggleableDefault": null,
1555
+ "requires": [
1556
+ "config"
1557
+ ],
1558
+ "optionalRequires": [],
1559
+ "configReads": [],
1560
+ "exposesApis": [],
1561
+ "usesApis": [],
1562
+ "extensionsUsed": [],
1563
+ "configKeys": [
1564
+ {
1565
+ "key": "branding-accent-color",
1566
+ "qualifiedName": "managed-pages:config:branding-accent-color",
1567
+ "type": "text",
1568
+ "scope": "tenant",
1569
+ "default": "",
1570
+ "encrypted": false,
1571
+ "computed": false,
1572
+ "validated": false,
1573
+ "options": null,
1574
+ "bounds": null,
1575
+ "pattern": {
1576
+ "regex": "^$|^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
1577
+ },
1578
+ "writeRoles": [
1579
+ "system",
1580
+ "TenantAdmin",
1581
+ "Admin",
1582
+ "SystemAdmin"
1583
+ ],
1584
+ "readRoles": [
1585
+ "all"
1586
+ ]
1587
+ },
1588
+ {
1589
+ "key": "branding-custom-css",
1590
+ "qualifiedName": "managed-pages:config:branding-custom-css",
1591
+ "type": "text",
1592
+ "scope": "tenant",
1593
+ "default": "",
1594
+ "encrypted": false,
1595
+ "computed": false,
1596
+ "validated": false,
1597
+ "options": null,
1598
+ "bounds": null,
1599
+ "pattern": {
1600
+ "regex": "^[\\s\\S]{0,8000}$"
1601
+ },
1602
+ "writeRoles": [
1603
+ "TenantAdmin",
1604
+ "Admin",
1605
+ "SystemAdmin"
1606
+ ],
1607
+ "readRoles": [
1608
+ "all"
1609
+ ]
1610
+ },
1611
+ {
1612
+ "key": "branding-description",
1613
+ "qualifiedName": "managed-pages:config:branding-description",
1614
+ "type": "text",
1615
+ "scope": "tenant",
1616
+ "default": "",
1617
+ "encrypted": false,
1618
+ "computed": false,
1619
+ "validated": false,
1620
+ "options": null,
1621
+ "bounds": null,
1622
+ "pattern": {
1623
+ "regex": "^[\\s\\S]{0,500}$"
1624
+ },
1625
+ "writeRoles": [
1626
+ "system",
1627
+ "TenantAdmin",
1628
+ "Admin",
1629
+ "SystemAdmin"
1630
+ ],
1631
+ "readRoles": [
1632
+ "all"
1633
+ ]
1634
+ },
1635
+ {
1636
+ "key": "branding-layout-preset",
1637
+ "qualifiedName": "managed-pages:config:branding-layout-preset",
1638
+ "type": "select",
1639
+ "scope": "tenant",
1640
+ "default": "centered",
1641
+ "encrypted": false,
1642
+ "computed": false,
1643
+ "validated": false,
1644
+ "options": [
1645
+ "minimal",
1646
+ "centered",
1647
+ "wide"
1648
+ ],
1649
+ "bounds": null,
1650
+ "pattern": null,
1651
+ "writeRoles": [
1652
+ "system",
1653
+ "TenantAdmin",
1654
+ "Admin",
1655
+ "SystemAdmin"
1656
+ ],
1657
+ "readRoles": [
1658
+ "all"
1659
+ ]
1660
+ },
1661
+ {
1662
+ "key": "branding-logo-url",
1663
+ "qualifiedName": "managed-pages:config:branding-logo-url",
1664
+ "type": "text",
1665
+ "scope": "tenant",
1666
+ "default": "",
1667
+ "encrypted": false,
1668
+ "computed": false,
1669
+ "validated": false,
1670
+ "options": null,
1671
+ "bounds": null,
1672
+ "pattern": {
1673
+ "regex": "^$|^https://[^\\s\"'<>]{1,2000}$"
1674
+ },
1675
+ "writeRoles": [
1676
+ "system",
1677
+ "TenantAdmin",
1678
+ "Admin",
1679
+ "SystemAdmin"
1680
+ ],
1681
+ "readRoles": [
1682
+ "all"
1683
+ ]
1684
+ },
1685
+ {
1686
+ "key": "branding-site-url",
1687
+ "qualifiedName": "managed-pages:config:branding-site-url",
1688
+ "type": "text",
1689
+ "scope": "tenant",
1690
+ "default": "",
1691
+ "encrypted": false,
1692
+ "computed": false,
1693
+ "validated": false,
1694
+ "options": null,
1695
+ "bounds": null,
1696
+ "pattern": {
1697
+ "regex": "^$|^https://[^\\s\"'<>]{1,2000}$"
1698
+ },
1699
+ "writeRoles": [
1700
+ "system",
1701
+ "TenantAdmin",
1702
+ "Admin",
1703
+ "SystemAdmin"
1704
+ ],
1705
+ "readRoles": [
1706
+ "all"
1707
+ ]
1708
+ },
1709
+ {
1710
+ "key": "branding-title",
1711
+ "qualifiedName": "managed-pages:config:branding-title",
1712
+ "type": "text",
1713
+ "scope": "tenant",
1714
+ "default": "",
1715
+ "encrypted": false,
1716
+ "computed": false,
1717
+ "validated": false,
1718
+ "options": null,
1719
+ "bounds": null,
1720
+ "pattern": {
1721
+ "regex": "^[\\s\\S]{0,200}$"
1722
+ },
1723
+ "writeRoles": [
1724
+ "system",
1725
+ "TenantAdmin",
1726
+ "Admin",
1727
+ "SystemAdmin"
1728
+ ],
1729
+ "readRoles": [
1730
+ "all"
1731
+ ]
1732
+ }
1733
+ ],
1734
+ "secrets": [],
1735
+ "writeHandlers": [
1736
+ "managed-pages:write:page:create",
1737
+ "managed-pages:write:page:delete",
1738
+ "managed-pages:write:page:update",
1739
+ "managed-pages:write:set"
1740
+ ],
1741
+ "uiHints": {
1742
+ "displayLabel": "Managed Pages · Public CMS",
1743
+ "category": "content",
1744
+ "recommended": false
1745
+ }
1746
+ },
1747
+ {
1748
+ "name": "metrics",
1749
+ "description": "Declarative tenant-scoped metrics: each metric declaration becomes an admin-only query that aggregates a read-model table for the caller's own tenant and returns the shape dashboard panels consume (stat value with period delta, time series, ranked rows).",
1750
+ "toggleableDefault": null,
1751
+ "requires": [
1752
+ "jobs",
1753
+ "delivery",
1754
+ "sessions"
1755
+ ],
1756
+ "optionalRequires": [],
1757
+ "configReads": [],
1758
+ "exposesApis": [],
1759
+ "usesApis": [],
1760
+ "extensionsUsed": [],
1761
+ "configKeys": [],
1762
+ "secrets": [],
1763
+ "writeHandlers": [],
1764
+ "uiHints": {
1765
+ "displayLabel": "Metrics · Tenant Dashboard Data",
1766
+ "category": "operations",
1767
+ "recommended": false
1768
+ }
1769
+ },
1770
+ {
1771
+ "name": "metrics-system",
1772
+ "description": "Declarative platform-wide metrics for SystemAdmin: each metric declaration becomes a query that aggregates a read-model table across all tenants (optionally narrowed to one tenant) and returns the shape dashboard panels consume.",
1773
+ "toggleableDefault": null,
1774
+ "requires": [
1775
+ "jobs",
1776
+ "delivery",
1777
+ "sessions",
1778
+ "tenant"
1779
+ ],
1780
+ "optionalRequires": [],
1781
+ "configReads": [],
1782
+ "exposesApis": [],
1783
+ "usesApis": [],
1784
+ "extensionsUsed": [],
1785
+ "configKeys": [],
1786
+ "secrets": [],
1787
+ "writeHandlers": [],
1788
+ "uiHints": {
1789
+ "displayLabel": "Metrics · Platform Dashboard Data",
1790
+ "category": "operations",
1791
+ "recommended": false
1792
+ }
1793
+ },
1794
+ {
1795
+ "name": "notes-history",
1796
+ "description": "Generic, host-agnostic, append-only note history for any entity. Owns one event-sourced entity, `note-entry` (`read_note_entries`), keyed by (entityType, entityId) — so attaching notes adds NO column to the host entity and needs no relational pivot or JOIN. Provides a `create` write-handler (author stamped server-side from the caller, never client-supplied) and a `list` query filterable on entityId. Deliberately append-only: no update or delete handler is registered — a correction is a new entry, not an edit, so who-said-what-when stays reconstructable. Every path uses one access rule — adopt the host's model with createNotesHistoryFeature({ access: { openToAll: { reason } } }) or pin roles with createNotesHistoryFeature({ roles }).",
1797
+ "toggleableDefault": null,
1798
+ "requires": [],
1799
+ "optionalRequires": [],
1800
+ "configReads": [],
1801
+ "exposesApis": [],
1802
+ "usesApis": [],
1803
+ "extensionsUsed": [],
1804
+ "configKeys": [],
1805
+ "secrets": [],
1806
+ "writeHandlers": [
1807
+ "notes-history:write:add-note"
1808
+ ],
1809
+ "uiHints": {
1810
+ "displayLabel": "Notes",
1811
+ "category": "data",
1812
+ "recommended": false
1813
+ }
1814
+ },
1815
+ {
1816
+ "name": "notes-history-user-data",
1817
+ "description": "GDPR (Art. 20 export / Art. 17 erasure) coverage for the `notes-history` feature's `note-entry` and `note-mention` entities. Mounts the export hook so a user's authored notes are included in the user-data export bundle; the note-entry delete hook looks up `note-mention` for notes that structurally @-mention the forgotten user and crypto-shreds each reached note's row-subject key (after consulting that note's host entity's retention strategy — blockDelete/anonymize win over erasure), keeping the append-only history intact for notes without such a mention. `note-mention`'s own hooks are a no-op — it is a plain FK pointer, not separately exportable content. Kept separate from `notes-history` so notes consumers without the user-data-rights pipeline don't pull a hard dependency — requires `user-data-rights`, optionalRequires `notes-history`.",
1818
+ "toggleableDefault": null,
1819
+ "requires": [
1820
+ "user-data-rights"
1821
+ ],
1822
+ "optionalRequires": [
1823
+ "notes-history"
1824
+ ],
1825
+ "configReads": [],
1826
+ "exposesApis": [],
1827
+ "usesApis": [],
1828
+ "extensionsUsed": [
1829
+ {
1830
+ "extensionName": "userData",
1831
+ "entityName": "note-entry"
1832
+ },
1833
+ {
1834
+ "extensionName": "userData",
1835
+ "entityName": "note-mention"
1836
+ }
1837
+ ],
1838
+ "configKeys": [],
1839
+ "secrets": [],
1840
+ "writeHandlers": []
1841
+ },
1842
+ {
1843
+ "name": "personal-access-tokens",
1844
+ "description": "Long-lived, revocable Personal Access Tokens for headless HTTP-API access. Stores SHA-256 token hashes in the `store_api_tokens` direct-write table; the plaintext is returned once at creation. `create`/`revoke`/`mine` manage a user's own tokens and `available-scopes` lists the app-declared scope catalog. Bearer tokens carrying the PAT prefix are resolved before jwt.verify (roles resolved live, granted scopes enforced fail-closed at the API boundary) — registered as an auth-foundation tokenVerifier provider, resolved generically by the middleware. Pass { toggleable: { default: false } } to tier-gate the whole feature.",
1845
+ "toggleableDefault": null,
1846
+ "requires": [
1847
+ "user",
1848
+ "tenant",
1849
+ "auth-foundation"
1850
+ ],
1851
+ "optionalRequires": [],
1852
+ "configReads": [],
1853
+ "exposesApis": [],
1854
+ "usesApis": [],
1855
+ "extensionsUsed": [
1856
+ {
1857
+ "extensionName": "tokenVerifier",
1858
+ "entityName": "pat"
1859
+ }
1860
+ ],
1861
+ "configKeys": [],
1862
+ "secrets": [],
1863
+ "writeHandlers": [
1864
+ "personal-access-tokens:write:create",
1865
+ "personal-access-tokens:write:revoke"
1866
+ ],
1867
+ "uiHints": {
1868
+ "displayLabel": "Personal Access Tokens",
1869
+ "category": "identity",
1870
+ "recommended": false
1871
+ }
1872
+ },
1873
+ {
1874
+ "name": "rate-limiting",
1875
+ "description": "Adds an ops-side `rate-limiting:query:status` query handler for inspecting current bucket state; the actual request throttling is wired automatically by the dispatcher when any handler declares a `rateLimit` option (e.g. `{ per: 'user', limit: 3, windowSeconds: 60 }`) or when you pass `context.rateLimit` to `buildServer`. Loading this feature is optional if you only need L3 per-handler rate limits and have no need for ops introspection.",
1876
+ "toggleableDefault": null,
1877
+ "requires": [],
1878
+ "optionalRequires": [],
1879
+ "configReads": [],
1880
+ "exposesApis": [],
1881
+ "usesApis": [],
1882
+ "extensionsUsed": [],
1883
+ "configKeys": [],
1884
+ "secrets": [],
1885
+ "writeHandlers": [],
1886
+ "uiHints": {
1887
+ "displayLabel": "Rate Limiting · Ops Query",
1888
+ "category": "operations",
1889
+ "recommended": false
1890
+ }
1891
+ },
1892
+ {
1893
+ "name": "readiness",
1894
+ "description": "One-call tenant-onboarding probe: `readiness:query:status` rolls up every config key and secret declared `required: true` across all mounted features and reports which still lack a usable value for the calling tenant, plus a single `ready` boolean. Provider-features under an `r.extensionSelector`-declared extension point count only while their provider is the selected one — a tenant on the inmemory mail transport is not blocked by unset SMTP keys. Mount it (together with `config` and `secrets`) when an admin UI needs a settings checklist before the first mail-send or file-write; the per-concern lists stay available via `config:query:readiness` and `secrets:query:list`.",
1895
+ "toggleableDefault": null,
1896
+ "requires": [
1897
+ "config",
1898
+ "secrets"
1899
+ ],
1900
+ "optionalRequires": [],
1901
+ "configReads": [],
1902
+ "exposesApis": [],
1903
+ "usesApis": [],
1904
+ "extensionsUsed": [],
1905
+ "configKeys": [],
1906
+ "secrets": [],
1907
+ "writeHandlers": [],
1908
+ "uiHints": {
1909
+ "displayLabel": "Readiness · Onboarding Probe",
1910
+ "category": "operations",
1911
+ "recommended": false
1912
+ }
1913
+ },
1914
+ {
1915
+ "name": "renderer-foundation",
1916
+ "description": "Plugin registry for content rendering (notification HTML, mail HTML, PDF, images): call `foundation.createRendererForTenant({ tenantId, kind })` at render time to get the right renderer plugin selected by kind, with tenant-level overrides via the `rendererPluginByKind` config key. Requires `template-resolver` (declared via `r.requires`). Low-level building block — add `renderer-simple` (or write a custom plugin via `r.useExtension(\"renderer\", name, { kinds, render })`) rather than using this feature alone.",
1917
+ "toggleableDefault": null,
1918
+ "requires": [
1919
+ "template-resolver"
1920
+ ],
1921
+ "optionalRequires": [],
1922
+ "configReads": [],
1923
+ "exposesApis": [],
1924
+ "usesApis": [],
1925
+ "extensionsUsed": [],
1926
+ "configKeys": [],
1927
+ "secrets": [],
1928
+ "writeHandlers": [],
1929
+ "uiHints": {
1930
+ "displayLabel": "Renderer Foundation",
1931
+ "category": "notifications",
1932
+ "recommended": false
1933
+ }
1934
+ },
1935
+ {
1936
+ "name": "renderer-simple",
1937
+ "description": "Default renderer plugin for `kind=\"notification\"`: takes a structured `EmailTemplateData` variable map (with `header`, `sections[]` of text/button objects, and optional `footer`; falls back to `title`/`body` if no structured fields are present) and returns rendered HTML with inline CSS. Requires `renderer-foundation`; sufficient for plain notification emails — swap it for `renderer-mail-html` if you need MJML/Markdown layouts.",
1938
+ "toggleableDefault": null,
1939
+ "requires": [
1940
+ "renderer-foundation"
1941
+ ],
1942
+ "optionalRequires": [
1943
+ "template-resolver"
1944
+ ],
1945
+ "configReads": [],
1946
+ "exposesApis": [],
1947
+ "usesApis": [],
1948
+ "extensionsUsed": [
1949
+ {
1950
+ "extensionName": "renderer",
1951
+ "entityName": "simple"
1952
+ }
1953
+ ],
1954
+ "configKeys": [],
1955
+ "secrets": [],
1956
+ "writeHandlers": [],
1957
+ "uiHints": {
1958
+ "displayLabel": "Renderer · Simple",
1959
+ "category": "notifications",
1960
+ "recommended": false
1961
+ }
1962
+ },
1963
+ {
1964
+ "name": "secrets",
1965
+ "description": "Stores arbitrary per-tenant secrets (API keys, tokens, credentials) encrypted at rest using AES-256 with a KEK loaded from `KUMIKO_SECRETS_MASTER_KEY_V1` (and successive versions for rotation). Read a secret in handlers via `ctx.secrets.get(tenantId, handle)`, which automatically appends a `tenantSecretRead` audit event so every access is traceable. A `rotate` job re-encrypts all envelopes after a KEK version bump. The `set`/`delete`/`list` handlers share one access rule — default { roles: [\"TenantAdmin\"] }; adopt the host's role vocabulary with createSecretsFeature({ roles }) or open it to every authenticated tenant user with { access: { openToAll: { reason } } } (larger blast radius: any tenant member can then read secret previews and write/delete secrets, not just admins).",
1966
+ "toggleableDefault": null,
1967
+ "requires": [],
1968
+ "optionalRequires": [],
1969
+ "configReads": [],
1970
+ "exposesApis": [],
1971
+ "usesApis": [],
1972
+ "extensionsUsed": [],
1973
+ "configKeys": [],
1974
+ "secrets": [],
1975
+ "writeHandlers": [
1976
+ "secrets:write:delete",
1977
+ "secrets:write:set"
1978
+ ],
1979
+ "uiHints": {
1980
+ "displayLabel": "Tenant Secrets",
1981
+ "category": "infrastructure",
1982
+ "recommended": true
1983
+ }
1984
+ },
1985
+ {
1986
+ "name": "seo",
1987
+ "description": "Site-discovery + SEO/AEO/GEO surface for apex/content pages. Serves GET /sitemap.xml and GET /llms.txt (both anonymous, revalidate-cached), merging the app-supplied sitemapEntries() callback with legal-pages' fixed routes (includeLegalPages) and/or managed-pages' published slugs (managedPages.resolveApexTenant) when opted in. Serves GET /robots.txt only when robotsPolicy is supplied (default off — the static public/robots.txt already covers the common case). Tenant-scoped config keys (seo:config:seo-organization-{name,logo-url}, seo:config:seo-twitter-site, seo:config:seo-llms-summary, seo:config:seo-default-og-image) feed the Organization JSON-LD helper + llms.txt summary. Also exports pure schema.org JSON-LD builders (organizationSchema/webPageSchema/faqPageSchema) for apps to pass into ApexHead.schemaJson or wrapInLayout({ seo: { schemaJson } }) directly — this feature does not inject JSON-LD on its own routes.",
1988
+ "toggleableDefault": null,
1989
+ "requires": [
1990
+ "config"
1991
+ ],
1992
+ "optionalRequires": [
1993
+ "legal-pages",
1994
+ "managed-pages"
1995
+ ],
1996
+ "configReads": [],
1997
+ "exposesApis": [],
1998
+ "usesApis": [],
1999
+ "extensionsUsed": [],
2000
+ "configKeys": [
2001
+ {
2002
+ "key": "seo-default-og-image",
2003
+ "qualifiedName": "seo:config:seo-default-og-image",
2004
+ "type": "text",
2005
+ "scope": "tenant",
2006
+ "default": "",
2007
+ "encrypted": false,
2008
+ "computed": false,
2009
+ "validated": false,
2010
+ "options": null,
2011
+ "bounds": null,
2012
+ "pattern": {
2013
+ "regex": "^$|^https://[^\\s\"'<>]{1,2000}$"
2014
+ },
2015
+ "writeRoles": [
2016
+ "system",
2017
+ "TenantAdmin",
2018
+ "Admin",
2019
+ "SystemAdmin"
2020
+ ],
2021
+ "readRoles": [
2022
+ "all"
2023
+ ]
2024
+ },
2025
+ {
2026
+ "key": "seo-llms-summary",
2027
+ "qualifiedName": "seo:config:seo-llms-summary",
2028
+ "type": "text",
2029
+ "scope": "tenant",
2030
+ "default": "",
2031
+ "encrypted": false,
2032
+ "computed": false,
2033
+ "validated": false,
2034
+ "options": null,
2035
+ "bounds": null,
2036
+ "pattern": {
2037
+ "regex": "^[\\s\\S]{0,500}$"
2038
+ },
2039
+ "writeRoles": [
2040
+ "system",
2041
+ "TenantAdmin",
2042
+ "Admin",
2043
+ "SystemAdmin"
2044
+ ],
2045
+ "readRoles": [
2046
+ "all"
2047
+ ]
2048
+ },
2049
+ {
2050
+ "key": "seo-organization-logo-url",
2051
+ "qualifiedName": "seo:config:seo-organization-logo-url",
2052
+ "type": "text",
2053
+ "scope": "tenant",
2054
+ "default": "",
2055
+ "encrypted": false,
2056
+ "computed": false,
2057
+ "validated": false,
2058
+ "options": null,
2059
+ "bounds": null,
2060
+ "pattern": {
2061
+ "regex": "^$|^https://[^\\s\"'<>]{1,2000}$"
2062
+ },
2063
+ "writeRoles": [
2064
+ "system",
2065
+ "TenantAdmin",
2066
+ "Admin",
2067
+ "SystemAdmin"
2068
+ ],
2069
+ "readRoles": [
2070
+ "all"
2071
+ ]
2072
+ },
2073
+ {
2074
+ "key": "seo-organization-name",
2075
+ "qualifiedName": "seo:config:seo-organization-name",
2076
+ "type": "text",
2077
+ "scope": "tenant",
2078
+ "default": "",
2079
+ "encrypted": false,
2080
+ "computed": false,
2081
+ "validated": false,
2082
+ "options": null,
2083
+ "bounds": null,
2084
+ "pattern": {
2085
+ "regex": "^[\\s\\S]{0,500}$"
2086
+ },
2087
+ "writeRoles": [
2088
+ "system",
2089
+ "TenantAdmin",
2090
+ "Admin",
2091
+ "SystemAdmin"
2092
+ ],
2093
+ "readRoles": [
2094
+ "all"
2095
+ ]
2096
+ },
2097
+ {
2098
+ "key": "seo-twitter-site",
2099
+ "qualifiedName": "seo:config:seo-twitter-site",
2100
+ "type": "text",
2101
+ "scope": "tenant",
2102
+ "default": "",
2103
+ "encrypted": false,
2104
+ "computed": false,
2105
+ "validated": false,
2106
+ "options": null,
2107
+ "bounds": null,
2108
+ "pattern": {
2109
+ "regex": "^[\\s\\S]{0,500}$"
2110
+ },
2111
+ "writeRoles": [
2112
+ "system",
2113
+ "TenantAdmin",
2114
+ "Admin",
2115
+ "SystemAdmin"
2116
+ ],
2117
+ "readRoles": [
2118
+ "all"
2119
+ ]
2120
+ }
2121
+ ],
2122
+ "secrets": [],
2123
+ "writeHandlers": [],
2124
+ "uiHints": {
2125
+ "displayLabel": "SEO / Site Discovery",
2126
+ "category": "content",
2127
+ "recommended": false
2128
+ }
2129
+ },
2130
+ {
2131
+ "name": "sessions",
2132
+ "description": "Tracks signed-in clients in the `store_user_sessions` table (one row per JWT, keyed by the `sid`/`jti` claim) and exposes handlers for `mine` (list your sessions), `revoke`, and `revokeAllOthers`. Session creation and revocation on the hot auth path are handled by `createSessionCallbacks()`, wired into `buildServer({ auth: { ... } })` outside the dispatcher; the same callbacks are also registered as an auth-foundation sessionStore provider, resolvable generically via `resolveSessionStore()`. The feature also ships a manual-trigger cleanup job for pruning expired rows and an optional `autoRevokeOnPasswordChange` hook that mass-revokes all sessions for a user whenever their `passwordHash` changes.",
2133
+ "toggleableDefault": null,
2134
+ "requires": [
2135
+ "user",
2136
+ "auth-foundation"
2137
+ ],
2138
+ "optionalRequires": [],
2139
+ "configReads": [],
2140
+ "exposesApis": [
2141
+ "sessions.revokeAllForUser"
2142
+ ],
2143
+ "usesApis": [],
2144
+ "extensionsUsed": [
2145
+ {
2146
+ "extensionName": "sessionStore",
2147
+ "entityName": "default"
2148
+ }
2149
+ ],
2150
+ "configKeys": [],
2151
+ "secrets": [],
2152
+ "writeHandlers": [
2153
+ "sessions:write:user-session:revoke",
2154
+ "sessions:write:user-session:revoke-all-for-user",
2155
+ "sessions:write:user-session:revoke-all-others"
2156
+ ],
2157
+ "uiHints": {
2158
+ "displayLabel": "Sessions · Server-side Logout",
2159
+ "category": "identity",
2160
+ "recommended": false
2161
+ }
2162
+ },
2163
+ {
2164
+ "name": "step-dispatcher",
2165
+ "description": "Internal system feature that drains deferred Tier-2 side-effects (currently `webhook.send` and `mail.send`) after their originating transaction commits. Listens via `r.multiStreamProjection` on the `kumiko:system:step.dispatch-requested` system event, performs the actual HTTP or mail delivery, then appends `kumiko:system:step.dispatched` or `kumiko:system:step.dispatch-failed` back onto the same stream so the outcome is recorded in the event log without a separate status table. Mount this feature explicitly via `createStepDispatcherFeature()` in your app's feature list alongside any features that use `r.step.webhook.send` or `r.step.mail.send`. Requires the `secrets` feature (`createSecretsFeature()`) to be mounted — `webhook.send` auth resolves per-tenant through it, under `step-dispatcher:webhook-auth.<name>`.",
2166
+ "toggleableDefault": null,
2167
+ "requires": [
2168
+ "secrets"
2169
+ ],
2170
+ "optionalRequires": [],
2171
+ "configReads": [],
2172
+ "exposesApis": [],
2173
+ "usesApis": [],
2174
+ "extensionsUsed": [],
2175
+ "configKeys": [],
2176
+ "secrets": [],
2177
+ "writeHandlers": [],
2178
+ "uiHints": {
2179
+ "displayLabel": "Step Dispatcher · Deferred Side-Effects",
2180
+ "category": "infrastructure",
2181
+ "recommended": false
2182
+ }
2183
+ },
2184
+ {
2185
+ "name": "subscription-mollie",
2186
+ "description": "Mollie payment provider plugin for `billing-foundation`, covering the DACH/EU mid-market use case. Mount via `createSubscriptionMollieFeature({ apiKey, webhookUrl, priceToTier, priceToConfig })` — the factory validates that `priceToTier` and `priceToConfig` keys are identical at boot time. Implements `verifyAndParseWebhook` (lazy Mollie-API fetch + heuristic event-type mapping) and `createCheckoutSession` (customer + first-payment with `sequenceType=\"first\"`); `createPortalSession` and `cancelSubscription` are not available because Mollie has no customer portal and requires a `customerId` that the plugin contract does not carry.",
2187
+ "toggleableDefault": null,
2188
+ "requires": [
2189
+ "billing-foundation"
2190
+ ],
2191
+ "optionalRequires": [],
2192
+ "configReads": [],
2193
+ "exposesApis": [],
2194
+ "usesApis": [],
2195
+ "extensionsUsed": [
2196
+ {
2197
+ "extensionName": "subscriptionProvider",
2198
+ "entityName": "mollie"
2199
+ }
2200
+ ],
2201
+ "configKeys": [],
2202
+ "secrets": [],
2203
+ "writeHandlers": [],
2204
+ "uiHints": {
2205
+ "displayLabel": "Billing · Mollie",
2206
+ "category": "billing",
2207
+ "recommended": false
2208
+ }
2209
+ },
2210
+ {
2211
+ "name": "subscription-stripe",
2212
+ "description": "Stripe payment provider plugin for `billing-foundation`. Reads its Stripe API key + webhook secret from system config keys with `backing:\"secrets\"` (envelope-encrypted in the secrets store under the system tenant) and a `billingLive` **system config** flag — all at runtime, so keys rotate and prod goes live without a redeploy. The `mask` on each key derives the sysadmin settings screen + nav, so no app wires a hand-written config UI. Mount via `createSubscriptionStripeFeature({ priceToTier })`; the optional `apiKey`/`webhookSecret` options are env→secrets bridge fallbacks. The plugin always mounts — `createCheckoutSession` throws `feature_disabled` unless `billingLive` is true, so sk_test_ keys in prod never produce a live checkout. Implements webhook verify, checkout, portal, cancel, `retrievePrices` (10-minute TTL-cached price lookup for the billing-plans catalog), `createPlanSwitchSession` (auto-provisions a Customer-Portal configuration for switching an existing subscription to another plan tier — each tier needs its own Stripe product), `retrieveSubscription` (live provider-side snapshot for the `sync-subscriptions` backfill job, mapped identically to the webhook path), plus `isBillingEnabled` (billingLive + an api-key existence probe, no secret read).",
2213
+ "toggleableDefault": null,
2214
+ "requires": [
2215
+ "billing-foundation",
2216
+ "config",
2217
+ "secrets"
2218
+ ],
2219
+ "optionalRequires": [],
2220
+ "configReads": [],
2221
+ "exposesApis": [],
2222
+ "usesApis": [],
2223
+ "extensionsUsed": [
2224
+ {
2225
+ "extensionName": "subscriptionProvider",
2226
+ "entityName": "stripe"
2227
+ }
2228
+ ],
2229
+ "configKeys": [
2230
+ {
2231
+ "key": "api-key",
2232
+ "qualifiedName": "subscription-stripe:config:api-key",
2233
+ "type": "text",
2234
+ "scope": "system",
2235
+ "default": null,
2236
+ "encrypted": true,
2237
+ "computed": false,
2238
+ "validated": false,
2239
+ "options": null,
2240
+ "bounds": null,
2241
+ "pattern": {
2242
+ "regex": "^(sk|rk)_(test|live)_"
2243
+ },
2244
+ "writeRoles": [
2245
+ "SystemAdmin"
2246
+ ],
2247
+ "readRoles": [
2248
+ "TenantAdmin",
2249
+ "Admin",
2250
+ "SystemAdmin"
2251
+ ]
2252
+ },
2253
+ {
2254
+ "key": "billing-live",
2255
+ "qualifiedName": "subscription-stripe:config:billing-live",
2256
+ "type": "boolean",
2257
+ "scope": "system",
2258
+ "default": false,
2259
+ "encrypted": false,
2260
+ "computed": false,
2261
+ "validated": false,
2262
+ "options": null,
2263
+ "bounds": null,
2264
+ "pattern": null,
2265
+ "writeRoles": [
2266
+ "system",
2267
+ "SystemAdmin"
2268
+ ],
2269
+ "readRoles": [
2270
+ "TenantAdmin",
2271
+ "Admin",
2272
+ "SystemAdmin"
2273
+ ]
2274
+ },
2275
+ {
2276
+ "key": "webhook-secret",
2277
+ "qualifiedName": "subscription-stripe:config:webhook-secret",
2278
+ "type": "text",
2279
+ "scope": "system",
2280
+ "default": null,
2281
+ "encrypted": true,
2282
+ "computed": false,
2283
+ "validated": false,
2284
+ "options": null,
2285
+ "bounds": null,
2286
+ "pattern": {
2287
+ "regex": "^whsec_"
2288
+ },
2289
+ "writeRoles": [
2290
+ "SystemAdmin"
2291
+ ],
2292
+ "readRoles": [
2293
+ "TenantAdmin",
2294
+ "Admin",
2295
+ "SystemAdmin"
2296
+ ]
2297
+ }
2298
+ ],
2299
+ "secrets": [],
2300
+ "writeHandlers": [],
2301
+ "uiHints": {
2302
+ "displayLabel": "Billing · Stripe",
2303
+ "category": "billing",
2304
+ "recommended": false
2305
+ }
2306
+ },
2307
+ {
2308
+ "name": "tags",
2309
+ "description": "Generic, host-agnostic tagging for any entity. Owns two event-sourced entities — the per-tenant `tag` catalog (`read_tags`, with optional `color` and `scope`) and `tag-assignment` join rows keyed by (entityType, entityId) (`read_tag_assignments`) — so tagging adds NO column to the host entity and needs no relational pivot or JOIN. Catalog screens are declarative (`entityList` + `entityEdit`) and use convention QNs `tag:{create,update,delete}`; TagManager/TagPicker keep `create-tag`/`update-tag`/`delete-tag`. Also: `assign-tag` (idempotent), `remove-tag` (idempotent) and list queries for the catalog and the assignments. Read which tags an entity has, or which entities carry a tag, by listing `tag-assignment` filtered on `entityId` or `tagId` and composing in the read-layer. A tag with empty `scope` is global; a `scope` of an entityType restricts it to that type in the picker. Every path uses one access rule — adopt the host's model with createTagsFeature({ access: { openToAll: { reason } } }) or pin roles with createTagsFeature({ roles }). Pass { toggleable: { default: false } } to make the whole feature tier-gatable via the tier-engine (no host hook).",
2310
+ "toggleableDefault": null,
2311
+ "requires": [],
2312
+ "optionalRequires": [],
2313
+ "configReads": [],
2314
+ "exposesApis": [],
2315
+ "usesApis": [],
2316
+ "extensionsUsed": [],
2317
+ "configKeys": [],
2318
+ "secrets": [],
2319
+ "writeHandlers": [
2320
+ "tags:write:assign-tag",
2321
+ "tags:write:create-tag",
2322
+ "tags:write:delete-tag",
2323
+ "tags:write:remove-tag",
2324
+ "tags:write:tag:create",
2325
+ "tags:write:tag:delete",
2326
+ "tags:write:tag:update",
2327
+ "tags:write:update-tag"
2328
+ ],
2329
+ "uiHints": {
2330
+ "displayLabel": "Tags",
2331
+ "category": "data",
2332
+ "recommended": false
2333
+ }
2334
+ },
2335
+ {
2336
+ "name": "template-resolver",
2337
+ "description": "Every piece of editable text lives here, in one entity: mail bodies, notification texts, PDF document templates, AI prompts and plain text blocks. What a record is used for is the `kind` (`notification`, `mail-html`, `document-pdf`, `ai-prompt`, `text-block`, `image-snapshot`).\n\nReading is one call — `ctx.templateResolver.resolveTemplate({ tenantId, slug, kind, locale })`. It walks four levels: tenant+locale, system+locale, tenant+fallback-locale, system+fallback-locale. A tenant overrides a system default by simply having its own record; no application code changes. Writing programmatically goes through the `upsertSystem`, `upsertTenant`, `publish` and `archive` write handlers.\n\nText an editor should be able to change belongs in a collection, declared at mount: `createTemplateResolverFeature({ collections: [{ id, kind, access: { roles }, nav }] })`. It appears in the navigation, and `access` is part of the mount because a bundled feature cannot know the host's roles. Each collection gets its own `<id>-list` / `<id>-item` / `<id>-set` handlers, so the dispatcher enforces the separation.\n\nHow a collection is edited follows from `contentFormat`: `plain` gives a text area, `rich` a small WYSIWYG (bold, italic, headings, lists, links), `markdown` a text area that stores markdown text (same insertable chips as `plain`). All three offer the collection's `variableSchema` as insertable chips and a preview rendered with sample data — an editor sees what `{{firstName}}` becomes without sending a mail. An app can register its own editor for a format; the last `clientFeature` that registers a format wins (a conflict logs a warning).\n\nA collection is tenant-wide by default. With `ownership: \"user\"` every user keeps their own entries — mail signatures being the obvious case. Those rows live in the separate `user-content-entry` entity and count as user data, so mounting one also requires the `template-resolver-user-data` feature and a migration on the app side.\n\nReplaces the former `text-content` feature; its blocks now live here as kind `text-block`.",
2338
+ "toggleableDefault": null,
2339
+ "requires": [],
2340
+ "optionalRequires": [],
2341
+ "configReads": [],
2342
+ "exposesApis": [],
2343
+ "usesApis": [],
2344
+ "extensionsUsed": [],
2345
+ "configKeys": [],
2346
+ "secrets": [],
2347
+ "writeHandlers": [
2348
+ "template-resolver:write:archive",
2349
+ "template-resolver:write:publish",
2350
+ "template-resolver:write:reply-snippets-set",
2351
+ "template-resolver:write:set",
2352
+ "template-resolver:write:signatures-set",
2353
+ "template-resolver:write:upsert-system",
2354
+ "template-resolver:write:upsert-tenant"
2355
+ ],
2356
+ "uiHints": {
2357
+ "displayLabel": "Template Resolver",
2358
+ "category": "notifications",
2359
+ "recommended": false
2360
+ }
2361
+ },
2362
+ {
2363
+ "name": "template-resolver-user-data",
2364
+ "description": "GDPR (Art. 20 export / Art. 17 erasure) coverage for the `template-resolver` feature's `user-content-entry` entity — the per-user half of the content store (mail signatures, personal reply snippets). Mounts the EXT_USER_DATA export hook so a user's own entries land in the export bundle; the delete hook is a deliberate no-op because `content` is annotated `userOwned`, so erasure runs via crypto-shredding (destroying the owner's subject key) rather than a physical delete, which would not survive an event replay. Mount this whenever `createTemplateResolverFeature` declares a collection with `ownership: \"user\"` — the boot guard otherwise refuses the entity. Requires `user-data-rights`, optionalRequires `template-resolver`.",
2365
+ "toggleableDefault": null,
2366
+ "requires": [
2367
+ "user-data-rights"
2368
+ ],
2369
+ "optionalRequires": [
2370
+ "template-resolver"
2371
+ ],
2372
+ "configReads": [],
2373
+ "exposesApis": [],
2374
+ "usesApis": [],
2375
+ "extensionsUsed": [
2376
+ {
2377
+ "extensionName": "userData",
2378
+ "entityName": "user-content-entry"
2379
+ }
2380
+ ],
2381
+ "configKeys": [],
2382
+ "secrets": [],
2383
+ "writeHandlers": []
2384
+ },
2385
+ {
2386
+ "name": "tenant",
2387
+ "description": "Registers the three core multi-tenancy entities — `tenant`, `tenant-membership`, and `tenant-invitation` (DB tables `read_tenants`, `read_tenant_memberships`, and `read_tenant_invitations`) — along with write handlers for create/update/disable/enable/addMember/removeMember/updateMemberRoles and the matching queries. It also declares a set of per-tenant config keys (companyName, timezone, locale, SMTP credentials) and system-only keys (priceModel, maxUsers) via `r.config({ keys: { ... } })`. Use this feature in every multi-tenant app; membership resolution and invitation flows depend on it, and `auth-email-password` requires it.",
2388
+ "toggleableDefault": null,
2389
+ "requires": [
2390
+ "config"
2391
+ ],
2392
+ "optionalRequires": [],
2393
+ "configReads": [],
2394
+ "exposesApis": [],
2395
+ "usesApis": [],
2396
+ "extensionsUsed": [],
2397
+ "configKeys": [
2398
+ {
2399
+ "key": "company-name",
2400
+ "qualifiedName": "tenant:config:company-name",
2401
+ "type": "text",
2402
+ "scope": "tenant",
2403
+ "default": "",
2404
+ "encrypted": false,
2405
+ "computed": false,
2406
+ "validated": false,
2407
+ "options": null,
2408
+ "bounds": null,
2409
+ "pattern": null,
2410
+ "writeRoles": [
2411
+ "TenantAdmin",
2412
+ "Admin",
2413
+ "SystemAdmin"
2414
+ ],
2415
+ "readRoles": [
2416
+ "all"
2417
+ ]
2418
+ },
2419
+ {
2420
+ "key": "locale",
2421
+ "qualifiedName": "tenant:config:locale",
2422
+ "type": "select",
2423
+ "scope": "tenant",
2424
+ "default": "de",
2425
+ "encrypted": false,
2426
+ "computed": false,
2427
+ "validated": false,
2428
+ "options": [
2429
+ "de",
2430
+ "en",
2431
+ "fr",
2432
+ "es"
2433
+ ],
2434
+ "bounds": null,
2435
+ "pattern": null,
2436
+ "writeRoles": [
2437
+ "TenantAdmin",
2438
+ "Admin",
2439
+ "SystemAdmin"
2440
+ ],
2441
+ "readRoles": [
2442
+ "all"
2443
+ ]
2444
+ },
2445
+ {
2446
+ "key": "max-users",
2447
+ "qualifiedName": "tenant:config:max-users",
2448
+ "type": "number",
2449
+ "scope": "system",
2450
+ "default": 50,
2451
+ "encrypted": false,
2452
+ "computed": false,
2453
+ "validated": false,
2454
+ "options": null,
2455
+ "bounds": null,
2456
+ "pattern": null,
2457
+ "writeRoles": [
2458
+ "system"
2459
+ ],
2460
+ "readRoles": [
2461
+ "TenantAdmin",
2462
+ "Admin",
2463
+ "SystemAdmin"
2464
+ ]
2465
+ },
2466
+ {
2467
+ "key": "price-model",
2468
+ "qualifiedName": "tenant:config:price-model",
2469
+ "type": "select",
2470
+ "scope": "system",
2471
+ "default": "basic",
2472
+ "encrypted": false,
2473
+ "computed": false,
2474
+ "validated": false,
2475
+ "options": [
2476
+ "basic",
2477
+ "pro",
2478
+ "enterprise"
2479
+ ],
2480
+ "bounds": null,
2481
+ "pattern": null,
2482
+ "writeRoles": [
2483
+ "system"
2484
+ ],
2485
+ "readRoles": [
2486
+ "TenantAdmin",
2487
+ "Admin",
2488
+ "SystemAdmin"
2489
+ ]
2490
+ },
2491
+ {
2492
+ "key": "smtp-host",
2493
+ "qualifiedName": "tenant:config:smtp-host",
2494
+ "type": "text",
2495
+ "scope": "tenant",
2496
+ "default": null,
2497
+ "encrypted": false,
2498
+ "computed": false,
2499
+ "validated": false,
2500
+ "options": null,
2501
+ "bounds": null,
2502
+ "pattern": null,
2503
+ "writeRoles": [
2504
+ "SystemAdmin"
2505
+ ],
2506
+ "readRoles": [
2507
+ "TenantAdmin",
2508
+ "Admin",
2509
+ "SystemAdmin"
2510
+ ]
2511
+ },
2512
+ {
2513
+ "key": "smtp-pass",
2514
+ "qualifiedName": "tenant:config:smtp-pass",
2515
+ "type": "text",
2516
+ "scope": "tenant",
2517
+ "default": null,
2518
+ "encrypted": true,
2519
+ "computed": false,
2520
+ "validated": false,
2521
+ "options": null,
2522
+ "bounds": null,
2523
+ "pattern": null,
2524
+ "writeRoles": [
2525
+ "SystemAdmin"
2526
+ ],
2527
+ "readRoles": [
2528
+ "SystemAdmin"
2529
+ ]
2530
+ },
2531
+ {
2532
+ "key": "timezone",
2533
+ "qualifiedName": "tenant:config:timezone",
2534
+ "type": "select",
2535
+ "scope": "tenant",
2536
+ "default": "Europe/Berlin",
2537
+ "encrypted": false,
2538
+ "computed": false,
2539
+ "validated": false,
2540
+ "options": [
2541
+ "UTC",
2542
+ "Europe/Berlin",
2543
+ "Europe/London",
2544
+ "Europe/Paris",
2545
+ "Europe/Madrid",
2546
+ "Europe/Rome",
2547
+ "America/New_York",
2548
+ "America/Los_Angeles",
2549
+ "America/Sao_Paulo",
2550
+ "Asia/Tokyo",
2551
+ "Asia/Singapore",
2552
+ "Australia/Sydney"
2553
+ ],
2554
+ "bounds": null,
2555
+ "pattern": null,
2556
+ "writeRoles": [
2557
+ "TenantAdmin",
2558
+ "Admin",
2559
+ "SystemAdmin"
2560
+ ],
2561
+ "readRoles": [
2562
+ "all"
2563
+ ]
2564
+ }
2565
+ ],
2566
+ "secrets": [],
2567
+ "writeHandlers": [
2568
+ "tenant:write:add-member",
2569
+ "tenant:write:cancel-invitation",
2570
+ "tenant:write:create",
2571
+ "tenant:write:disable",
2572
+ "tenant:write:enable",
2573
+ "tenant:write:remove-member",
2574
+ "tenant:write:tenant:update",
2575
+ "tenant:write:update",
2576
+ "tenant:write:update-member-roles"
2577
+ ],
2578
+ "uiHints": {
2579
+ "displayLabel": "Multi-Tenant Core",
2580
+ "category": "identity",
2581
+ "recommended": true
2582
+ }
2583
+ },
2584
+ {
2585
+ "name": "tenant-handover",
2586
+ "description": "Try-before-signup ownership handover: claims the rows of a declared-transferable entity graph (root plus its parentRef-linked children) from an anonymous/public tenant into the caller's own tenant, legitimized by a row-bound grant the anonymous flow minted. Idempotent, audited via a `tenant-handover:event:claimed` event on its own `tenant-handover-claim` aggregate.",
2587
+ "toggleableDefault": null,
2588
+ "requires": [],
2589
+ "optionalRequires": [],
2590
+ "configReads": [],
2591
+ "exposesApis": [],
2592
+ "usesApis": [],
2593
+ "extensionsUsed": [
2594
+ {
2595
+ "extensionName": "signupHandover",
2596
+ "entityName": "tenant-handover"
2597
+ }
2598
+ ],
2599
+ "configKeys": [],
2600
+ "secrets": [],
2601
+ "writeHandlers": [
2602
+ "tenant-handover:write:claim"
2603
+ ],
2604
+ "uiHints": {
2605
+ "displayLabel": "Tenant Handover",
2606
+ "category": "identity",
2607
+ "recommended": false
2608
+ }
2609
+ },
2610
+ {
2611
+ "name": "tenant-lifecycle",
2612
+ "description": "Tenant-destroy lifecycle: request/cancel destruction with compliance-profile grace, auth 410 gate for teardown states, cron trigger after grace, and staged destroy runner (extension fan-out, subject-key erase, tenant tombstone).",
2613
+ "toggleableDefault": null,
2614
+ "requires": [
2615
+ "tenant",
2616
+ "compliance-profiles"
2617
+ ],
2618
+ "optionalRequires": [
2619
+ "sessions"
2620
+ ],
2621
+ "configReads": [],
2622
+ "exposesApis": [
2623
+ "tenantLifecycle.runDestroySweep"
2624
+ ],
2625
+ "usesApis": [
2626
+ "compliance.forTenant"
2627
+ ],
2628
+ "extensionsUsed": [
2629
+ {
2630
+ "extensionName": "tenantLifecycleStatus",
2631
+ "entityName": "tenant-lifecycle"
2632
+ }
2633
+ ],
2634
+ "configKeys": [],
2635
+ "secrets": [],
2636
+ "writeHandlers": [
2637
+ "tenant-lifecycle:write:cancel-destruction",
2638
+ "tenant-lifecycle:write:request-destruction"
2639
+ ],
2640
+ "uiHints": {
2641
+ "displayLabel": "Tenant Lifecycle · Destroy",
2642
+ "category": "compliance",
2643
+ "recommended": false
2644
+ }
2645
+ },
2646
+ {
2647
+ "name": "tenant-settings",
2648
+ "description": "Per-tenant Currency + Locale defaults, exposed as two config keys (tenant-settings:config:currency, tenant-settings:config:locale) that surface in the self-populating Settings-Hub via `mask`. Pair with defineCreateWithTenantDefaults to auto-fill a money field's currency or a locale field on create instead of hard-coding a literal per entity.",
2649
+ "toggleableDefault": null,
2650
+ "requires": [
2651
+ "config"
2652
+ ],
2653
+ "optionalRequires": [],
2654
+ "configReads": [],
2655
+ "exposesApis": [],
2656
+ "usesApis": [],
2657
+ "extensionsUsed": [],
2658
+ "configKeys": [
2659
+ {
2660
+ "key": "currency",
2661
+ "qualifiedName": "tenant-settings:config:currency",
2662
+ "type": "select",
2663
+ "scope": "tenant",
2664
+ "default": "EUR",
2665
+ "encrypted": false,
2666
+ "computed": false,
2667
+ "validated": false,
2668
+ "options": [
2669
+ "EUR",
2670
+ "USD",
2671
+ "GBP",
2672
+ "CHF",
2673
+ "JPY",
2674
+ "SEK",
2675
+ "NOK",
2676
+ "DKK",
2677
+ "PLN",
2678
+ "CZK",
2679
+ "CAD",
2680
+ "AUD",
2681
+ "NZD",
2682
+ "CNY",
2683
+ "INR"
2684
+ ],
2685
+ "bounds": null,
2686
+ "pattern": null,
2687
+ "writeRoles": [
2688
+ "TenantAdmin",
2689
+ "Admin",
2690
+ "SystemAdmin"
2691
+ ],
2692
+ "readRoles": [
2693
+ "all"
2694
+ ]
2695
+ },
2696
+ {
2697
+ "key": "locale",
2698
+ "qualifiedName": "tenant-settings:config:locale",
2699
+ "type": "select",
2700
+ "scope": "tenant",
2701
+ "default": "en",
2702
+ "encrypted": false,
2703
+ "computed": false,
2704
+ "validated": false,
2705
+ "options": [
2706
+ "de",
2707
+ "en",
2708
+ "es"
2709
+ ],
2710
+ "bounds": null,
2711
+ "pattern": null,
2712
+ "writeRoles": [
2713
+ "TenantAdmin",
2714
+ "Admin",
2715
+ "SystemAdmin"
2716
+ ],
2717
+ "readRoles": [
2718
+ "all"
2719
+ ]
2720
+ }
2721
+ ],
2722
+ "secrets": [],
2723
+ "writeHandlers": []
2724
+ },
2725
+ {
2726
+ "name": "tier-engine",
2727
+ "description": "Stores a `tier-assignment` entity per tenant (which pricing tier is active) and, when configured with a `TierMap`, registers itself as the `tenantTierResolver` extension so the dispatcher automatically gates `r.toggleable()` features per tenant based on their assigned tier. Call `createTierEngineFeature({ defaultTier, tierMap })` to get full tier composition — including an `inTransaction` entity hook that atomically writes the default tier when a new tenant is created — or use `createTierEngineFeature()` without options for storage-only mode when you manage tier assignment yourself via `composeApp`. A SystemAdmin-only `set-tenant-tier` write plus `get-tenant-tier`/`tier-options` reads let an operator assign a tier to ANY tenant manually — without a billing purchase — stamping `source: \"manual\"` so a future Stripe→tier sync won't overwrite the grant. Apps surface this via the `tier-admin` screen, which is always registered — in storage-only mode (no `tierMap`) it shows an honest \"no tiers configured\" message instead of a tier dropdown.",
2728
+ "toggleableDefault": null,
2729
+ "requires": [
2730
+ "config",
2731
+ "tenant"
2732
+ ],
2733
+ "optionalRequires": [],
2734
+ "configReads": [],
2735
+ "exposesApis": [],
2736
+ "usesApis": [],
2737
+ "extensionsUsed": [],
2738
+ "configKeys": [],
2739
+ "secrets": [],
2740
+ "writeHandlers": [
2741
+ "tier-engine:write:set-tenant-tier",
2742
+ "tier-engine:write:tier-assignment:create",
2743
+ "tier-engine:write:tier-assignment:update"
2744
+ ],
2745
+ "uiHints": {
2746
+ "displayLabel": "Tier Engine · Plan Composition",
2747
+ "category": "billing",
2748
+ "recommended": false
2749
+ }
2750
+ },
2751
+ {
2752
+ "name": "user",
2753
+ "description": "Manages the cross-tenant user identity: the `read_users` table holds each user's email, `displayName`, global `roles`, `emailVerified` flag, and lifecycle `status` (active / restricted / deletionRequested / deleted). Because users exist above any individual tenant, the feature runs with `r.systemScope()` — membership and tenant-specific roles live in the `tenant` feature instead. Add this feature whenever your app needs a persistent, tenant-agnostic user record that auth and GDPR pipelines can reference.",
2754
+ "toggleableDefault": null,
2755
+ "requires": [],
2756
+ "optionalRequires": [],
2757
+ "configReads": [],
2758
+ "exposesApis": [],
2759
+ "usesApis": [],
2760
+ "extensionsUsed": [
2761
+ {
2762
+ "extensionName": "principalStatus",
2763
+ "entityName": "user"
2764
+ }
2765
+ ],
2766
+ "configKeys": [],
2767
+ "secrets": [],
2768
+ "writeHandlers": [
2769
+ "user:write:user:create",
2770
+ "user:write:user:update"
2771
+ ],
2772
+ "uiHints": {
2773
+ "displayLabel": "User Identity",
2774
+ "category": "identity",
2775
+ "recommended": true
2776
+ }
2777
+ },
2778
+ {
2779
+ "name": "user-data-rights",
2780
+ "description": "Implements GDPR Art. 15 (access / `my-audit-log` query), Art. 17 (erasure / `request-deletion` + `cancel-deletion`, plus the anonymous email-verified `request-deletion-by-email` + `confirm-deletion-by-token` flow for lockout-safe self-service, + cron cleanup with grace period), Art. 18 (restriction / `restrict-account` + `lift-restriction`), and Art. 20 (portability / async `request-export` → ZIP via `file-foundation`, Magic-Link download) as first-class HTTP handlers and cron jobs. Each domain feature opts in by calling `r.useExtension(EXT_USER_DATA, \"<entity>\", { export, delete })` — the feature then orchestrates the export and forget pipelines across all registered hooks automatically. When `mail-foundation` and a `mail-transport-*` are mounted, it also sends the four GDPR notifications (export ready/failed, deletion requested/executed) itself with no app callback code, rendered in each recipient’s locale. Requires `user`, `data-retention`, `compliance-profiles`, and `sessions`.",
2781
+ "toggleableDefault": null,
2782
+ "requires": [
2783
+ "user",
2784
+ "data-retention",
2785
+ "compliance-profiles",
2786
+ "sessions"
2787
+ ],
2788
+ "optionalRequires": [],
2789
+ "configReads": [],
2790
+ "exposesApis": [
2791
+ "userDataRights.runForget",
2792
+ "userDataRights.runExport"
2793
+ ],
2794
+ "usesApis": [
2795
+ "compliance.forTenant",
2796
+ "retention.policyFor",
2797
+ "sessions.revokeAllForUser"
2798
+ ],
2799
+ "extensionsUsed": [],
2800
+ "configKeys": [
2801
+ {
2802
+ "key": "tenant-model",
2803
+ "qualifiedName": "user-data-rights:config:tenant-model",
2804
+ "type": "select",
2805
+ "scope": "system",
2806
+ "default": "multi-user",
2807
+ "encrypted": false,
2808
+ "computed": false,
2809
+ "validated": false,
2810
+ "options": [
2811
+ "single-user",
2812
+ "multi-user"
2813
+ ],
2814
+ "bounds": null,
2815
+ "pattern": null,
2816
+ "writeRoles": [
2817
+ "system"
2818
+ ],
2819
+ "readRoles": [
2820
+ "TenantAdmin",
2821
+ "Admin",
2822
+ "SystemAdmin"
2823
+ ]
2824
+ }
2825
+ ],
2826
+ "secrets": [],
2827
+ "writeHandlers": [
2828
+ "user-data-rights:write:cancel-deletion",
2829
+ "user-data-rights:write:confirm-deletion-by-token",
2830
+ "user-data-rights:write:lift-restriction",
2831
+ "user-data-rights:write:request-deletion",
2832
+ "user-data-rights:write:request-deletion-by-email",
2833
+ "user-data-rights:write:request-export",
2834
+ "user-data-rights:write:restrict-account",
2835
+ "user-data-rights:write:run-forget-cleanup"
2836
+ ],
2837
+ "uiHints": {
2838
+ "displayLabel": "User Data Rights · GDPR",
2839
+ "category": "compliance",
2840
+ "recommended": false
2841
+ }
2842
+ },
2843
+ {
2844
+ "name": "user-data-rights-defaults",
2845
+ "description": "Registers ready-made `EXT_USER_DATA` export and delete hooks for the bundled entities that hold per-user data: `user` (delete strategy sets email to `deleted-<id>@anonymized.invalid`, nulls `passwordHash`, sets status to `Deleted`; anonymize strategy sets email to `anonymized-<id>@anonymized.invalid` without touching `passwordHash`), `fileRef` (delete removes both the DB row and the storage binary), plus — gated on the source feature being mounted — `user-session` (ip/userAgent, hard-delete), `api-token` (hard-delete = revoke), `in-app-message` (hard-delete), `tenant-invitation` (invitee email forgotten/pseudonymized, inviter link severed), `notification-preference` and user-scoped `config-value` (purged via the forget verb), plus export-only hooks for the events-only aggregates `delivery-attempt` (recipientAddress) and `job-run` (payload) whose erasure runs via crypto-shredding. Mount this alongside `user-data-rights` for standard GDPR compliance; omit it only if your app needs custom anonymization logic for these entities.",
2846
+ "toggleableDefault": null,
2847
+ "requires": [
2848
+ "user",
2849
+ "files",
2850
+ "user-data-rights"
2851
+ ],
2852
+ "optionalRequires": [
2853
+ "sessions",
2854
+ "personal-access-tokens",
2855
+ "channel-in-app",
2856
+ "tenant",
2857
+ "delivery",
2858
+ "config",
2859
+ "jobs"
2860
+ ],
2861
+ "configReads": [],
2862
+ "exposesApis": [],
2863
+ "usesApis": [],
2864
+ "extensionsUsed": [
2865
+ {
2866
+ "extensionName": "userData",
2867
+ "entityName": "user"
2868
+ },
2869
+ {
2870
+ "extensionName": "userData",
2871
+ "entityName": "fileRef"
2872
+ },
2873
+ {
2874
+ "extensionName": "userData",
2875
+ "entityName": "user-session"
2876
+ },
2877
+ {
2878
+ "extensionName": "userData",
2879
+ "entityName": "api-token"
2880
+ },
2881
+ {
2882
+ "extensionName": "userData",
2883
+ "entityName": "in-app-message"
2884
+ },
2885
+ {
2886
+ "extensionName": "userData",
2887
+ "entityName": "tenant-invitation"
2888
+ },
2889
+ {
2890
+ "extensionName": "userData",
2891
+ "entityName": "notification-preference"
2892
+ },
2893
+ {
2894
+ "extensionName": "userData",
2895
+ "entityName": "config-value"
2896
+ },
2897
+ {
2898
+ "extensionName": "userData",
2899
+ "entityName": "delivery-attempt"
2900
+ },
2901
+ {
2902
+ "extensionName": "userData",
2903
+ "entityName": "job-run"
2904
+ }
2905
+ ],
2906
+ "configKeys": [],
2907
+ "secrets": [],
2908
+ "writeHandlers": [],
2909
+ "uiHints": {
2910
+ "displayLabel": "User Data Rights · Default Hooks",
2911
+ "category": "compliance",
2912
+ "recommended": false
2913
+ }
2914
+ },
2915
+ {
2916
+ "name": "user-profile",
2917
+ "description": "Self-service account page (fw#2312: declarative `projectionDetail` bound to the signed-in user's own `me` row) plus its `change-email` write handler (re-auth via current password, uniqueness check, resets emailVerified and expects the app to trigger the verification flow). Change-password and change-email stay custom `EditExtensionSection` components (re-auth flows a declarative action can't express); account deletion (user-data-rights request/cancel with grace period) is declarative fields + actions. Apps place the screen (id \"profile\") in their logged-in area via r.nav — no `type: \"custom\"` / `__component` registration needed on the app side anymore. Requires `user`, `auth-email-password`, `user-data-rights`, and `user-data-rights-defaults` (so the GDPR boot-validator finds export/delete hooks for `user`'s PII fields once user-data-rights is mounted).",
2918
+ "toggleableDefault": null,
2919
+ "requires": [
2920
+ "user",
2921
+ "auth-email-password",
2922
+ "user-data-rights",
2923
+ "user-data-rights-defaults"
2924
+ ],
2925
+ "optionalRequires": [],
2926
+ "configReads": [],
2927
+ "exposesApis": [],
2928
+ "usesApis": [],
2929
+ "extensionsUsed": [],
2930
+ "configKeys": [],
2931
+ "secrets": [],
2932
+ "writeHandlers": [
2933
+ "user-profile:write:change-email"
2934
+ ],
2935
+ "uiHints": {
2936
+ "displayLabel": "User Profile · Self-Service",
2937
+ "category": "identity",
2938
+ "recommended": true
2939
+ }
2940
+ },
2941
+ {
2942
+ "name": "workflow-runner",
2943
+ "description": "Writes the run-envelope (`workflow.run-started` / `workflow.run-completed` / `workflow.run-failed`) for a workflow run onto its `workflow-run` aggregate stream. Provides `startAndRunWorkflow` and `registerEventTrigger` for consumer features to wire up `defineWorkflow`-based workflows against domain events. Registers no workflows itself. Runs the resume loop for suspended `wait`/`retry`/`waitForEvent` steps (`resume-due-runs` job + `resume-run` handler); `registerEventTrigger` wires an event-wakeup subscriber per workflow that declares `awaits` so a `waitForEvent` step resumes as soon as its awaited event arrives, not just on timeout.",
2944
+ "toggleableDefault": null,
2945
+ "requires": [],
2946
+ "optionalRequires": [],
2947
+ "configReads": [],
2948
+ "exposesApis": [],
2949
+ "usesApis": [],
2950
+ "extensionsUsed": [],
2951
+ "configKeys": [],
2952
+ "secrets": [],
2953
+ "writeHandlers": [
2954
+ "workflow-runner:write:resume-run"
2955
+ ],
2956
+ "uiHints": {
2957
+ "displayLabel": "Workflow Runner",
2958
+ "category": "infrastructure",
2959
+ "recommended": false
2960
+ }
2961
+ }
2962
+ ]
2963
+ }