@cosmicdrift/kumiko-bundled-features 0.386.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 (469) hide show
  1. package/LICENSE +21 -57
  2. package/dist/agent-tools/tool-catalog.js +1 -1
  3. package/dist/audit/screens.js +1 -1
  4. package/dist/auth-email-password/feature.js +1 -1
  5. package/dist/auth-email-password/handlers/change-password.write.js +3 -3
  6. package/dist/auth-email-password/handlers/confirm-token-flow.js +5 -5
  7. package/dist/auth-email-password/handlers/invite-accept-with-login.write.js +1 -1
  8. package/dist/auth-email-password/handlers/invite-accept.write.js +18 -18
  9. package/dist/auth-email-password/handlers/invite-create.write.d.ts +2 -2
  10. package/dist/auth-email-password/handlers/invite-create.write.js +10 -10
  11. package/dist/auth-email-password/handlers/invite-info.query.js +1 -1
  12. package/dist/auth-email-password/handlers/invite-signup-complete.write.js +24 -26
  13. package/dist/auth-email-password/handlers/login.write.d.ts +1 -1
  14. package/dist/auth-email-password/handlers/login.write.js +1 -1
  15. package/dist/auth-email-password/handlers/self-registration-status.query.js +1 -1
  16. package/dist/auth-email-password/handlers/signup-confirm.write.js +34 -37
  17. package/dist/auth-email-password/handlers/signup-request.write.js +6 -7
  18. package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.d.ts +1 -1
  19. package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.js +1 -4
  20. package/dist/auth-email-password/index.js +5 -5
  21. package/dist/auth-email-password/lockout-store.js +1 -1
  22. package/dist/auth-email-password/seeding.d.ts +42 -45
  23. package/dist/auth-email-password/seeding.js +51 -53
  24. package/dist/auth-email-password/signup-token-store.js +8 -8
  25. package/dist/auth-email-password/testing.js +3 -3
  26. package/dist/auth-email-password/web/auth-client.d.ts +2 -2
  27. package/dist/auth-email-password/web/auth-client.js +36 -37
  28. package/dist/auth-email-password/web/auth-form-primitives.js +10 -10
  29. package/dist/auth-email-password/web/auth-gate.js +15 -16
  30. package/dist/auth-email-password/web/client-plugin.d.ts +7 -7
  31. package/dist/auth-email-password/web/client-plugin.js +4 -5
  32. package/dist/auth-email-password/web/confirm-account-unlock-screen.js +1 -1
  33. package/dist/auth-email-password/web/constants.js +3 -3
  34. package/dist/auth-email-password/web/default-topbar-actions.d.ts +8 -8
  35. package/dist/auth-email-password/web/default-topbar-actions.js +6 -6
  36. package/dist/auth-email-password/web/forgot-password-screen.d.ts +2 -2
  37. package/dist/auth-email-password/web/forgot-password-screen.js +9 -9
  38. package/dist/auth-email-password/web/index.js +5 -5
  39. package/dist/auth-email-password/web/invite-accept-screen.d.ts +1 -1
  40. package/dist/auth-email-password/web/invite-accept-screen.js +16 -16
  41. package/dist/auth-email-password/web/login-screen.d.ts +1 -1
  42. package/dist/auth-email-password/web/login-screen.js +2 -3
  43. package/dist/auth-email-password/web/reset-password-screen.d.ts +4 -4
  44. package/dist/auth-email-password/web/reset-password-screen.js +12 -13
  45. package/dist/auth-email-password/web/session.d.ts +10 -9
  46. package/dist/auth-email-password/web/session.js +28 -29
  47. package/dist/auth-email-password/web/signup-complete-screen.js +3 -3
  48. package/dist/auth-email-password/web/signup-screen.d.ts +1 -1
  49. package/dist/auth-email-password/web/signup-screen.js +13 -13
  50. package/dist/auth-email-password/web/tenant-switcher.d.ts +4 -4
  51. package/dist/auth-email-password/web/tenant-switcher.js +21 -22
  52. package/dist/auth-email-password/web/use-shell-user.js +12 -13
  53. package/dist/auth-email-password/web/user-menu.d.ts +4 -4
  54. package/dist/auth-email-password/web/user-menu.js +12 -13
  55. package/dist/auth-email-password/web/verify-email-screen.d.ts +2 -2
  56. package/dist/auth-email-password/web/verify-email-screen.js +9 -10
  57. package/dist/auth-foundation/boot-checks.js +4 -4
  58. package/dist/auth-foundation/resolve-anonymous-access.d.ts +1 -1
  59. package/dist/auth-foundation/resolve-anonymous-access.js +3 -3
  60. package/dist/auth-foundation/types.js +2 -2
  61. package/dist/auth-mfa/handlers/disable.write.js +3 -3
  62. package/dist/auth-mfa/handlers/enable-confirm-preauth.write.js +4 -4
  63. package/dist/auth-mfa/handlers/enable-confirm.write.js +2 -2
  64. package/dist/auth-mfa/handlers/enable-start-preauth.write.js +1 -1
  65. package/dist/auth-mfa/handlers/reencrypt.job.js +1 -1
  66. package/dist/auth-mfa/handlers/regenerate-recovery.write.js +5 -5
  67. package/dist/auth-mfa/handlers/verify.write.js +1 -1
  68. package/dist/auth-mfa/token-secrets.js +1 -1
  69. package/dist/auth-mfa/web/client-plugin.d.ts +1 -1
  70. package/dist/auth-mfa/web/client-plugin.js +1 -1
  71. package/dist/auth-mfa/web/i18n.js +3 -3
  72. package/dist/auth-mfa/web/index.js +4 -4
  73. package/dist/auth-mfa/web/mfa-client.js +17 -16
  74. package/dist/auth-mfa/web/mfa-verify-screen.js +6 -6
  75. package/dist/billing-foundation/aggregate-id.d.ts +5 -5
  76. package/dist/billing-foundation/aggregate-id.js +10 -11
  77. package/dist/billing-foundation/entities.js +27 -27
  78. package/dist/billing-foundation/events.js +18 -17
  79. package/dist/billing-foundation/feature.js +42 -43
  80. package/dist/billing-foundation/get-subscription-for-tenant.d.ts +3 -3
  81. package/dist/billing-foundation/get-subscription-for-tenant.js +3 -5
  82. package/dist/billing-foundation/handlers/create-checkout-session.write.js +18 -17
  83. package/dist/billing-foundation/handlers/create-portal-session.write.js +11 -12
  84. package/dist/billing-foundation/handlers/list-subscriptions.query.js +4 -4
  85. package/dist/billing-foundation/handlers/process-event.write.js +20 -20
  86. package/dist/billing-foundation/projection.d.ts +15 -11
  87. package/dist/billing-foundation/projection.js +38 -37
  88. package/dist/billing-foundation/subscription-tier-sync.js +3 -3
  89. package/dist/billing-foundation/tenant-destroy-hook.d.ts +2 -2
  90. package/dist/billing-foundation/tenant-destroy-hook.js +7 -7
  91. package/dist/billing-foundation/types.d.ts +40 -41
  92. package/dist/billing-foundation/types.js +20 -20
  93. package/dist/billing-foundation/web/billing-plans-panel.js +4 -4
  94. package/dist/cap-counter/aggregate-id.js +8 -9
  95. package/dist/cap-counter/constants.js +11 -12
  96. package/dist/cap-counter/enforce-cap.d.ts +59 -62
  97. package/dist/cap-counter/enforce-cap.js +47 -48
  98. package/dist/cap-counter/entity.js +29 -29
  99. package/dist/cap-counter/feature.js +34 -35
  100. package/dist/cap-counter/handlers/increment-rolling.write.d.ts +2 -2
  101. package/dist/cap-counter/handlers/increment-rolling.write.js +31 -31
  102. package/dist/cap-counter/handlers/mark-soft-warned.write.js +4 -5
  103. package/dist/cap-counter/stock-cap-guard.js +1 -1
  104. package/dist/cap-counter/with-cap-enforcement.d.ts +3 -5
  105. package/dist/channel-email/smtp-transport.d.ts +18 -17
  106. package/dist/channel-email/smtp-transport.js +24 -21
  107. package/dist/channel-in-app/handlers/unread-count.query.js +3 -4
  108. package/dist/compliance-profiles/feature.js +4 -4
  109. package/dist/compliance-profiles/handlers/for-tenant.query.js +3 -6
  110. package/dist/compliance-profiles/handlers/list-profiles.query.js +5 -5
  111. package/dist/compliance-profiles/handlers/needs-profile.query.js +4 -4
  112. package/dist/compliance-profiles/handlers/set-profile.write.js +13 -14
  113. package/dist/compliance-profiles/handlers/sub-processors.query.js +9 -11
  114. package/dist/compliance-profiles/resolve-for-tenant.js +7 -7
  115. package/dist/compliance-profiles/schema/profile-selection.js +18 -23
  116. package/dist/compliance-profiles/seeding.js +14 -15
  117. package/dist/compliance-profiles-ops/handlers/tenants-missing-profile.query.js +3 -3
  118. package/dist/compliance-profiles-ops/index.js +2 -2
  119. package/dist/config/handlers/readiness.query.d.ts +4 -4
  120. package/dist/config/handlers/readiness.query.js +1 -1
  121. package/dist/config/handlers/reencrypt.job.js +4 -5
  122. package/dist/config/handlers/set.write.js +4 -4
  123. package/dist/config/resolver.js +4 -4
  124. package/dist/config/table.js +10 -10
  125. package/dist/config/write-helpers.js +1 -1
  126. package/dist/crypto-shredding/handlers/forget-subject.write.d.ts +2 -2
  127. package/dist/crypto-shredding/handlers/forget-subject.write.js +12 -11
  128. package/dist/custom-fields/aggregate-id.d.ts +12 -13
  129. package/dist/custom-fields/aggregate-id.js +16 -17
  130. package/dist/custom-fields/entity.js +49 -47
  131. package/dist/custom-fields/events.js +7 -8
  132. package/dist/custom-fields/feature.d.ts +14 -14
  133. package/dist/custom-fields/feature.js +53 -54
  134. package/dist/custom-fields/handlers/clear-custom-field.write.d.ts +3 -2
  135. package/dist/custom-fields/handlers/clear-custom-field.write.js +9 -8
  136. package/dist/custom-fields/handlers/define-tenant-field.write.d.ts +1 -1
  137. package/dist/custom-fields/handlers/define-tenant-field.write.js +2 -2
  138. package/dist/custom-fields/handlers/delete-system-field.write.js +6 -7
  139. package/dist/custom-fields/handlers/delete-tenant-field.write.d.ts +1 -1
  140. package/dist/custom-fields/handlers/delete-tenant-field.write.js +3 -3
  141. package/dist/custom-fields/handlers/set-custom-field.write.d.ts +3 -3
  142. package/dist/custom-fields/handlers/set-custom-field.write.js +25 -28
  143. package/dist/custom-fields/handlers/update-tenant-field.write.d.ts +1 -1
  144. package/dist/custom-fields/handlers/update-tenant-field.write.js +1 -1
  145. package/dist/custom-fields/lib/field-access.js +2 -2
  146. package/dist/custom-fields/lib/parse-serialized-field.js +1 -1
  147. package/dist/custom-fields/lib/quota.js +1 -1
  148. package/dist/custom-fields/lib/value-schema.js +10 -12
  149. package/dist/custom-fields/run-retention.js +3 -3
  150. package/dist/custom-fields/schemas.js +14 -14
  151. package/dist/custom-fields/web/client-plugin.js +2 -5
  152. package/dist/custom-fields/web/constants.js +2 -2
  153. package/dist/custom-fields/web/custom-fields-form-section.d.ts +4 -4
  154. package/dist/custom-fields/web/custom-fields-form-section.js +22 -22
  155. package/dist/custom-fields/wire-for-entity.js +65 -67
  156. package/dist/custom-fields/wire-user-data-rights.js +3 -3
  157. package/dist/data-retention/_internal/parse-override.js +2 -3
  158. package/dist/data-retention/feature.js +11 -18
  159. package/dist/data-retention/handlers/policy-for.query.js +6 -6
  160. package/dist/data-retention/keep-for.d.ts +7 -7
  161. package/dist/data-retention/keep-for.js +15 -15
  162. package/dist/data-retention/override-schema.d.ts +3 -4
  163. package/dist/data-retention/override-schema.js +13 -15
  164. package/dist/data-retention/presets.d.ts +4 -5
  165. package/dist/data-retention/presets.js +18 -23
  166. package/dist/data-retention/resolve-tenant-preset.js +17 -16
  167. package/dist/data-retention/resolver.d.ts +12 -12
  168. package/dist/data-retention/resolver.js +24 -23
  169. package/dist/data-retention/run-retention-cleanup.d.ts +8 -3
  170. package/dist/data-retention/run-retention-cleanup.js +61 -51
  171. package/dist/data-retention/schema/tenant-retention-override.js +13 -11
  172. package/dist/delivery/feature.js +2 -2
  173. package/dist/delivery/handlers/log.query.js +1 -1
  174. package/dist/delivery/tables.js +9 -8
  175. package/dist/delivery/unsubscribe.js +4 -4
  176. package/dist/document-ingest-foundation/entity.js +4 -4
  177. package/dist/document-ingest-foundation/events.js +2 -2
  178. package/dist/document-ingest-foundation/feature.js +2 -2
  179. package/dist/document-ingest-foundation/pages.js +1 -1
  180. package/dist/document-ingest-foundation/tenant-destroy-hook.js +4 -4
  181. package/dist/feature-toggles/compose-tier-resolver.js +1 -1
  182. package/dist/feature-toggles/feature.js +1 -1
  183. package/dist/feature-toggles/global-feature-state-table.js +1 -1
  184. package/dist/feature-toggles/handlers/registered.query.js +5 -5
  185. package/dist/feature-toggles/toggle-sync-signal.js +1 -1
  186. package/dist/feature-toggles/web/constants.js +1 -1
  187. package/dist/file-derivatives/feature.d.ts +1 -1
  188. package/dist/file-derivatives/feature.js +1 -1
  189. package/dist/file-derivatives/handlers/public-variant.query.js +1 -1
  190. package/dist/file-derivatives/presets.js +1 -1
  191. package/dist/file-foundation/feature.js +6 -6
  192. package/dist/file-provider-inmemory/feature.d.ts +1 -1
  193. package/dist/file-provider-inmemory/feature.js +16 -16
  194. package/dist/file-provider-s3/feature.js +16 -16
  195. package/dist/file-provider-s3/lib/s3-provider.js +6 -6
  196. package/dist/files/feature.js +6 -6
  197. package/dist/files-tenant-data/handlers/sweep-orphaned-derivatives.job.js +4 -4
  198. package/dist/files-tenant-data/hooks.js +24 -26
  199. package/dist/files-tenant-data/index.js +1 -1
  200. package/dist/folders/feature.d.ts +1 -1
  201. package/dist/folders/web/folder-manager.js +2 -2
  202. package/dist/folders/web/tree.js +5 -5
  203. package/dist/form-draft/db/queries/cleanup.js +1 -1
  204. package/dist/form-draft/db/queries/owned-file-refs.js +1 -1
  205. package/dist/form-draft/entity.js +3 -3
  206. package/dist/form-draft/feature.js +4 -5
  207. package/dist/form-draft/handlers/discard.write.js +1 -1
  208. package/dist/form-draft/release-file-refs.js +6 -6
  209. package/dist/form-draft/schemas.js +3 -3
  210. package/dist/form-draft/web/constants.js +0 -2
  211. package/dist/inbound-mail-foundation/aggregate-id.d.ts +13 -13
  212. package/dist/inbound-mail-foundation/aggregate-id.js +19 -19
  213. package/dist/inbound-mail-foundation/connect-routes.js +4 -3
  214. package/dist/inbound-mail-foundation/constants.d.ts +22 -24
  215. package/dist/inbound-mail-foundation/constants.js +30 -33
  216. package/dist/inbound-mail-foundation/entities.d.ts +12 -12
  217. package/dist/inbound-mail-foundation/entities.js +47 -48
  218. package/dist/inbound-mail-foundation/events.d.ts +4 -3
  219. package/dist/inbound-mail-foundation/events.js +50 -47
  220. package/dist/inbound-mail-foundation/feature.js +39 -39
  221. package/dist/inbound-mail-foundation/handlers/account-state.js +8 -8
  222. package/dist/inbound-mail-foundation/handlers/connect-account.write.js +25 -26
  223. package/dist/inbound-mail-foundation/handlers/disconnect-account.write.js +7 -7
  224. package/dist/inbound-mail-foundation/handlers/ingest-message.write.js +50 -51
  225. package/dist/inbound-mail-foundation/handlers/list-accounts.query.js +8 -8
  226. package/dist/inbound-mail-foundation/handlers/list-messages.query.js +10 -10
  227. package/dist/inbound-mail-foundation/handlers/scope-visibility.js +3 -4
  228. package/dist/inbound-mail-foundation/handlers/update-account.write.js +11 -11
  229. package/dist/inbound-mail-foundation/oauth-state.d.ts +5 -5
  230. package/dist/inbound-mail-foundation/oauth-state.js +11 -10
  231. package/dist/inbound-mail-foundation/projection.d.ts +4 -4
  232. package/dist/inbound-mail-foundation/projection.js +31 -29
  233. package/dist/inbound-mail-foundation/provider-factory.d.ts +4 -4
  234. package/dist/inbound-mail-foundation/provider-factory.js +9 -9
  235. package/dist/inbound-mail-foundation/retention-sweep.d.ts +5 -3
  236. package/dist/inbound-mail-foundation/retention-sweep.js +38 -36
  237. package/dist/inbound-mail-foundation/tenant-destroy-hook.js +14 -16
  238. package/dist/inbound-mail-foundation/types.d.ts +45 -46
  239. package/dist/inbound-mail-foundation/types.js +21 -21
  240. package/dist/inbound-mail-foundation/watch-supervisor.d.ts +10 -10
  241. package/dist/inbound-mail-foundation/watch-supervisor.js +57 -56
  242. package/dist/inbound-provider-imap/credential-document.js +13 -13
  243. package/dist/inbound-provider-imap/feature.d.ts +2 -2
  244. package/dist/inbound-provider-imap/feature.js +42 -40
  245. package/dist/inbound-provider-imap/imap-client.d.ts +12 -11
  246. package/dist/inbound-provider-imap/imap-client.js +20 -19
  247. package/dist/inbound-provider-inmemory/feature.d.ts +9 -9
  248. package/dist/inbound-provider-inmemory/feature.js +19 -19
  249. package/dist/jobs/db/queries/retention.js +2 -2
  250. package/dist/jobs/db/queries/stale-run-sweep.js +3 -3
  251. package/dist/jobs/events.js +1 -1
  252. package/dist/jobs/feature.js +5 -6
  253. package/dist/jobs/handlers/detail.query.js +4 -4
  254. package/dist/jobs/handlers/list.query.js +1 -1
  255. package/dist/jobs/handlers/projection-rebuild.job.js +1 -1
  256. package/dist/jobs/handlers/reindex-entity.job.js +1 -1
  257. package/dist/jobs/handlers/retry.write.js +1 -1
  258. package/dist/jobs/job-instant.js +1 -1
  259. package/dist/jobs/job-run-logger.js +10 -11
  260. package/dist/jobs/job-run-table.js +3 -3
  261. package/dist/jobs/screens.js +1 -1
  262. package/dist/jobs/tenant-job-failure-table.js +1 -1
  263. package/dist/jobs/tenant-job-run-table.js +1 -1
  264. package/dist/ledger/entity.js +5 -5
  265. package/dist/ledger/feature.js +3 -3
  266. package/dist/ledger/handlers/confirm-schedule-period.write.js +3 -3
  267. package/dist/ledger/recurring.js +12 -12
  268. package/dist/ledger/schemas.js +1 -1
  269. package/dist/ledger/web/constants.js +2 -2
  270. package/dist/ledger/web/index.js +7 -7
  271. package/dist/legal-pages/feature.d.ts +4 -4
  272. package/dist/legal-pages/feature.js +25 -26
  273. package/dist/legal-pages/markdown.js +3 -3
  274. package/dist/legal-pages/web/client-plugin.js +23 -24
  275. package/dist/legal-pages/web/index.js +0 -1
  276. package/dist/mail-foundation/feature.d.ts +2 -2
  277. package/dist/mail-foundation/feature.js +24 -25
  278. package/dist/mail-transport-inmemory/feature.d.ts +4 -4
  279. package/dist/mail-transport-inmemory/feature.js +27 -28
  280. package/dist/mail-transport-smtp/feature.js +20 -20
  281. package/dist/managed-pages/branding.js +6 -6
  282. package/dist/managed-pages/feature.d.ts +26 -26
  283. package/dist/managed-pages/feature.js +34 -34
  284. package/dist/managed-pages/handlers/by-slug.query.js +5 -6
  285. package/dist/managed-pages/handlers/by-tenant-published.query.js +2 -2
  286. package/dist/managed-pages/handlers/set.write.js +5 -7
  287. package/dist/managed-pages/screens/page-screens.js +11 -11
  288. package/dist/managed-pages/seeding.js +8 -8
  289. package/dist/managed-pages/table.js +13 -12
  290. package/dist/managed-pages/web/client-plugin.d.ts +1 -1
  291. package/dist/managed-pages/web/client-plugin.js +5 -5
  292. package/dist/managed-pages/web/i18n.js +1 -1
  293. package/dist/notes-history/entity.js +4 -4
  294. package/dist/notes-history/feature.d.ts +2 -2
  295. package/dist/notes-history-user-data/hooks.js +1 -1
  296. package/dist/page-render/layout.js +9 -9
  297. package/dist/page-render/markdown.js +11 -11
  298. package/dist/page-render/security-headers.js +7 -6
  299. package/dist/personal-access-tokens/feature.js +5 -5
  300. package/dist/personal-access-tokens/roles.js +2 -2
  301. package/dist/readiness/handlers/status.query.js +3 -3
  302. package/dist/renderer-foundation/api.js +12 -13
  303. package/dist/renderer-foundation/constants.js +2 -2
  304. package/dist/renderer-foundation/feature.js +7 -7
  305. package/dist/secrets/feature.js +9 -9
  306. package/dist/secrets/web/constants.js +2 -2
  307. package/dist/seo/feature.js +3 -3
  308. package/dist/sessions/constants.d.ts +1 -1
  309. package/dist/sessions/constants.js +1 -1
  310. package/dist/sessions/feature.js +8 -8
  311. package/dist/sessions/handlers/revoke-all-for-user.write.js +2 -2
  312. package/dist/sessions/handlers/revoke-all-others.write.js +2 -2
  313. package/dist/sessions/handlers/revoke.write.js +1 -1
  314. package/dist/sessions/schema/user-session.js +4 -4
  315. package/dist/sessions/screens.js +2 -2
  316. package/dist/sessions/session-callbacks.js +2 -2
  317. package/dist/sessions/session-revoked-event.js +2 -2
  318. package/dist/shared/assert-no-where-rule-in-ownership-write.js +1 -1
  319. package/dist/shared/decrypt-stored-pii.js +1 -1
  320. package/dist/shared/encrypt-for-direct-write.js +1 -1
  321. package/dist/shared/map-with-concurrency.js +5 -4
  322. package/dist/shared/parent-visibility.js +2 -2
  323. package/dist/shared/password-hashing.js +1 -1
  324. package/dist/shared/signup-handover.js +1 -2
  325. package/dist/shared/single-use-token-store.js +1 -1
  326. package/dist/subscription-mollie/constants.js +15 -17
  327. package/dist/subscription-mollie/feature.d.ts +17 -18
  328. package/dist/subscription-mollie/feature.js +24 -24
  329. package/dist/subscription-mollie/index.js +3 -3
  330. package/dist/subscription-mollie/plugin-methods.d.ts +2 -2
  331. package/dist/subscription-mollie/plugin-methods.js +15 -14
  332. package/dist/subscription-mollie/verify-webhook.d.ts +10 -10
  333. package/dist/subscription-mollie/verify-webhook.js +27 -27
  334. package/dist/subscription-stripe/constants.js +4 -6
  335. package/dist/subscription-stripe/feature.d.ts +14 -14
  336. package/dist/subscription-stripe/feature.js +35 -34
  337. package/dist/subscription-stripe/index.js +6 -6
  338. package/dist/subscription-stripe/plugin-methods.js +18 -18
  339. package/dist/subscription-stripe/runtime.d.ts +1 -1
  340. package/dist/subscription-stripe/runtime.js +1 -1
  341. package/dist/subscription-stripe/verify-webhook.d.ts +11 -11
  342. package/dist/subscription-stripe/verify-webhook.js +59 -61
  343. package/dist/tags/feature.d.ts +3 -3
  344. package/dist/tags/screens.js +1 -1
  345. package/dist/template-resolver/api.js +10 -10
  346. package/dist/template-resolver/handlers/find-by-id.query.js +5 -5
  347. package/dist/template-resolver/handlers/list.query.js +1 -1
  348. package/dist/template-resolver/handlers/shared.js +2 -2
  349. package/dist/template-resolver/handlers/template-write.js +3 -3
  350. package/dist/template-resolver/handlers/upsert-system.write.js +3 -4
  351. package/dist/template-resolver/handlers/upsert-tenant.write.js +4 -5
  352. package/dist/template-resolver/seeding.js +4 -4
  353. package/dist/template-resolver/table.js +10 -11
  354. package/dist/template-resolver/web/client-plugin.js +2 -2
  355. package/dist/tenant/feature.js +7 -7
  356. package/dist/tenant/handlers/member-directory.query.js +1 -1
  357. package/dist/tenant/handlers/members.query.js +1 -1
  358. package/dist/tenant/handlers/team-list.query.js +1 -1
  359. package/dist/tenant/handlers/tenant-directory.query.js +1 -1
  360. package/dist/tenant/invitation-table.js +37 -40
  361. package/dist/tenant/membership-table.js +3 -3
  362. package/dist/tenant/schema/tenant.js +7 -9
  363. package/dist/tenant/screens.js +1 -1
  364. package/dist/tenant/seeding.d.ts +6 -5
  365. package/dist/tenant/seeding.js +12 -12
  366. package/dist/tenant/testing.js +5 -6
  367. package/dist/tenant/web/constants.js +2 -2
  368. package/dist/tenant-handover/events.js +5 -7
  369. package/dist/tenant-handover/feature.js +1 -1
  370. package/dist/tenant-handover/grant.js +1 -1
  371. package/dist/tenant-handover/handlers/claim.write.js +1 -1
  372. package/dist/tenant-handover/move-entity-graph.js +8 -9
  373. package/dist/tenant-handover/signup-handover-provider.js +1 -2
  374. package/dist/tenant-handover/transfer-graph.js +4 -5
  375. package/dist/tenant-lifecycle/boot-checks.js +1 -1
  376. package/dist/tenant-lifecycle/feature.js +1 -1
  377. package/dist/tenant-settings/constants.js +1 -1
  378. package/dist/tenant-settings/tenant-defaults.d.ts +1 -1
  379. package/dist/tenant-settings/tenant-defaults.js +9 -2
  380. package/dist/tier-engine/aggregate-id.d.ts +11 -11
  381. package/dist/tier-engine/aggregate-id.js +15 -16
  382. package/dist/tier-engine/compose-app.d.ts +14 -14
  383. package/dist/tier-engine/compose-app.js +1 -1
  384. package/dist/tier-engine/entity.js +18 -19
  385. package/dist/tier-engine/feature.d.ts +19 -17
  386. package/dist/tier-engine/feature.js +68 -69
  387. package/dist/tier-engine/handlers/active-tier.query.js +6 -7
  388. package/dist/tier-engine/handlers/get-tenant-tier.query.js +4 -4
  389. package/dist/tier-engine/handlers/set-tenant-tier.write.d.ts +5 -5
  390. package/dist/tier-engine/handlers/set-tenant-tier.write.js +3 -3
  391. package/dist/tier-engine/tier-resolver.js +2 -2
  392. package/dist/tier-engine/trial.js +8 -8
  393. package/dist/tier-engine/web/index.js +4 -4
  394. package/dist/user/db/queries/stream-tenant-backfill.js +8 -8
  395. package/dist/user/handlers/create.write.js +4 -4
  396. package/dist/user/schema/user.d.ts +11 -11
  397. package/dist/user/schema/user.js +45 -44
  398. package/dist/user/seeding.d.ts +15 -15
  399. package/dist/user/seeding.js +28 -28
  400. package/dist/user/testing.js +3 -3
  401. package/dist/user-data-rights/audit-download.d.ts +8 -8
  402. package/dist/user-data-rights/audit-download.js +19 -20
  403. package/dist/user-data-rights/boot-checks.js +1 -1
  404. package/dist/user-data-rights/deletion-token.js +1 -1
  405. package/dist/user-data-rights/feature.d.ts +49 -50
  406. package/dist/user-data-rights/feature.js +54 -53
  407. package/dist/user-data-rights/handlers/cancel-deletion.write.js +9 -9
  408. package/dist/user-data-rights/handlers/confirm-deletion-by-token.write.js +8 -8
  409. package/dist/user-data-rights/handlers/download-by-job.query.js +29 -30
  410. package/dist/user-data-rights/handlers/download-by-token.query.js +40 -42
  411. package/dist/user-data-rights/handlers/export-status.query.js +8 -9
  412. package/dist/user-data-rights/handlers/lift-restriction.write.js +7 -8
  413. package/dist/user-data-rights/handlers/list-download-attempts.query.js +2 -2
  414. package/dist/user-data-rights/handlers/my-audit-log.query.js +4 -4
  415. package/dist/user-data-rights/handlers/request-deletion-by-email.write.d.ts +5 -5
  416. package/dist/user-data-rights/handlers/request-deletion-by-email.write.js +16 -15
  417. package/dist/user-data-rights/handlers/request-deletion.write.d.ts +2 -2
  418. package/dist/user-data-rights/handlers/request-deletion.write.js +7 -9
  419. package/dist/user-data-rights/handlers/request-export.write.js +42 -41
  420. package/dist/user-data-rights/handlers/restrict-account.write.js +22 -19
  421. package/dist/user-data-rights/handlers/run-forget-cleanup.write.js +8 -8
  422. package/dist/user-data-rights/index.js +8 -10
  423. package/dist/user-data-rights/lib/default-mailers.js +3 -3
  424. package/dist/user-data-rights/lib/update-user-lifecycle.js +14 -17
  425. package/dist/user-data-rights/run-export-jobs.d.ts +38 -42
  426. package/dist/user-data-rights/run-export-jobs.js +127 -233
  427. package/dist/user-data-rights/run-forget-cleanup.d.ts +16 -20
  428. package/dist/user-data-rights/run-forget-cleanup.js +63 -82
  429. package/dist/user-data-rights/run-user-export.d.ts +34 -33
  430. package/dist/user-data-rights/run-user-export.js +55 -57
  431. package/dist/user-data-rights/schema/download-attempt.js +11 -11
  432. package/dist/user-data-rights/schema/download-token.js +37 -41
  433. package/dist/user-data-rights/schema/export-job.d.ts +4 -4
  434. package/dist/user-data-rights/schema/export-job.js +65 -67
  435. package/dist/user-data-rights/token-helpers.d.ts +8 -9
  436. package/dist/user-data-rights/token-helpers.js +21 -25
  437. package/dist/user-data-rights/web/client-plugin.d.ts +5 -5
  438. package/dist/user-data-rights/web/client-plugin.js +1 -1
  439. package/dist/user-data-rights/web/confirm-deletion-screen.js +6 -5
  440. package/dist/user-data-rights/web/constants.js +1 -1
  441. package/dist/user-data-rights/web/index.js +5 -5
  442. package/dist/user-data-rights/web/privacy-center-screen.js +14 -13
  443. package/dist/user-data-rights/web/public-deletion-gate.d.ts +4 -4
  444. package/dist/user-data-rights/web/request-deletion-screen.js +6 -6
  445. package/dist/user-data-rights/zip-path.d.ts +15 -15
  446. package/dist/user-data-rights/zip-path.js +41 -40
  447. package/dist/user-data-rights-defaults/feature.js +15 -15
  448. package/dist/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.js +3 -5
  449. package/dist/user-data-rights-defaults/hooks/file-ref.userdata-hook.js +45 -51
  450. package/dist/user-data-rights-defaults/hooks/job-run.userdata-hook.js +2 -2
  451. package/dist/user-data-rights-defaults/hooks/notification-preference.userdata-hook.js +1 -1
  452. package/dist/user-data-rights-defaults/hooks/user-session.userdata-hook.js +3 -3
  453. package/dist/user-data-rights-defaults/hooks/user.userdata-hook.js +32 -31
  454. package/dist/user-profile/handlers/change-email.write.js +13 -13
  455. package/dist/user-profile/index.js +3 -3
  456. package/dist/user-profile/web/client-plugin.js +1 -1
  457. package/dist/user-profile/web/constants.js +1 -1
  458. package/dist/user-profile/web/profile-screen.js +1 -1
  459. package/dist/workflow-runner/aggregate-id.d.ts +1 -1
  460. package/dist/workflow-runner/aggregate-id.js +1 -1
  461. package/dist/workflow-runner/event-subscriber.js +4 -5
  462. package/dist/workflow-runner/event-trigger.js +4 -17
  463. package/dist/workflow-runner/feature.js +2 -2
  464. package/dist/workflow-runner/handlers/resume-run.write.js +4 -4
  465. package/dist/workflow-runner/pending-projection.js +6 -7
  466. package/dist/workflow-runner/runner.js +6 -6
  467. package/dist/workflow-runner/tables.js +6 -6
  468. package/dist/workflow-runner/workflow-registry.js +1 -1
  469. package/package.json +10 -10
@@ -5,25 +5,25 @@ import { USER_ANONYMIZED_DISPLAY_NAME, USER_ANONYMIZED_EMAIL_DOMAIN, USER_ANONYM
5
5
  // projection rebuild replays the events, so the anonymization survives it.
6
6
  // A direct write would be wiped on rebuild — the Art.17 hole this fixes.
7
7
  const crud = createEventStoreExecutor(userTable, userEntity, { entityName: "user" });
8
- // userData-Hook fuer user-entity (S2.H1).
8
+ // The user-data hook for the user entity.
9
9
  //
10
- // Export-Hook liefert Profil-Daten ohne security-sensitive Felder
11
- // (passwordHash, roles, status — DSGVO Art. 20 ist Datenportabilitaet
12
- // fuer das was der User selbst zur Verfuegung gestellt hat, nicht
13
- // Lifecycle-Metadata oder Authorization-State).
10
+ // The export hook returns profile data without security-sensitive fields
11
+ // (passwordHash, roles, status — GDPR Art. 20 covers portability of data
12
+ // the user provided themselves, not lifecycle metadata or authorization
13
+ // state).
14
14
  //
15
- // Delete-Hook anonymisiert PII + setzt status=deleted. Der eigentliche
16
- // softDelete-Flag wird ueber drizzle's deletedAt-Column gesetzt; die
17
- // Row bleibt fuer Audit-Trail erhalten (alle FK-Refs auf user.id
18
- // bleiben gueltig). DSGVO-konform via PII-Anonymisierung.
15
+ // The delete hook anonymizes PII and sets status=deleted. The actual
16
+ // softDelete flag is set through Drizzle's deletedAt column; the row remains
17
+ // for the audit trail (all foreign-key references to user.id remain valid).
18
+ // This complies with GDPR through PII anonymization.
19
19
  //
20
20
  // Strategy:
21
- // "delete": softDelete + email/displayName/passwordHash leeren,
22
- // status=deleted (Login geblockt)
23
- // "anonymize": email/displayName auf Pseudonym, Row bleibt active
24
- // — fuer Cases wo User-Row als FK noch relevant ist
25
- // aber PII raus muss (z.B. anonymize mit blockDelete-
26
- // Frist auf einer FK-target-Entity)
21
+ // "delete": softDelete + clear email/displayName/passwordHash,
22
+ // status=deleted (login blocked)
23
+ // "anonymize": replace email/displayName with pseudonyms; the row remains
24
+ // active when the user row is still needed as a foreign-key
25
+ // target but PII must be removed (for example, anonymization
26
+ // with a blockDelete deadline on a foreign-key target entity)
27
27
  export const userExportHook = async (ctx) => {
28
28
  const row = await ctx.db.fetchOne(userTable, { id: ctx.userId });
29
29
  if (!row)
@@ -42,11 +42,11 @@ export const userExportHook = async (ctx) => {
42
42
  };
43
43
  };
44
44
  export const userDeleteHook = async (ctx, strategy) => {
45
- // Idempotent: zweiter Call findet die Row schon anonymized + skipt
46
- // implicit (UPDATE mit gleichen Werten). Memory feedback_event_store_
47
- // tenant_consistency: ctx.tenantId muss in der user-table-Zeile
48
- // korrelieren — user.id ist tenant-agnostic (User kann in mehreren
49
- // Tenants Member sein), kein tenantId-Filter noetig.
45
+ // Idempotent: a second call finds the row already anonymized and skips
46
+ // implicitly (UPDATE with the same values). Event-store tenant
47
+ // consistency requires ctx.tenantId to correlate with the row in
48
+ // the user table — user.id is tenant-agnostic (a user can be a member in
49
+ // multiple tenants), so no tenantId filter is needed.
50
50
  // System actor + skipOptimisticLock: the forget pipeline has no read
51
51
  // version and writes privileged identity columns ("system" is privileged).
52
52
  // crud.update extracts the raw connection from ctx.db via tenantDbRunner
@@ -55,12 +55,13 @@ export const userDeleteHook = async (ctx, strategy) => {
55
55
  // TenantDb's own tenant-scoping narrowing never applies to executor writes.
56
56
  const systemUser = createSystemUser(ctx.tenantId);
57
57
  if (strategy === "delete") {
58
- // PII raus + status=deleted (Login geblockt) via Event → Rebuild spielt den
59
- // Forget mit. KEIN softDelete: user ist systemStream (eine tenant-agnostische
60
- // Row), der Forget laeuft pro Tenant — wuerde isDeleted gesetzt, faende der
61
- // loadById (isDeleted:false) die Row beim zweiten Tenant nicht mehr
62
- // (not_found). status=Deleted blockt Login; die Row bleibt findbar +
63
- // idempotent ueber mehrere Tenant-Durchlaeufe (wie der alte raw UPDATE).
58
+ // Remove PII and set status=deleted via an event, so a rebuild replays
59
+ // the forget operation. Do NOT use softDelete: user is systemStream (a
60
+ // tenant-agnostic row), and forgetting runs once per tenant. Setting
61
+ // isDeleted would cause loadById (isDeleted:false) to miss the row for
62
+ // the second tenant (not_found). status=Deleted blocks login; the row
63
+ // remains findable and idempotent across tenant passes, as with the old
64
+ // raw UPDATE.
64
65
  await crud.update({
65
66
  id: ctx.userId,
66
67
  changes: {
@@ -75,11 +76,11 @@ export const userDeleteHook = async (ctx, strategy) => {
75
76
  }, systemUser, ctx.db, { skipOptimisticLock: true, writePurpose: WritePurposes.erasure });
76
77
  }
77
78
  else {
78
- // anonymize: PII raus, aber Row bleibt active (damit FK-References
79
- // weiter aufloesbar sind). Account ist effektiv weiter nutzbar
80
- // wenn der User sich neu authentifiziert — pragmatisch akzeptabel
81
- // weil "anonymize" auf user-entity ein seltener Edge-Case ist
82
- // (typisch hard-delete fuer User).
79
+ // Anonymize PII, but keep the row active so foreign-key references
80
+ // remain resolvable. The account can still be used if the user
81
+ // authenticates again — pragmatically acceptable because "anonymize"
82
+ // on the user entity is a rare edge case (hard deletion is typical for
83
+ // users).
83
84
  await crud.update({
84
85
  id: ctx.userId,
85
86
  changes: {
@@ -5,22 +5,22 @@ import { AuthErrors } from "../../auth-email-password/index.js";
5
5
  import { decryptStoredPii, verifyPassword } from "../../shared/index.js";
6
6
  import { UserErrors, UserHandlers, UserQueries } from "../../user/index.js";
7
7
  import { UserProfileErrors } from "../web/constants.js";
8
- // Gleiche Failure-Shape wie auth-email-password (anti-enumeration):
9
- // dessen errors.ts ist nicht Teil des Feature-Barrels, der Reason-Code
10
- // + i18nKey sind aber stabile Public-API.
8
+ // Same failure shape as auth-email-password (anti-enumeration):
9
+ // its errors.ts is not part of the feature barrel, but the reason code
10
+ // and i18nKey are stable public API.
11
11
  // @wrapper-known error-helper
12
12
  function invalidCredentials() {
13
13
  return writeFailure(new UnprocessableError(AuthErrors.invalidCredentials, {
14
14
  i18nKey: "auth.errors.invalidCredentials",
15
15
  }));
16
16
  }
17
- // Change-email — authenticated, self-only. Der User bestätigt mit seinem
18
- // aktuellen Passwort (Re-Auth wie change-password); die neue Adresse wird
19
- // via ctx.writeAs(system) gegen den user-update-Handler geschrieben, weil
20
- // `email` field-level privileged ist und bei Self-Updates sonst silent
21
- // gestrippt würde. emailVerified flippt auf false — die App triggert
22
- // anschließend den Verification-Flow (request-email-verification ist
23
- // public; der ProfileScreen ruft ihn nach Erfolg auf).
17
+ // Change-email — authenticated, self-only. The user confirms with their
18
+ // current password (re-authentication as with change-password); the new
19
+ // address is written through the user-update handler via ctx.writeAs(system)
20
+ // because `email` is field-level privileged and would otherwise be silently
21
+ // stripped during self-updates. emailVerified is set to false — the app then
22
+ // triggers the verification flow (request-email-verification is public; the
23
+ // ProfileScreen calls it after success).
24
24
  export const changeEmailWrite = defineWriteHandler({
25
25
  name: "change-email",
26
26
  schema: z.object({
@@ -67,9 +67,9 @@ export const changeEmailWrite = defineWriteHandler({
67
67
  i18nKey: "user.errors.emailAlreadyExists",
68
68
  }));
69
69
  }
70
- // user ist systemStream (#497): der Event-Stream liegt deterministisch
71
- // auf SYSTEM_TENANT_ID. Pre-#497-Streams brauchen einmalig
72
- // backfillUserStreamTenants (#762).
70
+ // user is systemStream: the event stream is deterministically located
71
+ // on SYSTEM_TENANT_ID. Older streams require a one-time
72
+ // backfillUserStreamTenants.
73
73
  const writer = createSystemUser(SYSTEM_TENANT_ID);
74
74
  const writeRes = await ctx.writeAs(writer, UserHandlers.update, {
75
75
  id: me.id,
@@ -1,5 +1,5 @@
1
- // Bewusst OHNE i18n-Export: das Server-Barrel muss von Server-Samples
2
- // ohne jsx-tsconfig kompilierbar bleiben (i18n zieht kumiko-renderer →
3
- // .tsx). Translations kommen via ./web (userProfileClient).
1
+ // Deliberately no i18n export: the server barrel must remain compilable by server samples
2
+ // without a JSX tsconfig (i18n pulls in kumiko-renderer → .tsx). Translations are provided
3
+ // through ./web (userProfileClient).
4
4
  export { createUserProfileFeature } from "./feature.js";
5
5
  export { USER_PROFILE_FEATURE, UserDataRightsHandlers, UserProfileErrors, UserProfileHandlers, UserProfileQueries, } from "./web/constants.js";
@@ -3,7 +3,7 @@ import { CHANGE_EMAIL_SECTION_EXTENSION_NAME, CHANGE_PASSWORD_SECTION_EXTENSION_
3
3
  import { defaultTranslations } from "./i18n.js";
4
4
  import { ChangeEmailSection, ChangePasswordSection } from "./profile-screen.js";
5
5
  // Supplies the ChangeEmail/ChangePassword extension components for the
6
- // declarative `profile` projectionDetail screen (fw#2312, ../feature.ts,
6
+ // declarative `profile` projectionDetail screen (../feature.ts,
7
7
  // registered there server-side) plus the default translations. Apps add it
8
8
  // via createKumikoApp({ clientFeatures: [userProfileClient()] }) and place
9
9
  // the screen (id "profile") via r.nav — the screen itself has no r.nav of
@@ -2,7 +2,7 @@
2
2
  // import them; runtime code (handlers/feature) may pull client files anyway.
3
3
  export const USER_PROFILE_FEATURE = "user-profile";
4
4
  export const PROFILE_SCREEN_ID = "profile";
5
- // EditExtensionSection `__component` markers (fw#2312) — change-password and
5
+ // EditExtensionSection `__component` markers — change-password and
6
6
  // change-email stay React components (re-auth flows a declarative action
7
7
  // can't express); deletion moved to declarative fields/actions on the screen
8
8
  // itself (feature.ts), same split as user-data-rights' privacy-center.
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // Change-password and change-email sections for the declarative `profile`
3
- // projectionDetail screen (fw#2312, ../feature.ts). Both keep re-auth flows
3
+ // projectionDetail screen (../feature.ts). Both keep re-auth flows
4
4
  // a declarative action can't express, so they stay React `EditExtensionSection`
5
5
  // components; account deletion moved to declarative fields/actions on the
6
6
  // screen itself — same split as user-data-rights' privacy-center
@@ -6,6 +6,6 @@
6
6
  * race on `expectedVersion` and have the loser fail the unique constraint
7
7
  * instead of silently double-running. It does NOT dedup sequential
8
8
  * re-triggers of the same key — those land as version 2, 3, ... on the same
9
- * stream and each starts its own run; that's out of scope for #2478.
9
+ * stream and each starts its own run; that's out of scope.
10
10
  */
11
11
  export declare function workflowRunAggregateId(workflowName: string, key: string): string;
@@ -10,7 +10,7 @@ const WORKFLOW_RUN_NAMESPACE = "1f8a6c3e-7d2b-4a91-9e3f-5c8b2a41d6f0";
10
10
  * race on `expectedVersion` and have the loser fail the unique constraint
11
11
  * instead of silently double-running. It does NOT dedup sequential
12
12
  * re-triggers of the same key — those land as version 2, 3, ... on the same
13
- * stream and each starts its own run; that's out of scope for #2478.
13
+ * stream and each starts its own run; that's out of scope.
14
14
  */
15
15
  // @wrapper-known uuid-domain
16
16
  export function workflowRunAggregateId(workflowName, key) {
@@ -1,6 +1,5 @@
1
1
  // event-subscriber — wakes up pending waitForEvent suspensions when their
2
- // awaited domain event arrives (framework#2513 Phase 3b, D4 in
3
- // workflow-resume-loop.md).
2
+ // awaited domain event arrives (in workflow-resume-loop.md).
4
3
  //
5
4
  // registerEventTrigger (event-trigger.ts) calls registerEventWakeup for
6
5
  // every workflow it registers, building ONE MultiStreamProjection PER
@@ -17,12 +16,12 @@
17
16
  // already in hand, has no such hazard — same reasoning event-trigger.ts
18
17
  // already applies to the run-start MSP.
19
18
  //
20
- // This subscriber never resumes a run itself (D3, workflow-resume-loop.md):
19
+ // This subscriber never resumes a run itself (in workflow-resume-loop.md):
21
20
  // the MultiStreamApplyContext it runs in has no callFeature/runStepList
22
21
  // access, only unsafeAppendEvent/loadAggregate. It writes triggerEventType
23
22
  // + triggerEventRef + wakeAt=now() onto the matching pending row(s); the
24
- // existing resume-due-runs job (Phase 2) picks the row up on its next
25
- // cron tick — the one resume path stays exactly the one Phase 2 built.
23
+ // existing resume-due-runs job picks the row up on its next
24
+ // cron tick — the resume path remains unchanged.
26
25
  import { selectMany, updateMany } from "@cosmicdrift/kumiko-framework/db";
27
26
  import { evaluateEventMatch } from "@cosmicdrift/kumiko-framework/engine";
28
27
  import { createFallbackLogger } from "@cosmicdrift/kumiko-framework/logging";
@@ -8,7 +8,7 @@
8
8
  // wiring uses the unbound pool), so `workflow.run-started` and the rest of
9
9
  // the pipeline are not atomic. A throw from startAndRunWorkflow is recorded
10
10
  // as `workflow.run-failed` and swallowed, so the dispatcher moves on.
11
- import { buildPipelineSteps, createSystemUser, describeWorkflowStepError, getStep, SYSTEM_TENANT_ID, unwrapWorkflowStepError, WORKFLOW_AGGREGATE_TYPE, WORKFLOW_RUN_FAILED_TYPE, WorkflowStepError, } from "@cosmicdrift/kumiko-framework/engine";
11
+ import { buildPipelineSteps, createSystemUser, describeWorkflowStepError, getStep, SYSTEM_TENANT_ID, unwrapWorkflowStepError, WORKFLOW_AGGREGATE_TYPE, WORKFLOW_RUN_FAILED_TYPE, WorkflowStepError, walkStepInstances, } from "@cosmicdrift/kumiko-framework/engine";
12
12
  import { createFallbackLogger } from "@cosmicdrift/kumiko-framework/logging";
13
13
  import { workflowRunAggregateId } from "./aggregate-id.js";
14
14
  import { registerEventWakeup } from "./event-subscriber.js";
@@ -26,19 +26,6 @@ const STEP_KINDS_NEEDING_HANDLER_CONTEXT = new Set([
26
26
  "unsafeProjectionUpsert",
27
27
  "unsafeProjectionDelete",
28
28
  ]);
29
- function* walkStepInstances(steps) {
30
- for (const step of steps) {
31
- yield step;
32
- const { args } = step;
33
- if (typeof args !== "object" || args === null)
34
- continue;
35
- for (const path of getStep(step.kind)?.subPaths ?? []) {
36
- const nested = path in args ? Reflect.get(args, path) : undefined;
37
- if (Array.isArray(nested))
38
- yield* walkStepInstances(nested);
39
- }
40
- }
41
- }
42
29
  export function assertEventTriggerStepsSupported(workflow) {
43
30
  let steps;
44
31
  try {
@@ -54,7 +41,7 @@ export function assertEventTriggerStepsSupported(workflow) {
54
41
  throw new Error(`Workflow "${workflow.name}" pipeline closure threw at registration: ${String(error)}. ` +
55
42
  "Build the step list without reading event payload fields; read them inside step resolvers.", { cause: error });
56
43
  }
57
- for (const step of walkStepInstances(steps)) {
44
+ for (const step of walkStepInstances(steps, `workflow "${workflow.name}" eventTrigger`)) {
58
45
  if (getStep(step.kind) === undefined) {
59
46
  throw new Error(`Workflow "${workflow.name}" uses unknown step kind "${step.kind}"`);
60
47
  }
@@ -66,12 +53,12 @@ export function assertEventTriggerStepsSupported(workflow) {
66
53
  }
67
54
  export function registerEventTrigger(r, workflow) {
68
55
  // Populate the workflow-registry unconditionally, before the event-trigger
69
- // guard below — resume-run (framework#2513 Phase 2) looks workflows up by
56
+ // guard below — resume-run looks workflows up by
70
57
  // name regardless of trigger kind, and a cron-triggered workflow that never
71
58
  // reaches the MSP branch still needs to be resumable.
72
59
  registerWorkflow(workflow);
73
60
  // Independent of trigger.kind — a cron-triggered workflow can still have
74
- // waitForEvent steps in its pipeline (framework#2513 Phase 3b, D4).
61
+ // waitForEvent steps in its pipeline.
75
62
  registerEventWakeup(r, workflow);
76
63
  // skip: cron-triggered workflows have no domain event to project off — they
77
64
  // need a scheduler, not an MSP, so there is nothing to register here.
@@ -9,8 +9,8 @@
9
9
  // `workflowRunnerFeature` documents that dependency and reserves the
10
10
  // picker/manifest slot.
11
11
  //
12
- // It also registers the resume loop (framework#2513 Phase 2 + 3b):
13
- // - the workflow_run_pending MSP (Phase 1) materialises suspended
12
+ // It also registers the resume loop:
13
+ // - the workflow_run_pending MSP materialises suspended
14
14
  // wait/waitForEvent/retry steps into a pending-set table
15
15
  // - the `resume-due-runs` cron job (perTenant) scans that table for
16
16
  // `wakeAt < now()` rows and dispatches `resume-run` per row — the job
@@ -1,10 +1,10 @@
1
1
  // resume-run — wakes one suspended workflow step. Dispatched by the
2
- // resume-due-runs job (framework#2513 Phase 2), never called directly by a
2
+ // resume-due-runs job, never called directly by a
3
3
  // user — r.systemScope() + access: { roles: [SYSTEM_ROLE] } enforce that.
4
4
  //
5
5
  // The job does nothing but SELECT + dispatch; all resume logic lives here,
6
6
  // adapted from samples/recipes/workflow-engine/src/resume-loop.ts:
7
- // 1. Q7 fingerprint check FIRST — before claiming, before any pipeline
7
+ // 1. Fingerprint check FIRST — before claiming, before any pipeline
8
8
  // work. A changed workflow definition fails loud (WORKFLOW_RUN_FAILED,
9
9
  // reason "workflow_definition_changed"), never a silent skip.
10
10
  // 2. Claim via a savepoint-scoped WORKFLOW_RESUMED append (ctx.tryAppendEvent,
@@ -23,8 +23,8 @@
23
23
  // shows up here in its shredded form, and an unloadable one (archived
24
24
  // stream) fails the run. The pending row's own
25
25
  // triggerEventType/triggerEventRef columns are a DIFFERENT thing: for a
26
- // waitForEvent suspension they point at the AWAITED event the Phase 3b
27
- // event-subscriber matched (NULL until then, and NULL forever on a
26
+ // waitForEvent suspension they point at the AWAITED event the event-subscriber
27
+ // matched (NULL until then, and NULL forever on a
28
28
  // timeout-without-a-match). That event's payload becomes the resumed
29
29
  // pipeline's result for the skipped waitForEvent step itself (see
30
30
  // resultKey on steps/wait-for-event.ts) — pre-seeded into stepsAcc below so
@@ -4,13 +4,12 @@
4
4
  // Insert (upsert, for idempotent at-least-once redelivery) on every
5
5
  // suspension: wait, waitForEvent, retry. Delete on WORKFLOW_RESUMED or a
6
6
  // terminal run outcome (completed/failed) — a run only ever has one row
7
- // pending at a time (D1: a later suspension always targets a fresh
8
- // stepIndex, since the prior one was resumed away first), so deleting by
7
+ // pending at a time (a later suspension always targets a fresh stepIndex,
8
+ // since the prior one was resumed away first), so deleting by
9
9
  // (tenantId, runId) alone is exact.
10
10
  //
11
- // No resume logic here — framework#2513 Phase 2 owns the job that reads
12
- // this table and dispatches the actual resume. This projection only writes
13
- // the rows.
11
+ // No resume logic here — the job that reads this table and dispatches the
12
+ // actual resume is separate. This projection only writes the rows.
14
13
  import { deleteMany, fetchOne, upsertOnConflict } from "@cosmicdrift/kumiko-framework/db";
15
14
  import { WORKFLOW_RESUMED_TYPE, WORKFLOW_RETRY_SCHEDULED_TYPE, WORKFLOW_RUN_COMPLETED_TYPE, WORKFLOW_RUN_FAILED_TYPE, WORKFLOW_WAITING_FOR_EVENT_TYPE, WORKFLOW_WAITING_TYPE, } from "@cosmicdrift/kumiko-framework/engine";
16
15
  import { workflowRunPendingTable } from "./tables.js";
@@ -24,8 +23,8 @@ async function upsertPending(tx, row) {
24
23
  return;
25
24
  await upsertOnConflict(tx, workflowRunPendingTable, {
26
25
  ...row,
27
- // Phase 3's event-subscriber writes these when the awaited event
28
- // arrives — Phase 1 never touches them, insert or update.
26
+ // The event-subscriber writes these when the awaited event
27
+ // arrives — they are never touched here, on insert or update.
29
28
  triggerEventType: null,
30
29
  triggerEventRef: null,
31
30
  triggerPayload: null,
@@ -2,12 +2,12 @@
2
2
  // pipeline until first suspension or completion, and writing run-completed.
3
3
  //
4
4
  // wait / retry / waitForEvent suspensions are all resumable — the
5
- // resume-due-runs job + resume-run handler (framework#2513 Phase 2) wake
6
- // wait/retry via a plain wakeAt timeout; waitForEvent additionally gets
7
- // woken early by the event-subscriber (Phase 3b, event-subscriber.ts) when
8
- // its awaited event arrives, and by the same wakeAt timeout otherwise
9
- // (D1's `wakeAt ?? timeoutAt`). startAndRunWorkflow returns a silent
10
- // "suspended" outcome for all three instead of throwing.
5
+ // resume-due-runs job + resume-run handler wake wait/retry via a plain
6
+ // wakeAt timeout; waitForEvent additionally gets woken early by the
7
+ // event-subscriber (event-subscriber.ts) when its awaited event arrives,
8
+ // and by the same wakeAt timeout otherwise (D1's `wakeAt ?? timeoutAt`).
9
+ // startAndRunWorkflow returns a silent "suspended" outcome for all three
10
+ // instead of throwing.
11
11
  import { buildPipelineSteps, computeDefinitionFingerprint, runStepList, WORKFLOW_AGGREGATE_TYPE, WORKFLOW_RUN_COMPLETED_TYPE, WORKFLOW_RUN_STARTED_TYPE, } from "@cosmicdrift/kumiko-framework/engine";
12
12
  // Suspensions the resume loop knows how to wake — every Tier-3 step that
13
13
  // can return SUSPEND_SENTINEL. Kept as an explicit allowlist (not "every
@@ -1,11 +1,11 @@
1
1
  import { defineUnmanagedTable, index, instant, integer, jsonb, table as pgTable, primaryKey, text, uuid, } from "@cosmicdrift/kumiko-framework/db";
2
2
  // workflow_run_pending — one row per currently-suspended workflow step.
3
- // Read-side of the resume loop (framework#2513 Phase 1): the wait /
3
+ // Read-side of the resume loop: the wait /
4
4
  // waitForEvent / retry steps already write their suspension onto the
5
5
  // workflow-run event stream, but scanning kumiko_events for due runs
6
6
  // doesn't scale (see samples/recipes/workflow-engine/postgres-resume-loop.ts,
7
7
  // which does exactly that). This table is kept in sync by
8
- // pending-projection.ts's MultiStreamProjection so Phase 2's resume job can
8
+ // pending-projection.ts's MultiStreamProjection so the resume job can
9
9
  // do an indexed `wakeAt < now()` scan instead.
10
10
  //
11
11
  // **Unmanaged table** — same reasoning as delivery/tables.ts'
@@ -19,7 +19,7 @@ import { defineUnmanagedTable, index, instant, integer, jsonb, table as pgTable,
19
19
  // key only, see aggregate-id.ts), so two tenants triggering the same
20
20
  // workflow with the same idempotencyKey get the SAME run_id. Without
21
21
  // tenant_id in the key, a same-stepIndex suspension from tenant B would
22
- // upsert onto tenant A's row and silently steal it (framework#2513).
22
+ // upsert onto tenant A's row and silently steal it.
23
23
  export const workflowRunPendingTable = pgTable("workflow_run_pending", {
24
24
  runId: uuid("run_id").notNull(),
25
25
  tenantId: uuid("tenant_id").notNull(),
@@ -31,14 +31,14 @@ export const workflowRunPendingTable = pgTable("workflow_run_pending", {
31
31
  // which step suspended.
32
32
  wakeAt: instant("wake_at").notNull(),
33
33
  retryAttempt: integer("retry_attempt"),
34
- // Q7 snapshot fingerprint — Phase 2 compares this against the current
34
+ // Snapshot fingerprint — compares this against the current
35
35
  // workflow definition's fingerprint before resuming.
36
36
  definitionFingerprint: text("definition_fingerprint"),
37
37
  // Set only for waitForEvent suspensions; NULL for wait/retry.
38
38
  waitEventType: text("wait_event_type"),
39
39
  matchExpr: jsonb("match_expr"),
40
- // Written by the Phase 3 event-subscriber when the awaited event
41
- // arrives — always NULL in Phase 1/2. The row points at the awaited event
40
+ // Written by the event subscriber when the awaited event
41
+ // arrives — always NULL initially. The row points at the awaited event
42
42
  // ({ eventId, aggregateId, version }); resume-run re-reads it from the
43
43
  // event store, so erasing the event also covers the workflow.
44
44
  triggerEventType: text("trigger_event_type"),
@@ -1,6 +1,6 @@
1
1
  // workflow-registry — process-local lookup from workflow name to its
2
2
  // WorkflowDefinition. registerEventTrigger populates it at feature-
3
- // registration time; resume-run (Phase 2) is the only reader — it has
3
+ // registration time; resume-run is the only reader — it has
4
4
  // nothing but a workflow name on the pending row and needs the live
5
5
  // definition to rebuild the pipeline + recompute the Q7 fingerprint.
6
6
  //
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-bundled-features",
3
- "version": "0.386.0",
3
+ "version": "0.387.0",
4
4
  "description": "Built-in features — tenant, user, auth, delivery. The stuff you'd rewrite anyway, already typed.",
5
- "license": "BUSL-1.1",
5
+ "license": "MIT",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
7
7
  "repository": {
8
8
  "type": "git",
@@ -544,9 +544,9 @@
544
544
  }
545
545
  },
546
546
  "dependencies": {
547
- "@cosmicdrift/kumiko-framework": "0.386.0",
548
- "@cosmicdrift/kumiko-renderer": "0.386.0",
549
- "@cosmicdrift/kumiko-types": "0.386.0",
547
+ "@cosmicdrift/kumiko-framework": "0.387.0",
548
+ "@cosmicdrift/kumiko-renderer": "0.387.0",
549
+ "@cosmicdrift/kumiko-types": "0.387.0",
550
550
  "@mollie/api-client": "^4.5.0",
551
551
  "@node-rs/argon2": "^2.0.2",
552
552
  "@tiptap/core": "3.31.3",
@@ -1116,15 +1116,15 @@
1116
1116
  ],
1117
1117
  "devDependencies": {
1118
1118
  "@testing-library/user-event": "^14.6.1",
1119
- "@cosmicdrift/kumiko-locale-de": "0.386.0",
1120
- "@cosmicdrift/kumiko-locale-es": "0.386.0",
1121
- "@cosmicdrift/kumiko-renderer-mail-html": "0.386.0",
1119
+ "@cosmicdrift/kumiko-locale-de": "0.387.0",
1120
+ "@cosmicdrift/kumiko-locale-es": "0.387.0",
1121
+ "@cosmicdrift/kumiko-renderer-mail-html": "0.387.0",
1122
1122
  "jsqr": "^1.4.0",
1123
1123
  "unpdf": "^1.8.1",
1124
- "@cosmicdrift/kumiko-testing": "0.386.0"
1124
+ "@cosmicdrift/kumiko-testing": "0.387.0"
1125
1125
  },
1126
1126
  "peerDependencies": {
1127
- "@cosmicdrift/kumiko-testing": "0.386.0"
1127
+ "@cosmicdrift/kumiko-testing": "0.387.0"
1128
1128
  },
1129
1129
  "peerDependenciesMeta": {
1130
1130
  "@cosmicdrift/kumiko-testing": {