@cosmicdrift/kumiko-bundled-features 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 (470) hide show
  1. package/LICENSE +21 -57
  2. package/dist/agent-tools/tool-catalog.js +1 -1
  3. package/dist/agent-tools/tool-dispatch.js +0 -2
  4. package/dist/audit/screens.js +1 -1
  5. package/dist/auth-email-password/feature.js +1 -1
  6. package/dist/auth-email-password/handlers/change-password.write.js +3 -3
  7. package/dist/auth-email-password/handlers/confirm-token-flow.js +5 -5
  8. package/dist/auth-email-password/handlers/invite-accept-with-login.write.js +1 -1
  9. package/dist/auth-email-password/handlers/invite-accept.write.js +18 -18
  10. package/dist/auth-email-password/handlers/invite-create.write.d.ts +2 -2
  11. package/dist/auth-email-password/handlers/invite-create.write.js +10 -10
  12. package/dist/auth-email-password/handlers/invite-info.query.js +1 -1
  13. package/dist/auth-email-password/handlers/invite-signup-complete.write.js +24 -26
  14. package/dist/auth-email-password/handlers/login.write.d.ts +1 -1
  15. package/dist/auth-email-password/handlers/login.write.js +1 -1
  16. package/dist/auth-email-password/handlers/self-registration-status.query.js +1 -1
  17. package/dist/auth-email-password/handlers/signup-confirm.write.js +34 -37
  18. package/dist/auth-email-password/handlers/signup-request.write.js +6 -7
  19. package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.d.ts +1 -1
  20. package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.js +1 -4
  21. package/dist/auth-email-password/index.js +5 -5
  22. package/dist/auth-email-password/lockout-store.js +1 -1
  23. package/dist/auth-email-password/seeding.d.ts +42 -45
  24. package/dist/auth-email-password/seeding.js +51 -53
  25. package/dist/auth-email-password/signup-token-store.js +8 -8
  26. package/dist/auth-email-password/testing.js +3 -3
  27. package/dist/auth-email-password/web/auth-client.d.ts +2 -2
  28. package/dist/auth-email-password/web/auth-client.js +36 -37
  29. package/dist/auth-email-password/web/auth-form-primitives.js +10 -10
  30. package/dist/auth-email-password/web/auth-gate.js +15 -16
  31. package/dist/auth-email-password/web/client-plugin.d.ts +7 -7
  32. package/dist/auth-email-password/web/client-plugin.js +4 -5
  33. package/dist/auth-email-password/web/confirm-account-unlock-screen.js +1 -1
  34. package/dist/auth-email-password/web/constants.js +3 -3
  35. package/dist/auth-email-password/web/default-topbar-actions.d.ts +8 -8
  36. package/dist/auth-email-password/web/default-topbar-actions.js +6 -6
  37. package/dist/auth-email-password/web/forgot-password-screen.d.ts +2 -2
  38. package/dist/auth-email-password/web/forgot-password-screen.js +9 -9
  39. package/dist/auth-email-password/web/index.js +5 -5
  40. package/dist/auth-email-password/web/invite-accept-screen.d.ts +1 -1
  41. package/dist/auth-email-password/web/invite-accept-screen.js +16 -16
  42. package/dist/auth-email-password/web/login-screen.d.ts +1 -1
  43. package/dist/auth-email-password/web/login-screen.js +2 -3
  44. package/dist/auth-email-password/web/reset-password-screen.d.ts +4 -4
  45. package/dist/auth-email-password/web/reset-password-screen.js +12 -13
  46. package/dist/auth-email-password/web/session.d.ts +10 -9
  47. package/dist/auth-email-password/web/session.js +28 -29
  48. package/dist/auth-email-password/web/signup-complete-screen.js +3 -3
  49. package/dist/auth-email-password/web/signup-screen.d.ts +1 -1
  50. package/dist/auth-email-password/web/signup-screen.js +13 -13
  51. package/dist/auth-email-password/web/tenant-switcher.d.ts +4 -4
  52. package/dist/auth-email-password/web/tenant-switcher.js +21 -22
  53. package/dist/auth-email-password/web/use-shell-user.js +12 -13
  54. package/dist/auth-email-password/web/user-menu.d.ts +4 -4
  55. package/dist/auth-email-password/web/user-menu.js +12 -13
  56. package/dist/auth-email-password/web/verify-email-screen.d.ts +2 -2
  57. package/dist/auth-email-password/web/verify-email-screen.js +9 -10
  58. package/dist/auth-foundation/boot-checks.js +4 -4
  59. package/dist/auth-foundation/resolve-anonymous-access.d.ts +1 -1
  60. package/dist/auth-foundation/resolve-anonymous-access.js +3 -3
  61. package/dist/auth-foundation/types.js +2 -2
  62. package/dist/auth-mfa/handlers/disable.write.js +3 -3
  63. package/dist/auth-mfa/handlers/enable-confirm-preauth.write.js +4 -4
  64. package/dist/auth-mfa/handlers/enable-confirm.write.js +2 -2
  65. package/dist/auth-mfa/handlers/enable-start-preauth.write.js +1 -1
  66. package/dist/auth-mfa/handlers/reencrypt.job.js +1 -1
  67. package/dist/auth-mfa/handlers/regenerate-recovery.write.js +5 -5
  68. package/dist/auth-mfa/handlers/verify.write.js +1 -1
  69. package/dist/auth-mfa/token-secrets.js +1 -1
  70. package/dist/auth-mfa/web/client-plugin.d.ts +1 -1
  71. package/dist/auth-mfa/web/client-plugin.js +1 -1
  72. package/dist/auth-mfa/web/i18n.js +3 -3
  73. package/dist/auth-mfa/web/index.js +4 -4
  74. package/dist/auth-mfa/web/mfa-client.js +17 -16
  75. package/dist/auth-mfa/web/mfa-verify-screen.js +6 -6
  76. package/dist/billing-foundation/aggregate-id.d.ts +5 -5
  77. package/dist/billing-foundation/aggregate-id.js +10 -11
  78. package/dist/billing-foundation/entities.js +27 -27
  79. package/dist/billing-foundation/events.js +18 -17
  80. package/dist/billing-foundation/feature.js +42 -43
  81. package/dist/billing-foundation/get-subscription-for-tenant.d.ts +3 -3
  82. package/dist/billing-foundation/get-subscription-for-tenant.js +3 -5
  83. package/dist/billing-foundation/handlers/create-checkout-session.write.js +18 -17
  84. package/dist/billing-foundation/handlers/create-portal-session.write.js +11 -12
  85. package/dist/billing-foundation/handlers/list-subscriptions.query.js +4 -4
  86. package/dist/billing-foundation/handlers/process-event.write.js +20 -20
  87. package/dist/billing-foundation/projection.d.ts +15 -11
  88. package/dist/billing-foundation/projection.js +38 -37
  89. package/dist/billing-foundation/subscription-tier-sync.js +3 -3
  90. package/dist/billing-foundation/tenant-destroy-hook.d.ts +2 -2
  91. package/dist/billing-foundation/tenant-destroy-hook.js +7 -7
  92. package/dist/billing-foundation/types.d.ts +40 -41
  93. package/dist/billing-foundation/types.js +20 -20
  94. package/dist/billing-foundation/web/billing-plans-panel.js +4 -4
  95. package/dist/cap-counter/aggregate-id.js +8 -9
  96. package/dist/cap-counter/constants.js +11 -12
  97. package/dist/cap-counter/enforce-cap.d.ts +59 -62
  98. package/dist/cap-counter/enforce-cap.js +47 -48
  99. package/dist/cap-counter/entity.js +29 -29
  100. package/dist/cap-counter/feature.js +34 -35
  101. package/dist/cap-counter/handlers/increment-rolling.write.d.ts +2 -2
  102. package/dist/cap-counter/handlers/increment-rolling.write.js +31 -31
  103. package/dist/cap-counter/handlers/mark-soft-warned.write.js +4 -5
  104. package/dist/cap-counter/stock-cap-guard.js +1 -1
  105. package/dist/cap-counter/with-cap-enforcement.d.ts +3 -5
  106. package/dist/channel-email/smtp-transport.d.ts +18 -17
  107. package/dist/channel-email/smtp-transport.js +24 -21
  108. package/dist/channel-in-app/handlers/unread-count.query.js +3 -4
  109. package/dist/compliance-profiles/feature.js +4 -4
  110. package/dist/compliance-profiles/handlers/for-tenant.query.js +3 -6
  111. package/dist/compliance-profiles/handlers/list-profiles.query.js +5 -5
  112. package/dist/compliance-profiles/handlers/needs-profile.query.js +4 -4
  113. package/dist/compliance-profiles/handlers/set-profile.write.js +13 -14
  114. package/dist/compliance-profiles/handlers/sub-processors.query.js +9 -11
  115. package/dist/compliance-profiles/resolve-for-tenant.js +7 -7
  116. package/dist/compliance-profiles/schema/profile-selection.js +18 -23
  117. package/dist/compliance-profiles/seeding.js +14 -15
  118. package/dist/compliance-profiles-ops/handlers/tenants-missing-profile.query.js +3 -3
  119. package/dist/compliance-profiles-ops/index.js +2 -2
  120. package/dist/config/handlers/readiness.query.d.ts +4 -4
  121. package/dist/config/handlers/readiness.query.js +1 -1
  122. package/dist/config/handlers/reencrypt.job.js +4 -5
  123. package/dist/config/handlers/set.write.js +4 -4
  124. package/dist/config/resolver.js +4 -4
  125. package/dist/config/table.js +10 -10
  126. package/dist/config/write-helpers.js +1 -1
  127. package/dist/crypto-shredding/handlers/forget-subject.write.d.ts +2 -2
  128. package/dist/crypto-shredding/handlers/forget-subject.write.js +12 -11
  129. package/dist/custom-fields/aggregate-id.d.ts +12 -13
  130. package/dist/custom-fields/aggregate-id.js +16 -17
  131. package/dist/custom-fields/entity.js +49 -47
  132. package/dist/custom-fields/events.js +7 -8
  133. package/dist/custom-fields/feature.d.ts +14 -14
  134. package/dist/custom-fields/feature.js +53 -54
  135. package/dist/custom-fields/handlers/clear-custom-field.write.d.ts +3 -2
  136. package/dist/custom-fields/handlers/clear-custom-field.write.js +9 -8
  137. package/dist/custom-fields/handlers/define-tenant-field.write.d.ts +1 -1
  138. package/dist/custom-fields/handlers/define-tenant-field.write.js +2 -2
  139. package/dist/custom-fields/handlers/delete-system-field.write.js +6 -7
  140. package/dist/custom-fields/handlers/delete-tenant-field.write.d.ts +1 -1
  141. package/dist/custom-fields/handlers/delete-tenant-field.write.js +3 -3
  142. package/dist/custom-fields/handlers/set-custom-field.write.d.ts +3 -3
  143. package/dist/custom-fields/handlers/set-custom-field.write.js +25 -28
  144. package/dist/custom-fields/handlers/update-tenant-field.write.d.ts +1 -1
  145. package/dist/custom-fields/handlers/update-tenant-field.write.js +1 -1
  146. package/dist/custom-fields/lib/field-access.js +2 -2
  147. package/dist/custom-fields/lib/parse-serialized-field.js +1 -1
  148. package/dist/custom-fields/lib/quota.js +1 -1
  149. package/dist/custom-fields/lib/value-schema.js +10 -12
  150. package/dist/custom-fields/run-retention.js +3 -3
  151. package/dist/custom-fields/schemas.js +14 -14
  152. package/dist/custom-fields/web/client-plugin.js +2 -5
  153. package/dist/custom-fields/web/constants.js +2 -2
  154. package/dist/custom-fields/web/custom-fields-form-section.d.ts +4 -4
  155. package/dist/custom-fields/web/custom-fields-form-section.js +22 -22
  156. package/dist/custom-fields/wire-for-entity.js +65 -67
  157. package/dist/custom-fields/wire-user-data-rights.js +3 -3
  158. package/dist/data-retention/_internal/parse-override.js +2 -3
  159. package/dist/data-retention/feature.js +11 -18
  160. package/dist/data-retention/handlers/policy-for.query.js +6 -6
  161. package/dist/data-retention/keep-for.d.ts +7 -7
  162. package/dist/data-retention/keep-for.js +15 -15
  163. package/dist/data-retention/override-schema.d.ts +3 -4
  164. package/dist/data-retention/override-schema.js +13 -15
  165. package/dist/data-retention/presets.d.ts +4 -5
  166. package/dist/data-retention/presets.js +18 -23
  167. package/dist/data-retention/resolve-tenant-preset.js +17 -16
  168. package/dist/data-retention/resolver.d.ts +12 -12
  169. package/dist/data-retention/resolver.js +24 -23
  170. package/dist/data-retention/run-retention-cleanup.d.ts +8 -3
  171. package/dist/data-retention/run-retention-cleanup.js +61 -51
  172. package/dist/data-retention/schema/tenant-retention-override.js +13 -11
  173. package/dist/delivery/feature.js +2 -2
  174. package/dist/delivery/handlers/log.query.js +1 -1
  175. package/dist/delivery/tables.js +9 -8
  176. package/dist/delivery/unsubscribe.js +4 -4
  177. package/dist/document-ingest-foundation/entity.js +4 -4
  178. package/dist/document-ingest-foundation/events.js +2 -2
  179. package/dist/document-ingest-foundation/feature.js +2 -2
  180. package/dist/document-ingest-foundation/pages.js +1 -1
  181. package/dist/document-ingest-foundation/tenant-destroy-hook.js +4 -4
  182. package/dist/feature-toggles/compose-tier-resolver.js +1 -1
  183. package/dist/feature-toggles/feature.js +1 -1
  184. package/dist/feature-toggles/global-feature-state-table.js +1 -1
  185. package/dist/feature-toggles/handlers/registered.query.js +5 -5
  186. package/dist/feature-toggles/toggle-sync-signal.js +1 -1
  187. package/dist/feature-toggles/web/constants.js +1 -1
  188. package/dist/file-derivatives/feature.d.ts +1 -1
  189. package/dist/file-derivatives/feature.js +1 -1
  190. package/dist/file-derivatives/handlers/public-variant.query.js +1 -1
  191. package/dist/file-derivatives/presets.js +1 -1
  192. package/dist/file-foundation/feature.js +6 -6
  193. package/dist/file-provider-inmemory/feature.d.ts +1 -1
  194. package/dist/file-provider-inmemory/feature.js +16 -16
  195. package/dist/file-provider-s3/feature.js +16 -16
  196. package/dist/file-provider-s3/lib/s3-provider.js +6 -6
  197. package/dist/files/feature.js +6 -6
  198. package/dist/files-tenant-data/handlers/sweep-orphaned-derivatives.job.js +4 -4
  199. package/dist/files-tenant-data/hooks.js +24 -26
  200. package/dist/files-tenant-data/index.js +1 -1
  201. package/dist/folders/feature.d.ts +1 -1
  202. package/dist/folders/web/folder-manager.js +2 -2
  203. package/dist/folders/web/tree.js +5 -5
  204. package/dist/form-draft/db/queries/cleanup.js +1 -1
  205. package/dist/form-draft/db/queries/owned-file-refs.js +1 -1
  206. package/dist/form-draft/entity.js +3 -3
  207. package/dist/form-draft/feature.js +4 -5
  208. package/dist/form-draft/handlers/discard.write.js +1 -1
  209. package/dist/form-draft/release-file-refs.js +6 -6
  210. package/dist/form-draft/schemas.js +3 -3
  211. package/dist/form-draft/web/constants.js +0 -2
  212. package/dist/inbound-mail-foundation/aggregate-id.d.ts +13 -13
  213. package/dist/inbound-mail-foundation/aggregate-id.js +19 -19
  214. package/dist/inbound-mail-foundation/connect-routes.js +4 -3
  215. package/dist/inbound-mail-foundation/constants.d.ts +22 -24
  216. package/dist/inbound-mail-foundation/constants.js +30 -33
  217. package/dist/inbound-mail-foundation/entities.d.ts +12 -12
  218. package/dist/inbound-mail-foundation/entities.js +47 -48
  219. package/dist/inbound-mail-foundation/events.d.ts +4 -3
  220. package/dist/inbound-mail-foundation/events.js +50 -47
  221. package/dist/inbound-mail-foundation/feature.js +39 -39
  222. package/dist/inbound-mail-foundation/handlers/account-state.js +8 -8
  223. package/dist/inbound-mail-foundation/handlers/connect-account.write.js +25 -26
  224. package/dist/inbound-mail-foundation/handlers/disconnect-account.write.js +7 -7
  225. package/dist/inbound-mail-foundation/handlers/ingest-message.write.js +50 -51
  226. package/dist/inbound-mail-foundation/handlers/list-accounts.query.js +8 -8
  227. package/dist/inbound-mail-foundation/handlers/list-messages.query.js +10 -10
  228. package/dist/inbound-mail-foundation/handlers/scope-visibility.js +3 -4
  229. package/dist/inbound-mail-foundation/handlers/update-account.write.js +11 -11
  230. package/dist/inbound-mail-foundation/oauth-state.d.ts +5 -5
  231. package/dist/inbound-mail-foundation/oauth-state.js +11 -10
  232. package/dist/inbound-mail-foundation/projection.d.ts +4 -4
  233. package/dist/inbound-mail-foundation/projection.js +31 -29
  234. package/dist/inbound-mail-foundation/provider-factory.d.ts +4 -4
  235. package/dist/inbound-mail-foundation/provider-factory.js +9 -9
  236. package/dist/inbound-mail-foundation/retention-sweep.d.ts +5 -3
  237. package/dist/inbound-mail-foundation/retention-sweep.js +38 -36
  238. package/dist/inbound-mail-foundation/tenant-destroy-hook.js +14 -16
  239. package/dist/inbound-mail-foundation/types.d.ts +45 -46
  240. package/dist/inbound-mail-foundation/types.js +21 -21
  241. package/dist/inbound-mail-foundation/watch-supervisor.d.ts +10 -10
  242. package/dist/inbound-mail-foundation/watch-supervisor.js +57 -56
  243. package/dist/inbound-provider-imap/credential-document.js +13 -13
  244. package/dist/inbound-provider-imap/feature.d.ts +2 -2
  245. package/dist/inbound-provider-imap/feature.js +42 -40
  246. package/dist/inbound-provider-imap/imap-client.d.ts +12 -11
  247. package/dist/inbound-provider-imap/imap-client.js +20 -19
  248. package/dist/inbound-provider-inmemory/feature.d.ts +9 -9
  249. package/dist/inbound-provider-inmemory/feature.js +19 -19
  250. package/dist/jobs/db/queries/retention.js +2 -2
  251. package/dist/jobs/db/queries/stale-run-sweep.js +3 -3
  252. package/dist/jobs/events.js +1 -1
  253. package/dist/jobs/feature.js +5 -6
  254. package/dist/jobs/handlers/detail.query.js +4 -4
  255. package/dist/jobs/handlers/list.query.js +1 -1
  256. package/dist/jobs/handlers/projection-rebuild.job.js +1 -1
  257. package/dist/jobs/handlers/reindex-entity.job.js +1 -1
  258. package/dist/jobs/handlers/retry.write.js +1 -1
  259. package/dist/jobs/job-instant.js +1 -1
  260. package/dist/jobs/job-run-logger.js +10 -11
  261. package/dist/jobs/job-run-table.js +3 -3
  262. package/dist/jobs/screens.js +1 -1
  263. package/dist/jobs/tenant-job-failure-table.js +1 -1
  264. package/dist/jobs/tenant-job-run-table.js +1 -1
  265. package/dist/ledger/entity.js +5 -5
  266. package/dist/ledger/feature.js +3 -3
  267. package/dist/ledger/handlers/confirm-schedule-period.write.js +3 -3
  268. package/dist/ledger/recurring.js +12 -12
  269. package/dist/ledger/schemas.js +1 -1
  270. package/dist/ledger/web/constants.js +2 -2
  271. package/dist/ledger/web/index.js +7 -7
  272. package/dist/legal-pages/feature.d.ts +4 -4
  273. package/dist/legal-pages/feature.js +25 -26
  274. package/dist/legal-pages/markdown.js +3 -3
  275. package/dist/legal-pages/web/client-plugin.js +23 -24
  276. package/dist/legal-pages/web/index.js +0 -1
  277. package/dist/mail-foundation/feature.d.ts +2 -2
  278. package/dist/mail-foundation/feature.js +24 -25
  279. package/dist/mail-transport-inmemory/feature.d.ts +4 -4
  280. package/dist/mail-transport-inmemory/feature.js +27 -28
  281. package/dist/mail-transport-smtp/feature.js +20 -20
  282. package/dist/managed-pages/branding.js +6 -6
  283. package/dist/managed-pages/feature.d.ts +26 -26
  284. package/dist/managed-pages/feature.js +34 -34
  285. package/dist/managed-pages/handlers/by-slug.query.js +5 -6
  286. package/dist/managed-pages/handlers/by-tenant-published.query.js +2 -2
  287. package/dist/managed-pages/handlers/set.write.js +5 -7
  288. package/dist/managed-pages/screens/page-screens.js +11 -11
  289. package/dist/managed-pages/seeding.js +8 -8
  290. package/dist/managed-pages/table.js +13 -12
  291. package/dist/managed-pages/web/client-plugin.d.ts +1 -1
  292. package/dist/managed-pages/web/client-plugin.js +5 -5
  293. package/dist/managed-pages/web/i18n.js +1 -1
  294. package/dist/notes-history/entity.js +4 -4
  295. package/dist/notes-history/feature.d.ts +2 -2
  296. package/dist/notes-history-user-data/hooks.js +1 -1
  297. package/dist/page-render/layout.js +9 -9
  298. package/dist/page-render/markdown.js +11 -11
  299. package/dist/page-render/security-headers.js +7 -6
  300. package/dist/personal-access-tokens/feature.js +5 -5
  301. package/dist/personal-access-tokens/roles.js +2 -2
  302. package/dist/readiness/handlers/status.query.js +3 -3
  303. package/dist/renderer-foundation/api.js +12 -13
  304. package/dist/renderer-foundation/constants.js +2 -2
  305. package/dist/renderer-foundation/feature.js +7 -7
  306. package/dist/secrets/feature.js +9 -9
  307. package/dist/secrets/web/constants.js +2 -2
  308. package/dist/seo/feature.js +3 -3
  309. package/dist/sessions/constants.d.ts +1 -1
  310. package/dist/sessions/constants.js +1 -1
  311. package/dist/sessions/feature.js +8 -8
  312. package/dist/sessions/handlers/revoke-all-for-user.write.js +2 -2
  313. package/dist/sessions/handlers/revoke-all-others.write.js +2 -2
  314. package/dist/sessions/handlers/revoke.write.js +1 -1
  315. package/dist/sessions/schema/user-session.js +4 -4
  316. package/dist/sessions/screens.js +2 -2
  317. package/dist/sessions/session-callbacks.js +2 -2
  318. package/dist/sessions/session-revoked-event.js +2 -2
  319. package/dist/shared/assert-no-where-rule-in-ownership-write.js +1 -1
  320. package/dist/shared/decrypt-stored-pii.js +1 -1
  321. package/dist/shared/encrypt-for-direct-write.js +1 -1
  322. package/dist/shared/map-with-concurrency.js +5 -4
  323. package/dist/shared/parent-visibility.js +2 -2
  324. package/dist/shared/password-hashing.js +1 -1
  325. package/dist/shared/signup-handover.js +1 -2
  326. package/dist/shared/single-use-token-store.js +1 -1
  327. package/dist/subscription-mollie/constants.js +15 -17
  328. package/dist/subscription-mollie/feature.d.ts +17 -18
  329. package/dist/subscription-mollie/feature.js +24 -24
  330. package/dist/subscription-mollie/index.js +3 -3
  331. package/dist/subscription-mollie/plugin-methods.d.ts +2 -2
  332. package/dist/subscription-mollie/plugin-methods.js +15 -14
  333. package/dist/subscription-mollie/verify-webhook.d.ts +10 -10
  334. package/dist/subscription-mollie/verify-webhook.js +27 -27
  335. package/dist/subscription-stripe/constants.js +4 -6
  336. package/dist/subscription-stripe/feature.d.ts +14 -14
  337. package/dist/subscription-stripe/feature.js +35 -34
  338. package/dist/subscription-stripe/index.js +6 -6
  339. package/dist/subscription-stripe/plugin-methods.js +18 -18
  340. package/dist/subscription-stripe/runtime.d.ts +1 -1
  341. package/dist/subscription-stripe/runtime.js +1 -1
  342. package/dist/subscription-stripe/verify-webhook.d.ts +11 -11
  343. package/dist/subscription-stripe/verify-webhook.js +59 -61
  344. package/dist/tags/feature.d.ts +3 -3
  345. package/dist/tags/screens.js +1 -1
  346. package/dist/template-resolver/api.js +10 -10
  347. package/dist/template-resolver/handlers/find-by-id.query.js +5 -5
  348. package/dist/template-resolver/handlers/list.query.js +1 -1
  349. package/dist/template-resolver/handlers/shared.js +2 -2
  350. package/dist/template-resolver/handlers/template-write.js +3 -3
  351. package/dist/template-resolver/handlers/upsert-system.write.js +3 -4
  352. package/dist/template-resolver/handlers/upsert-tenant.write.js +4 -5
  353. package/dist/template-resolver/seeding.js +4 -4
  354. package/dist/template-resolver/table.js +10 -11
  355. package/dist/template-resolver/web/client-plugin.js +2 -2
  356. package/dist/tenant/feature.js +7 -7
  357. package/dist/tenant/handlers/member-directory.query.js +1 -1
  358. package/dist/tenant/handlers/members.query.js +1 -1
  359. package/dist/tenant/handlers/team-list.query.js +1 -1
  360. package/dist/tenant/handlers/tenant-directory.query.js +1 -1
  361. package/dist/tenant/invitation-table.js +37 -40
  362. package/dist/tenant/membership-table.js +3 -3
  363. package/dist/tenant/schema/tenant.js +7 -9
  364. package/dist/tenant/screens.js +1 -1
  365. package/dist/tenant/seeding.d.ts +6 -5
  366. package/dist/tenant/seeding.js +12 -12
  367. package/dist/tenant/testing.js +5 -6
  368. package/dist/tenant/web/constants.js +2 -2
  369. package/dist/tenant-handover/events.js +5 -7
  370. package/dist/tenant-handover/feature.js +1 -1
  371. package/dist/tenant-handover/grant.js +1 -1
  372. package/dist/tenant-handover/handlers/claim.write.js +1 -1
  373. package/dist/tenant-handover/move-entity-graph.js +8 -9
  374. package/dist/tenant-handover/signup-handover-provider.js +1 -2
  375. package/dist/tenant-handover/transfer-graph.js +4 -5
  376. package/dist/tenant-lifecycle/boot-checks.js +1 -1
  377. package/dist/tenant-lifecycle/feature.js +1 -1
  378. package/dist/tenant-settings/constants.js +1 -1
  379. package/dist/tenant-settings/tenant-defaults.d.ts +1 -1
  380. package/dist/tenant-settings/tenant-defaults.js +9 -2
  381. package/dist/tier-engine/aggregate-id.d.ts +11 -11
  382. package/dist/tier-engine/aggregate-id.js +15 -16
  383. package/dist/tier-engine/compose-app.d.ts +14 -14
  384. package/dist/tier-engine/compose-app.js +1 -1
  385. package/dist/tier-engine/entity.js +18 -19
  386. package/dist/tier-engine/feature.d.ts +19 -17
  387. package/dist/tier-engine/feature.js +68 -69
  388. package/dist/tier-engine/handlers/active-tier.query.js +6 -7
  389. package/dist/tier-engine/handlers/get-tenant-tier.query.js +4 -4
  390. package/dist/tier-engine/handlers/set-tenant-tier.write.d.ts +5 -5
  391. package/dist/tier-engine/handlers/set-tenant-tier.write.js +3 -3
  392. package/dist/tier-engine/tier-resolver.js +2 -2
  393. package/dist/tier-engine/trial.js +8 -8
  394. package/dist/tier-engine/web/index.js +4 -4
  395. package/dist/user/db/queries/stream-tenant-backfill.js +8 -8
  396. package/dist/user/handlers/create.write.js +4 -4
  397. package/dist/user/schema/user.d.ts +11 -11
  398. package/dist/user/schema/user.js +45 -44
  399. package/dist/user/seeding.d.ts +15 -15
  400. package/dist/user/seeding.js +28 -28
  401. package/dist/user/testing.js +3 -3
  402. package/dist/user-data-rights/audit-download.d.ts +8 -8
  403. package/dist/user-data-rights/audit-download.js +19 -20
  404. package/dist/user-data-rights/boot-checks.js +1 -1
  405. package/dist/user-data-rights/deletion-token.js +1 -1
  406. package/dist/user-data-rights/feature.d.ts +49 -50
  407. package/dist/user-data-rights/feature.js +54 -53
  408. package/dist/user-data-rights/handlers/cancel-deletion.write.js +9 -9
  409. package/dist/user-data-rights/handlers/confirm-deletion-by-token.write.js +8 -8
  410. package/dist/user-data-rights/handlers/download-by-job.query.js +29 -30
  411. package/dist/user-data-rights/handlers/download-by-token.query.js +40 -42
  412. package/dist/user-data-rights/handlers/export-status.query.js +8 -9
  413. package/dist/user-data-rights/handlers/lift-restriction.write.js +7 -8
  414. package/dist/user-data-rights/handlers/list-download-attempts.query.js +2 -2
  415. package/dist/user-data-rights/handlers/my-audit-log.query.js +4 -4
  416. package/dist/user-data-rights/handlers/request-deletion-by-email.write.d.ts +5 -5
  417. package/dist/user-data-rights/handlers/request-deletion-by-email.write.js +16 -15
  418. package/dist/user-data-rights/handlers/request-deletion.write.d.ts +2 -2
  419. package/dist/user-data-rights/handlers/request-deletion.write.js +7 -9
  420. package/dist/user-data-rights/handlers/request-export.write.js +42 -41
  421. package/dist/user-data-rights/handlers/restrict-account.write.js +22 -19
  422. package/dist/user-data-rights/handlers/run-forget-cleanup.write.js +8 -8
  423. package/dist/user-data-rights/index.js +8 -10
  424. package/dist/user-data-rights/lib/default-mailers.js +3 -3
  425. package/dist/user-data-rights/lib/update-user-lifecycle.js +14 -17
  426. package/dist/user-data-rights/run-export-jobs.d.ts +38 -42
  427. package/dist/user-data-rights/run-export-jobs.js +127 -233
  428. package/dist/user-data-rights/run-forget-cleanup.d.ts +16 -20
  429. package/dist/user-data-rights/run-forget-cleanup.js +63 -82
  430. package/dist/user-data-rights/run-user-export.d.ts +34 -33
  431. package/dist/user-data-rights/run-user-export.js +55 -57
  432. package/dist/user-data-rights/schema/download-attempt.js +11 -11
  433. package/dist/user-data-rights/schema/download-token.js +37 -41
  434. package/dist/user-data-rights/schema/export-job.d.ts +4 -4
  435. package/dist/user-data-rights/schema/export-job.js +65 -67
  436. package/dist/user-data-rights/token-helpers.d.ts +8 -9
  437. package/dist/user-data-rights/token-helpers.js +21 -25
  438. package/dist/user-data-rights/web/client-plugin.d.ts +5 -5
  439. package/dist/user-data-rights/web/client-plugin.js +1 -1
  440. package/dist/user-data-rights/web/confirm-deletion-screen.js +6 -5
  441. package/dist/user-data-rights/web/constants.js +1 -1
  442. package/dist/user-data-rights/web/index.js +5 -5
  443. package/dist/user-data-rights/web/privacy-center-screen.js +14 -13
  444. package/dist/user-data-rights/web/public-deletion-gate.d.ts +4 -4
  445. package/dist/user-data-rights/web/request-deletion-screen.js +6 -6
  446. package/dist/user-data-rights/zip-path.d.ts +15 -15
  447. package/dist/user-data-rights/zip-path.js +41 -40
  448. package/dist/user-data-rights-defaults/feature.js +15 -15
  449. package/dist/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.js +3 -5
  450. package/dist/user-data-rights-defaults/hooks/file-ref.userdata-hook.js +45 -51
  451. package/dist/user-data-rights-defaults/hooks/job-run.userdata-hook.js +2 -2
  452. package/dist/user-data-rights-defaults/hooks/notification-preference.userdata-hook.js +1 -1
  453. package/dist/user-data-rights-defaults/hooks/user-session.userdata-hook.js +3 -3
  454. package/dist/user-data-rights-defaults/hooks/user.userdata-hook.js +32 -31
  455. package/dist/user-profile/handlers/change-email.write.js +13 -13
  456. package/dist/user-profile/index.js +3 -3
  457. package/dist/user-profile/web/client-plugin.js +1 -1
  458. package/dist/user-profile/web/constants.js +1 -1
  459. package/dist/user-profile/web/profile-screen.js +1 -1
  460. package/dist/workflow-runner/aggregate-id.d.ts +1 -1
  461. package/dist/workflow-runner/aggregate-id.js +1 -1
  462. package/dist/workflow-runner/event-subscriber.js +4 -5
  463. package/dist/workflow-runner/event-trigger.js +4 -17
  464. package/dist/workflow-runner/feature.js +2 -2
  465. package/dist/workflow-runner/handlers/resume-run.write.js +4 -4
  466. package/dist/workflow-runner/pending-projection.js +6 -7
  467. package/dist/workflow-runner/runner.js +6 -6
  468. package/dist/workflow-runner/tables.js +6 -6
  469. package/dist/workflow-runner/workflow-registry.js +1 -1
  470. package/package.json +10 -10
@@ -26,7 +26,7 @@ const DEFAULT_CACHE_MAX_ENTRIES = 10_000;
26
26
  const DEFAULT_CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
27
27
  // Run rows hang on SYSTEM_TENANT_ID and a null trigger is a cron/system run;
28
28
  // job-run-table.ts declares whenAbsent: "tenant" for exactly that case, so the
29
- // logger must resolve the same subject the entity chain would (fw#3654).
29
+ // logger must resolve the same subject the entity chain would.
30
30
  function jobRunSubject(triggeredById) {
31
31
  return triggeredById === null
32
32
  ? { kind: "tenant", tenantId: SYSTEM_TENANT_ID }
@@ -51,12 +51,12 @@ async function encryptOrSentinel(kms, subject, value, field) {
51
51
  }
52
52
  }
53
53
  // Same per-subject encryption as encryptStartedPayload, applied to each
54
- // batched log line's `message` (#2247) before insertMany into
54
+ // batched log line's `message` before insertMany into
55
55
  // jobRunLogsTable — that table is unmanaged/direct-write, so there is no
56
56
  // event-piiFields catalog to lean on here either. "message" is the AAD
57
57
  // field name and must match the field passed to decryptStoredPii on read
58
58
  // (detail.query.ts) or decrypt fails loud. Same skip rule as the payload:
59
- // absent KMS (rollout mode) stays plaintext. Bounded concurrency (#2307) —
59
+ // absent KMS (rollout mode) stays plaintext. Bounded concurrency —
60
60
  // unbounded Promise.all would fire one getOrCreateDek per log line at once
61
61
  // against the KMS adapter's pool.
62
62
  async function encryptLogMessages(logs, triggeredById) {
@@ -69,7 +69,7 @@ async function encryptLogMessages(logs, triggeredById) {
69
69
  message: await encryptOrSentinel(kms, subject, log.message, "message"),
70
70
  }));
71
71
  }
72
- // Mirrors encryptFailureError for the failure-path `error` column (#2307):
72
+ // Mirrors encryptFailureError for the failure-path `error` column:
73
73
  // stored alongside logs[].message under the same triggering user's DEK, so
74
74
  // a log/error pair from the same failed run decrypt together or erase
75
75
  // together. Exported so stale-run-sweep.ts's crash-recovery write (a
@@ -82,12 +82,12 @@ export async function encryptFailureError(error, triggeredById) {
82
82
  return encryptOrSentinel(kms, jobRunSubject(triggeredById), error, "error");
83
83
  }
84
84
  // The run-started payload can carry arbitrary user data; triggeredById
85
- // names its owning user. No event-PII catalog involved (#2243 removed the
86
- // jobRun r.defineEvent registrations, so there is nothing to catalog) —
87
- // the subject is known statically, so we encrypt directly. A null subject
85
+ // names its owning user. No event-PII catalog involved (the
86
+ // jobRun r.defineEvent registrations were removed, so there is nothing to
87
+ // catalog) — the subject is known statically, so we encrypt directly. A null subject
88
88
  // (system cron runs, recipient-less triggers) encrypts under the system
89
89
  // tenant key. Absent KMS adapter stays plaintext (rollout mode, unchanged).
90
- // A key already erased by the time the trigger lands (#2307) must not fail
90
+ // A key already erased by the time the trigger lands must not fail
91
91
  // the whole run-start write — sentinel like the log/error paths.
92
92
  async function encryptStartedPayload(payload, triggeredById) {
93
93
  if (payload === null)
@@ -103,13 +103,12 @@ const TENANT_JOB_FAILURE_LOCK_NAMESPACE = 0x746a666c;
103
103
  // 'tjrl': serialises the finished-row write + prune per tenant run key.
104
104
  const TENANT_JOB_RUN_LOCK_NAMESPACE = 0x746a726c;
105
105
  const TENANT_RUN_CONFLICT_KEYS = ["tenantId", "jobName", "bullJobId"];
106
- // fw#3079 — which row the tenant-visible failure record lives in: one per
106
+ // Which row the tenant-visible failure record lives in: one per
107
107
  // (tenant, job, subject), so the next outcome of the same work replaces or
108
108
  // clears it. `subject` is null for a job that declares no subjectFields.
109
109
  // Null target = nothing to write or clear: the job did not opt in, the run
110
110
  // was tenant-less (cron resolves to SYSTEM_TENANT_ID, where no tenant-scoped
111
- // query could ever read the row), or the caller predates fw#3079 and passes
112
- // no outcome at all.
111
+ // query could ever read the row), or the caller passes no outcome at all.
113
112
  function tenantJobFailureTarget(jobName, outcome) {
114
113
  if (!outcome?.tenantVisible || outcome.tenantId === SYSTEM_TENANT_ID)
115
114
  return null;
@@ -1,9 +1,9 @@
1
1
  import { defineUnmanagedTable, deriveEntityTableMeta, instant, table as pgTable, serial, text, } from "@cosmicdrift/kumiko-framework/db";
2
2
  import { createEntity, createNumberField, createTextField, createTimestampField, } from "@cosmicdrift/kumiko-framework/engine";
3
- // jobRun is a system-scoped direct-write store (#2243): every job execution
3
+ // jobRun is a system-scoped direct-write store: every job execution
4
4
  // writes straight into jobRunsTable / jobRunLogsTable from the BullMQ
5
5
  // callbacks (onJobStart / -Complete / -Failed, see job-run-logger.ts) —
6
- // no event-store detour. Pre-#2243 this was an events-only aggregate
6
+ // no event-store detour. Previously this was an events-only aggregate
7
7
  // replayed through two inline projections; that generated two permanent
8
8
  // `kumiko_events` rows per run for data that is itself already the
9
9
  // system of record (no other consumer replays or MSP-subscribes to it).
@@ -20,7 +20,7 @@ import { createEntity, createNumberField, createTextField, createTimestampField,
20
20
  // app boundary (same pattern as template-resolver kind/scope).
21
21
  // `table: "store_job_runs"` (not `read_*`) because this is no longer a
22
22
  // rebuildable projection — `defineUnmanagedTable`/`deriveEntityTableMeta`
23
- // reject the `read_` prefix for `source: "unmanaged"` (#1208/#1220).
23
+ // reject the `read_` prefix for `source: "unmanaged"`.
24
24
  export const jobRunEntity = createEntity({
25
25
  table: "store_job_runs",
26
26
  fields: {
@@ -92,7 +92,7 @@ export const jobRunDetailScreen = {
92
92
  "error",
93
93
  ],
94
94
  },
95
- // No section `title` here (fw#2312 label-dedup fix): the section
95
+ // No section `title` here (label-dedup fix): the section
96
96
  // holds exactly one field, so a title would repeat the field's own
97
97
  // label (rendered by RenderField as the Field's heading) verbatim.
98
98
  {
@@ -1,5 +1,5 @@
1
1
  import { index, instant, table as pgTable, requireEntityTableMeta, serial, sql, text, uniqueIndex, uuid, } from "@cosmicdrift/kumiko-framework/db";
2
- // The tenant's own view of a failed job (fw#3079). Direct-write store like
2
+ // The tenant's own view of a failed job. Direct-write store like
3
3
  // store_job_runs: job-run-logger.ts writes it from the BullMQ callbacks,
4
4
  // outside any dispatcher transaction.
5
5
  //
@@ -1,5 +1,5 @@
1
1
  import { index, instant, table as pgTable, requireEntityTableMeta, serial, sql, text, uniqueIndex, uuid, } from "@cosmicdrift/kumiko-framework/db";
2
- // The tenant's own view of a job's run state (fw#3616). Direct-write store
2
+ // The tenant's own view of a job's run state. Direct-write store
3
3
  // like store_job_runs, written by job-run-logger.ts from the runner callbacks.
4
4
  //
5
5
  // store_job_runs cannot serve the tenant: it anchors every run on the system
@@ -5,7 +5,7 @@ import { ACCOUNT_TYPES, SCHEDULE_INTERVALS, TRANSACTION_STATUS } from "./web/con
5
5
  // detail via the standard handlers); the framework projects `read_ledger_accounts`
6
6
  // from its CRUD events. `parentId` null → root account; otherwise the chart-of-
7
7
  // accounts tree. `type` drives how the report layer interprets a balance. No
8
- // money column — balances are DERIVED from postings (Phase 1), never stored.
8
+ // money column — balances are DERIVED from postings, never stored.
9
9
  // tenantId is a base column set by the framework → each tenant has its own books.
10
10
  export const accountEntity = createEntity({
11
11
  table: "read_ledger_accounts",
@@ -39,13 +39,13 @@ export const accountEntity = createEntity({
39
39
  // transaction — a journal entry. The balanced posting lines live embedded as
40
40
  // `lines` (embedded list: { accountId, amount }[], Σ amount = 0), so an entry is atomic:
41
41
  // the Σ=0 invariant holds within a single command, no cross-row write. The
42
- // framework projects `read_ledger_transactions`; Phase 1 adds a flat
43
- // `read_ledger_postings` projection (one row per line) for per-account/period
42
+ // framework projects `read_ledger_transactions`; a flat
43
+ // `read_ledger_postings` projection (one row per line) supports per-account/period
44
44
  // report queries.
45
45
  //
46
46
  // IMMUTABLE: the feature registers NO update/delete handler for transaction. A
47
- // posted entry is a fact; corrections are reverse-transaction (Storno) entries.
48
- // `status` carries draft|posted for the later Soll/Ist work — Phase 0 posts only.
47
+ // posted entry is a fact; corrections are reverse-transaction entries.
48
+ // `status` carries draft|posted.
49
49
  export const transactionEntity = createEntity({
50
50
  table: "read_ledger_transactions",
51
51
  description: "One journal entry: a booking date, a narration, an optional reference (a reversal points at the entry it corrects), a draft/posted status and the embedded posting lines of accountId plus signed minor-unit amount that must sum to zero; posted entries are immutable and corrected only by a reversing entry.",
@@ -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
  import { defineEntityCreateHandler, defineEntityDetailHandler, defineEntityListHandler, defineEntityUpdateHandler, defineFeature, } from "@cosmicdrift/kumiko-framework/engine";
@@ -33,7 +33,7 @@ function registerLedger(r, access, toggleable) {
33
33
  r.entity({ name: "schedule", ...scheduleEntity });
34
34
  // Chart of accounts — plain CRUD, no custom logic. No delete in v1: removing an
35
35
  // account that has postings would orphan them; a posting-aware guard lands with
36
- // the postings projection (Phase 1).
36
+ // the postings projection.
37
37
  r.writeHandler(defineEntityCreateHandler("account", accountEntity, {
38
38
  access,
39
39
  description: "Adds an account to the tenant's chart of accounts with a name, a type of asset, liability, equity, income or expense, an optional code and an optional parent account; use it before booking anything against that account.",
@@ -12,11 +12,11 @@ const CONFIRM_PERIOD_LOCK_NAMESPACE = 0x6c637370;
12
12
  // balanced transaction (debit +amount / credit −amount), tagged with
13
13
  // scheduleReference(scheduleId, period) so the host can merge Soll vs. Ist.
14
14
  //
15
- // Idempotent + reversal-aware: if an ACTIVE (non-reversed) booking for this
15
+ // Idempotent and reversal-aware: if an ACTIVE (non-reversed) booking for this
16
16
  // reference already exists, it's a no-op; a booking that was reversed (Storno)
17
17
  // leaves the period re-confirmable. Referential integrity (both accounts must
18
- // exist) mirrors create-transaction — a schedule could name a bogus account, the
19
- // generic CRUD create doesn't check.
18
+ // exist) mirrors create-transaction because a schedule could name a bogus
19
+ // account that the generic CRUD create does not check.
20
20
  export function createConfirmSchedulePeriodHandler(access = DEFAULT_LEDGER_ACCESS) {
21
21
  return {
22
22
  name: "confirm-schedule-period",
@@ -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
  // "schedule:<id>:<period>" — the stable idempotency + merge key on a confirmation.
16
16
  export function scheduleReference(scheduleId, period) {
17
17
  return `schedule:${scheduleId}:${period}`;
@@ -54,8 +54,8 @@ export function projectSchedule(schedule, window) {
54
54
  }
55
55
  return periods;
56
56
  }
57
- // Soll vs. Ist. A month is `posted` when a confirmation for its reference exists
58
- // AND has not been reversed (Storno); a reversed confirmation drops the month back
57
+ // Planned vs. actual. A month is `posted` when a confirmation for its reference exists
58
+ // AND has not been reversed; a reversed confirmation drops the month back
59
59
  // to `open` so it can be re-confirmed. Past/current unbooked months are `open`,
60
60
  // future ones `forecast` (asOf is the boundary — month-granular).
61
61
  export function mergeScheduleActuals(scheduleId, projection, transactions, asOf) {
@@ -17,7 +17,7 @@ export const createTransactionPayloadSchema = z
17
17
  description: z.string().min(1).max(200),
18
18
  reference: z.string().max(120).optional(),
19
19
  // Defaults to "posted" in the handler. draft lifecycle (editable) lands with
20
- // the Soll/recurring work — Phase 0 only ever creates posted entries.
20
+ // the debit/recurring work — only ever creates posted entries.
21
21
  status: z.enum(TRANSACTION_STATUS).optional(),
22
22
  lines: z.array(postingSchema).min(2),
23
23
  // Business-object reference (e.g. a lease contract) this entry is about.
@@ -25,14 +25,14 @@ export const LedgerQueries = {
25
25
  transactionDetail: "ledger:query:transaction:detail",
26
26
  scheduleList: "ledger:query:schedule:list",
27
27
  scheduleDetail: "ledger:query:schedule:detail",
28
- // Reports — pure aggregations over the posted entries (Phase 1).
28
+ // Reports — pure aggregations over the posted entries.
29
29
  reportBalances: "ledger:query:report:balances",
30
30
  reportIncomeStatement: "ledger:query:report:income-statement",
31
31
  reportBalanceSheet: "ledger:query:report:balance-sheet",
32
32
  };
33
33
  // Account types double-entry needs to interpret a balance: asset/expense are
34
34
  // debit-normal, liability/equity/income are credit-normal. The report layer
35
- // (Phase 1) flips signs by type; the primitive only stores them.
35
+ // flips signs by type; the primitive only stores them.
36
36
  export const ACCOUNT_TYPES = ["asset", "liability", "equity", "income", "expense"];
37
37
  export const TRANSACTION_STATUS = ["draft", "posted"];
38
38
  // Recurrence steps a schedule can project. Monthly is the only step v1 needs
@@ -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
  export { mergeScheduleActuals, projectSchedule, scheduleReference, } from "../recurring.js";
9
9
  export { confirmSchedulePeriodPayloadSchema, postingSchema, } from "../schemas.js";
10
10
  export { ACCOUNT_TYPES, LEDGER_FEATURE_NAME, LedgerHandlers, LedgerQueries, SCHEDULE_INTERVALS, TRANSACTION_STATUS, } from "./constants.js";
@@ -4,10 +4,10 @@ import { type LegalPageRoute, type LegalRequiredBlock } from "./web/constants.ts
4
4
  export { type LegalPagesBootCheckCtx, runLegalPagesBootCheck } from "./lib/boot-check.ts";
5
5
  export type LegalPagesWrapLayout = PublicPageWrapLayout;
6
6
  export type LegalPagesOptions = {
7
- /** Custom Layout-Wrapper für die /legal/*-Routes. Default: minimaler
8
- * HTML-Skeleton aus markdown.ts (`wrapInLayout`). Apps die ihr eigenes
9
- * Marketing-Layout (Header/Footer/Theme) auch um Legal-Body legen
10
- * wollen, übergeben hier ihre Render-Function. */
7
+ /** Custom layout wrapper for the /legal/* routes. Default: minimal
8
+ * HTML skeleton from markdown.ts (`wrapInLayout`). Apps that want to place
9
+ * their own marketing layout (header/footer/theme) around the legal body
10
+ * can provide their render function here. */
11
11
  readonly wrapLayout?: LegalPagesWrapLayout;
12
12
  /** Public HTML routes to register. Default: LEGAL_ROUTES (DACH: DE+EN
13
13
  * imprint/privacy). Non-DACH apps (other default language, additional
@@ -7,13 +7,12 @@ import { validateRoutes } from "./lib/validate-routes.js";
7
7
  import { renderMarkdownToHtml, wrapInLayout } from "./markdown.js";
8
8
  import { LEGAL_REQUIRED_BLOCKS, LEGAL_ROUTES, LEGAL_TERMS_ROUTES, } from "./web/constants.js";
9
9
  export { runLegalPagesBootCheck } from "./lib/boot-check.js";
10
- // QN-Konstante als dokumentierter Public-Contract des template-resolver-
11
- // Features. Ein magic-string statt eines Code-Imports ist hier explizit
12
- // gewollt: Cross-Feature-Calls gehen nur über stable Public-API
13
- // (handler-name + payload-shape), nicht über interne Module-Refs. Wenn
14
- // template-resolver's Handler-Name sich ändert, ist das ein semver-major
15
- // und muss in beiden Features synchronisiert werden — gleiches Risiko
16
- // wie bei jedem API-Endpunkt.
10
+ // QN constant as the documented public contract of the template-resolver
11
+ // feature. A magic string is intentional instead of a code import: cross-feature
12
+ // calls use only the stable public API (handler name + payload shape), not
13
+ // internal module references. If template-resolver's handler name changes, it is
14
+ // a semver-major change and must be synchronized in both features—the same risk
15
+ // as with any API endpoint.
17
16
  const TEXT_BLOCK_BY_SLUG_QN = "template-resolver:query:by-slug";
18
17
  // 60s-shared-cache saves the origin-revalidate roundtrip; legal-content edits are live within 60s.
19
18
  const PUBLIC_PAGE_CACHE = { kind: "revalidate", maxAgeSeconds: 60 };
@@ -57,18 +56,18 @@ export function createLegalPagesFeature(opts = {}) {
57
56
  // Public pages backed by a DB query: bound the per-IP read rate.
58
57
  rateLimit: { per: "ip+handler", limit: 60, windowSeconds: 60 },
59
58
  handler: async (c, { systemQuery }) => {
60
- // Architektur: 1 App = X Tenants = 1 Impressum. Egal welche
61
- // Subdomain der Visitor besucht (apex, admin.*, tenant-x.*) —
62
- // legal-pages serven IMMER die SYSTEM_TENANT-Texte. systemQuery
63
- // erzwingt SYSTEM_TENANT_ID in-process (kein X-Tenant-Header-
64
- // Trick über app.fetch — der sähe für einen host-basierten
65
- // anonymousAccess-Resolver wie ein Client-Override aus und würde
66
- // von resolverTrust: "authoritative" zurecht abgelehnt).
59
+ // Architecture: 1 app = X tenants = 1 imprint. Regardless of which
60
+ // subdomain the visitor uses (apex, admin.*, tenant-x.*),
61
+ // legal-pages ALWAYS serves the SYSTEM_TENANT texts. systemQuery
62
+ // enforces SYSTEM_TENANT_ID in-process (no X-Tenant-Header trick
63
+ // through app.fetch—the host-based anonymousAccess resolver would
64
+ // see that as a client override and correctly reject it with
65
+ // resolverTrust: "authoritative").
67
66
  let data;
68
67
  try {
69
68
  // @cast-boundary engine-payload — dispatcher.query returnt
70
- // unknown; Shape ist durch bySlugQuery's Handler-Return-Type
71
- // (siehe template-resolver/handlers/by-slug.query.ts) vertraut.
69
+ // unknown; the shape is trusted because of bySlugQuery's handler return type
70
+ // (see template-resolver/handlers/by-slug.query.ts).
72
71
  data = (await systemQuery(TEXT_BLOCK_BY_SLUG_QN, { slug: route.slug, locale: route.lang }, SYSTEM_TENANT_ID));
73
72
  }
74
73
  catch (err) {
@@ -87,8 +86,8 @@ export function createLegalPagesFeature(opts = {}) {
87
86
  String(data.modifiedAt ?? ""),
88
87
  ]);
89
88
  const extra = { "content-type": "text/html; charset=utf-8" };
90
- // 304 (Revision unverändert) und HEAD überspringen beide das
91
- // Markdown-Rendern — der Body wird ohnehin verworfen.
89
+ // Both 304 (unchanged revision) and HEAD skip Markdown rendering—the body
90
+ // would be discarded anyway.
92
91
  if (etagMatches(c.req.raw.headers.get("if-none-match"), etag) ||
93
92
  c.req.method === "HEAD") {
94
93
  return cachedSecurePageResponse(c.req.raw, {
@@ -132,19 +131,19 @@ export function createLegalPagesFeature(opts = {}) {
132
131
  handler: (c) => redirectToCanonicalPath(c.req.url, route.path),
133
132
  });
134
133
  }
135
- // Boot-Check via ctx.templateResolver (extraContext-Pattern, symmetrisch
136
- // zu requireConfigResolver in config). App-Bootstrap muss templateResolver
137
- // wired haben — der Helper gibt einen klaren Wiring-Hinweis wenn nicht.
134
+ // Boot check via ctx.templateResolver (extraContext pattern, symmetrical
135
+ // with requireConfigResolver in config). App bootstrap must wire
136
+ // templateResolver; the helper gives a clear wiring hint if it is missing.
138
137
  //
139
- // Body als named function extrahiert (`runLegalPagesBootCheck`) damit
140
- // die Logik direkt unit-testbar ist statt nur indirekt über Routes.
141
- // Pattern: thin job-shell ruft testable function — keine Test-Coupling
142
- // zum JobRunner.
138
+ // The body is extracted as the named function (`runLegalPagesBootCheck`) so
139
+ // the logic can be unit-tested directly instead of only indirectly through
140
+ // routes. Pattern: a thin job shell calls a testable function, avoiding
141
+ // coupling tests to the JobRunner.
143
142
  r.job("legal-pages-boot-check", {
144
143
  trigger: { manual: true },
145
144
  // bootGate, not runOnBoot: only an inline gate can actually abort the
146
145
  // boot. runOnBoot merely enqueues, so a missing imprint would fail a
147
- // queue job while the pod goes ready anyway (fw#2590).
146
+ // queue job while the pod goes ready anyway.
148
147
  bootGate: true,
149
148
  runIn: "api",
150
149
  }, async (_payload, ctx) => runLegalPagesBootCheck(ctx, requiredBlocks));
@@ -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
  export { wrapInLayout } from "../page-render/layout.js";
6
6
  export { renderSafeMarkdown as renderMarkdownToHtml } from "../page-render/markdown.js";
@@ -1,22 +1,21 @@
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
  import { LEGAL_OPTIONAL_BLOCKS, LEGAL_REQUIRED_BLOCKS } from "./constants.js";
18
17
  const treeProvider = () => (emit) => {
19
- // V.1.5d Slug-first Verschachtelung (Variante C):
18
+ // Slug-first nesting:
20
19
  // 📁 Legal
21
20
  // 📁 imprint
22
21
  // de
@@ -25,10 +24,10 @@ const treeProvider = () => (emit) => {
25
24
  // de
26
25
  // en
27
26
  //
28
- // Slug ist der Übersetzungs-Anker — User pflegt DE+EN-Versionen
29
- // desselben Inhalts zusammen statt nach Sprache zu gruppieren.
30
- // Sub-Items sind reine Sprach-Leaves; Label = Sprache, target zeigt
31
- // auf template-resolver:edit mit slug+locale.
27
+ // The slug is the translation anchor — users maintain the DE+EN versions
28
+ // of the same content together instead of grouping them by language.
29
+ // Sub-items are language-only leaves; label = language, and target points
30
+ // to template-resolver:edit with slug+locale.
32
31
  // Group all blocks by slug, collect set of langs per slug.
33
32
  const bySlug = new Map();
34
33
  for (const b of [...LEGAL_REQUIRED_BLOCKS, ...LEGAL_OPTIONAL_BLOCKS]) {
@@ -57,14 +56,14 @@ const treeProvider = () => (emit) => {
57
56
  children: langLeaves,
58
57
  });
59
58
  }
60
- // Der App-seitige r.nav-Knoten IST der "Legal"-Container → der Provider
61
- // emittiert die slug-Folder direkt darunter.
59
+ // The app-side r.nav node IS the "Legal" container → the provider
60
+ // emits the slug folders directly beneath it.
62
61
  emit(slugFolders);
63
62
  return () => { };
64
63
  };
65
- // `navId` = QN des r.nav({ provider: true })-Knotens den die App registriert.
66
- // Statisch (kein Fetch, keine Entities) → kein SSE-Refresh nötig. Ohne navId:
67
- // kein Sidebar-Knoten (server-only-Consumer leaken nichts).
64
+ // `navId` = the QN of the r.nav({ provider: true }) node registered by the app.
65
+ // Static (no fetch, no entities) → no SSE refresh is needed. Without navId:
66
+ // no sidebar node (server-only consumers expose nothing).
68
67
  export function legalPagesClient(opts) {
69
68
  const navId = opts?.navId;
70
69
  return {
@@ -1,2 +1 @@
1
- // Public exports für die Browser-Seite des legal-pages Features.
2
1
  export { legalPagesClient } from "./client-plugin.js";
@@ -40,8 +40,8 @@ export type MailTransportContext = {
40
40
  * an EmailTransport. Per-call construction so a tenant editing config
41
41
  * sees the change on the next mail.
42
42
  *
43
- * **Plugin-Author-Warnung:** `ctx` ist EXPLIZIT ein MailTransportContext,
44
- * nicht ein voller HandlerContext (siehe MailTransportContext-Doc).
43
+ * **Plugin-author warning:** `ctx` is EXPLICITLY a MailTransportContext,
44
+ * not a full HandlerContext (see the MailTransportContext doc).
45
45
  */
46
46
  export type MailTransportPlugin = {
47
47
  readonly build: (ctx: MailTransportContext, tenantId: string) => Promise<EmailTransport>;
@@ -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
  import { withPiiCiphertextGuard, } from "@cosmicdrift/kumiko-bundled-features/channel-email";
34
33
  import { requireDefined } from "@cosmicdrift/kumiko-bundled-features/foundation-shared";
35
34
  import { access, createSystemUser, createTenantConfig, defineFeature, } from "@cosmicdrift/kumiko-framework/engine";
@@ -1,12 +1,12 @@
1
1
  import type { EmailMessage } from "@cosmicdrift/kumiko-bundled-features/channel-email";
2
2
  /**
3
- * Demo/Test-Helper: lies die "versendeten" Mails eines Tenants. Im
4
- * Sample-App rendert ein query-Handler darauf die Inbox-UI.
3
+ * Demo/test helper: reads the emails "sent" for a tenant. A query
4
+ * handler in the sample app uses this to render the inbox UI.
5
5
  */
6
6
  export declare function getInbox(tenantId: string): readonly EmailMessage[];
7
7
  /**
8
- * Demo/Test-Helper: clear einen Tenant-Buffer (z.B. zwischen Test-
9
- * Szenarien).
8
+ * Demo/test helper: clears a tenant's buffer, for example between
9
+ * test scenarios.
10
10
  */
11
11
  export declare function clearInbox(tenantId: string): void;
12
12
  export declare function createMailTransportInMemoryFeature(): import("@cosmicdrift/kumiko-types/feature").FeatureDefinition & {