@cosmicdrift/kumiko-samples 0.386.0 → 0.388.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (530) 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 +9 -2
  5. package/packages/bundled-features/src/agent-tools/changes.json +6 -0
  6. package/packages/bundled-features/src/agent-tools/tool-catalog.ts +1 -1
  7. package/packages/bundled-features/src/agent-tools/tool-dispatch.ts +9 -9
  8. package/packages/bundled-features/src/audit/changes.json +12 -0
  9. package/packages/bundled-features/src/audit/handlers/audit-events.ts +1 -1
  10. package/packages/bundled-features/src/audit/screens.ts +1 -1
  11. package/packages/bundled-features/src/auth-email-password/auth-user-row.ts +10 -10
  12. package/packages/bundled-features/src/auth-email-password/feature.ts +6 -6
  13. package/packages/bundled-features/src/auth-email-password/handlers/change-password.write.ts +3 -3
  14. package/packages/bundled-features/src/auth-email-password/handlers/confirm-token-flow.ts +5 -5
  15. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +1 -1
  16. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept.write.ts +18 -18
  17. package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +12 -12
  18. package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +1 -1
  19. package/packages/bundled-features/src/auth-email-password/handlers/invite-signup-complete.write.ts +24 -26
  20. package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +1 -1
  21. package/packages/bundled-features/src/auth-email-password/handlers/self-registration-status.query.ts +1 -1
  22. package/packages/bundled-features/src/auth-email-password/handlers/signup-confirm.write.ts +34 -37
  23. package/packages/bundled-features/src/auth-email-password/handlers/signup-request.write.ts +6 -7
  24. package/packages/bundled-features/src/auth-email-password/handlers/switch-tenant-mfa-gate.write.ts +1 -5
  25. package/packages/bundled-features/src/auth-email-password/index.ts +5 -5
  26. package/packages/bundled-features/src/auth-email-password/lockout-store.ts +1 -1
  27. package/packages/bundled-features/src/auth-email-password/seeding.ts +63 -66
  28. package/packages/bundled-features/src/auth-email-password/signup-token-store.ts +8 -8
  29. package/packages/bundled-features/src/auth-email-password/testing.ts +3 -3
  30. package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +57 -57
  31. package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +14 -14
  32. package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +15 -16
  33. package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +11 -12
  34. package/packages/bundled-features/src/auth-email-password/web/confirm-account-unlock-screen.tsx +1 -1
  35. package/packages/bundled-features/src/auth-email-password/web/constants.ts +3 -3
  36. package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +14 -14
  37. package/packages/bundled-features/src/auth-email-password/web/forgot-password-screen.tsx +11 -11
  38. package/packages/bundled-features/src/auth-email-password/web/index.ts +5 -5
  39. package/packages/bundled-features/src/auth-email-password/web/invite-accept-screen.tsx +17 -17
  40. package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +3 -4
  41. package/packages/bundled-features/src/auth-email-password/web/reset-password-screen.tsx +16 -17
  42. package/packages/bundled-features/src/auth-email-password/web/session.tsx +34 -34
  43. package/packages/bundled-features/src/auth-email-password/web/signup-complete-screen.tsx +3 -3
  44. package/packages/bundled-features/src/auth-email-password/web/signup-screen.tsx +14 -14
  45. package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +26 -27
  46. package/packages/bundled-features/src/auth-email-password/web/use-shell-user.ts +12 -13
  47. package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +17 -18
  48. package/packages/bundled-features/src/auth-email-password/web/verify-email-screen.tsx +11 -12
  49. package/packages/bundled-features/src/auth-foundation/boot-checks.ts +4 -4
  50. package/packages/bundled-features/src/auth-foundation/resolve-anonymous-access.ts +4 -4
  51. package/packages/bundled-features/src/auth-foundation/types.ts +2 -2
  52. package/packages/bundled-features/src/auth-mfa/changes.json +6 -0
  53. package/packages/bundled-features/src/auth-mfa/feature-exports.ts +2 -2
  54. package/packages/bundled-features/src/auth-mfa/feature.ts +6 -0
  55. package/packages/bundled-features/src/auth-mfa/handlers/disable.write.ts +3 -3
  56. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +4 -4
  57. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm.write.ts +2 -2
  58. package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +1 -1
  59. package/packages/bundled-features/src/auth-mfa/handlers/reencrypt.job.ts +1 -1
  60. package/packages/bundled-features/src/auth-mfa/handlers/regenerate-recovery.write.ts +5 -5
  61. package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +1 -1
  62. package/packages/bundled-features/src/auth-mfa/token-secrets.ts +1 -1
  63. package/packages/bundled-features/src/auth-mfa/web/client-plugin.ts +2 -2
  64. package/packages/bundled-features/src/auth-mfa/web/i18n.ts +9 -4
  65. package/packages/bundled-features/src/auth-mfa/web/index.ts +4 -4
  66. package/packages/bundled-features/src/auth-mfa/web/mfa-client.ts +17 -16
  67. package/packages/bundled-features/src/auth-mfa/web/mfa-code-or-recovery-field.tsx +68 -0
  68. package/packages/bundled-features/src/auth-mfa/web/mfa-disable-dialog.tsx +23 -13
  69. package/packages/bundled-features/src/auth-mfa/web/mfa-regenerate-recovery-dialog.tsx +23 -13
  70. package/packages/bundled-features/src/auth-mfa/web/mfa-setup-preauth-screen.tsx +15 -6
  71. package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +71 -24
  72. package/packages/bundled-features/src/billing-foundation/aggregate-id.ts +10 -11
  73. package/packages/bundled-features/src/billing-foundation/changes.json +55 -0
  74. package/packages/bundled-features/src/billing-foundation/checkout-core.ts +32 -42
  75. package/packages/bundled-features/src/billing-foundation/consumer-protection/confirmation-mail.ts +8 -2
  76. package/packages/bundled-features/src/billing-foundation/consumer-protection/consent-gate.ts +2 -0
  77. package/packages/bundled-features/src/billing-foundation/consumer-protection/issue-confirmation.ts +14 -3
  78. package/packages/bundled-features/src/billing-foundation/consumer-protection/mail-notifications.ts +3 -4
  79. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-receipt-limit.ts +12 -6
  80. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-record.ts +35 -19
  81. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-request.ts +12 -8
  82. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-revoke.ts +14 -8
  83. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-texts.ts +5 -0
  84. package/packages/bundled-features/src/billing-foundation/consumer-protection/withdrawal-period.ts +8 -10
  85. package/packages/bundled-features/src/billing-foundation/entities.ts +27 -27
  86. package/packages/bundled-features/src/billing-foundation/events.ts +23 -21
  87. package/packages/bundled-features/src/billing-foundation/feature.ts +45 -44
  88. package/packages/bundled-features/src/billing-foundation/get-subscription-for-tenant.ts +3 -5
  89. package/packages/bundled-features/src/billing-foundation/handlers/billing-plans.query.ts +71 -6
  90. package/packages/bundled-features/src/billing-foundation/handlers/create-checkout-session.write.ts +19 -17
  91. package/packages/bundled-features/src/billing-foundation/handlers/create-portal-session.write.ts +11 -12
  92. package/packages/bundled-features/src/billing-foundation/handlers/list-subscriptions.query.ts +4 -4
  93. package/packages/bundled-features/src/billing-foundation/handlers/plan-switch-preview.query.ts +65 -0
  94. package/packages/bundled-features/src/billing-foundation/handlers/process-event.write.ts +29 -22
  95. package/packages/bundled-features/src/billing-foundation/handlers/start-plan-checkout.write.ts +44 -8
  96. package/packages/bundled-features/src/billing-foundation/handlers/switch-plan.write.ts +72 -82
  97. package/packages/bundled-features/src/billing-foundation/handlers/sync-subscription.write.ts +14 -1
  98. package/packages/bundled-features/src/billing-foundation/i18n.ts +22 -0
  99. package/packages/bundled-features/src/billing-foundation/index.ts +2 -0
  100. package/packages/bundled-features/src/billing-foundation/plan-catalog.ts +62 -27
  101. package/packages/bundled-features/src/billing-foundation/plan-switch.ts +84 -0
  102. package/packages/bundled-features/src/billing-foundation/projection.ts +38 -37
  103. package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +3 -3
  104. package/packages/bundled-features/src/billing-foundation/tenant-destroy-hook.ts +7 -8
  105. package/packages/bundled-features/src/billing-foundation/types.ts +144 -66
  106. package/packages/bundled-features/src/billing-foundation/validate-options.ts +19 -0
  107. package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +123 -51
  108. package/packages/bundled-features/src/billing-foundation/web/checkout-consent-dialog.tsx +89 -42
  109. package/packages/bundled-features/src/billing-foundation/web/constants.ts +4 -0
  110. package/packages/bundled-features/src/billing-foundation/web/plan-price.ts +55 -0
  111. package/packages/bundled-features/src/billing-foundation/web/plan-switch-confirm-dialog.tsx +224 -0
  112. package/packages/bundled-features/src/billing-foundation/webhook-handler.ts +1 -1
  113. package/packages/bundled-features/src/cap-counter/aggregate-id.ts +8 -9
  114. package/packages/bundled-features/src/cap-counter/cap-reservation.ts +5 -1
  115. package/packages/bundled-features/src/cap-counter/changes.json +18 -0
  116. package/packages/bundled-features/src/cap-counter/constants.ts +11 -12
  117. package/packages/bundled-features/src/cap-counter/enforce-cap.ts +66 -68
  118. package/packages/bundled-features/src/cap-counter/entity.ts +29 -29
  119. package/packages/bundled-features/src/cap-counter/feature.ts +34 -35
  120. package/packages/bundled-features/src/cap-counter/handlers/increment-rolling.write.ts +31 -31
  121. package/packages/bundled-features/src/cap-counter/handlers/mark-soft-warned.write.ts +4 -5
  122. package/packages/bundled-features/src/cap-counter/stock-cap-guard.ts +9 -2
  123. package/packages/bundled-features/src/cap-counter/with-cap-enforcement.ts +3 -5
  124. package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +1 -3
  125. package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +1 -1
  126. package/packages/bundled-features/src/channel-email/changes.json +6 -0
  127. package/packages/bundled-features/src/channel-email/feature.ts +1 -1
  128. package/packages/bundled-features/src/channel-email/smtp-transport.ts +34 -31
  129. package/packages/bundled-features/src/channel-in-app/handlers/unread-count.query.ts +3 -4
  130. package/packages/bundled-features/src/compliance-profiles/feature.ts +15 -16
  131. package/packages/bundled-features/src/compliance-profiles/handlers/for-tenant.query.ts +3 -6
  132. package/packages/bundled-features/src/compliance-profiles/handlers/list-profiles.query.ts +5 -5
  133. package/packages/bundled-features/src/compliance-profiles/handlers/needs-profile.query.ts +4 -4
  134. package/packages/bundled-features/src/compliance-profiles/handlers/set-profile.write.ts +13 -14
  135. package/packages/bundled-features/src/compliance-profiles/handlers/sub-processors.query.ts +9 -11
  136. package/packages/bundled-features/src/compliance-profiles/resolve-for-tenant.ts +7 -7
  137. package/packages/bundled-features/src/compliance-profiles/schema/profile-selection.ts +18 -23
  138. package/packages/bundled-features/src/compliance-profiles/seeding.ts +14 -15
  139. package/packages/bundled-features/src/compliance-profiles-ops/handlers/tenants-missing-profile.query.ts +3 -3
  140. package/packages/bundled-features/src/compliance-profiles-ops/index.ts +2 -2
  141. package/packages/bundled-features/src/config/changes.json +12 -0
  142. package/packages/bundled-features/src/config/handlers/cascade.query.ts +4 -2
  143. package/packages/bundled-features/src/config/handlers/readiness.query.ts +7 -7
  144. package/packages/bundled-features/src/config/handlers/reencrypt.job.ts +4 -5
  145. package/packages/bundled-features/src/config/handlers/set.write.ts +4 -4
  146. package/packages/bundled-features/src/config/handlers/values.query.ts +4 -2
  147. package/packages/bundled-features/src/config/resolver.ts +4 -4
  148. package/packages/bundled-features/src/config/table.ts +10 -10
  149. package/packages/bundled-features/src/config/write-helpers.ts +28 -9
  150. package/packages/bundled-features/src/crypto-shredding/changes.json +6 -0
  151. package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +23 -21
  152. package/packages/bundled-features/src/custom-fields/aggregate-id.ts +16 -17
  153. package/packages/bundled-features/src/custom-fields/entity.ts +49 -47
  154. package/packages/bundled-features/src/custom-fields/events.ts +7 -8
  155. package/packages/bundled-features/src/custom-fields/feature.ts +70 -72
  156. package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +9 -8
  157. package/packages/bundled-features/src/custom-fields/handlers/define-tenant-field.write.ts +28 -26
  158. package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +6 -7
  159. package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +12 -13
  160. package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +25 -28
  161. package/packages/bundled-features/src/custom-fields/handlers/update-tenant-field.write.ts +6 -6
  162. package/packages/bundled-features/src/custom-fields/lib/field-access.ts +2 -2
  163. package/packages/bundled-features/src/custom-fields/lib/parse-serialized-field.ts +1 -1
  164. package/packages/bundled-features/src/custom-fields/lib/quota.ts +1 -1
  165. package/packages/bundled-features/src/custom-fields/lib/value-schema.ts +10 -12
  166. package/packages/bundled-features/src/custom-fields/run-retention.ts +3 -3
  167. package/packages/bundled-features/src/custom-fields/schemas.ts +14 -14
  168. package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +2 -5
  169. package/packages/bundled-features/src/custom-fields/web/constants.ts +2 -2
  170. package/packages/bundled-features/src/custom-fields/web/custom-fields-form-section.tsx +26 -26
  171. package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +65 -67
  172. package/packages/bundled-features/src/custom-fields/wire-user-data-rights.ts +3 -3
  173. package/packages/bundled-features/src/data-retention/_internal/parse-override.ts +2 -3
  174. package/packages/bundled-features/src/data-retention/feature.ts +11 -18
  175. package/packages/bundled-features/src/data-retention/handlers/policy-for.query.ts +6 -6
  176. package/packages/bundled-features/src/data-retention/keep-for.ts +17 -17
  177. package/packages/bundled-features/src/data-retention/override-schema.ts +13 -15
  178. package/packages/bundled-features/src/data-retention/presets.ts +18 -23
  179. package/packages/bundled-features/src/data-retention/resolve-for-tenant.ts +1 -1
  180. package/packages/bundled-features/src/data-retention/resolve-tenant-preset.ts +17 -16
  181. package/packages/bundled-features/src/data-retention/resolver.ts +33 -32
  182. package/packages/bundled-features/src/data-retention/run-retention-cleanup.ts +71 -58
  183. package/packages/bundled-features/src/data-retention/schema/tenant-retention-override.ts +13 -11
  184. package/packages/bundled-features/src/delivery/changes.json +30 -0
  185. package/packages/bundled-features/src/delivery/channel-context.ts +9 -3
  186. package/packages/bundled-features/src/delivery/db/queries/preferences.ts +2 -2
  187. package/packages/bundled-features/src/delivery/delivery-service.ts +35 -5
  188. package/packages/bundled-features/src/delivery/feature.ts +3 -3
  189. package/packages/bundled-features/src/delivery/handlers/log.query.ts +1 -1
  190. package/packages/bundled-features/src/delivery/handlers/preferences.query.ts +20 -1
  191. package/packages/bundled-features/src/delivery/handlers/unsubscribe-page-chrome.query.ts +1 -1
  192. package/packages/bundled-features/src/delivery/tables.ts +9 -8
  193. package/packages/bundled-features/src/delivery/unsubscribe-link.ts +3 -1
  194. package/packages/bundled-features/src/delivery/unsubscribe-page-strings.ts +1 -0
  195. package/packages/bundled-features/src/delivery/unsubscribe-page.ts +6 -0
  196. package/packages/bundled-features/src/delivery/unsubscribe.ts +40 -19
  197. package/packages/bundled-features/src/delivery/upsert-preference.ts +3 -4
  198. package/packages/bundled-features/src/document-ingest-foundation/entity.ts +5 -5
  199. package/packages/bundled-features/src/document-ingest-foundation/events.ts +2 -2
  200. package/packages/bundled-features/src/document-ingest-foundation/feature.ts +2 -2
  201. package/packages/bundled-features/src/document-ingest-foundation/pages.ts +1 -1
  202. package/packages/bundled-features/src/document-ingest-foundation/tenant-destroy-hook.ts +4 -4
  203. package/packages/bundled-features/src/feature-toggles/compose-tier-resolver.ts +1 -1
  204. package/packages/bundled-features/src/feature-toggles/feature.ts +1 -1
  205. package/packages/bundled-features/src/feature-toggles/global-feature-state-table.ts +1 -1
  206. package/packages/bundled-features/src/feature-toggles/handlers/registered.query.ts +5 -5
  207. package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +1 -1
  208. package/packages/bundled-features/src/feature-toggles/toggle-sync-signal.ts +1 -1
  209. package/packages/bundled-features/src/feature-toggles/web/constants.ts +1 -1
  210. package/packages/bundled-features/src/file-derivatives/feature.ts +2 -2
  211. package/packages/bundled-features/src/file-derivatives/handlers/public-variant.query.ts +1 -1
  212. package/packages/bundled-features/src/file-derivatives/presets.ts +1 -1
  213. package/packages/bundled-features/src/file-foundation/feature.ts +6 -6
  214. package/packages/bundled-features/src/file-foundation/index.ts +1 -0
  215. package/packages/bundled-features/src/file-foundation/read-file-ref-content.ts +7 -1
  216. package/packages/bundled-features/src/file-provider-inmemory/feature.ts +16 -16
  217. package/packages/bundled-features/src/file-provider-s3/env-named-feature.ts +0 -2
  218. package/packages/bundled-features/src/file-provider-s3/feature.ts +16 -16
  219. package/packages/bundled-features/src/file-provider-s3/lib/s3-provider.ts +6 -6
  220. package/packages/bundled-features/src/files/README.md +1 -1
  221. package/packages/bundled-features/src/files/feature.ts +6 -6
  222. package/packages/bundled-features/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +5 -5
  223. package/packages/bundled-features/src/files-tenant-data/hooks.ts +24 -26
  224. package/packages/bundled-features/src/files-tenant-data/index.ts +1 -1
  225. package/packages/bundled-features/src/folders/feature.ts +1 -1
  226. package/packages/bundled-features/src/folders/web/folder-manager.tsx +2 -2
  227. package/packages/bundled-features/src/folders/web/tree.ts +5 -5
  228. package/packages/bundled-features/src/form-draft/changes.json +6 -0
  229. package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +3 -3
  230. package/packages/bundled-features/src/form-draft/db/queries/owned-file-refs.ts +1 -1
  231. package/packages/bundled-features/src/form-draft/decrypt-draft.ts +4 -1
  232. package/packages/bundled-features/src/form-draft/entity.ts +3 -3
  233. package/packages/bundled-features/src/form-draft/feature.ts +4 -5
  234. package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +1 -1
  235. package/packages/bundled-features/src/form-draft/release-file-refs.ts +6 -6
  236. package/packages/bundled-features/src/form-draft/schemas.ts +3 -3
  237. package/packages/bundled-features/src/form-draft/web/constants.ts +0 -2
  238. package/packages/bundled-features/src/host-routing/README.md +1 -1
  239. package/packages/bundled-features/src/host-routing/changes.json +6 -0
  240. package/packages/bundled-features/src/host-routing/dispatch.ts +16 -17
  241. package/packages/bundled-features/src/host-routing/options.ts +2 -1
  242. package/packages/bundled-features/src/inbound-mail-foundation/aggregate-id.ts +19 -19
  243. package/packages/bundled-features/src/inbound-mail-foundation/changes.json +18 -0
  244. package/packages/bundled-features/src/inbound-mail-foundation/connect-routes.ts +4 -3
  245. package/packages/bundled-features/src/inbound-mail-foundation/constants.ts +30 -33
  246. package/packages/bundled-features/src/inbound-mail-foundation/entities.ts +47 -48
  247. package/packages/bundled-features/src/inbound-mail-foundation/events.ts +54 -50
  248. package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +39 -39
  249. package/packages/bundled-features/src/inbound-mail-foundation/handlers/account-state.ts +8 -8
  250. package/packages/bundled-features/src/inbound-mail-foundation/handlers/connect-account.write.ts +25 -26
  251. package/packages/bundled-features/src/inbound-mail-foundation/handlers/disconnect-account.write.ts +7 -7
  252. package/packages/bundled-features/src/inbound-mail-foundation/handlers/ingest-message.write.ts +50 -51
  253. package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-accounts.query.ts +8 -8
  254. package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-messages.query.ts +10 -10
  255. package/packages/bundled-features/src/inbound-mail-foundation/handlers/scope-visibility.ts +3 -4
  256. package/packages/bundled-features/src/inbound-mail-foundation/handlers/update-account.write.ts +27 -15
  257. package/packages/bundled-features/src/inbound-mail-foundation/i18n.ts +0 -1
  258. package/packages/bundled-features/src/inbound-mail-foundation/oauth-state.ts +16 -15
  259. package/packages/bundled-features/src/inbound-mail-foundation/projection.ts +31 -29
  260. package/packages/bundled-features/src/inbound-mail-foundation/provider-factory.ts +9 -9
  261. package/packages/bundled-features/src/inbound-mail-foundation/retention-sweep.ts +45 -41
  262. package/packages/bundled-features/src/inbound-mail-foundation/screens.ts +0 -3
  263. package/packages/bundled-features/src/inbound-mail-foundation/tenant-destroy-hook.ts +14 -16
  264. package/packages/bundled-features/src/inbound-mail-foundation/types.ts +70 -70
  265. package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor.ts +101 -84
  266. package/packages/bundled-features/src/inbound-provider-imap/credential-document.ts +13 -13
  267. package/packages/bundled-features/src/inbound-provider-imap/feature.ts +42 -40
  268. package/packages/bundled-features/src/inbound-provider-imap/imap-client.ts +20 -19
  269. package/packages/bundled-features/src/inbound-provider-inmemory/feature.ts +21 -21
  270. package/packages/bundled-features/src/jobs/changes.json +13 -0
  271. package/packages/bundled-features/src/jobs/db/queries/retention.ts +2 -2
  272. package/packages/bundled-features/src/jobs/db/queries/stale-run-sweep.ts +3 -3
  273. package/packages/bundled-features/src/jobs/events.ts +1 -1
  274. package/packages/bundled-features/src/jobs/feature.ts +20 -11
  275. package/packages/bundled-features/src/jobs/handlers/detail.query.ts +4 -4
  276. package/packages/bundled-features/src/jobs/handlers/list.query.ts +1 -1
  277. package/packages/bundled-features/src/jobs/handlers/projection-rebuild.job.ts +1 -1
  278. package/packages/bundled-features/src/jobs/handlers/reindex-entity.job.ts +1 -1
  279. package/packages/bundled-features/src/jobs/handlers/retry.write.ts +1 -1
  280. package/packages/bundled-features/src/jobs/handlers/tenant-failures.query.ts +45 -40
  281. package/packages/bundled-features/src/jobs/handlers/tenant-runs.query.ts +63 -59
  282. package/packages/bundled-features/src/jobs/job-instant.ts +1 -1
  283. package/packages/bundled-features/src/jobs/job-run-logger.ts +19 -19
  284. package/packages/bundled-features/src/jobs/job-run-table.ts +3 -3
  285. package/packages/bundled-features/src/jobs/screens.ts +1 -1
  286. package/packages/bundled-features/src/jobs/tenant-job-failure-table.ts +1 -1
  287. package/packages/bundled-features/src/jobs/tenant-job-run-table.ts +1 -1
  288. package/packages/bundled-features/src/ledger/entity.ts +5 -5
  289. package/packages/bundled-features/src/ledger/feature.ts +3 -3
  290. package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +3 -3
  291. package/packages/bundled-features/src/ledger/recurring.ts +12 -12
  292. package/packages/bundled-features/src/ledger/schemas.ts +1 -1
  293. package/packages/bundled-features/src/ledger/web/constants.ts +2 -2
  294. package/packages/bundled-features/src/ledger/web/index.ts +7 -7
  295. package/packages/bundled-features/src/legal-pages/README.md +1 -1
  296. package/packages/bundled-features/src/legal-pages/feature.ts +40 -41
  297. package/packages/bundled-features/src/legal-pages/markdown.ts +3 -3
  298. package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +23 -24
  299. package/packages/bundled-features/src/legal-pages/web/index.ts +0 -2
  300. package/packages/bundled-features/src/mail-foundation/changes.json +6 -0
  301. package/packages/bundled-features/src/mail-foundation/feature.ts +31 -30
  302. package/packages/bundled-features/src/mail-transport-inmemory/feature.ts +27 -28
  303. package/packages/bundled-features/src/mail-transport-smtp/feature.ts +20 -20
  304. package/packages/bundled-features/src/managed-pages/branding.ts +6 -6
  305. package/packages/bundled-features/src/managed-pages/feature.ts +62 -62
  306. package/packages/bundled-features/src/managed-pages/handlers/by-slug.query.ts +5 -6
  307. package/packages/bundled-features/src/managed-pages/handlers/by-tenant-published.query.ts +8 -8
  308. package/packages/bundled-features/src/managed-pages/handlers/set.write.ts +5 -7
  309. package/packages/bundled-features/src/managed-pages/screens/page-screens.ts +11 -11
  310. package/packages/bundled-features/src/managed-pages/seeding.ts +8 -8
  311. package/packages/bundled-features/src/managed-pages/table.ts +16 -15
  312. package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +6 -6
  313. package/packages/bundled-features/src/managed-pages/web/i18n.ts +1 -1
  314. package/packages/bundled-features/src/notes-history/entity.ts +4 -4
  315. package/packages/bundled-features/src/notes-history/feature.ts +2 -2
  316. package/packages/bundled-features/src/notes-history-user-data/hooks.ts +1 -1
  317. package/packages/bundled-features/src/page-render/layout.ts +9 -9
  318. package/packages/bundled-features/src/page-render/markdown.ts +11 -11
  319. package/packages/bundled-features/src/page-render/security-headers.ts +7 -6
  320. package/packages/bundled-features/src/personal-access-tokens/feature.ts +9 -6
  321. package/packages/bundled-features/src/personal-access-tokens/roles.ts +2 -2
  322. package/packages/bundled-features/src/readiness/handlers/status.query.ts +3 -3
  323. package/packages/bundled-features/src/renderer-foundation/api.ts +12 -13
  324. package/packages/bundled-features/src/renderer-foundation/constants.ts +2 -2
  325. package/packages/bundled-features/src/renderer-foundation/feature.ts +7 -7
  326. package/packages/bundled-features/src/renderer-foundation/types.ts +11 -12
  327. package/packages/bundled-features/src/renderer-pdf/changes.json +6 -0
  328. package/packages/bundled-features/src/renderer-pdf/render-table-pdf.ts +27 -10
  329. package/packages/bundled-features/src/secrets/feature.ts +9 -9
  330. package/packages/bundled-features/src/secrets/web/constants.ts +2 -2
  331. package/packages/bundled-features/src/seo/feature.ts +3 -3
  332. package/packages/bundled-features/src/sessions/constants.ts +1 -1
  333. package/packages/bundled-features/src/sessions/feature.ts +16 -11
  334. package/packages/bundled-features/src/sessions/handlers/revoke-all-for-user.write.ts +2 -2
  335. package/packages/bundled-features/src/sessions/handlers/revoke-all-others.write.ts +2 -2
  336. package/packages/bundled-features/src/sessions/handlers/revoke.write.ts +1 -1
  337. package/packages/bundled-features/src/sessions/schema/user-session.ts +4 -4
  338. package/packages/bundled-features/src/sessions/screens.ts +2 -2
  339. package/packages/bundled-features/src/sessions/session-callbacks.ts +2 -2
  340. package/packages/bundled-features/src/sessions/session-revoked-event.ts +2 -2
  341. package/packages/bundled-features/src/shared/assert-no-where-rule-in-ownership-write.ts +1 -1
  342. package/packages/bundled-features/src/shared/decrypt-stored-pii.ts +11 -1
  343. package/packages/bundled-features/src/shared/encrypt-for-direct-write.ts +1 -1
  344. package/packages/bundled-features/src/shared/index.ts +1 -1
  345. package/packages/bundled-features/src/shared/mail-template-body.ts +10 -3
  346. package/packages/bundled-features/src/shared/map-with-concurrency.ts +5 -4
  347. package/packages/bundled-features/src/shared/parent-visibility.ts +2 -2
  348. package/packages/bundled-features/src/shared/password-hashing.ts +1 -1
  349. package/packages/bundled-features/src/shared/signup-handover.ts +1 -2
  350. package/packages/bundled-features/src/shared/single-use-token-store.ts +1 -1
  351. package/packages/bundled-features/src/step-dispatcher/changes.json +6 -0
  352. package/packages/bundled-features/src/step-dispatcher/feature.ts +1 -0
  353. package/packages/bundled-features/src/subscription-dodo/changes.json +14 -0
  354. package/packages/bundled-features/src/subscription-dodo/client.ts +45 -0
  355. package/packages/bundled-features/src/subscription-dodo/constants.ts +24 -0
  356. package/packages/bundled-features/src/subscription-dodo/feature.ts +207 -0
  357. package/packages/bundled-features/src/subscription-dodo/index.ts +16 -0
  358. package/packages/bundled-features/src/subscription-dodo/plugin-methods.ts +345 -0
  359. package/packages/bundled-features/src/subscription-dodo/runtime.ts +126 -0
  360. package/packages/bundled-features/src/subscription-dodo/verify-webhook.ts +262 -0
  361. package/packages/bundled-features/src/subscription-mollie/constants.ts +15 -17
  362. package/packages/bundled-features/src/subscription-mollie/feature.ts +41 -42
  363. package/packages/bundled-features/src/subscription-mollie/index.ts +3 -3
  364. package/packages/bundled-features/src/subscription-mollie/plugin-methods.ts +17 -16
  365. package/packages/bundled-features/src/subscription-mollie/verify-webhook.ts +34 -34
  366. package/packages/bundled-features/src/subscription-stripe/changes.json +12 -0
  367. package/packages/bundled-features/src/subscription-stripe/constants.ts +4 -6
  368. package/packages/bundled-features/src/subscription-stripe/feature.ts +45 -43
  369. package/packages/bundled-features/src/subscription-stripe/index.ts +6 -6
  370. package/packages/bundled-features/src/subscription-stripe/plugin-methods.ts +22 -27
  371. package/packages/bundled-features/src/subscription-stripe/runtime.ts +9 -8
  372. package/packages/bundled-features/src/subscription-stripe/verify-webhook.ts +62 -64
  373. package/packages/bundled-features/src/tags/feature.ts +3 -3
  374. package/packages/bundled-features/src/tags/screens.ts +1 -1
  375. package/packages/bundled-features/src/template-resolver/api.ts +41 -14
  376. package/packages/bundled-features/src/template-resolver/changes.json +48 -0
  377. package/packages/bundled-features/src/template-resolver/compile-document-body.ts +1 -0
  378. package/packages/bundled-features/src/template-resolver/feature.ts +2 -2
  379. package/packages/bundled-features/src/template-resolver/handlers/bundle-import.ts +3 -2
  380. package/packages/bundled-features/src/template-resolver/handlers/copy-locale.write.ts +27 -5
  381. package/packages/bundled-features/src/template-resolver/handlers/diff-to-system.query.ts +3 -2
  382. package/packages/bundled-features/src/template-resolver/handlers/document-base.ts +3 -2
  383. package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +8 -7
  384. package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +19 -20
  385. package/packages/bundled-features/src/template-resolver/handlers/overview.query.ts +15 -5
  386. package/packages/bundled-features/src/template-resolver/handlers/shared.ts +2 -2
  387. package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +3 -3
  388. package/packages/bundled-features/src/template-resolver/handlers/tenant-override-counts.query.ts +9 -5
  389. package/packages/bundled-features/src/template-resolver/handlers/tenant-override-selection.ts +8 -6
  390. package/packages/bundled-features/src/template-resolver/handlers/tenant-overrides.query.ts +44 -5
  391. package/packages/bundled-features/src/template-resolver/handlers/upsert-system.write.ts +3 -4
  392. package/packages/bundled-features/src/template-resolver/handlers/upsert-tenant.write.ts +4 -5
  393. package/packages/bundled-features/src/template-resolver/handlers/usage.query.ts +37 -26
  394. package/packages/bundled-features/src/template-resolver/handlers/validate.query.ts +7 -2
  395. package/packages/bundled-features/src/template-resolver/seeding.ts +36 -18
  396. package/packages/bundled-features/src/template-resolver/store-template-resource.ts +22 -4
  397. package/packages/bundled-features/src/template-resolver/table.ts +13 -14
  398. package/packages/bundled-features/src/template-resolver/template-delivery-policy.ts +0 -11
  399. package/packages/bundled-features/src/template-resolver/template-meta.ts +12 -4
  400. package/packages/bundled-features/src/template-resolver/template-preview.ts +11 -3
  401. package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +2 -2
  402. package/packages/bundled-features/src/template-resolver/web/constants.ts +7 -5
  403. package/packages/bundled-features/src/template-resolver/web/index.ts +7 -0
  404. package/packages/bundled-features/src/template-resolver/web/mail-layout-constants.ts +8 -0
  405. package/packages/bundled-features/src/tenant/changes.json +6 -0
  406. package/packages/bundled-features/src/tenant/feature.ts +7 -7
  407. package/packages/bundled-features/src/tenant/handlers/member-directory.query.ts +10 -4
  408. package/packages/bundled-features/src/tenant/handlers/members.query.ts +1 -1
  409. package/packages/bundled-features/src/tenant/handlers/memberships.query.ts +1 -1
  410. package/packages/bundled-features/src/tenant/handlers/team-list.query.ts +1 -1
  411. package/packages/bundled-features/src/tenant/handlers/tenant-directory.query.ts +8 -5
  412. package/packages/bundled-features/src/tenant/invitation-table.ts +37 -40
  413. package/packages/bundled-features/src/tenant/membership-table.ts +3 -3
  414. package/packages/bundled-features/src/tenant/schema/tenant.ts +7 -9
  415. package/packages/bundled-features/src/tenant/screens.ts +1 -1
  416. package/packages/bundled-features/src/tenant/seeding.ts +19 -18
  417. package/packages/bundled-features/src/tenant/testing.ts +5 -6
  418. package/packages/bundled-features/src/tenant/web/constants.ts +2 -2
  419. package/packages/bundled-features/src/tenant-handover/events.ts +5 -7
  420. package/packages/bundled-features/src/tenant-handover/feature.ts +1 -1
  421. package/packages/bundled-features/src/tenant-handover/grant.ts +1 -1
  422. package/packages/bundled-features/src/tenant-handover/handlers/claim.write.ts +1 -1
  423. package/packages/bundled-features/src/tenant-handover/move-entity-graph.ts +8 -9
  424. package/packages/bundled-features/src/tenant-handover/signup-handover-provider.ts +1 -2
  425. package/packages/bundled-features/src/tenant-handover/transfer-graph.ts +4 -5
  426. package/packages/bundled-features/src/tenant-lifecycle/boot-checks.ts +1 -1
  427. package/packages/bundled-features/src/tenant-lifecycle/changes.json +6 -0
  428. package/packages/bundled-features/src/tenant-lifecycle/constants.ts +5 -0
  429. package/packages/bundled-features/src/tenant-lifecycle/feature.ts +1 -1
  430. package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +7 -3
  431. package/packages/bundled-features/src/tenant-lifecycle/stages.ts +1 -1
  432. package/packages/bundled-features/src/tenant-settings/constants.ts +1 -1
  433. package/packages/bundled-features/src/tenant-settings/tenant-defaults.ts +12 -5
  434. package/packages/bundled-features/src/tier-engine/aggregate-id.ts +15 -16
  435. package/packages/bundled-features/src/tier-engine/changes.json +6 -0
  436. package/packages/bundled-features/src/tier-engine/compose-app.ts +14 -14
  437. package/packages/bundled-features/src/tier-engine/entity.ts +18 -19
  438. package/packages/bundled-features/src/tier-engine/feature.ts +88 -87
  439. package/packages/bundled-features/src/tier-engine/handlers/active-tier.query.ts +6 -7
  440. package/packages/bundled-features/src/tier-engine/handlers/get-tenant-tier.query.ts +4 -4
  441. package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +12 -9
  442. package/packages/bundled-features/src/tier-engine/tier-resolver.ts +2 -2
  443. package/packages/bundled-features/src/tier-engine/trial.ts +13 -13
  444. package/packages/bundled-features/src/tier-engine/web/constants.ts +3 -3
  445. package/packages/bundled-features/src/tier-engine/web/index.ts +4 -4
  446. package/packages/bundled-features/src/user/db/queries/stream-tenant-backfill.ts +8 -8
  447. package/packages/bundled-features/src/user/handlers/create.write.ts +4 -4
  448. package/packages/bundled-features/src/user/schema/user.ts +45 -44
  449. package/packages/bundled-features/src/user/seeding.ts +40 -40
  450. package/packages/bundled-features/src/user/testing.ts +3 -3
  451. package/packages/bundled-features/src/user-data-rights/audit-download.ts +27 -28
  452. package/packages/bundled-features/src/user-data-rights/boot-checks.ts +1 -1
  453. package/packages/bundled-features/src/user-data-rights/deletion-token.ts +1 -1
  454. package/packages/bundled-features/src/user-data-rights/feature.ts +112 -113
  455. package/packages/bundled-features/src/user-data-rights/handlers/cancel-deletion.write.ts +9 -9
  456. package/packages/bundled-features/src/user-data-rights/handlers/confirm-deletion-by-token.write.ts +8 -8
  457. package/packages/bundled-features/src/user-data-rights/handlers/download-by-job.query.ts +29 -30
  458. package/packages/bundled-features/src/user-data-rights/handlers/download-by-token.query.ts +40 -42
  459. package/packages/bundled-features/src/user-data-rights/handlers/export-status.query.ts +8 -9
  460. package/packages/bundled-features/src/user-data-rights/handlers/lift-restriction.write.ts +7 -8
  461. package/packages/bundled-features/src/user-data-rights/handlers/list-download-attempts.query.ts +2 -2
  462. package/packages/bundled-features/src/user-data-rights/handlers/my-audit-log.query.ts +4 -4
  463. package/packages/bundled-features/src/user-data-rights/handlers/request-deletion-by-email.write.ts +30 -29
  464. package/packages/bundled-features/src/user-data-rights/handlers/request-deletion.write.ts +15 -18
  465. package/packages/bundled-features/src/user-data-rights/handlers/request-export.write.ts +42 -41
  466. package/packages/bundled-features/src/user-data-rights/handlers/restrict-account.write.ts +22 -19
  467. package/packages/bundled-features/src/user-data-rights/handlers/run-forget-cleanup.write.ts +8 -8
  468. package/packages/bundled-features/src/user-data-rights/index.ts +8 -10
  469. package/packages/bundled-features/src/user-data-rights/lib/default-mailers.ts +3 -3
  470. package/packages/bundled-features/src/user-data-rights/lib/update-user-lifecycle.ts +24 -27
  471. package/packages/bundled-features/src/user-data-rights/run-export-jobs.ts +169 -280
  472. package/packages/bundled-features/src/user-data-rights/run-forget-cleanup.ts +87 -108
  473. package/packages/bundled-features/src/user-data-rights/run-user-export.ts +67 -69
  474. package/packages/bundled-features/src/user-data-rights/schema/download-attempt.ts +11 -11
  475. package/packages/bundled-features/src/user-data-rights/schema/download-token.ts +37 -41
  476. package/packages/bundled-features/src/user-data-rights/schema/export-job.ts +65 -67
  477. package/packages/bundled-features/src/user-data-rights/token-helpers.ts +21 -25
  478. package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +6 -6
  479. package/packages/bundled-features/src/user-data-rights/web/confirm-deletion-screen.tsx +6 -5
  480. package/packages/bundled-features/src/user-data-rights/web/constants.ts +1 -1
  481. package/packages/bundled-features/src/user-data-rights/web/index.ts +5 -5
  482. package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +14 -13
  483. package/packages/bundled-features/src/user-data-rights/web/public-deletion-gate.tsx +13 -12
  484. package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +6 -6
  485. package/packages/bundled-features/src/user-data-rights/zip-path.ts +41 -40
  486. package/packages/bundled-features/src/user-data-rights-defaults/feature.ts +15 -15
  487. package/packages/bundled-features/src/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.ts +3 -5
  488. package/packages/bundled-features/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +45 -51
  489. package/packages/bundled-features/src/user-data-rights-defaults/hooks/job-run.userdata-hook.ts +2 -2
  490. package/packages/bundled-features/src/user-data-rights-defaults/hooks/notification-preference.userdata-hook.ts +1 -1
  491. package/packages/bundled-features/src/user-data-rights-defaults/hooks/user-session.userdata-hook.ts +3 -3
  492. package/packages/bundled-features/src/user-data-rights-defaults/hooks/user.userdata-hook.ts +32 -31
  493. package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +13 -13
  494. package/packages/bundled-features/src/user-profile/index.ts +3 -3
  495. package/packages/bundled-features/src/user-profile/web/client-plugin.ts +1 -1
  496. package/packages/bundled-features/src/user-profile/web/constants.ts +1 -1
  497. package/packages/bundled-features/src/user-profile/web/profile-screen.tsx +1 -1
  498. package/packages/bundled-features/src/waitlist/changes.json +18 -0
  499. package/packages/bundled-features/src/waitlist/handlers/export-purge.write.ts +2 -1
  500. package/packages/bundled-features/src/waitlist/handlers/submit.write.ts +5 -5
  501. package/packages/bundled-features/src/waitlist/import.ts +5 -0
  502. package/packages/bundled-features/src/waitlist/legacy-migrate.ts +22 -3
  503. package/packages/bundled-features/src/waitlist/link-on-signup.ts +20 -10
  504. package/packages/bundled-features/src/waitlist/options.ts +3 -0
  505. package/packages/bundled-features/src/workflow-runner/aggregate-id.ts +1 -1
  506. package/packages/bundled-features/src/workflow-runner/event-subscriber.ts +4 -5
  507. package/packages/bundled-features/src/workflow-runner/event-trigger.ts +4 -15
  508. package/packages/bundled-features/src/workflow-runner/feature.ts +2 -2
  509. package/packages/bundled-features/src/workflow-runner/handlers/resume-run.write.ts +4 -4
  510. package/packages/bundled-features/src/workflow-runner/pending-projection.ts +6 -7
  511. package/packages/bundled-features/src/workflow-runner/runner.ts +6 -6
  512. package/packages/bundled-features/src/workflow-runner/tables.ts +6 -6
  513. package/packages/bundled-features/src/workflow-runner/workflow-registry.ts +1 -1
  514. package/samples/apps/styleguide/src/features/widgets/i18n.ts +11 -0
  515. package/samples/apps/styleguide/src/features/widgets/web/Widgets.tsx +24 -0
  516. package/samples/apps/use-all-bundled/e2e-billing-gallery/gallery-constants.ts +5 -0
  517. package/samples/apps/use-all-bundled/e2e-billing-gallery/gallery-features.ts +90 -15
  518. package/samples/apps/use-all-bundled/e2e-billing-gallery/server.ts +16 -6
  519. package/samples/apps/use-all-bundled/feature-manifest.json +120 -3
  520. package/samples/apps/use-all-bundled/src/run-config.ts +9 -3
  521. package/samples/recipes/auth-mfa/README.md +5 -0
  522. package/samples/recipes/auth-mfa/package.json +5 -2
  523. package/samples/recipes/auth-mfa/src/web/confirmation-code-step.tsx +49 -0
  524. package/samples/recipes/auth-mfa/tsconfig.json +8 -0
  525. package/samples/recipes/env-composition/README.md +3 -1
  526. package/samples/recipes/env-composition/src/env.ts +2 -0
  527. package/samples/recipes/legal-pages/README.md +1 -1
  528. package/samples/recipes/rate-limiting/README.md +18 -0
  529. package/samples/recipes/rate-limiting/src/feature.ts +12 -0
  530. package/packages/bundled-features/src/billing-foundation/consumer-protection/stored-user-email.ts +0 -12
@@ -41,9 +41,9 @@ import { tenantJobRunsTable } from "./tenant-job-run-table.ts";
41
41
  // every connection in the pool.
42
42
  const KMS_POOL_CONCURRENCY = 4;
43
43
 
44
- // Direct-write job-run log (#2243): onJobStart/-Complete/-Failed write
44
+ // Direct-write job-run log: onJobStart/-Complete/-Failed write
45
45
  // straight into jobRunsTable / jobRunLogsTable instead of appending to the
46
- // event store and replaying through inline projections. Pre-#2243 every run
46
+ // event store and replaying through inline projections. Before this change every run
47
47
  // left two permanent `kumiko_events` rows that nothing else ever replayed
48
48
  // or MSP-subscribed to — in two production apps that was ~99% of all
49
49
  // events. Same tables, same shape, no event stream in between.
@@ -76,7 +76,7 @@ const DEFAULT_CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
76
76
 
77
77
  // Run rows hang on SYSTEM_TENANT_ID and a null trigger is a cron/system run;
78
78
  // job-run-table.ts declares whenAbsent: "tenant" for exactly that case, so the
79
- // logger must resolve the same subject the entity chain would (fw#3654).
79
+ // logger must resolve the same subject the entity chain would.
80
80
  function jobRunSubject(triggeredById: string | null): SubjectId {
81
81
  return triggeredById === null
82
82
  ? { kind: "tenant", tenantId: SYSTEM_TENANT_ID }
@@ -112,12 +112,12 @@ async function encryptOrSentinel(
112
112
  }
113
113
 
114
114
  // Same per-subject encryption as encryptStartedPayload, applied to each
115
- // batched log line's `message` (#2247) before insertMany into
115
+ // batched log line's `message` before insertMany into
116
116
  // jobRunLogsTable — that table is unmanaged/direct-write, so there is no
117
117
  // event-piiFields catalog to lean on here either. "message" is the AAD
118
118
  // field name and must match the field passed to decryptStoredPii on read
119
119
  // (detail.query.ts) or decrypt fails loud. Same skip rule as the payload:
120
- // absent KMS (rollout mode) stays plaintext. Bounded concurrency (#2307) —
120
+ // absent KMS (rollout mode) stays plaintext. Bounded concurrency —
121
121
  // unbounded Promise.all would fire one getOrCreateDek per log line at once
122
122
  // against the KMS adapter's pool.
123
123
  async function encryptLogMessages<T extends { readonly message: string }>(
@@ -133,7 +133,7 @@ async function encryptLogMessages<T extends { readonly message: string }>(
133
133
  }));
134
134
  }
135
135
 
136
- // Mirrors encryptFailureError for the failure-path `error` column (#2307):
136
+ // Mirrors encryptFailureError for the failure-path `error` column:
137
137
  // stored alongside logs[].message under the same triggering user's DEK, so
138
138
  // a log/error pair from the same failed run decrypt together or erase
139
139
  // together. Exported so stale-run-sweep.ts's crash-recovery write (a
@@ -149,12 +149,12 @@ export async function encryptFailureError(
149
149
  }
150
150
 
151
151
  // The run-started payload can carry arbitrary user data; triggeredById
152
- // names its owning user. No event-PII catalog involved (#2243 removed the
153
- // jobRun r.defineEvent registrations, so there is nothing to catalog) —
154
- // the subject is known statically, so we encrypt directly. A null subject
152
+ // names its owning user. No event-PII catalog involved (the
153
+ // jobRun r.defineEvent registrations were removed, so there is nothing to
154
+ // catalog) — the subject is known statically, so we encrypt directly. A null subject
155
155
  // (system cron runs, recipient-less triggers) encrypts under the system
156
156
  // tenant key. Absent KMS adapter stays plaintext (rollout mode, unchanged).
157
- // A key already erased by the time the trigger lands (#2307) must not fail
157
+ // A key already erased by the time the trigger lands must not fail
158
158
  // the whole run-start write — sentinel like the log/error paths.
159
159
  async function encryptStartedPayload(
160
160
  payload: string | null,
@@ -173,13 +173,12 @@ const TENANT_JOB_FAILURE_LOCK_NAMESPACE = 0x746a666c;
173
173
  const TENANT_JOB_RUN_LOCK_NAMESPACE = 0x746a726c;
174
174
  const TENANT_RUN_CONFLICT_KEYS = ["tenantId", "jobName", "bullJobId"] as const;
175
175
 
176
- // fw#3079 — which row the tenant-visible failure record lives in: one per
176
+ // Which row the tenant-visible failure record lives in: one per
177
177
  // (tenant, job, subject), so the next outcome of the same work replaces or
178
178
  // clears it. `subject` is null for a job that declares no subjectFields.
179
179
  // Null target = nothing to write or clear: the job did not opt in, the run
180
180
  // was tenant-less (cron resolves to SYSTEM_TENANT_ID, where no tenant-scoped
181
- // query could ever read the row), or the caller predates fw#3079 and passes
182
- // no outcome at all.
181
+ // query could ever read the row), or the caller passes no outcome at all.
183
182
  function tenantJobFailureTarget(
184
183
  jobName: string,
185
184
  outcome: JobOutcomeMeta | undefined,
@@ -229,7 +228,7 @@ async function clearTenantJobFailure(
229
228
  await deleteMany(db, tenantJobFailuresTable, where);
230
229
  }
231
230
 
232
- // fw#3616 — tenant-visible run state. One row per BullMQ job in
231
+ // Tenant-visible run state. One row per BullMQ job in
233
232
  // store_tenant_job_runs, addressed by (tenant, job name, bullJobId): BullMQ
234
233
  // ids are only unique per queue (api and worker lane both count from 1) and
235
234
  // restart after a Redis reset, so the id alone must never pick a row. The
@@ -263,15 +262,16 @@ async function recordTenantRunQueued(
263
262
  const now = Temporal.Now.instant();
264
263
  await transaction(db, async (tx) => {
265
264
  // A finished row under the same id is left over from before a Redis reset
266
- // (ids restart at 1), not this job. Only rows that went through this hook
267
- // (queuedAt set) qualify: a fast worker can finish before the hook runs,
268
- // and that row is this job's own and must stay.
265
+ // (ids restart at 1), not this job. Only rows queued before this BullMQ job
266
+ // was created qualify: a fast worker can finish before the hook runs (no
267
+ // queuedAt), and a deduplicated add of an already finished job re-announces
268
+ // it with a creation time older than its own row. Both rows must stay.
269
269
  await deleteMany(tx, tenantJobRunsTable, {
270
270
  tenantId: key.tenantId,
271
271
  jobName,
272
272
  bullJobId,
273
273
  status: { in: ["completed", "failed"] },
274
- queuedAt: { gt: Temporal.Instant.fromEpochMilliseconds(0) },
274
+ queuedAt: { lt: Temporal.Instant.fromEpochMilliseconds(meta.jobCreatedAtMs) },
275
275
  });
276
276
  // DO NOTHING: a fast worker can report the start before this enqueue hook
277
277
  // returns, and a repeated jobId (debounce, fan-out dedup) is the same job.
@@ -445,7 +445,7 @@ export function createJobRunLogger(opts: JobRunLoggerOptions): JobRunLoggerCallb
445
445
  // Bounded cache (LRU-ish with TTL) — worker-crash between start and
446
446
  // complete would otherwise leak entries. DB-lookup recovers evicted
447
447
  // entries via bull_job_id on jobRunsTable.
448
- // triggeredById rides along with runId (#2247) — resolved once at start
448
+ // triggeredById rides along with runId — resolved once at start
449
449
  // (or on cache-miss DB fallback) so onJobComplete/-Failed know the log
450
450
  // subject without an extra always-on DB round trip.
451
451
  type CacheEntry = {
@@ -18,10 +18,10 @@ import {
18
18
  export type JobRunStatus = "queued" | "running" | "completed" | "failed";
19
19
  export type JobLogLevel = "info" | "warn" | "error";
20
20
 
21
- // jobRun is a system-scoped direct-write store (#2243): every job execution
21
+ // jobRun is a system-scoped direct-write store: every job execution
22
22
  // writes straight into jobRunsTable / jobRunLogsTable from the BullMQ
23
23
  // callbacks (onJobStart / -Complete / -Failed, see job-run-logger.ts) —
24
- // no event-store detour. Pre-#2243 this was an events-only aggregate
24
+ // no event-store detour. Previously this was an events-only aggregate
25
25
  // replayed through two inline projections; that generated two permanent
26
26
  // `kumiko_events` rows per run for data that is itself already the
27
27
  // system of record (no other consumer replays or MSP-subscribes to it).
@@ -38,7 +38,7 @@ export type JobLogLevel = "info" | "warn" | "error";
38
38
  // app boundary (same pattern as template-resolver kind/scope).
39
39
  // `table: "store_job_runs"` (not `read_*`) because this is no longer a
40
40
  // rebuildable projection — `defineUnmanagedTable`/`deriveEntityTableMeta`
41
- // reject the `read_` prefix for `source: "unmanaged"` (#1208/#1220).
41
+ // reject the `read_` prefix for `source: "unmanaged"`.
42
42
  export const jobRunEntity = createEntity({
43
43
  table: "store_job_runs",
44
44
  fields: {
@@ -111,7 +111,7 @@ export const jobRunDetailScreen: ProjectionDetailScreenDefinition = {
111
111
  "error",
112
112
  ],
113
113
  },
114
- // No section `title` here (fw#2312 label-dedup fix): the section
114
+ // No section `title` here (label-dedup fix): the section
115
115
  // holds exactly one field, so a title would repeat the field's own
116
116
  // label (rendered by RenderField as the Field's heading) verbatim.
117
117
  {
@@ -11,7 +11,7 @@ import {
11
11
  uuid,
12
12
  } from "@cosmicdrift/kumiko-framework/db";
13
13
 
14
- // The tenant's own view of a failed job (fw#3079). Direct-write store like
14
+ // The tenant's own view of a failed job. Direct-write store like
15
15
  // store_job_runs: job-run-logger.ts writes it from the BullMQ callbacks,
16
16
  // outside any dispatcher transaction.
17
17
  //
@@ -13,7 +13,7 @@ import {
13
13
 
14
14
  export type TenantJobRunStatus = "queued" | "running" | "completed" | "failed";
15
15
 
16
- // The tenant's own view of a job's run state (fw#3616). Direct-write store
16
+ // The tenant's own view of a job's run state. Direct-write store
17
17
  // like store_job_runs, written by job-run-logger.ts from the runner callbacks.
18
18
  //
19
19
  // store_job_runs cannot serve the tenant: it anchors every run on the system
@@ -13,7 +13,7 @@ import { ACCOUNT_TYPES, SCHEDULE_INTERVALS, TRANSACTION_STATUS } from "./web/con
13
13
  // detail via the standard handlers); the framework projects `read_ledger_accounts`
14
14
  // from its CRUD events. `parentId` null → root account; otherwise the chart-of-
15
15
  // accounts tree. `type` drives how the report layer interprets a balance. No
16
- // money column — balances are DERIVED from postings (Phase 1), never stored.
16
+ // money column — balances are DERIVED from postings, never stored.
17
17
  // tenantId is a base column set by the framework → each tenant has its own books.
18
18
  export const accountEntity = createEntity({
19
19
  table: "read_ledger_accounts",
@@ -49,13 +49,13 @@ export const accountEntity = createEntity({
49
49
  // transaction — a journal entry. The balanced posting lines live embedded as
50
50
  // `lines` (embedded list: { accountId, amount }[], Σ amount = 0), so an entry is atomic:
51
51
  // the Σ=0 invariant holds within a single command, no cross-row write. The
52
- // framework projects `read_ledger_transactions`; Phase 1 adds a flat
53
- // `read_ledger_postings` projection (one row per line) for per-account/period
52
+ // framework projects `read_ledger_transactions`; a flat
53
+ // `read_ledger_postings` projection (one row per line) supports per-account/period
54
54
  // report queries.
55
55
  //
56
56
  // IMMUTABLE: the feature registers NO update/delete handler for transaction. A
57
- // posted entry is a fact; corrections are reverse-transaction (Storno) entries.
58
- // `status` carries draft|posted for the later Soll/Ist work — Phase 0 posts only.
57
+ // posted entry is a fact; corrections are reverse-transaction entries.
58
+ // `status` carries draft|posted.
59
59
  export const transactionEntity = createEntity({
60
60
  table: "read_ledger_transactions",
61
61
  description:
@@ -7,8 +7,8 @@
7
7
  // corrections are reverse-transaction (Storno) entries.
8
8
  //
9
9
  // Everything financial — banking, accounting, rent cashflow, credits, invoices —
10
- // is accounts + balanced transactions on top. Balances and reports (Bilanz, GuV,
11
- // Cashflow) are pure queries over the postings (Phase 1), never stored state.
10
+ // is accounts + balanced transactions on top. Balances and reports (balance
11
+ // sheet, P&L, cashflow) are pure queries over the postings, never stored state.
12
12
  //
13
13
  // Spec: kumiko-platform/docs/plans/ledger-feature.md
14
14
 
@@ -60,7 +60,7 @@ function registerLedger(
60
60
 
61
61
  // Chart of accounts — plain CRUD, no custom logic. No delete in v1: removing an
62
62
  // account that has postings would orphan them; a posting-aware guard lands with
63
- // the postings projection (Phase 1).
63
+ // the postings projection.
64
64
  r.writeHandler(
65
65
  defineEntityCreateHandler("account", accountEntity, {
66
66
  access,
@@ -27,11 +27,11 @@ const CONFIRM_PERIOD_LOCK_NAMESPACE = 0x6c637370;
27
27
  // balanced transaction (debit +amount / credit −amount), tagged with
28
28
  // scheduleReference(scheduleId, period) so the host can merge Soll vs. Ist.
29
29
  //
30
- // Idempotent + reversal-aware: if an ACTIVE (non-reversed) booking for this
30
+ // Idempotent and reversal-aware: if an ACTIVE (non-reversed) booking for this
31
31
  // reference already exists, it's a no-op; a booking that was reversed (Storno)
32
32
  // leaves the period re-confirmable. Referential integrity (both accounts must
33
- // exist) mirrors create-transaction — a schedule could name a bogus account, the
34
- // generic CRUD create doesn't check.
33
+ // exist) mirrors create-transaction because a schedule could name a bogus
34
+ // account that the generic CRUD create does not check.
35
35
  export function createConfirmSchedulePeriodHandler(
36
36
  access: AccessRule = DEFAULT_LEDGER_ACCESS,
37
37
  ): WriteHandlerDef {
@@ -1,17 +1,17 @@
1
1
  // Recurring schedules on top of the ledger primitive. A `schedule` is a standing
2
- // booking template ("Miete ab 1.1.2026, 500 €/Monat") from which two things fall
3
- // out WITHOUT booking every month up front:
2
+ // booking template ("Rent from 1/1/2026, €500/month") used without booking every
3
+ // month up front:
4
4
  //
5
- // • projectSchedule() — the Soll (forecast): pure projection over a window,
6
- // no transactions needed (chart, "trägt sich das?").
7
- // • mergeScheduleActuals() — Soll vs. Ist: the projection left-joined against
8
- // the posted confirmations (per `reference`), so each
9
- // month is posted | open | forecast.
5
+ // • projectSchedule() — the forecast: a pure projection over a window with
6
+ // no transactions required (chart, "does it pay for itself?").
7
+ // • mergeScheduleActuals() — forecast vs. actual: the projection left-joined
8
+ // against posted confirmations (by `reference`), so
9
+ // each month is posted | open | forecast.
10
10
  //
11
- // confirm-schedule-period (handler) turns one projected month into ONE balanced
11
+ // The confirm-schedule-period handler turns one projected month into one balanced
12
12
  // transaction tagged with `scheduleReference(id, period)`. Both functions here are
13
- // pure — no DB, no Date API (windows/asOf come in as params) — so the no-date-api
14
- // guard stays green and the forecast is deterministic.
13
+ // pure—no DB or Date API (windows/asOf are supplied as parameters)—so the forecast
14
+ // remains deterministic and the no-date-api guard stays green.
15
15
 
16
16
  import type { Posting } from "./schemas.ts";
17
17
  import type { ScheduleInterval } from "./web/constants.ts";
@@ -109,8 +109,8 @@ export function projectSchedule(
109
109
  return periods;
110
110
  }
111
111
 
112
- // Soll vs. Ist. A month is `posted` when a confirmation for its reference exists
113
- // AND has not been reversed (Storno); a reversed confirmation drops the month back
112
+ // Planned vs. actual. A month is `posted` when a confirmation for its reference exists
113
+ // AND has not been reversed; a reversed confirmation drops the month back
114
114
  // to `open` so it can be re-confirmed. Past/current unbooked months are `open`,
115
115
  // future ones `forecast` (asOf is the boundary — month-granular).
116
116
  export function mergeScheduleActuals(
@@ -24,7 +24,7 @@ export const createTransactionPayloadSchema = z
24
24
  description: z.string().min(1).max(200),
25
25
  reference: z.string().max(120).optional(),
26
26
  // Defaults to "posted" in the handler. draft lifecycle (editable) lands with
27
- // the Soll/recurring work — Phase 0 only ever creates posted entries.
27
+ // the debit/recurring work — only ever creates posted entries.
28
28
  status: z.enum(TRANSACTION_STATUS).optional(),
29
29
  lines: z.array(postingSchema).min(2),
30
30
  // Business-object reference (e.g. a lease contract) this entry is about.
@@ -30,7 +30,7 @@ export const LedgerQueries = {
30
30
  transactionDetail: "ledger:query:transaction:detail",
31
31
  scheduleList: "ledger:query:schedule:list",
32
32
  scheduleDetail: "ledger:query:schedule:detail",
33
- // Reports — pure aggregations over the posted entries (Phase 1).
33
+ // Reports — pure aggregations over the posted entries.
34
34
  reportBalances: "ledger:query:report:balances",
35
35
  reportIncomeStatement: "ledger:query:report:income-statement",
36
36
  reportBalanceSheet: "ledger:query:report:balance-sheet",
@@ -38,7 +38,7 @@ export const LedgerQueries = {
38
38
 
39
39
  // Account types double-entry needs to interpret a balance: asset/expense are
40
40
  // debit-normal, liability/equity/income are credit-normal. The report layer
41
- // (Phase 1) flips signs by type; the primitive only stores them.
41
+ // flips signs by type; the primitive only stores them.
42
42
  export const ACCOUNT_TYPES = ["asset", "liability", "equity", "income", "expense"] as const;
43
43
  export type AccountType = (typeof ACCOUNT_TYPES)[number];
44
44
 
@@ -1,10 +1,10 @@
1
- // Client-safe ledger surface: QN constants, the pure recurring helpers
2
- // (projection + Soll/Ist merge), and the Zod payload schemas (for client-side
3
- // pre-validation before dispatch) — nothing else. The full `../ledger` entry
4
- // re-exports the feature/handlers/executor, which pull postgres-js — a
5
- // browser bundle that imports from there fails on Node builtins. A client screen
6
- // (e.g. a rent-cashflow view) imports the dispatch QNs + the pure forecast/merge
7
- // from HERE, then dispatches via the renderer's useDispatcher.
1
+ // Client-safe ledger surface: QN constants, pure recurring helpers
2
+ // (projection + Soll/Ist merge), and Zod payload schemas for client-side
3
+ // pre-validation before dispatch. The full `../ledger` entry also re-exports
4
+ // the feature/handlers/executor, which pull postgres-js; importing it in a
5
+ // browser bundle fails on Node builtins. Client screens import dispatch QNs and
6
+ // pure forecast/merge helpers from this module, then dispatch via the renderer's
7
+ // useDispatcher.
8
8
 
9
9
  export {
10
10
  type LedgerTxRow,
@@ -35,7 +35,7 @@ runProdApp({
35
35
  // decoupling — legal-pages imports no code from template-resolver,
36
36
  // only uses the API via ctx)
37
37
  anonymousAccess: { defaultTenantId: SYSTEM_TENANT_ID },
38
- extraContext: ({ db }) => ({
38
+ extraContext: ({ db, registry }) => ({
39
39
  templateResolver: createTemplateResolverApi(db, registry),
40
40
  }),
41
41
  });
@@ -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";
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.388.0",
4
+ "type": "fix",
5
+ "title": "Tenant mail transport falls back to the app transport without tenant config",
6
+ "detail": "tenantMailTransport returns null when the channel context carries no tenant config, instead of throwing on every send, so the channel uses the app transport as documented."
7
+ },
2
8
  {
3
9
  "version": "0.378.0",
4
10
  "type": "improvement",