@cosmicdrift/kumiko-samples 0.385.0 → 0.387.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/LICENSE +21 -57
  2. package/README.md +1 -1
  3. package/package.json +2 -2
  4. package/packages/bundled-features/package.json +2 -2
  5. package/packages/bundled-features/src/agent-tools/tool-catalog.ts +1 -1
  6. package/packages/bundled-features/src/agent-tools/tool-dispatch.ts +0 -2
  7. package/packages/bundled-features/src/audit/screens.ts +1 -1
  8. package/packages/bundled-features/src/auth-email-password/auth-user-row.ts +10 -10
  9. package/packages/bundled-features/src/auth-email-password/feature.ts +6 -6
  10. package/packages/bundled-features/src/auth-email-password/handlers/change-password.write.ts +3 -3
  11. package/packages/bundled-features/src/auth-email-password/handlers/confirm-token-flow.ts +5 -5
  12. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +1 -1
  13. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept.write.ts +18 -18
  14. package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +12 -12
  15. package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +1 -1
  16. package/packages/bundled-features/src/auth-email-password/handlers/invite-signup-complete.write.ts +24 -26
  17. package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +1 -1
  18. package/packages/bundled-features/src/auth-email-password/handlers/self-registration-status.query.ts +1 -1
  19. package/packages/bundled-features/src/auth-email-password/handlers/signup-confirm.write.ts +34 -37
  20. package/packages/bundled-features/src/auth-email-password/handlers/signup-request.write.ts +6 -7
  21. package/packages/bundled-features/src/auth-email-password/handlers/switch-tenant-mfa-gate.write.ts +1 -5
  22. package/packages/bundled-features/src/auth-email-password/index.ts +5 -5
  23. package/packages/bundled-features/src/auth-email-password/lockout-store.ts +1 -1
  24. package/packages/bundled-features/src/auth-email-password/seeding.ts +63 -66
  25. package/packages/bundled-features/src/auth-email-password/signup-token-store.ts +8 -8
  26. package/packages/bundled-features/src/auth-email-password/testing.ts +3 -3
  27. package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +57 -57
  28. package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +14 -14
  29. package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +15 -16
  30. package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +11 -12
  31. package/packages/bundled-features/src/auth-email-password/web/confirm-account-unlock-screen.tsx +1 -1
  32. package/packages/bundled-features/src/auth-email-password/web/constants.ts +3 -3
  33. package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +14 -14
  34. package/packages/bundled-features/src/auth-email-password/web/forgot-password-screen.tsx +11 -11
  35. package/packages/bundled-features/src/auth-email-password/web/index.ts +5 -5
  36. package/packages/bundled-features/src/auth-email-password/web/invite-accept-screen.tsx +17 -17
  37. package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +3 -4
  38. package/packages/bundled-features/src/auth-email-password/web/reset-password-screen.tsx +16 -17
  39. package/packages/bundled-features/src/auth-email-password/web/session.tsx +34 -34
  40. package/packages/bundled-features/src/auth-email-password/web/signup-complete-screen.tsx +3 -3
  41. package/packages/bundled-features/src/auth-email-password/web/signup-screen.tsx +14 -14
  42. package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +26 -27
  43. package/packages/bundled-features/src/auth-email-password/web/use-shell-user.ts +12 -13
  44. package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +17 -18
  45. package/packages/bundled-features/src/auth-email-password/web/verify-email-screen.tsx +11 -12
  46. package/packages/bundled-features/src/auth-foundation/boot-checks.ts +4 -4
  47. package/packages/bundled-features/src/auth-foundation/resolve-anonymous-access.ts +4 -4
  48. package/packages/bundled-features/src/auth-foundation/types.ts +2 -2
  49. package/packages/bundled-features/src/auth-mfa/handlers/disable.write.ts +3 -3
  50. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +4 -4
  51. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm.write.ts +2 -2
  52. package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +1 -1
  53. package/packages/bundled-features/src/auth-mfa/handlers/reencrypt.job.ts +1 -1
  54. package/packages/bundled-features/src/auth-mfa/handlers/regenerate-recovery.write.ts +5 -5
  55. package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +1 -1
  56. package/packages/bundled-features/src/auth-mfa/token-secrets.ts +1 -1
  57. package/packages/bundled-features/src/auth-mfa/web/client-plugin.ts +2 -2
  58. package/packages/bundled-features/src/auth-mfa/web/i18n.ts +3 -3
  59. package/packages/bundled-features/src/auth-mfa/web/index.ts +4 -4
  60. package/packages/bundled-features/src/auth-mfa/web/mfa-client.ts +17 -16
  61. package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +6 -6
  62. package/packages/bundled-features/src/billing-foundation/aggregate-id.ts +10 -11
  63. package/packages/bundled-features/src/billing-foundation/entities.ts +27 -27
  64. package/packages/bundled-features/src/billing-foundation/events.ts +22 -21
  65. package/packages/bundled-features/src/billing-foundation/feature.ts +42 -43
  66. package/packages/bundled-features/src/billing-foundation/get-subscription-for-tenant.ts +3 -5
  67. package/packages/bundled-features/src/billing-foundation/handlers/create-checkout-session.write.ts +18 -17
  68. package/packages/bundled-features/src/billing-foundation/handlers/create-portal-session.write.ts +11 -12
  69. package/packages/bundled-features/src/billing-foundation/handlers/list-subscriptions.query.ts +4 -4
  70. package/packages/bundled-features/src/billing-foundation/handlers/process-event.write.ts +20 -20
  71. package/packages/bundled-features/src/billing-foundation/projection.ts +38 -37
  72. package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +3 -3
  73. package/packages/bundled-features/src/billing-foundation/tenant-destroy-hook.ts +7 -8
  74. package/packages/bundled-features/src/billing-foundation/types.ts +64 -65
  75. package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +4 -4
  76. package/packages/bundled-features/src/billing-foundation/webhook-handler.ts +1 -1
  77. package/packages/bundled-features/src/cap-counter/aggregate-id.ts +8 -9
  78. package/packages/bundled-features/src/cap-counter/constants.ts +11 -12
  79. package/packages/bundled-features/src/cap-counter/enforce-cap.ts +64 -67
  80. package/packages/bundled-features/src/cap-counter/entity.ts +29 -29
  81. package/packages/bundled-features/src/cap-counter/feature.ts +34 -35
  82. package/packages/bundled-features/src/cap-counter/handlers/increment-rolling.write.ts +31 -31
  83. package/packages/bundled-features/src/cap-counter/handlers/mark-soft-warned.write.ts +4 -5
  84. package/packages/bundled-features/src/cap-counter/stock-cap-guard.ts +1 -1
  85. package/packages/bundled-features/src/cap-counter/with-cap-enforcement.ts +3 -5
  86. package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +1 -3
  87. package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +1 -1
  88. package/packages/bundled-features/src/channel-email/smtp-transport.ts +34 -31
  89. package/packages/bundled-features/src/channel-in-app/handlers/unread-count.query.ts +3 -4
  90. package/packages/bundled-features/src/compliance-profiles/feature.ts +15 -16
  91. package/packages/bundled-features/src/compliance-profiles/handlers/for-tenant.query.ts +3 -6
  92. package/packages/bundled-features/src/compliance-profiles/handlers/list-profiles.query.ts +5 -5
  93. package/packages/bundled-features/src/compliance-profiles/handlers/needs-profile.query.ts +4 -4
  94. package/packages/bundled-features/src/compliance-profiles/handlers/set-profile.write.ts +13 -14
  95. package/packages/bundled-features/src/compliance-profiles/handlers/sub-processors.query.ts +9 -11
  96. package/packages/bundled-features/src/compliance-profiles/resolve-for-tenant.ts +7 -7
  97. package/packages/bundled-features/src/compliance-profiles/schema/profile-selection.ts +18 -23
  98. package/packages/bundled-features/src/compliance-profiles/seeding.ts +14 -15
  99. package/packages/bundled-features/src/compliance-profiles-ops/handlers/tenants-missing-profile.query.ts +3 -3
  100. package/packages/bundled-features/src/compliance-profiles-ops/index.ts +2 -2
  101. package/packages/bundled-features/src/config/handlers/readiness.query.ts +7 -7
  102. package/packages/bundled-features/src/config/handlers/reencrypt.job.ts +4 -5
  103. package/packages/bundled-features/src/config/handlers/set.write.ts +4 -4
  104. package/packages/bundled-features/src/config/resolver.ts +4 -4
  105. package/packages/bundled-features/src/config/table.ts +10 -10
  106. package/packages/bundled-features/src/config/write-helpers.ts +1 -1
  107. package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +13 -12
  108. package/packages/bundled-features/src/custom-fields/aggregate-id.ts +16 -17
  109. package/packages/bundled-features/src/custom-fields/entity.ts +49 -47
  110. package/packages/bundled-features/src/custom-fields/events.ts +7 -8
  111. package/packages/bundled-features/src/custom-fields/feature.ts +70 -72
  112. package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +9 -8
  113. package/packages/bundled-features/src/custom-fields/handlers/define-tenant-field.write.ts +28 -26
  114. package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +6 -7
  115. package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +12 -13
  116. package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +25 -28
  117. package/packages/bundled-features/src/custom-fields/handlers/update-tenant-field.write.ts +6 -6
  118. package/packages/bundled-features/src/custom-fields/lib/field-access.ts +2 -2
  119. package/packages/bundled-features/src/custom-fields/lib/parse-serialized-field.ts +1 -1
  120. package/packages/bundled-features/src/custom-fields/lib/quota.ts +1 -1
  121. package/packages/bundled-features/src/custom-fields/lib/value-schema.ts +10 -12
  122. package/packages/bundled-features/src/custom-fields/run-retention.ts +3 -3
  123. package/packages/bundled-features/src/custom-fields/schemas.ts +14 -14
  124. package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +2 -5
  125. package/packages/bundled-features/src/custom-fields/web/constants.ts +2 -2
  126. package/packages/bundled-features/src/custom-fields/web/custom-fields-form-section.tsx +26 -26
  127. package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +65 -67
  128. package/packages/bundled-features/src/custom-fields/wire-user-data-rights.ts +3 -3
  129. package/packages/bundled-features/src/data-retention/_internal/parse-override.ts +2 -3
  130. package/packages/bundled-features/src/data-retention/feature.ts +11 -18
  131. package/packages/bundled-features/src/data-retention/handlers/policy-for.query.ts +6 -6
  132. package/packages/bundled-features/src/data-retention/keep-for.ts +17 -17
  133. package/packages/bundled-features/src/data-retention/override-schema.ts +13 -15
  134. package/packages/bundled-features/src/data-retention/presets.ts +18 -23
  135. package/packages/bundled-features/src/data-retention/resolve-for-tenant.ts +1 -1
  136. package/packages/bundled-features/src/data-retention/resolve-tenant-preset.ts +17 -16
  137. package/packages/bundled-features/src/data-retention/resolver.ts +33 -32
  138. package/packages/bundled-features/src/data-retention/run-retention-cleanup.ts +71 -58
  139. package/packages/bundled-features/src/data-retention/schema/tenant-retention-override.ts +13 -11
  140. package/packages/bundled-features/src/delivery/feature.ts +3 -3
  141. package/packages/bundled-features/src/delivery/handlers/log.query.ts +1 -1
  142. package/packages/bundled-features/src/delivery/tables.ts +9 -8
  143. package/packages/bundled-features/src/delivery/unsubscribe.ts +4 -4
  144. package/packages/bundled-features/src/delivery/upsert-preference.ts +3 -4
  145. package/packages/bundled-features/src/document-ingest-foundation/entity.ts +5 -5
  146. package/packages/bundled-features/src/document-ingest-foundation/events.ts +2 -2
  147. package/packages/bundled-features/src/document-ingest-foundation/feature.ts +2 -2
  148. package/packages/bundled-features/src/document-ingest-foundation/pages.ts +1 -1
  149. package/packages/bundled-features/src/document-ingest-foundation/tenant-destroy-hook.ts +4 -4
  150. package/packages/bundled-features/src/feature-toggles/compose-tier-resolver.ts +1 -1
  151. package/packages/bundled-features/src/feature-toggles/feature.ts +1 -1
  152. package/packages/bundled-features/src/feature-toggles/global-feature-state-table.ts +1 -1
  153. package/packages/bundled-features/src/feature-toggles/handlers/registered.query.ts +5 -5
  154. package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +1 -1
  155. package/packages/bundled-features/src/feature-toggles/toggle-sync-signal.ts +1 -1
  156. package/packages/bundled-features/src/feature-toggles/web/constants.ts +1 -1
  157. package/packages/bundled-features/src/file-derivatives/feature.ts +2 -2
  158. package/packages/bundled-features/src/file-derivatives/handlers/public-variant.query.ts +1 -1
  159. package/packages/bundled-features/src/file-derivatives/presets.ts +1 -1
  160. package/packages/bundled-features/src/file-foundation/feature.ts +6 -6
  161. package/packages/bundled-features/src/file-provider-inmemory/feature.ts +16 -16
  162. package/packages/bundled-features/src/file-provider-s3/feature.ts +16 -16
  163. package/packages/bundled-features/src/file-provider-s3/lib/s3-provider.ts +6 -6
  164. package/packages/bundled-features/src/files/feature.ts +6 -6
  165. package/packages/bundled-features/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +5 -5
  166. package/packages/bundled-features/src/files-tenant-data/hooks.ts +24 -26
  167. package/packages/bundled-features/src/files-tenant-data/index.ts +1 -1
  168. package/packages/bundled-features/src/folders/feature.ts +1 -1
  169. package/packages/bundled-features/src/folders/web/folder-manager.tsx +2 -2
  170. package/packages/bundled-features/src/folders/web/tree.ts +5 -5
  171. package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +1 -1
  172. package/packages/bundled-features/src/form-draft/db/queries/owned-file-refs.ts +1 -1
  173. package/packages/bundled-features/src/form-draft/entity.ts +3 -3
  174. package/packages/bundled-features/src/form-draft/feature.ts +4 -5
  175. package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +1 -1
  176. package/packages/bundled-features/src/form-draft/release-file-refs.ts +6 -6
  177. package/packages/bundled-features/src/form-draft/schemas.ts +3 -3
  178. package/packages/bundled-features/src/form-draft/web/constants.ts +0 -2
  179. package/packages/bundled-features/src/inbound-mail-foundation/aggregate-id.ts +19 -19
  180. package/packages/bundled-features/src/inbound-mail-foundation/connect-routes.ts +4 -3
  181. package/packages/bundled-features/src/inbound-mail-foundation/constants.ts +30 -33
  182. package/packages/bundled-features/src/inbound-mail-foundation/entities.ts +47 -48
  183. package/packages/bundled-features/src/inbound-mail-foundation/events.ts +54 -50
  184. package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +39 -39
  185. package/packages/bundled-features/src/inbound-mail-foundation/handlers/account-state.ts +8 -8
  186. package/packages/bundled-features/src/inbound-mail-foundation/handlers/connect-account.write.ts +25 -26
  187. package/packages/bundled-features/src/inbound-mail-foundation/handlers/disconnect-account.write.ts +7 -7
  188. package/packages/bundled-features/src/inbound-mail-foundation/handlers/ingest-message.write.ts +50 -51
  189. package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-accounts.query.ts +8 -8
  190. package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-messages.query.ts +10 -10
  191. package/packages/bundled-features/src/inbound-mail-foundation/handlers/scope-visibility.ts +3 -4
  192. package/packages/bundled-features/src/inbound-mail-foundation/handlers/update-account.write.ts +11 -11
  193. package/packages/bundled-features/src/inbound-mail-foundation/oauth-state.ts +16 -15
  194. package/packages/bundled-features/src/inbound-mail-foundation/projection.ts +31 -29
  195. package/packages/bundled-features/src/inbound-mail-foundation/provider-factory.ts +9 -9
  196. package/packages/bundled-features/src/inbound-mail-foundation/retention-sweep.ts +45 -41
  197. package/packages/bundled-features/src/inbound-mail-foundation/tenant-destroy-hook.ts +14 -16
  198. package/packages/bundled-features/src/inbound-mail-foundation/types.ts +66 -67
  199. package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor.ts +69 -68
  200. package/packages/bundled-features/src/inbound-provider-imap/credential-document.ts +13 -13
  201. package/packages/bundled-features/src/inbound-provider-imap/feature.ts +42 -40
  202. package/packages/bundled-features/src/inbound-provider-imap/imap-client.ts +20 -19
  203. package/packages/bundled-features/src/inbound-provider-inmemory/feature.ts +21 -21
  204. package/packages/bundled-features/src/jobs/db/queries/retention.ts +2 -2
  205. package/packages/bundled-features/src/jobs/db/queries/stale-run-sweep.ts +3 -3
  206. package/packages/bundled-features/src/jobs/events.ts +1 -1
  207. package/packages/bundled-features/src/jobs/feature.ts +6 -7
  208. package/packages/bundled-features/src/jobs/handlers/detail.query.ts +4 -4
  209. package/packages/bundled-features/src/jobs/handlers/list.query.ts +1 -1
  210. package/packages/bundled-features/src/jobs/handlers/projection-rebuild.job.ts +1 -1
  211. package/packages/bundled-features/src/jobs/handlers/reindex-entity.job.ts +1 -1
  212. package/packages/bundled-features/src/jobs/handlers/retry.write.ts +1 -1
  213. package/packages/bundled-features/src/jobs/job-instant.ts +1 -1
  214. package/packages/bundled-features/src/jobs/job-run-logger.ts +14 -15
  215. package/packages/bundled-features/src/jobs/job-run-table.ts +3 -3
  216. package/packages/bundled-features/src/jobs/screens.ts +1 -1
  217. package/packages/bundled-features/src/jobs/tenant-job-failure-table.ts +1 -1
  218. package/packages/bundled-features/src/jobs/tenant-job-run-table.ts +1 -1
  219. package/packages/bundled-features/src/ledger/entity.ts +5 -5
  220. package/packages/bundled-features/src/ledger/feature.ts +3 -3
  221. package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +3 -3
  222. package/packages/bundled-features/src/ledger/recurring.ts +12 -12
  223. package/packages/bundled-features/src/ledger/schemas.ts +1 -1
  224. package/packages/bundled-features/src/ledger/web/constants.ts +2 -2
  225. package/packages/bundled-features/src/ledger/web/index.ts +7 -7
  226. package/packages/bundled-features/src/legal-pages/feature.ts +40 -41
  227. package/packages/bundled-features/src/legal-pages/markdown.ts +3 -3
  228. package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +23 -24
  229. package/packages/bundled-features/src/legal-pages/web/index.ts +0 -2
  230. package/packages/bundled-features/src/mail-foundation/feature.ts +26 -27
  231. package/packages/bundled-features/src/mail-transport-inmemory/feature.ts +27 -28
  232. package/packages/bundled-features/src/mail-transport-smtp/feature.ts +20 -20
  233. package/packages/bundled-features/src/managed-pages/branding.ts +6 -6
  234. package/packages/bundled-features/src/managed-pages/feature.ts +62 -62
  235. package/packages/bundled-features/src/managed-pages/handlers/by-slug.query.ts +5 -6
  236. package/packages/bundled-features/src/managed-pages/handlers/by-tenant-published.query.ts +8 -8
  237. package/packages/bundled-features/src/managed-pages/handlers/set.write.ts +5 -7
  238. package/packages/bundled-features/src/managed-pages/screens/page-screens.ts +11 -11
  239. package/packages/bundled-features/src/managed-pages/seeding.ts +8 -8
  240. package/packages/bundled-features/src/managed-pages/table.ts +16 -15
  241. package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +6 -6
  242. package/packages/bundled-features/src/managed-pages/web/i18n.ts +1 -1
  243. package/packages/bundled-features/src/notes-history/entity.ts +4 -4
  244. package/packages/bundled-features/src/notes-history/feature.ts +2 -2
  245. package/packages/bundled-features/src/notes-history-user-data/hooks.ts +1 -1
  246. package/packages/bundled-features/src/page-render/layout.ts +9 -9
  247. package/packages/bundled-features/src/page-render/markdown.ts +11 -11
  248. package/packages/bundled-features/src/page-render/security-headers.ts +7 -6
  249. package/packages/bundled-features/src/personal-access-tokens/feature.ts +5 -5
  250. package/packages/bundled-features/src/personal-access-tokens/roles.ts +2 -2
  251. package/packages/bundled-features/src/readiness/handlers/status.query.ts +3 -3
  252. package/packages/bundled-features/src/renderer-foundation/api.ts +12 -13
  253. package/packages/bundled-features/src/renderer-foundation/constants.ts +2 -2
  254. package/packages/bundled-features/src/renderer-foundation/feature.ts +7 -7
  255. package/packages/bundled-features/src/renderer-foundation/types.ts +11 -12
  256. package/packages/bundled-features/src/secrets/feature.ts +9 -9
  257. package/packages/bundled-features/src/secrets/web/constants.ts +2 -2
  258. package/packages/bundled-features/src/seo/feature.ts +3 -3
  259. package/packages/bundled-features/src/sessions/constants.ts +1 -1
  260. package/packages/bundled-features/src/sessions/feature.ts +9 -9
  261. package/packages/bundled-features/src/sessions/handlers/revoke-all-for-user.write.ts +2 -2
  262. package/packages/bundled-features/src/sessions/handlers/revoke-all-others.write.ts +2 -2
  263. package/packages/bundled-features/src/sessions/handlers/revoke.write.ts +1 -1
  264. package/packages/bundled-features/src/sessions/schema/user-session.ts +4 -4
  265. package/packages/bundled-features/src/sessions/screens.ts +2 -2
  266. package/packages/bundled-features/src/sessions/session-callbacks.ts +2 -2
  267. package/packages/bundled-features/src/sessions/session-revoked-event.ts +2 -2
  268. package/packages/bundled-features/src/shared/assert-no-where-rule-in-ownership-write.ts +1 -1
  269. package/packages/bundled-features/src/shared/decrypt-stored-pii.ts +1 -1
  270. package/packages/bundled-features/src/shared/encrypt-for-direct-write.ts +1 -1
  271. package/packages/bundled-features/src/shared/map-with-concurrency.ts +5 -4
  272. package/packages/bundled-features/src/shared/parent-visibility.ts +2 -2
  273. package/packages/bundled-features/src/shared/password-hashing.ts +1 -1
  274. package/packages/bundled-features/src/shared/signup-handover.ts +1 -2
  275. package/packages/bundled-features/src/shared/single-use-token-store.ts +1 -1
  276. package/packages/bundled-features/src/subscription-mollie/constants.ts +15 -17
  277. package/packages/bundled-features/src/subscription-mollie/feature.ts +41 -42
  278. package/packages/bundled-features/src/subscription-mollie/index.ts +3 -3
  279. package/packages/bundled-features/src/subscription-mollie/plugin-methods.ts +17 -16
  280. package/packages/bundled-features/src/subscription-mollie/verify-webhook.ts +34 -34
  281. package/packages/bundled-features/src/subscription-stripe/constants.ts +4 -6
  282. package/packages/bundled-features/src/subscription-stripe/feature.ts +44 -43
  283. package/packages/bundled-features/src/subscription-stripe/index.ts +6 -6
  284. package/packages/bundled-features/src/subscription-stripe/plugin-methods.ts +22 -27
  285. package/packages/bundled-features/src/subscription-stripe/runtime.ts +2 -2
  286. package/packages/bundled-features/src/subscription-stripe/verify-webhook.ts +62 -64
  287. package/packages/bundled-features/src/tags/feature.ts +3 -3
  288. package/packages/bundled-features/src/tags/screens.ts +1 -1
  289. package/packages/bundled-features/src/template-resolver/api.ts +10 -10
  290. package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +5 -5
  291. package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +1 -1
  292. package/packages/bundled-features/src/template-resolver/handlers/shared.ts +2 -2
  293. package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +3 -3
  294. package/packages/bundled-features/src/template-resolver/handlers/upsert-system.write.ts +3 -4
  295. package/packages/bundled-features/src/template-resolver/handlers/upsert-tenant.write.ts +4 -5
  296. package/packages/bundled-features/src/template-resolver/seeding.ts +4 -4
  297. package/packages/bundled-features/src/template-resolver/table.ts +13 -14
  298. package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +2 -2
  299. package/packages/bundled-features/src/tenant/feature.ts +7 -7
  300. package/packages/bundled-features/src/tenant/handlers/member-directory.query.ts +1 -1
  301. package/packages/bundled-features/src/tenant/handlers/members.query.ts +1 -1
  302. package/packages/bundled-features/src/tenant/handlers/memberships.query.ts +1 -1
  303. package/packages/bundled-features/src/tenant/handlers/team-list.query.ts +1 -1
  304. package/packages/bundled-features/src/tenant/handlers/tenant-directory.query.ts +1 -1
  305. package/packages/bundled-features/src/tenant/invitation-table.ts +37 -40
  306. package/packages/bundled-features/src/tenant/membership-table.ts +3 -3
  307. package/packages/bundled-features/src/tenant/schema/tenant.ts +7 -9
  308. package/packages/bundled-features/src/tenant/screens.ts +1 -1
  309. package/packages/bundled-features/src/tenant/seeding.ts +19 -18
  310. package/packages/bundled-features/src/tenant/testing.ts +5 -6
  311. package/packages/bundled-features/src/tenant/web/constants.ts +2 -2
  312. package/packages/bundled-features/src/tenant-handover/events.ts +5 -7
  313. package/packages/bundled-features/src/tenant-handover/feature.ts +1 -1
  314. package/packages/bundled-features/src/tenant-handover/grant.ts +1 -1
  315. package/packages/bundled-features/src/tenant-handover/handlers/claim.write.ts +1 -1
  316. package/packages/bundled-features/src/tenant-handover/move-entity-graph.ts +8 -9
  317. package/packages/bundled-features/src/tenant-handover/signup-handover-provider.ts +1 -2
  318. package/packages/bundled-features/src/tenant-handover/transfer-graph.ts +4 -5
  319. package/packages/bundled-features/src/tenant-lifecycle/boot-checks.ts +1 -1
  320. package/packages/bundled-features/src/tenant-lifecycle/feature.ts +1 -1
  321. package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +2 -2
  322. package/packages/bundled-features/src/tenant-lifecycle/stages.ts +1 -1
  323. package/packages/bundled-features/src/tenant-settings/constants.ts +1 -1
  324. package/packages/bundled-features/src/tenant-settings/tenant-defaults.ts +12 -5
  325. package/packages/bundled-features/src/tier-engine/aggregate-id.ts +15 -16
  326. package/packages/bundled-features/src/tier-engine/compose-app.ts +14 -14
  327. package/packages/bundled-features/src/tier-engine/entity.ts +18 -19
  328. package/packages/bundled-features/src/tier-engine/feature.ts +88 -87
  329. package/packages/bundled-features/src/tier-engine/handlers/active-tier.query.ts +6 -7
  330. package/packages/bundled-features/src/tier-engine/handlers/get-tenant-tier.query.ts +4 -4
  331. package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +8 -8
  332. package/packages/bundled-features/src/tier-engine/tier-resolver.ts +2 -2
  333. package/packages/bundled-features/src/tier-engine/trial.ts +13 -13
  334. package/packages/bundled-features/src/tier-engine/web/index.ts +4 -4
  335. package/packages/bundled-features/src/user/db/queries/stream-tenant-backfill.ts +8 -8
  336. package/packages/bundled-features/src/user/handlers/create.write.ts +4 -4
  337. package/packages/bundled-features/src/user/schema/user.ts +45 -44
  338. package/packages/bundled-features/src/user/seeding.ts +40 -40
  339. package/packages/bundled-features/src/user/testing.ts +3 -3
  340. package/packages/bundled-features/src/user-data-rights/audit-download.ts +27 -28
  341. package/packages/bundled-features/src/user-data-rights/boot-checks.ts +1 -1
  342. package/packages/bundled-features/src/user-data-rights/deletion-token.ts +1 -1
  343. package/packages/bundled-features/src/user-data-rights/feature.ts +112 -113
  344. package/packages/bundled-features/src/user-data-rights/handlers/cancel-deletion.write.ts +9 -9
  345. package/packages/bundled-features/src/user-data-rights/handlers/confirm-deletion-by-token.write.ts +8 -8
  346. package/packages/bundled-features/src/user-data-rights/handlers/download-by-job.query.ts +29 -30
  347. package/packages/bundled-features/src/user-data-rights/handlers/download-by-token.query.ts +40 -42
  348. package/packages/bundled-features/src/user-data-rights/handlers/export-status.query.ts +8 -9
  349. package/packages/bundled-features/src/user-data-rights/handlers/lift-restriction.write.ts +7 -8
  350. package/packages/bundled-features/src/user-data-rights/handlers/list-download-attempts.query.ts +2 -2
  351. package/packages/bundled-features/src/user-data-rights/handlers/my-audit-log.query.ts +4 -4
  352. package/packages/bundled-features/src/user-data-rights/handlers/request-deletion-by-email.write.ts +30 -29
  353. package/packages/bundled-features/src/user-data-rights/handlers/request-deletion.write.ts +15 -18
  354. package/packages/bundled-features/src/user-data-rights/handlers/request-export.write.ts +42 -41
  355. package/packages/bundled-features/src/user-data-rights/handlers/restrict-account.write.ts +22 -19
  356. package/packages/bundled-features/src/user-data-rights/handlers/run-forget-cleanup.write.ts +8 -8
  357. package/packages/bundled-features/src/user-data-rights/index.ts +8 -10
  358. package/packages/bundled-features/src/user-data-rights/lib/default-mailers.ts +3 -3
  359. package/packages/bundled-features/src/user-data-rights/lib/update-user-lifecycle.ts +24 -27
  360. package/packages/bundled-features/src/user-data-rights/run-export-jobs.ts +166 -276
  361. package/packages/bundled-features/src/user-data-rights/run-forget-cleanup.ts +85 -107
  362. package/packages/bundled-features/src/user-data-rights/run-user-export.ts +67 -69
  363. package/packages/bundled-features/src/user-data-rights/schema/download-attempt.ts +11 -11
  364. package/packages/bundled-features/src/user-data-rights/schema/download-token.ts +37 -41
  365. package/packages/bundled-features/src/user-data-rights/schema/export-job.ts +65 -67
  366. package/packages/bundled-features/src/user-data-rights/token-helpers.ts +21 -25
  367. package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +6 -6
  368. package/packages/bundled-features/src/user-data-rights/web/confirm-deletion-screen.tsx +6 -5
  369. package/packages/bundled-features/src/user-data-rights/web/constants.ts +1 -1
  370. package/packages/bundled-features/src/user-data-rights/web/index.ts +5 -5
  371. package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +14 -13
  372. package/packages/bundled-features/src/user-data-rights/web/public-deletion-gate.tsx +13 -12
  373. package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +6 -6
  374. package/packages/bundled-features/src/user-data-rights/zip-path.ts +41 -40
  375. package/packages/bundled-features/src/user-data-rights-defaults/feature.ts +15 -15
  376. package/packages/bundled-features/src/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.ts +3 -5
  377. package/packages/bundled-features/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +45 -51
  378. package/packages/bundled-features/src/user-data-rights-defaults/hooks/job-run.userdata-hook.ts +2 -2
  379. package/packages/bundled-features/src/user-data-rights-defaults/hooks/notification-preference.userdata-hook.ts +1 -1
  380. package/packages/bundled-features/src/user-data-rights-defaults/hooks/user-session.userdata-hook.ts +3 -3
  381. package/packages/bundled-features/src/user-data-rights-defaults/hooks/user.userdata-hook.ts +32 -31
  382. package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +13 -13
  383. package/packages/bundled-features/src/user-profile/index.ts +3 -3
  384. package/packages/bundled-features/src/user-profile/web/client-plugin.ts +1 -1
  385. package/packages/bundled-features/src/user-profile/web/constants.ts +1 -1
  386. package/packages/bundled-features/src/user-profile/web/profile-screen.tsx +1 -1
  387. package/packages/bundled-features/src/workflow-runner/aggregate-id.ts +1 -1
  388. package/packages/bundled-features/src/workflow-runner/event-subscriber.ts +4 -5
  389. package/packages/bundled-features/src/workflow-runner/event-trigger.ts +4 -15
  390. package/packages/bundled-features/src/workflow-runner/feature.ts +2 -2
  391. package/packages/bundled-features/src/workflow-runner/handlers/resume-run.write.ts +4 -4
  392. package/packages/bundled-features/src/workflow-runner/pending-projection.ts +6 -7
  393. package/packages/bundled-features/src/workflow-runner/runner.ts +6 -6
  394. package/packages/bundled-features/src/workflow-runner/tables.ts +6 -6
  395. package/packages/bundled-features/src/workflow-runner/workflow-registry.ts +1 -1
@@ -24,13 +24,12 @@ import {
24
24
 
25
25
  export { type LegalPagesBootCheckCtx, runLegalPagesBootCheck } from "./lib/boot-check.ts";
26
26
 
27
- // QN-Konstante als dokumentierter Public-Contract des template-resolver-
28
- // Features. Ein magic-string statt eines Code-Imports ist hier explizit
29
- // gewollt: Cross-Feature-Calls gehen nur über stable Public-API
30
- // (handler-name + payload-shape), nicht über interne Module-Refs. Wenn
31
- // template-resolver's Handler-Name sich ändert, ist das ein semver-major
32
- // und muss in beiden Features synchronisiert werden — gleiches Risiko
33
- // wie bei jedem API-Endpunkt.
27
+ // QN constant as the documented public contract of the template-resolver
28
+ // feature. A magic string is intentional instead of a code import: cross-feature
29
+ // calls use only the stable public API (handler name + payload shape), not
30
+ // internal module references. If template-resolver's handler name changes, it is
31
+ // a semver-major change and must be synchronized in both features—the same risk
32
+ // as with any API endpoint.
34
33
  const TEXT_BLOCK_BY_SLUG_QN = "template-resolver:query:by-slug";
35
34
 
36
35
  // Return shape of bySlugQuery (template-resolver/handlers/by-slug.query.ts).
@@ -53,25 +52,25 @@ const PUBLIC_PAGE_CACHE = { kind: "revalidate", maxAgeSeconds: 60 } as const;
53
52
  // additional pages (e.g. terms/AGB).
54
53
  //
55
54
  // Cross-Feature-Decoupling:
56
- // • Routes nutzen app.fetch zu "/api/query" mit dem QN-string
57
- // `template-resolver:query:by-slug` — kein Code-Import von template-resolver
58
- // • Boot-Check nutzt ctx.templateResolver (über extraContext) — symmetrisch
59
- // zum config/tenant-Pattern
60
- // • Single Type-Import (TemplateResolverApi) bleibt — type-only verstößt
61
- // nicht gegen Cross-Feature-Coupling
55
+ // • Routes use app.fetch to "/api/query" with the QN string
56
+ // `template-resolver:query:by-slug`—no code import from template-resolver
57
+ // • The boot check uses ctx.templateResolver (via extraContext), symmetrically
58
+ // with the config/tenant pattern
59
+ // • The single type import (TemplateResolverApi) remains; type-only imports do
60
+ // not violate cross-feature coupling
62
61
  //
63
- // Voraussetzungen für Production:
64
- // • App-Bootstrap muss extraContext: { templateResolver: createTemplateResolverApi(db, registry) }
65
- // setzen — sonst wirft Boot-Check beim Start
66
- // • anonymousAccess: { defaultTenantId: SYSTEM_TENANT_ID } — sonst
67
- // antworten die Routes mit 503
62
+ // Production requirements:
63
+ // • App bootstrap must set extraContext: { templateResolver: createTemplateResolverApi(db,
64
+ // registry) } —otherwise the boot check throws at startup
65
+ // • anonymousAccess: { defaultTenantId: SYSTEM_TENANT_ID }—otherwise
66
+ // the routes respond with 503
68
67
  export type LegalPagesWrapLayout = PublicPageWrapLayout;
69
68
 
70
69
  export type LegalPagesOptions = {
71
- /** Custom Layout-Wrapper für die /legal/*-Routes. Default: minimaler
72
- * HTML-Skeleton aus markdown.ts (`wrapInLayout`). Apps die ihr eigenes
73
- * Marketing-Layout (Header/Footer/Theme) auch um Legal-Body legen
74
- * wollen, übergeben hier ihre Render-Function. */
70
+ /** Custom layout wrapper for the /legal/* routes. Default: minimal
71
+ * HTML skeleton from markdown.ts (`wrapInLayout`). Apps that want to place
72
+ * their own marketing layout (header/footer/theme) around the legal body
73
+ * can provide their render function here. */
75
74
  readonly wrapLayout?: LegalPagesWrapLayout;
76
75
  /** Public HTML routes to register. Default: LEGAL_ROUTES (DACH: DE+EN
77
76
  * imprint/privacy). Non-DACH apps (other default language, additional
@@ -140,18 +139,18 @@ export function createLegalPagesFeature(opts: LegalPagesOptions = {}): FeatureDe
140
139
  // Public pages backed by a DB query: bound the per-IP read rate.
141
140
  rateLimit: { per: "ip+handler", limit: 60, windowSeconds: 60 },
142
141
  handler: async (c, { systemQuery }) => {
143
- // Architektur: 1 App = X Tenants = 1 Impressum. Egal welche
144
- // Subdomain der Visitor besucht (apex, admin.*, tenant-x.*) —
145
- // legal-pages serven IMMER die SYSTEM_TENANT-Texte. systemQuery
146
- // erzwingt SYSTEM_TENANT_ID in-process (kein X-Tenant-Header-
147
- // Trick über app.fetch — der sähe für einen host-basierten
148
- // anonymousAccess-Resolver wie ein Client-Override aus und würde
149
- // von resolverTrust: "authoritative" zurecht abgelehnt).
142
+ // Architecture: 1 app = X tenants = 1 imprint. Regardless of which
143
+ // subdomain the visitor uses (apex, admin.*, tenant-x.*),
144
+ // legal-pages ALWAYS serves the SYSTEM_TENANT texts. systemQuery
145
+ // enforces SYSTEM_TENANT_ID in-process (no X-Tenant-Header trick
146
+ // through app.fetch—the host-based anonymousAccess resolver would
147
+ // see that as a client override and correctly reject it with
148
+ // resolverTrust: "authoritative").
150
149
  let data: TextBlockQueryResult;
151
150
  try {
152
151
  // @cast-boundary engine-payload — dispatcher.query returnt
153
- // unknown; Shape ist durch bySlugQuery's Handler-Return-Type
154
- // (siehe template-resolver/handlers/by-slug.query.ts) vertraut.
152
+ // unknown; the shape is trusted because of bySlugQuery's handler return type
153
+ // (see template-resolver/handlers/by-slug.query.ts).
155
154
  data = (await systemQuery(
156
155
  TEXT_BLOCK_BY_SLUG_QN,
157
156
  { slug: route.slug, locale: route.lang },
@@ -178,8 +177,8 @@ export function createLegalPagesFeature(opts: LegalPagesOptions = {}): FeatureDe
178
177
  String(data.modifiedAt ?? ""),
179
178
  ]);
180
179
  const extra = { "content-type": "text/html; charset=utf-8" };
181
- // 304 (Revision unverändert) und HEAD überspringen beide das
182
- // Markdown-Rendern — der Body wird ohnehin verworfen.
180
+ // Both 304 (unchanged revision) and HEAD skip Markdown rendering—the body
181
+ // would be discarded anyway.
183
182
  if (
184
183
  etagMatches(c.req.raw.headers.get("if-none-match"), etag) ||
185
184
  c.req.method === "HEAD"
@@ -228,21 +227,21 @@ export function createLegalPagesFeature(opts: LegalPagesOptions = {}): FeatureDe
228
227
  });
229
228
  }
230
229
 
231
- // Boot-Check via ctx.templateResolver (extraContext-Pattern, symmetrisch
232
- // zu requireConfigResolver in config). App-Bootstrap muss templateResolver
233
- // wired haben — der Helper gibt einen klaren Wiring-Hinweis wenn nicht.
230
+ // Boot check via ctx.templateResolver (extraContext pattern, symmetrical
231
+ // with requireConfigResolver in config). App bootstrap must wire
232
+ // templateResolver; the helper gives a clear wiring hint if it is missing.
234
233
  //
235
- // Body als named function extrahiert (`runLegalPagesBootCheck`) damit
236
- // die Logik direkt unit-testbar ist statt nur indirekt über Routes.
237
- // Pattern: thin job-shell ruft testable function — keine Test-Coupling
238
- // zum JobRunner.
234
+ // The body is extracted as the named function (`runLegalPagesBootCheck`) so
235
+ // the logic can be unit-tested directly instead of only indirectly through
236
+ // routes. Pattern: a thin job shell calls a testable function, avoiding
237
+ // coupling tests to the JobRunner.
239
238
  r.job(
240
239
  "legal-pages-boot-check",
241
240
  {
242
241
  trigger: { manual: true },
243
242
  // bootGate, not runOnBoot: only an inline gate can actually abort the
244
243
  // boot. runOnBoot merely enqueues, so a missing imprint would fail a
245
- // queue job while the pod goes ready anyway (fw#2590).
244
+ // queue job while the pod goes ready anyway.
246
245
  bootGate: true,
247
246
  runIn: "api",
248
247
  },
@@ -1,6 +1,6 @@
1
- // Re-export aus dem geteilten page-render-Kern (managed-pages nutzt
2
- // denselben gehärteten Renderer + Default-Layout). Namen bleiben stabil
3
- // für legal-pages' Public-API (index.ts exportiert renderMarkdownToHtml +
1
+ // Re-export from the shared page-rendering core (managed pages use
2
+ // the same hardened renderer and default layout). Keep these names stable
3
+ // for legal-pages' public API (index.ts exports renderMarkdownToHtml and
4
4
  // wrapInLayout).
5
5
 
6
6
  export { wrapInLayout } from "../page-render/layout.ts";
@@ -1,26 +1,25 @@
1
- // Client-Feature-Factory für legal-pages Visual-Tree. Liefert statische
2
- // Tree-Knoten für die DACH-Compliance-Blöcke (imprint, privacy in de/en).
3
- // Jeder Knoten linkt auf text-content's edit-Action — reines Cross-Feature-
4
- // Linking, kein eigener State oder Fetch nötig.
1
+ // Client feature factory for the legal-pages visual tree. Provides static
2
+ // tree nodes for the DACH compliance blocks (imprint, privacy in de/en).
3
+ // Each node links to text-content's edit action — pure cross-feature
4
+ // linking, with no own state or fetch required.
5
5
  //
6
- // **Static statt fetch**: legal-pages weiß out-of-the-box welche Blocks
7
- // existieren (LEGAL_REQUIRED_BLOCKS + LEGAL_OPTIONAL_BLOCKS aus constants).
8
- // Anders als text-content's Provider (der alle Slugs des Tenants holt)
9
- // ist diese Liste bekannt zur Build-Zeit — kein /api/query-Round-trip nötig.
6
+ // **Static instead of fetch**: legal-pages knows out of the box which blocks
7
+ // exist (LEGAL_REQUIRED_BLOCKS + LEGAL_OPTIONAL_BLOCKS from constants).
8
+ // Unlike text-content's provider (which fetches all tenant slugs), this list
9
+ // is known at build time — no /api/query round trip is needed.
10
10
  //
11
- // **Content-State unbekannt**: V.1.2 setzt keine state-Markierung; alle
12
- // Knoten erscheinen "filled" (default). V.1.3+ könnte via by-slug-Query
13
- // ermitteln ob ein Block tatsächlich body hat und „stub" markieren wenn
14
- // leer (Provider-Author-Hinweis dass Block existiert aber befüllt werden
15
- // muss). Aktuell ist legal-pages's Boot-Check der primäre Wächter für
16
- // fehlende Pflicht-Blocks.
11
+ // **Content state unknown**: no state marker is set; all nodes appear
12
+ // "filled" (default). A by-slug query could determine whether a block
13
+ // actually has a body and mark it as "stub" when empty (a provider-author hint
14
+ // that the block exists but must be filled). Currently, legal-pages's boot
15
+ // check is the primary guard for missing required blocks.
17
16
 
18
17
  import type { TreeChildrenSubscribe, TreeNode } from "@cosmicdrift/kumiko-framework/engine";
19
18
  import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
20
19
  import { LEGAL_OPTIONAL_BLOCKS, LEGAL_REQUIRED_BLOCKS } from "./constants.ts";
21
20
 
22
21
  const treeProvider: TreeChildrenSubscribe = () => (emit) => {
23
- // V.1.5d Slug-first Verschachtelung (Variante C):
22
+ // Slug-first nesting:
24
23
  // 📁 Legal
25
24
  // 📁 imprint
26
25
  // de
@@ -29,10 +28,10 @@ const treeProvider: TreeChildrenSubscribe = () => (emit) => {
29
28
  // de
30
29
  // en
31
30
  //
32
- // Slug ist der Übersetzungs-Anker — User pflegt DE+EN-Versionen
33
- // desselben Inhalts zusammen statt nach Sprache zu gruppieren.
34
- // Sub-Items sind reine Sprach-Leaves; Label = Sprache, target zeigt
35
- // auf template-resolver:edit mit slug+locale.
31
+ // The slug is the translation anchor — users maintain the DE+EN versions
32
+ // of the same content together instead of grouping them by language.
33
+ // Sub-items are language-only leaves; label = language, and target points
34
+ // to template-resolver:edit with slug+locale.
36
35
 
37
36
  // Group all blocks by slug, collect set of langs per slug.
38
37
  const bySlug = new Map<string, string[]>();
@@ -62,15 +61,15 @@ const treeProvider: TreeChildrenSubscribe = () => (emit) => {
62
61
  });
63
62
  }
64
63
 
65
- // Der App-seitige r.nav-Knoten IST der "Legal"-Container → der Provider
66
- // emittiert die slug-Folder direkt darunter.
64
+ // The app-side r.nav node IS the "Legal" container → the provider
65
+ // emits the slug folders directly beneath it.
67
66
  emit(slugFolders);
68
67
  return () => {};
69
68
  };
70
69
 
71
- // `navId` = QN des r.nav({ provider: true })-Knotens den die App registriert.
72
- // Statisch (kein Fetch, keine Entities) → kein SSE-Refresh nötig. Ohne navId:
73
- // kein Sidebar-Knoten (server-only-Consumer leaken nichts).
70
+ // `navId` = the QN of the r.nav({ provider: true }) node registered by the app.
71
+ // Static (no fetch, no entities) → no SSE refresh is needed. Without navId:
72
+ // no sidebar node (server-only consumers expose nothing).
74
73
  export function legalPagesClient(opts?: { readonly navId?: string }): ClientFeatureDefinition {
75
74
  const navId = opts?.navId;
76
75
  return {
@@ -1,3 +1 @@
1
- // Public exports für die Browser-Seite des legal-pages Features.
2
-
3
1
  export { legalPagesClient } from "./client-plugin.ts";
@@ -2,34 +2,33 @@
2
2
  //
3
3
  // mail-foundation as a Kumiko bundled feature.
4
4
  //
5
- // **Was diese Feature liefert:**
6
- // 1. **Plugin-API** für Mail-Transport-Provider via `r.extendsRegistrar
7
- // ("mailTransport", ...)`. Provider-Features (mail-transport-smtp,
8
- // mail-transport-brevo-api, ...) registrieren sich namentlich.
9
- // 2. **Tenant-Config-key** `provider`: select-Wert der zur Runtime
10
- // bestimmt welcher registrierte Plugin verwendet wird.
11
- // 3. **createTransportForTenant(ctx, tenantId)** Factory die den
12
- // gewählten Plugin im Registry sucht und seine `build`-Methode
13
- // aufruft.
5
+ // **What this feature provides:**
6
+ // 1. **Plugin API** for mail transport providers via `r.extendsRegistrar
7
+ // ("mailTransport", ...)`. Provider features (mail-transport-smtp,
8
+ // mail-transport-brevo-api, ...) register by name.
9
+ // 2. **Tenant config key** `provider`: a selection value that determines at
10
+ // runtime which registered plugin is used.
11
+ // 3. **createTransportForTenant(ctx, tenantId)** factory that looks up the
12
+ // selected plugin in the registry and calls its `build` method.
14
13
  //
15
- // **Was diese Foundation NICHT mehr macht (im Vergleich zur ersten
16
- // Iteration):**
17
- // - Keine SMTP/Brevo/Postmark-spezifischen Config-Keys mehr in
18
- // mail-foundation. Provider-spezifische Config (host/port/from/
19
- // authUser für SMTP, apiUrl/accountId für Brevo etc.) lebt im
20
- // jeweiligen Provider-Plugin-Feature.
21
- // - Kein direkter Import von `createSmtpTransport`. Die Foundation
22
- // kennt nur das `EmailTransport`-Interface (Type-Import, kein
23
- // runtime-coupling), nicht die konkrete Implementation.
14
+ // **What this foundation no longer does (compared with the first
15
+ // iteration):**
16
+ // - No SMTP/Brevo/Postmark-specific config keys in mail-foundation.
17
+ // Provider-specific config (host/port/from/authUser for SMTP,
18
+ // apiUrl/accountId for Brevo, etc.) lives in the respective provider
19
+ // plugin feature.
20
+ // - No direct import of `createSmtpTransport`. The foundation knows only
21
+ // the `EmailTransport` interface (type import, no runtime coupling), not
22
+ // the concrete implementation.
24
23
  //
25
- // **Pattern-Vorbild:** identisch zu `delivery` + `channel-email`. Die
26
- // delivery-feature deklariert `r.extendsRegistrar("deliveryChannel")`,
27
- // channel-email registriert sich via `r.useExtension("deliveryChannel",
28
- // "email", {...})`. Selbe Trennung Foundation ↔ Provider.
24
+ // **Pattern precedent:** identical to `delivery` + `channel-email`. The
25
+ // delivery feature declares `r.extendsRegistrar("deliveryChannel")`, and
26
+ // channel-email registers via `r.useExtension("deliveryChannel",
27
+ // "email", {...})`. The foundation ↔ provider separation is the same.
29
28
  //
30
- // **Standalone:** Foundation ist ohne tier-engine nutzbar. Existing
31
- // `channel-email` (App-wide-Mail-Sender via delivery) bleibt unangetastet
32
- // — additive Feature.
29
+ // **Standalone:** The foundation can be used without tier-engine. Existing
30
+ // `channel-email` (app-wide mail sender via delivery) remains unchanged—an
31
+ // additive feature.
33
32
 
34
33
  import {
35
34
  type EmailTransport,
@@ -97,8 +96,8 @@ export type MailTransportContext = {
97
96
  * an EmailTransport. Per-call construction so a tenant editing config
98
97
  * sees the change on the next mail.
99
98
  *
100
- * **Plugin-Author-Warnung:** `ctx` ist EXPLIZIT ein MailTransportContext,
101
- * nicht ein voller HandlerContext (siehe MailTransportContext-Doc).
99
+ * **Plugin-author warning:** `ctx` is EXPLICITLY a MailTransportContext,
100
+ * not a full HandlerContext (see the MailTransportContext doc).
102
101
  */
103
102
  export type MailTransportPlugin = {
104
103
  readonly build: (ctx: MailTransportContext, tenantId: string) => Promise<EmailTransport>;
@@ -1,25 +1,25 @@
1
1
  // kumiko-feature-version: 1
2
2
  //
3
- // mail-transport-inmemory — In-Memory-EmailTransport für die mail-
4
- // foundation Plugin-API. Sammelt Mails in einem per-Tenant-Buffer
5
- // statt sie über einen echten SMTP-Server zu senden. Designed für
6
- // Demos, Sample-Apps und Tests die ohne Mailpit/Mailcrab/echten SMTP
7
- // laufen sollen.
3
+ // mail-transport-inmemory — In-memory email transport for the mail-
4
+ // foundation plugin API. Collects emails in a per-tenant buffer
5
+ // instead of sending them through a real SMTP server. Designed for
6
+ // demos, sample apps, and tests that should run without Mailpit,
7
+ // Mailcrab, or real SMTP.
8
8
  //
9
- // **Was diese Feature liefert:**
10
- // 1. Plugin-Registration via `r.useExtension("mailTransport",
11
- // "inmemory", { build })`. Tenants setzen
12
- // "mail-foundation:config:provider" auf "inmemory" und kriegen
13
- // die buffered-Variante.
14
- // 2. **Pro-Tenant Inbox.** Jeder Tenant hat einen eigenen
15
- // Mail-Buffer (Map<tenantId, EmailMessage[]>). Demo-Apps können
16
- // die Inbox via `getInbox(tenantId)` lesen + UI rendern.
9
+ // **What this feature provides:**
10
+ // 1. Plugin registration via `r.useExtension("mailTransport",
11
+ // "inmemory", { build })`. Tenants set
12
+ // "mail-foundation:config:provider" to "inmemory" and receive
13
+ // the buffered variant.
14
+ // 2. **Per-tenant inbox.** Each tenant has its own mail buffer
15
+ // (Map<tenantId, EmailMessage[]>). Demo apps can read the inbox
16
+ // via `getInbox(tenantId)` and render a UI.
17
17
  //
18
- // **Pattern-Vorbild:** mirrors mail-transport-smtp.
18
+ // **Pattern reference:** mirrors mail-transport-smtp.
19
19
  //
20
- // **NICHT für Production.** Buffer ist im Process-Memory, geht beim
21
- // Restart verloren. Cap-Counter / Audit-Trail bleiben trotzdem korrekt
22
- // — die hängen am event-store, nicht am Transport.
20
+ // **NOT for production.** The buffer is in process memory and is lost
21
+ // on restart. Cap counters and the audit trail remain correct because
22
+ // they are tied to the event store, not the transport.
23
23
 
24
24
  import type {
25
25
  EmailMessage,
@@ -39,9 +39,9 @@ const FEATURE_NAME = "mail-transport-inmemory";
39
39
  // Per-tenant in-memory buffer
40
40
  // =============================================================================
41
41
  //
42
- // Module-level Map weil der Plugin-build-call pro Send einen neuen
43
- // Transport-Wrapper baut, aber wir wollen dass alle Wrapper für
44
- // denselben Tenant auf denselben Buffer zeigen. Map<tenantId,
42
+ // The module-level Map is needed because the plugin build call creates
43
+ // a new transport wrapper for each send, while all wrappers for the
44
+ // same tenant must point to the same buffer. Map<tenantId,
45
45
  // InMemoryTransport>.
46
46
 
47
47
  const transportsByTenant = new Map<string, ReturnType<typeof createInMemoryTransport>>();
@@ -56,16 +56,16 @@ function getOrCreateTransportForTenant(tenantId: string) {
56
56
  }
57
57
 
58
58
  /**
59
- * Demo/Test-Helper: lies die "versendeten" Mails eines Tenants. Im
60
- * Sample-App rendert ein query-Handler darauf die Inbox-UI.
59
+ * Demo/test helper: reads the emails "sent" for a tenant. A query
60
+ * handler in the sample app uses this to render the inbox UI.
61
61
  */
62
62
  export function getInbox(tenantId: string): readonly EmailMessage[] {
63
63
  return transportsByTenant.get(tenantId)?.sent ?? [];
64
64
  }
65
65
 
66
66
  /**
67
- * Demo/Test-Helper: clear einen Tenant-Buffer (z.B. zwischen Test-
68
- * Szenarien).
67
+ * Demo/test helper: clears a tenant's buffer, for example between
68
+ * test scenarios.
69
69
  */
70
70
  export function clearInbox(tenantId: string): void {
71
71
  const t = transportsByTenant.get(tenantId);
@@ -82,10 +82,9 @@ export function createMailTransportInMemoryFeature() {
82
82
  r.describe(
83
83
  '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).',
84
84
  );
85
- // Kein requires auf "config" oder "secrets" — der
86
- // In-Memory-Transport hat keine Config (nichts zu konfigurieren) und
87
- // kein Secret. Der einzige hard-require ist mail-foundation, das den
88
- // extension-point "mailTransport" definiert.
85
+ // No `config` or `secrets` requirement: the in-memory transport has
86
+ // no configuration and no secret. The only hard requirement is
87
+ // mail-foundation, which defines the "mailTransport" extension point.
89
88
  r.requires({ features: ["mail-foundation"] });
90
89
 
91
90
  const plugin: MailTransportPlugin = {
@@ -1,29 +1,29 @@
1
1
  // kumiko-feature-version: 1
2
2
  //
3
- // mail-transport-smtp — concrete SMTP-implementation for the
4
- // mail-foundation plugin-API.
3
+ // mail-transport-smtp — concrete SMTP implementation for the
4
+ // mail-foundation plugin API.
5
5
  //
6
- // **Was diese Feature liefert:**
7
- // 1. Provider-spezifische Tenant-Config (host/port/secure/from/authUser)
8
- // und Secret (smtp.password). Self-contained — mail-foundation kennt
9
- // diese Schlüssel nicht; wenn ein App-Owner zwischen SMTP und Brevo-
10
- // API wechseln will, hat er pro-Plugin eigenständige Config-Sets.
11
- // 2. **Plugin-Registration** via `r.useExtension("mailTransport",
12
- // "smtp", { build })`. Beim Boot kennt mail-foundation's
13
- // Factory-Lookup damit den name "smtp" ↔ build-Funktion.
14
- // 3. `build(ctx, tenantId)` liest die config-keys + secret und ruft
15
- // `createSmtpTransport()` aus channel-email auf. Das ist der
16
- // EINZIGE Cross-Feature-Import dieses Plugins — bewusst lokal
17
- // gehalten, mail-foundation bleibt provider-frei.
6
+ // **What this feature provides:**
7
+ // 1. Provider-specific tenant config (host/port/secure/from/authUser)
8
+ // and secret (smtp.password). Self-contained — mail-foundation does not
9
+ // know these keys; when an app owner switches between SMTP and the Brevo
10
+ // API, each plugin has its own independent config sets.
11
+ // 2. **Plugin registration** via `r.useExtension("mailTransport",
12
+ // "smtp", { build })`. At boot, mail-foundation's factory lookup maps
13
+ // the name "smtp" to the build function.
14
+ // 3. `build(ctx, tenantId)` reads the config keys and secret, then calls
15
+ // `createSmtpTransport()` from channel-email. This is the plugin's
16
+ // ONLY cross-feature import, deliberately kept local so
17
+ // mail-foundation remains provider-independent.
18
18
  //
19
- // **Pattern-Vorbild:** mirrors `channel-email` registering itself for
20
- // `delivery`. Diese Feature ist analog: registriert sich für
21
- // mail-foundation's "mailTransport"-Extension-Point.
19
+ // **Pattern reference:** mirrors `channel-email` registering itself for
20
+ // `delivery`. This feature is analogous: it registers for
21
+ // mail-foundation's "mailTransport" extension point.
22
22
  //
23
- // **Boot-Dependencies:**
23
+ // **Boot dependencies:**
24
24
  // - `mail-foundation` — extension-point owner
25
- // - `config` — für die Tenant-Config-Keys
26
- // - `secrets` — für das verschlüsselte SMTP-Password
25
+ // - `config` — for the tenant config keys
26
+ // - `secrets` — for the encrypted SMTP password
27
27
 
28
28
  import type { lookup } from "node:dns/promises";
29
29
  import {
@@ -20,13 +20,13 @@ import { type BrandingTokens, EMPTY_BRANDING } from "../page-render/index.ts";
20
20
  // `write: access.withSystem(access.admin)` — tenant admins self-service via
21
21
  // configEdit AND the system actor (ctx.systemWriteAs) may provision/migrate
22
22
  // these keys. The scope default (`access.admin`, admin-only) has no system
23
- // path, so a continuity migration could not set them (issue #396). Adding
24
- // SYSTEM_ROLE keeps the keys human-writable (checkWriteAccess collapses to
23
+ // path, so a continuity migration could not set them. Adding SYSTEM_ROLE
24
+ // keeps the keys human-writable (checkWriteAccess collapses to
25
25
  // system-only only when system is the SOLE writer), so self-service survives.
26
26
  //
27
- // CONTINUITY (Phase 5 — Prod trap): these keys land under
27
+ // CONTINUITY (Prod trap): these keys land under
28
28
  // `managed-pages:config:branding-*`, NOT the live `publicstatus:config:
29
- // branding-*`. The publicstatus consumer (Phase 5) MUST migrate the existing
29
+ // branding-*`. The publicstatus consumer MUST migrate the existing
30
30
  // read_config_values rows to the new QNs per tenant BEFORE switching the read
31
31
  // path, or every tenant resets to defaults on deploy. The migration is
32
32
  // deliberately NOT built here — the source QNs belong to the consumer app.
@@ -37,7 +37,7 @@ import { type BrandingTokens, EMPTY_BRANDING } from "../page-render/index.ts";
37
37
  // also renders. text keys carry an explicit length cap too — `validateType`
38
38
  // only checks the JS type, and the configEdit `maxLength` is client-side, so a
39
39
  // direct config:write:set would otherwise be unbounded (the page body is
40
- // likewise capped in Phase 2).
40
+ // likewise capped).
41
41
  const HEX_PATTERN = {
42
42
  regex: "^$|^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
43
43
  } as const;
@@ -67,7 +67,7 @@ export const MANAGED_PAGES_CSS_FEATURE = "managed-pages-css";
67
67
  // site-url`. BRANDING_QN below is the single source those QN strings are read
68
68
  // from (configEdit screen + render read); the integration test pins write-
69
69
  // target == read-source end-to-end.
70
- // Admin self-service + system provisioning (see write-access note above, #396).
70
+ // Admin self-service + system provisioning.
71
71
  const BRANDING_WRITE = access.withSystem(access.admin);
72
72
 
73
73
  export const BRANDING_KEYS = {