@cosmicdrift/kumiko-samples 0.386.0 → 0.388.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -57
- package/README.md +1 -1
- package/package.json +2 -2
- package/packages/bundled-features/package.json +9 -2
- package/packages/bundled-features/src/agent-tools/changes.json +6 -0
- package/packages/bundled-features/src/agent-tools/tool-catalog.ts +1 -1
- package/packages/bundled-features/src/agent-tools/tool-dispatch.ts +9 -9
- package/packages/bundled-features/src/audit/changes.json +12 -0
- package/packages/bundled-features/src/audit/handlers/audit-events.ts +1 -1
- package/packages/bundled-features/src/audit/screens.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/auth-user-row.ts +10 -10
- package/packages/bundled-features/src/auth-email-password/feature.ts +6 -6
- package/packages/bundled-features/src/auth-email-password/handlers/change-password.write.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/handlers/confirm-token-flow.ts +5 -5
- package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/invite-accept.write.ts +18 -18
- package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +12 -12
- package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/invite-signup-complete.write.ts +24 -26
- package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/self-registration-status.query.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/signup-confirm.write.ts +34 -37
- package/packages/bundled-features/src/auth-email-password/handlers/signup-request.write.ts +6 -7
- package/packages/bundled-features/src/auth-email-password/handlers/switch-tenant-mfa-gate.write.ts +1 -5
- package/packages/bundled-features/src/auth-email-password/index.ts +5 -5
- package/packages/bundled-features/src/auth-email-password/lockout-store.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/seeding.ts +63 -66
- package/packages/bundled-features/src/auth-email-password/signup-token-store.ts +8 -8
- package/packages/bundled-features/src/auth-email-password/testing.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +57 -57
- package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +14 -14
- package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +15 -16
- package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +11 -12
- package/packages/bundled-features/src/auth-email-password/web/confirm-account-unlock-screen.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/constants.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +14 -14
- package/packages/bundled-features/src/auth-email-password/web/forgot-password-screen.tsx +11 -11
- package/packages/bundled-features/src/auth-email-password/web/index.ts +5 -5
- package/packages/bundled-features/src/auth-email-password/web/invite-accept-screen.tsx +17 -17
- package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +3 -4
- package/packages/bundled-features/src/auth-email-password/web/reset-password-screen.tsx +16 -17
- package/packages/bundled-features/src/auth-email-password/web/session.tsx +34 -34
- package/packages/bundled-features/src/auth-email-password/web/signup-complete-screen.tsx +3 -3
- package/packages/bundled-features/src/auth-email-password/web/signup-screen.tsx +14 -14
- package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +26 -27
- package/packages/bundled-features/src/auth-email-password/web/use-shell-user.ts +12 -13
- package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +17 -18
- package/packages/bundled-features/src/auth-email-password/web/verify-email-screen.tsx +11 -12
- package/packages/bundled-features/src/auth-foundation/boot-checks.ts +4 -4
- package/packages/bundled-features/src/auth-foundation/resolve-anonymous-access.ts +4 -4
- package/packages/bundled-features/src/auth-foundation/types.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/changes.json +6 -0
- package/packages/bundled-features/src/auth-mfa/feature-exports.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/feature.ts +6 -0
- package/packages/bundled-features/src/auth-mfa/handlers/disable.write.ts +3 -3
- package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +4 -4
- package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm.write.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/reencrypt.job.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/regenerate-recovery.write.ts +5 -5
- package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/token-secrets.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/web/client-plugin.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/web/i18n.ts +9 -4
- package/packages/bundled-features/src/auth-mfa/web/index.ts +4 -4
- package/packages/bundled-features/src/auth-mfa/web/mfa-client.ts +17 -16
- package/packages/bundled-features/src/auth-mfa/web/mfa-code-or-recovery-field.tsx +68 -0
- package/packages/bundled-features/src/auth-mfa/web/mfa-disable-dialog.tsx +23 -13
- package/packages/bundled-features/src/auth-mfa/web/mfa-regenerate-recovery-dialog.tsx +23 -13
- package/packages/bundled-features/src/auth-mfa/web/mfa-setup-preauth-screen.tsx +15 -6
- package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +71 -24
- package/packages/bundled-features/src/billing-foundation/aggregate-id.ts +10 -11
- package/packages/bundled-features/src/billing-foundation/changes.json +55 -0
- package/packages/bundled-features/src/billing-foundation/checkout-core.ts +32 -42
- package/packages/bundled-features/src/billing-foundation/consumer-protection/confirmation-mail.ts +8 -2
- package/packages/bundled-features/src/billing-foundation/consumer-protection/consent-gate.ts +2 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/issue-confirmation.ts +14 -3
- package/packages/bundled-features/src/billing-foundation/consumer-protection/mail-notifications.ts +3 -4
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-receipt-limit.ts +12 -6
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-record.ts +35 -19
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-request.ts +12 -8
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-revoke.ts +14 -8
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-texts.ts +5 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/withdrawal-period.ts +8 -10
- package/packages/bundled-features/src/billing-foundation/entities.ts +27 -27
- package/packages/bundled-features/src/billing-foundation/events.ts +23 -21
- package/packages/bundled-features/src/billing-foundation/feature.ts +45 -44
- package/packages/bundled-features/src/billing-foundation/get-subscription-for-tenant.ts +3 -5
- package/packages/bundled-features/src/billing-foundation/handlers/billing-plans.query.ts +71 -6
- package/packages/bundled-features/src/billing-foundation/handlers/create-checkout-session.write.ts +19 -17
- package/packages/bundled-features/src/billing-foundation/handlers/create-portal-session.write.ts +11 -12
- package/packages/bundled-features/src/billing-foundation/handlers/list-subscriptions.query.ts +4 -4
- package/packages/bundled-features/src/billing-foundation/handlers/plan-switch-preview.query.ts +65 -0
- package/packages/bundled-features/src/billing-foundation/handlers/process-event.write.ts +29 -22
- package/packages/bundled-features/src/billing-foundation/handlers/start-plan-checkout.write.ts +44 -8
- package/packages/bundled-features/src/billing-foundation/handlers/switch-plan.write.ts +72 -82
- package/packages/bundled-features/src/billing-foundation/handlers/sync-subscription.write.ts +14 -1
- package/packages/bundled-features/src/billing-foundation/i18n.ts +22 -0
- package/packages/bundled-features/src/billing-foundation/index.ts +2 -0
- package/packages/bundled-features/src/billing-foundation/plan-catalog.ts +62 -27
- package/packages/bundled-features/src/billing-foundation/plan-switch.ts +84 -0
- package/packages/bundled-features/src/billing-foundation/projection.ts +38 -37
- package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +3 -3
- package/packages/bundled-features/src/billing-foundation/tenant-destroy-hook.ts +7 -8
- package/packages/bundled-features/src/billing-foundation/types.ts +144 -66
- package/packages/bundled-features/src/billing-foundation/validate-options.ts +19 -0
- package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +123 -51
- package/packages/bundled-features/src/billing-foundation/web/checkout-consent-dialog.tsx +89 -42
- package/packages/bundled-features/src/billing-foundation/web/constants.ts +4 -0
- package/packages/bundled-features/src/billing-foundation/web/plan-price.ts +55 -0
- package/packages/bundled-features/src/billing-foundation/web/plan-switch-confirm-dialog.tsx +224 -0
- package/packages/bundled-features/src/billing-foundation/webhook-handler.ts +1 -1
- package/packages/bundled-features/src/cap-counter/aggregate-id.ts +8 -9
- package/packages/bundled-features/src/cap-counter/cap-reservation.ts +5 -1
- package/packages/bundled-features/src/cap-counter/changes.json +18 -0
- package/packages/bundled-features/src/cap-counter/constants.ts +11 -12
- package/packages/bundled-features/src/cap-counter/enforce-cap.ts +66 -68
- package/packages/bundled-features/src/cap-counter/entity.ts +29 -29
- package/packages/bundled-features/src/cap-counter/feature.ts +34 -35
- package/packages/bundled-features/src/cap-counter/handlers/increment-rolling.write.ts +31 -31
- package/packages/bundled-features/src/cap-counter/handlers/mark-soft-warned.write.ts +4 -5
- package/packages/bundled-features/src/cap-counter/stock-cap-guard.ts +9 -2
- package/packages/bundled-features/src/cap-counter/with-cap-enforcement.ts +3 -5
- package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +1 -3
- package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +1 -1
- package/packages/bundled-features/src/channel-email/changes.json +6 -0
- package/packages/bundled-features/src/channel-email/feature.ts +1 -1
- package/packages/bundled-features/src/channel-email/smtp-transport.ts +34 -31
- package/packages/bundled-features/src/channel-in-app/handlers/unread-count.query.ts +3 -4
- package/packages/bundled-features/src/compliance-profiles/feature.ts +15 -16
- package/packages/bundled-features/src/compliance-profiles/handlers/for-tenant.query.ts +3 -6
- package/packages/bundled-features/src/compliance-profiles/handlers/list-profiles.query.ts +5 -5
- package/packages/bundled-features/src/compliance-profiles/handlers/needs-profile.query.ts +4 -4
- package/packages/bundled-features/src/compliance-profiles/handlers/set-profile.write.ts +13 -14
- package/packages/bundled-features/src/compliance-profiles/handlers/sub-processors.query.ts +9 -11
- package/packages/bundled-features/src/compliance-profiles/resolve-for-tenant.ts +7 -7
- package/packages/bundled-features/src/compliance-profiles/schema/profile-selection.ts +18 -23
- package/packages/bundled-features/src/compliance-profiles/seeding.ts +14 -15
- package/packages/bundled-features/src/compliance-profiles-ops/handlers/tenants-missing-profile.query.ts +3 -3
- package/packages/bundled-features/src/compliance-profiles-ops/index.ts +2 -2
- package/packages/bundled-features/src/config/changes.json +12 -0
- package/packages/bundled-features/src/config/handlers/cascade.query.ts +4 -2
- package/packages/bundled-features/src/config/handlers/readiness.query.ts +7 -7
- package/packages/bundled-features/src/config/handlers/reencrypt.job.ts +4 -5
- package/packages/bundled-features/src/config/handlers/set.write.ts +4 -4
- package/packages/bundled-features/src/config/handlers/values.query.ts +4 -2
- package/packages/bundled-features/src/config/resolver.ts +4 -4
- package/packages/bundled-features/src/config/table.ts +10 -10
- package/packages/bundled-features/src/config/write-helpers.ts +28 -9
- package/packages/bundled-features/src/crypto-shredding/changes.json +6 -0
- package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +23 -21
- package/packages/bundled-features/src/custom-fields/aggregate-id.ts +16 -17
- package/packages/bundled-features/src/custom-fields/entity.ts +49 -47
- package/packages/bundled-features/src/custom-fields/events.ts +7 -8
- package/packages/bundled-features/src/custom-fields/feature.ts +70 -72
- package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +9 -8
- package/packages/bundled-features/src/custom-fields/handlers/define-tenant-field.write.ts +28 -26
- package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +6 -7
- package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +12 -13
- package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +25 -28
- package/packages/bundled-features/src/custom-fields/handlers/update-tenant-field.write.ts +6 -6
- package/packages/bundled-features/src/custom-fields/lib/field-access.ts +2 -2
- package/packages/bundled-features/src/custom-fields/lib/parse-serialized-field.ts +1 -1
- package/packages/bundled-features/src/custom-fields/lib/quota.ts +1 -1
- package/packages/bundled-features/src/custom-fields/lib/value-schema.ts +10 -12
- package/packages/bundled-features/src/custom-fields/run-retention.ts +3 -3
- package/packages/bundled-features/src/custom-fields/schemas.ts +14 -14
- package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +2 -5
- package/packages/bundled-features/src/custom-fields/web/constants.ts +2 -2
- package/packages/bundled-features/src/custom-fields/web/custom-fields-form-section.tsx +26 -26
- package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +65 -67
- package/packages/bundled-features/src/custom-fields/wire-user-data-rights.ts +3 -3
- package/packages/bundled-features/src/data-retention/_internal/parse-override.ts +2 -3
- package/packages/bundled-features/src/data-retention/feature.ts +11 -18
- package/packages/bundled-features/src/data-retention/handlers/policy-for.query.ts +6 -6
- package/packages/bundled-features/src/data-retention/keep-for.ts +17 -17
- package/packages/bundled-features/src/data-retention/override-schema.ts +13 -15
- package/packages/bundled-features/src/data-retention/presets.ts +18 -23
- package/packages/bundled-features/src/data-retention/resolve-for-tenant.ts +1 -1
- package/packages/bundled-features/src/data-retention/resolve-tenant-preset.ts +17 -16
- package/packages/bundled-features/src/data-retention/resolver.ts +33 -32
- package/packages/bundled-features/src/data-retention/run-retention-cleanup.ts +71 -58
- package/packages/bundled-features/src/data-retention/schema/tenant-retention-override.ts +13 -11
- package/packages/bundled-features/src/delivery/changes.json +30 -0
- package/packages/bundled-features/src/delivery/channel-context.ts +9 -3
- package/packages/bundled-features/src/delivery/db/queries/preferences.ts +2 -2
- package/packages/bundled-features/src/delivery/delivery-service.ts +35 -5
- package/packages/bundled-features/src/delivery/feature.ts +3 -3
- package/packages/bundled-features/src/delivery/handlers/log.query.ts +1 -1
- package/packages/bundled-features/src/delivery/handlers/preferences.query.ts +20 -1
- package/packages/bundled-features/src/delivery/handlers/unsubscribe-page-chrome.query.ts +1 -1
- package/packages/bundled-features/src/delivery/tables.ts +9 -8
- package/packages/bundled-features/src/delivery/unsubscribe-link.ts +3 -1
- package/packages/bundled-features/src/delivery/unsubscribe-page-strings.ts +1 -0
- package/packages/bundled-features/src/delivery/unsubscribe-page.ts +6 -0
- package/packages/bundled-features/src/delivery/unsubscribe.ts +40 -19
- package/packages/bundled-features/src/delivery/upsert-preference.ts +3 -4
- package/packages/bundled-features/src/document-ingest-foundation/entity.ts +5 -5
- package/packages/bundled-features/src/document-ingest-foundation/events.ts +2 -2
- package/packages/bundled-features/src/document-ingest-foundation/feature.ts +2 -2
- package/packages/bundled-features/src/document-ingest-foundation/pages.ts +1 -1
- package/packages/bundled-features/src/document-ingest-foundation/tenant-destroy-hook.ts +4 -4
- package/packages/bundled-features/src/feature-toggles/compose-tier-resolver.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/feature.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/global-feature-state-table.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/handlers/registered.query.ts +5 -5
- package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/toggle-sync-signal.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/web/constants.ts +1 -1
- package/packages/bundled-features/src/file-derivatives/feature.ts +2 -2
- package/packages/bundled-features/src/file-derivatives/handlers/public-variant.query.ts +1 -1
- package/packages/bundled-features/src/file-derivatives/presets.ts +1 -1
- package/packages/bundled-features/src/file-foundation/feature.ts +6 -6
- package/packages/bundled-features/src/file-foundation/index.ts +1 -0
- package/packages/bundled-features/src/file-foundation/read-file-ref-content.ts +7 -1
- package/packages/bundled-features/src/file-provider-inmemory/feature.ts +16 -16
- package/packages/bundled-features/src/file-provider-s3/env-named-feature.ts +0 -2
- package/packages/bundled-features/src/file-provider-s3/feature.ts +16 -16
- package/packages/bundled-features/src/file-provider-s3/lib/s3-provider.ts +6 -6
- package/packages/bundled-features/src/files/README.md +1 -1
- package/packages/bundled-features/src/files/feature.ts +6 -6
- package/packages/bundled-features/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +5 -5
- package/packages/bundled-features/src/files-tenant-data/hooks.ts +24 -26
- package/packages/bundled-features/src/files-tenant-data/index.ts +1 -1
- package/packages/bundled-features/src/folders/feature.ts +1 -1
- package/packages/bundled-features/src/folders/web/folder-manager.tsx +2 -2
- package/packages/bundled-features/src/folders/web/tree.ts +5 -5
- package/packages/bundled-features/src/form-draft/changes.json +6 -0
- package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +3 -3
- package/packages/bundled-features/src/form-draft/db/queries/owned-file-refs.ts +1 -1
- package/packages/bundled-features/src/form-draft/decrypt-draft.ts +4 -1
- package/packages/bundled-features/src/form-draft/entity.ts +3 -3
- package/packages/bundled-features/src/form-draft/feature.ts +4 -5
- package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +1 -1
- package/packages/bundled-features/src/form-draft/release-file-refs.ts +6 -6
- package/packages/bundled-features/src/form-draft/schemas.ts +3 -3
- package/packages/bundled-features/src/form-draft/web/constants.ts +0 -2
- package/packages/bundled-features/src/host-routing/README.md +1 -1
- package/packages/bundled-features/src/host-routing/changes.json +6 -0
- package/packages/bundled-features/src/host-routing/dispatch.ts +16 -17
- package/packages/bundled-features/src/host-routing/options.ts +2 -1
- package/packages/bundled-features/src/inbound-mail-foundation/aggregate-id.ts +19 -19
- package/packages/bundled-features/src/inbound-mail-foundation/changes.json +18 -0
- package/packages/bundled-features/src/inbound-mail-foundation/connect-routes.ts +4 -3
- package/packages/bundled-features/src/inbound-mail-foundation/constants.ts +30 -33
- package/packages/bundled-features/src/inbound-mail-foundation/entities.ts +47 -48
- package/packages/bundled-features/src/inbound-mail-foundation/events.ts +54 -50
- package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +39 -39
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/account-state.ts +8 -8
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/connect-account.write.ts +25 -26
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/disconnect-account.write.ts +7 -7
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/ingest-message.write.ts +50 -51
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-accounts.query.ts +8 -8
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-messages.query.ts +10 -10
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/scope-visibility.ts +3 -4
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/update-account.write.ts +27 -15
- package/packages/bundled-features/src/inbound-mail-foundation/i18n.ts +0 -1
- package/packages/bundled-features/src/inbound-mail-foundation/oauth-state.ts +16 -15
- package/packages/bundled-features/src/inbound-mail-foundation/projection.ts +31 -29
- package/packages/bundled-features/src/inbound-mail-foundation/provider-factory.ts +9 -9
- package/packages/bundled-features/src/inbound-mail-foundation/retention-sweep.ts +45 -41
- package/packages/bundled-features/src/inbound-mail-foundation/screens.ts +0 -3
- package/packages/bundled-features/src/inbound-mail-foundation/tenant-destroy-hook.ts +14 -16
- package/packages/bundled-features/src/inbound-mail-foundation/types.ts +70 -70
- package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor.ts +101 -84
- package/packages/bundled-features/src/inbound-provider-imap/credential-document.ts +13 -13
- package/packages/bundled-features/src/inbound-provider-imap/feature.ts +42 -40
- package/packages/bundled-features/src/inbound-provider-imap/imap-client.ts +20 -19
- package/packages/bundled-features/src/inbound-provider-inmemory/feature.ts +21 -21
- package/packages/bundled-features/src/jobs/changes.json +13 -0
- package/packages/bundled-features/src/jobs/db/queries/retention.ts +2 -2
- package/packages/bundled-features/src/jobs/db/queries/stale-run-sweep.ts +3 -3
- package/packages/bundled-features/src/jobs/events.ts +1 -1
- package/packages/bundled-features/src/jobs/feature.ts +20 -11
- package/packages/bundled-features/src/jobs/handlers/detail.query.ts +4 -4
- package/packages/bundled-features/src/jobs/handlers/list.query.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/projection-rebuild.job.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/reindex-entity.job.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/retry.write.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/tenant-failures.query.ts +45 -40
- package/packages/bundled-features/src/jobs/handlers/tenant-runs.query.ts +63 -59
- package/packages/bundled-features/src/jobs/job-instant.ts +1 -1
- package/packages/bundled-features/src/jobs/job-run-logger.ts +19 -19
- package/packages/bundled-features/src/jobs/job-run-table.ts +3 -3
- package/packages/bundled-features/src/jobs/screens.ts +1 -1
- package/packages/bundled-features/src/jobs/tenant-job-failure-table.ts +1 -1
- package/packages/bundled-features/src/jobs/tenant-job-run-table.ts +1 -1
- package/packages/bundled-features/src/ledger/entity.ts +5 -5
- package/packages/bundled-features/src/ledger/feature.ts +3 -3
- package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +3 -3
- package/packages/bundled-features/src/ledger/recurring.ts +12 -12
- package/packages/bundled-features/src/ledger/schemas.ts +1 -1
- package/packages/bundled-features/src/ledger/web/constants.ts +2 -2
- package/packages/bundled-features/src/ledger/web/index.ts +7 -7
- package/packages/bundled-features/src/legal-pages/README.md +1 -1
- package/packages/bundled-features/src/legal-pages/feature.ts +40 -41
- package/packages/bundled-features/src/legal-pages/markdown.ts +3 -3
- package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +23 -24
- package/packages/bundled-features/src/legal-pages/web/index.ts +0 -2
- package/packages/bundled-features/src/mail-foundation/changes.json +6 -0
- package/packages/bundled-features/src/mail-foundation/feature.ts +31 -30
- package/packages/bundled-features/src/mail-transport-inmemory/feature.ts +27 -28
- package/packages/bundled-features/src/mail-transport-smtp/feature.ts +20 -20
- package/packages/bundled-features/src/managed-pages/branding.ts +6 -6
- package/packages/bundled-features/src/managed-pages/feature.ts +62 -62
- package/packages/bundled-features/src/managed-pages/handlers/by-slug.query.ts +5 -6
- package/packages/bundled-features/src/managed-pages/handlers/by-tenant-published.query.ts +8 -8
- package/packages/bundled-features/src/managed-pages/handlers/set.write.ts +5 -7
- package/packages/bundled-features/src/managed-pages/screens/page-screens.ts +11 -11
- package/packages/bundled-features/src/managed-pages/seeding.ts +8 -8
- package/packages/bundled-features/src/managed-pages/table.ts +16 -15
- package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +6 -6
- package/packages/bundled-features/src/managed-pages/web/i18n.ts +1 -1
- package/packages/bundled-features/src/notes-history/entity.ts +4 -4
- package/packages/bundled-features/src/notes-history/feature.ts +2 -2
- package/packages/bundled-features/src/notes-history-user-data/hooks.ts +1 -1
- package/packages/bundled-features/src/page-render/layout.ts +9 -9
- package/packages/bundled-features/src/page-render/markdown.ts +11 -11
- package/packages/bundled-features/src/page-render/security-headers.ts +7 -6
- package/packages/bundled-features/src/personal-access-tokens/feature.ts +9 -6
- package/packages/bundled-features/src/personal-access-tokens/roles.ts +2 -2
- package/packages/bundled-features/src/readiness/handlers/status.query.ts +3 -3
- package/packages/bundled-features/src/renderer-foundation/api.ts +12 -13
- package/packages/bundled-features/src/renderer-foundation/constants.ts +2 -2
- package/packages/bundled-features/src/renderer-foundation/feature.ts +7 -7
- package/packages/bundled-features/src/renderer-foundation/types.ts +11 -12
- package/packages/bundled-features/src/renderer-pdf/changes.json +6 -0
- package/packages/bundled-features/src/renderer-pdf/render-table-pdf.ts +27 -10
- package/packages/bundled-features/src/secrets/feature.ts +9 -9
- package/packages/bundled-features/src/secrets/web/constants.ts +2 -2
- package/packages/bundled-features/src/seo/feature.ts +3 -3
- package/packages/bundled-features/src/sessions/constants.ts +1 -1
- package/packages/bundled-features/src/sessions/feature.ts +16 -11
- package/packages/bundled-features/src/sessions/handlers/revoke-all-for-user.write.ts +2 -2
- package/packages/bundled-features/src/sessions/handlers/revoke-all-others.write.ts +2 -2
- package/packages/bundled-features/src/sessions/handlers/revoke.write.ts +1 -1
- package/packages/bundled-features/src/sessions/schema/user-session.ts +4 -4
- package/packages/bundled-features/src/sessions/screens.ts +2 -2
- package/packages/bundled-features/src/sessions/session-callbacks.ts +2 -2
- package/packages/bundled-features/src/sessions/session-revoked-event.ts +2 -2
- package/packages/bundled-features/src/shared/assert-no-where-rule-in-ownership-write.ts +1 -1
- package/packages/bundled-features/src/shared/decrypt-stored-pii.ts +11 -1
- package/packages/bundled-features/src/shared/encrypt-for-direct-write.ts +1 -1
- package/packages/bundled-features/src/shared/index.ts +1 -1
- package/packages/bundled-features/src/shared/mail-template-body.ts +10 -3
- package/packages/bundled-features/src/shared/map-with-concurrency.ts +5 -4
- package/packages/bundled-features/src/shared/parent-visibility.ts +2 -2
- package/packages/bundled-features/src/shared/password-hashing.ts +1 -1
- package/packages/bundled-features/src/shared/signup-handover.ts +1 -2
- package/packages/bundled-features/src/shared/single-use-token-store.ts +1 -1
- package/packages/bundled-features/src/step-dispatcher/changes.json +6 -0
- package/packages/bundled-features/src/step-dispatcher/feature.ts +1 -0
- package/packages/bundled-features/src/subscription-dodo/changes.json +14 -0
- package/packages/bundled-features/src/subscription-dodo/client.ts +45 -0
- package/packages/bundled-features/src/subscription-dodo/constants.ts +24 -0
- package/packages/bundled-features/src/subscription-dodo/feature.ts +207 -0
- package/packages/bundled-features/src/subscription-dodo/index.ts +16 -0
- package/packages/bundled-features/src/subscription-dodo/plugin-methods.ts +345 -0
- package/packages/bundled-features/src/subscription-dodo/runtime.ts +126 -0
- package/packages/bundled-features/src/subscription-dodo/verify-webhook.ts +262 -0
- package/packages/bundled-features/src/subscription-mollie/constants.ts +15 -17
- package/packages/bundled-features/src/subscription-mollie/feature.ts +41 -42
- package/packages/bundled-features/src/subscription-mollie/index.ts +3 -3
- package/packages/bundled-features/src/subscription-mollie/plugin-methods.ts +17 -16
- package/packages/bundled-features/src/subscription-mollie/verify-webhook.ts +34 -34
- package/packages/bundled-features/src/subscription-stripe/changes.json +12 -0
- package/packages/bundled-features/src/subscription-stripe/constants.ts +4 -6
- package/packages/bundled-features/src/subscription-stripe/feature.ts +45 -43
- package/packages/bundled-features/src/subscription-stripe/index.ts +6 -6
- package/packages/bundled-features/src/subscription-stripe/plugin-methods.ts +22 -27
- package/packages/bundled-features/src/subscription-stripe/runtime.ts +9 -8
- package/packages/bundled-features/src/subscription-stripe/verify-webhook.ts +62 -64
- package/packages/bundled-features/src/tags/feature.ts +3 -3
- package/packages/bundled-features/src/tags/screens.ts +1 -1
- package/packages/bundled-features/src/template-resolver/api.ts +41 -14
- package/packages/bundled-features/src/template-resolver/changes.json +48 -0
- package/packages/bundled-features/src/template-resolver/compile-document-body.ts +1 -0
- package/packages/bundled-features/src/template-resolver/feature.ts +2 -2
- package/packages/bundled-features/src/template-resolver/handlers/bundle-import.ts +3 -2
- package/packages/bundled-features/src/template-resolver/handlers/copy-locale.write.ts +27 -5
- package/packages/bundled-features/src/template-resolver/handlers/diff-to-system.query.ts +3 -2
- package/packages/bundled-features/src/template-resolver/handlers/document-base.ts +3 -2
- package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +8 -7
- package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +19 -20
- package/packages/bundled-features/src/template-resolver/handlers/overview.query.ts +15 -5
- package/packages/bundled-features/src/template-resolver/handlers/shared.ts +2 -2
- package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +3 -3
- package/packages/bundled-features/src/template-resolver/handlers/tenant-override-counts.query.ts +9 -5
- package/packages/bundled-features/src/template-resolver/handlers/tenant-override-selection.ts +8 -6
- package/packages/bundled-features/src/template-resolver/handlers/tenant-overrides.query.ts +44 -5
- package/packages/bundled-features/src/template-resolver/handlers/upsert-system.write.ts +3 -4
- package/packages/bundled-features/src/template-resolver/handlers/upsert-tenant.write.ts +4 -5
- package/packages/bundled-features/src/template-resolver/handlers/usage.query.ts +37 -26
- package/packages/bundled-features/src/template-resolver/handlers/validate.query.ts +7 -2
- package/packages/bundled-features/src/template-resolver/seeding.ts +36 -18
- package/packages/bundled-features/src/template-resolver/store-template-resource.ts +22 -4
- package/packages/bundled-features/src/template-resolver/table.ts +13 -14
- package/packages/bundled-features/src/template-resolver/template-delivery-policy.ts +0 -11
- package/packages/bundled-features/src/template-resolver/template-meta.ts +12 -4
- package/packages/bundled-features/src/template-resolver/template-preview.ts +11 -3
- package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +2 -2
- package/packages/bundled-features/src/template-resolver/web/constants.ts +7 -5
- package/packages/bundled-features/src/template-resolver/web/index.ts +7 -0
- package/packages/bundled-features/src/template-resolver/web/mail-layout-constants.ts +8 -0
- package/packages/bundled-features/src/tenant/changes.json +6 -0
- package/packages/bundled-features/src/tenant/feature.ts +7 -7
- package/packages/bundled-features/src/tenant/handlers/member-directory.query.ts +10 -4
- package/packages/bundled-features/src/tenant/handlers/members.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/memberships.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/team-list.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/tenant-directory.query.ts +8 -5
- package/packages/bundled-features/src/tenant/invitation-table.ts +37 -40
- package/packages/bundled-features/src/tenant/membership-table.ts +3 -3
- package/packages/bundled-features/src/tenant/schema/tenant.ts +7 -9
- package/packages/bundled-features/src/tenant/screens.ts +1 -1
- package/packages/bundled-features/src/tenant/seeding.ts +19 -18
- package/packages/bundled-features/src/tenant/testing.ts +5 -6
- package/packages/bundled-features/src/tenant/web/constants.ts +2 -2
- package/packages/bundled-features/src/tenant-handover/events.ts +5 -7
- package/packages/bundled-features/src/tenant-handover/feature.ts +1 -1
- package/packages/bundled-features/src/tenant-handover/grant.ts +1 -1
- package/packages/bundled-features/src/tenant-handover/handlers/claim.write.ts +1 -1
- package/packages/bundled-features/src/tenant-handover/move-entity-graph.ts +8 -9
- package/packages/bundled-features/src/tenant-handover/signup-handover-provider.ts +1 -2
- package/packages/bundled-features/src/tenant-handover/transfer-graph.ts +4 -5
- package/packages/bundled-features/src/tenant-lifecycle/boot-checks.ts +1 -1
- package/packages/bundled-features/src/tenant-lifecycle/changes.json +6 -0
- package/packages/bundled-features/src/tenant-lifecycle/constants.ts +5 -0
- package/packages/bundled-features/src/tenant-lifecycle/feature.ts +1 -1
- package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +7 -3
- package/packages/bundled-features/src/tenant-lifecycle/stages.ts +1 -1
- package/packages/bundled-features/src/tenant-settings/constants.ts +1 -1
- package/packages/bundled-features/src/tenant-settings/tenant-defaults.ts +12 -5
- package/packages/bundled-features/src/tier-engine/aggregate-id.ts +15 -16
- package/packages/bundled-features/src/tier-engine/changes.json +6 -0
- package/packages/bundled-features/src/tier-engine/compose-app.ts +14 -14
- package/packages/bundled-features/src/tier-engine/entity.ts +18 -19
- package/packages/bundled-features/src/tier-engine/feature.ts +88 -87
- package/packages/bundled-features/src/tier-engine/handlers/active-tier.query.ts +6 -7
- package/packages/bundled-features/src/tier-engine/handlers/get-tenant-tier.query.ts +4 -4
- package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +12 -9
- package/packages/bundled-features/src/tier-engine/tier-resolver.ts +2 -2
- package/packages/bundled-features/src/tier-engine/trial.ts +13 -13
- package/packages/bundled-features/src/tier-engine/web/constants.ts +3 -3
- package/packages/bundled-features/src/tier-engine/web/index.ts +4 -4
- package/packages/bundled-features/src/user/db/queries/stream-tenant-backfill.ts +8 -8
- package/packages/bundled-features/src/user/handlers/create.write.ts +4 -4
- package/packages/bundled-features/src/user/schema/user.ts +45 -44
- package/packages/bundled-features/src/user/seeding.ts +40 -40
- package/packages/bundled-features/src/user/testing.ts +3 -3
- package/packages/bundled-features/src/user-data-rights/audit-download.ts +27 -28
- package/packages/bundled-features/src/user-data-rights/boot-checks.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/deletion-token.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/feature.ts +112 -113
- package/packages/bundled-features/src/user-data-rights/handlers/cancel-deletion.write.ts +9 -9
- package/packages/bundled-features/src/user-data-rights/handlers/confirm-deletion-by-token.write.ts +8 -8
- package/packages/bundled-features/src/user-data-rights/handlers/download-by-job.query.ts +29 -30
- package/packages/bundled-features/src/user-data-rights/handlers/download-by-token.query.ts +40 -42
- package/packages/bundled-features/src/user-data-rights/handlers/export-status.query.ts +8 -9
- package/packages/bundled-features/src/user-data-rights/handlers/lift-restriction.write.ts +7 -8
- package/packages/bundled-features/src/user-data-rights/handlers/list-download-attempts.query.ts +2 -2
- package/packages/bundled-features/src/user-data-rights/handlers/my-audit-log.query.ts +4 -4
- package/packages/bundled-features/src/user-data-rights/handlers/request-deletion-by-email.write.ts +30 -29
- package/packages/bundled-features/src/user-data-rights/handlers/request-deletion.write.ts +15 -18
- package/packages/bundled-features/src/user-data-rights/handlers/request-export.write.ts +42 -41
- package/packages/bundled-features/src/user-data-rights/handlers/restrict-account.write.ts +22 -19
- package/packages/bundled-features/src/user-data-rights/handlers/run-forget-cleanup.write.ts +8 -8
- package/packages/bundled-features/src/user-data-rights/index.ts +8 -10
- package/packages/bundled-features/src/user-data-rights/lib/default-mailers.ts +3 -3
- package/packages/bundled-features/src/user-data-rights/lib/update-user-lifecycle.ts +24 -27
- package/packages/bundled-features/src/user-data-rights/run-export-jobs.ts +169 -280
- package/packages/bundled-features/src/user-data-rights/run-forget-cleanup.ts +87 -108
- package/packages/bundled-features/src/user-data-rights/run-user-export.ts +67 -69
- package/packages/bundled-features/src/user-data-rights/schema/download-attempt.ts +11 -11
- package/packages/bundled-features/src/user-data-rights/schema/download-token.ts +37 -41
- package/packages/bundled-features/src/user-data-rights/schema/export-job.ts +65 -67
- package/packages/bundled-features/src/user-data-rights/token-helpers.ts +21 -25
- package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +6 -6
- package/packages/bundled-features/src/user-data-rights/web/confirm-deletion-screen.tsx +6 -5
- package/packages/bundled-features/src/user-data-rights/web/constants.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/web/index.ts +5 -5
- package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +14 -13
- package/packages/bundled-features/src/user-data-rights/web/public-deletion-gate.tsx +13 -12
- package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +6 -6
- package/packages/bundled-features/src/user-data-rights/zip-path.ts +41 -40
- package/packages/bundled-features/src/user-data-rights-defaults/feature.ts +15 -15
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.ts +3 -5
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +45 -51
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/job-run.userdata-hook.ts +2 -2
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/notification-preference.userdata-hook.ts +1 -1
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/user-session.userdata-hook.ts +3 -3
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/user.userdata-hook.ts +32 -31
- package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +13 -13
- package/packages/bundled-features/src/user-profile/index.ts +3 -3
- package/packages/bundled-features/src/user-profile/web/client-plugin.ts +1 -1
- package/packages/bundled-features/src/user-profile/web/constants.ts +1 -1
- package/packages/bundled-features/src/user-profile/web/profile-screen.tsx +1 -1
- package/packages/bundled-features/src/waitlist/changes.json +18 -0
- package/packages/bundled-features/src/waitlist/handlers/export-purge.write.ts +2 -1
- package/packages/bundled-features/src/waitlist/handlers/submit.write.ts +5 -5
- package/packages/bundled-features/src/waitlist/import.ts +5 -0
- package/packages/bundled-features/src/waitlist/legacy-migrate.ts +22 -3
- package/packages/bundled-features/src/waitlist/link-on-signup.ts +20 -10
- package/packages/bundled-features/src/waitlist/options.ts +3 -0
- package/packages/bundled-features/src/workflow-runner/aggregate-id.ts +1 -1
- package/packages/bundled-features/src/workflow-runner/event-subscriber.ts +4 -5
- package/packages/bundled-features/src/workflow-runner/event-trigger.ts +4 -15
- package/packages/bundled-features/src/workflow-runner/feature.ts +2 -2
- package/packages/bundled-features/src/workflow-runner/handlers/resume-run.write.ts +4 -4
- package/packages/bundled-features/src/workflow-runner/pending-projection.ts +6 -7
- package/packages/bundled-features/src/workflow-runner/runner.ts +6 -6
- package/packages/bundled-features/src/workflow-runner/tables.ts +6 -6
- package/packages/bundled-features/src/workflow-runner/workflow-registry.ts +1 -1
- package/samples/apps/styleguide/src/features/widgets/i18n.ts +11 -0
- package/samples/apps/styleguide/src/features/widgets/web/Widgets.tsx +24 -0
- package/samples/apps/use-all-bundled/e2e-billing-gallery/gallery-constants.ts +5 -0
- package/samples/apps/use-all-bundled/e2e-billing-gallery/gallery-features.ts +90 -15
- package/samples/apps/use-all-bundled/e2e-billing-gallery/server.ts +16 -6
- package/samples/apps/use-all-bundled/feature-manifest.json +120 -3
- package/samples/apps/use-all-bundled/src/run-config.ts +9 -3
- package/samples/recipes/auth-mfa/README.md +5 -0
- package/samples/recipes/auth-mfa/package.json +5 -2
- package/samples/recipes/auth-mfa/src/web/confirmation-code-step.tsx +49 -0
- package/samples/recipes/auth-mfa/tsconfig.json +8 -0
- package/samples/recipes/env-composition/README.md +3 -1
- package/samples/recipes/env-composition/src/env.ts +2 -0
- package/samples/recipes/legal-pages/README.md +1 -1
- package/samples/recipes/rate-limiting/README.md +18 -0
- package/samples/recipes/rate-limiting/src/feature.ts +12 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/stored-user-email.ts +0 -12
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useLocale, usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
|
|
2
2
|
import type { WriteResult } from "@cosmicdrift/kumiko-renderer/headless";
|
|
3
|
+
import { ChoiceCards } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
4
|
import { type ReactNode, useState } from "react";
|
|
4
5
|
import type { BillingPlansResult } from "../types.ts";
|
|
5
6
|
import { resolveConsentLocale } from "./consumer-protection/consent-locale.ts";
|
|
@@ -24,8 +25,24 @@ export type CheckoutConsentDialogProps = {
|
|
|
24
25
|
readonly renewalKey?: string;
|
|
25
26
|
readonly count?: string;
|
|
26
27
|
};
|
|
27
|
-
|
|
28
|
-
readonly
|
|
28
|
+
/** Without it the dialog shows no legal links and no consent checkboxes and orders without a consent. */
|
|
29
|
+
readonly consumerProtection?: ConsumerProtectionView;
|
|
30
|
+
/** Several providers to pick from; the parent follows `value` for price and order. */
|
|
31
|
+
readonly providerChoice?: {
|
|
32
|
+
readonly options: readonly {
|
|
33
|
+
readonly value: string;
|
|
34
|
+
readonly title: string;
|
|
35
|
+
readonly description?: string;
|
|
36
|
+
readonly aside?: string;
|
|
37
|
+
}[];
|
|
38
|
+
readonly value: string;
|
|
39
|
+
readonly onChange: (value: string) => void;
|
|
40
|
+
};
|
|
41
|
+
/** Provider note under the price line when there is no provider choice. */
|
|
42
|
+
readonly note?: string;
|
|
43
|
+
readonly onOrder: (
|
|
44
|
+
consent: CheckoutConsentPayload | undefined,
|
|
45
|
+
) => Promise<WriteResult<{ url: string }>>;
|
|
29
46
|
readonly onConsentTextOutdated: () => void;
|
|
30
47
|
};
|
|
31
48
|
|
|
@@ -36,6 +53,8 @@ export function CheckoutConsentDialog({
|
|
|
36
53
|
planName,
|
|
37
54
|
price,
|
|
38
55
|
consumerProtection,
|
|
56
|
+
providerChoice,
|
|
57
|
+
note,
|
|
39
58
|
onOrder,
|
|
40
59
|
onConsentTextOutdated,
|
|
41
60
|
}: CheckoutConsentDialogProps): ReactNode {
|
|
@@ -48,18 +67,23 @@ export function CheckoutConsentDialog({
|
|
|
48
67
|
const [errorText, setErrorText] = useState<string | null>(null);
|
|
49
68
|
|
|
50
69
|
const consentLocale = resolveConsentLocale(uiLocale);
|
|
51
|
-
const texts = consumerProtection
|
|
52
|
-
const legalLinks = consumerProtection
|
|
70
|
+
const texts = consumerProtection?.consentTexts[consentLocale];
|
|
71
|
+
const legalLinks = consumerProtection?.legalLinks[consentLocale];
|
|
72
|
+
const consentGiven = consumerProtection === undefined || (earlyPerformance && withdrawalLoss);
|
|
53
73
|
|
|
54
74
|
async function order(): Promise<void> {
|
|
55
75
|
setSubmitting(true);
|
|
56
76
|
setErrorText(null);
|
|
57
|
-
const result = await onOrder(
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
77
|
+
const result = await onOrder(
|
|
78
|
+
texts === undefined
|
|
79
|
+
? undefined
|
|
80
|
+
: {
|
|
81
|
+
earlyPerformanceRequested: true,
|
|
82
|
+
withdrawalLossAcknowledged: true,
|
|
83
|
+
consentTextVersion: texts.consentTextVersion,
|
|
84
|
+
locale: consentLocale,
|
|
85
|
+
},
|
|
86
|
+
);
|
|
63
87
|
if (result.isSuccess) return;
|
|
64
88
|
setSubmitting(false);
|
|
65
89
|
setErrorText(t(result.error.i18nKey, result.error.i18nParams));
|
|
@@ -78,6 +102,18 @@ export function CheckoutConsentDialog({
|
|
|
78
102
|
testId="checkout-consent-dialog"
|
|
79
103
|
>
|
|
80
104
|
<div className="flex flex-col gap-4">
|
|
105
|
+
{providerChoice !== undefined && (
|
|
106
|
+
<div className="flex flex-col gap-2">
|
|
107
|
+
<Text variant="muted">{t("billing-foundation.consent.chooseProvider")}</Text>
|
|
108
|
+
<ChoiceCards
|
|
109
|
+
value={providerChoice.value}
|
|
110
|
+
options={providerChoice.options}
|
|
111
|
+
onChange={providerChoice.onChange}
|
|
112
|
+
ariaLabel={t("billing-foundation.consent.chooseProvider")}
|
|
113
|
+
testId="checkout-provider-choice"
|
|
114
|
+
/>
|
|
115
|
+
</div>
|
|
116
|
+
)}
|
|
81
117
|
<div className="flex flex-col gap-1" data-testid="checkout-consent-summary">
|
|
82
118
|
<Text>
|
|
83
119
|
{planName} — {price.amount}
|
|
@@ -93,38 +129,49 @@ export function CheckoutConsentDialog({
|
|
|
93
129
|
<Text variant="muted">{t("billing-foundation.consent.cancelAnytime")}</Text>
|
|
94
130
|
</>
|
|
95
131
|
)}
|
|
132
|
+
{note !== undefined && (
|
|
133
|
+
<Text variant="muted" testId="checkout-consent-note">
|
|
134
|
+
{note}
|
|
135
|
+
</Text>
|
|
136
|
+
)}
|
|
96
137
|
</div>
|
|
97
|
-
|
|
98
|
-
<
|
|
99
|
-
{
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
{
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
{
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
138
|
+
{legalLinks !== undefined && (
|
|
139
|
+
<div className="flex flex-wrap gap-4">
|
|
140
|
+
<Link href={legalLinks.terms} target="_blank">
|
|
141
|
+
{t("billing-foundation.consent.link.terms")}
|
|
142
|
+
</Link>
|
|
143
|
+
<Link href={legalLinks.withdrawal} target="_blank">
|
|
144
|
+
{t("billing-foundation.consent.link.withdrawal")}
|
|
145
|
+
</Link>
|
|
146
|
+
<Link href={legalLinks.privacy} target="_blank">
|
|
147
|
+
{t("billing-foundation.consent.link.privacy")}
|
|
148
|
+
</Link>
|
|
149
|
+
</div>
|
|
150
|
+
)}
|
|
151
|
+
{texts !== undefined && (
|
|
152
|
+
<>
|
|
153
|
+
<Field id="consent-early-performance" label={texts.earlyPerformance} layout="inline">
|
|
154
|
+
<Input
|
|
155
|
+
kind="boolean"
|
|
156
|
+
id="consent-early-performance"
|
|
157
|
+
name="consent-early-performance"
|
|
158
|
+
value={earlyPerformance}
|
|
159
|
+
onChange={setEarlyPerformance}
|
|
160
|
+
disabled={submitting}
|
|
161
|
+
/>
|
|
162
|
+
</Field>
|
|
163
|
+
<Field id="consent-withdrawal-loss" label={texts.withdrawalLoss} layout="inline">
|
|
164
|
+
<Input
|
|
165
|
+
kind="boolean"
|
|
166
|
+
id="consent-withdrawal-loss"
|
|
167
|
+
name="consent-withdrawal-loss"
|
|
168
|
+
value={withdrawalLoss}
|
|
169
|
+
onChange={setWithdrawalLoss}
|
|
170
|
+
disabled={submitting}
|
|
171
|
+
/>
|
|
172
|
+
</Field>
|
|
173
|
+
</>
|
|
174
|
+
)}
|
|
128
175
|
{errorText !== null && (
|
|
129
176
|
<Banner variant="error" testId="checkout-consent-error">
|
|
130
177
|
{errorText}
|
|
@@ -140,7 +187,7 @@ export function CheckoutConsentDialog({
|
|
|
140
187
|
{t("billing-foundation.consent.back")}
|
|
141
188
|
</Button>
|
|
142
189
|
<Button
|
|
143
|
-
disabled={!
|
|
190
|
+
disabled={!consentGiven || submitting}
|
|
144
191
|
loading={submitting}
|
|
145
192
|
onClick={order}
|
|
146
193
|
testId="checkout-consent-order"
|
|
@@ -95,6 +95,10 @@ export const SubscriptionFoundationQueries = {
|
|
|
95
95
|
* current tier and per-plan action. Only registered when a `catalog` is
|
|
96
96
|
* configured. */
|
|
97
97
|
billingPlans: "billing-foundation:query:billing-plans",
|
|
98
|
+
/** What switching to a tier would cost right now, for providers that switch
|
|
99
|
+
* plans in-app (preview + apply). Only registered when a `catalog` is
|
|
100
|
+
* configured. */
|
|
101
|
+
planSwitchPreview: "billing-foundation:query:plan-switch-preview",
|
|
98
102
|
/** System-only probe: does the caller tenant hold a non-terminal
|
|
99
103
|
* subscription (consumerProtection only). */
|
|
100
104
|
terminableSubscription: "billing-foundation:query:terminable-subscription",
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { BillingPlanView } from "../types.ts";
|
|
2
|
+
|
|
3
|
+
type Recurrence = {
|
|
4
|
+
readonly interval: string | null;
|
|
5
|
+
readonly intervalCount: number | null;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export function intervalKey(price: Recurrence | null): string | undefined {
|
|
9
|
+
if (price === null || price.interval === null) return undefined;
|
|
10
|
+
return price.intervalCount !== null && price.intervalCount > 1
|
|
11
|
+
? `billing-foundation.plans.everyInterval.${price.interval}`
|
|
12
|
+
: `billing-foundation.plans.perInterval.${price.interval}`;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function renewalKey(price: Recurrence | null): string | undefined {
|
|
16
|
+
if (price === null || price.interval === null) return undefined;
|
|
17
|
+
return price.intervalCount !== null && price.intervalCount > 1
|
|
18
|
+
? `billing-foundation.consent.renewsEvery.${price.interval}`
|
|
19
|
+
: `billing-foundation.consent.renews.${price.interval}`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
type PlanPrice = NonNullable<BillingPlanView["price"]>;
|
|
23
|
+
|
|
24
|
+
export function pricesDiffer(prices: readonly PlanPrice[]): boolean {
|
|
25
|
+
const [first, ...rest] = prices;
|
|
26
|
+
return (
|
|
27
|
+
first !== undefined &&
|
|
28
|
+
rest.some(
|
|
29
|
+
(price) =>
|
|
30
|
+
price.unitAmount !== first.unitAmount ||
|
|
31
|
+
price.currency !== first.currency ||
|
|
32
|
+
price.interval !== first.interval ||
|
|
33
|
+
price.intervalCount !== first.intervalCount,
|
|
34
|
+
)
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Price of `tier` at every provider that offers it, in provider order. */
|
|
39
|
+
export function tierPrices(
|
|
40
|
+
providers: readonly { readonly plans: readonly BillingPlanView[] }[],
|
|
41
|
+
tier: string,
|
|
42
|
+
): PlanPrice[] {
|
|
43
|
+
return providers.flatMap((provider) => {
|
|
44
|
+
const price = provider.plans.find((plan) => plan.tier === tier)?.price;
|
|
45
|
+
return price ? [price] : [];
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function cheapestPrice(prices: readonly PlanPrice[]): PlanPrice | undefined {
|
|
50
|
+
return prices.reduce<PlanPrice | undefined>(
|
|
51
|
+
(lowest, price) =>
|
|
52
|
+
lowest === undefined || price.unitAmount < lowest.unitAmount ? price : lowest,
|
|
53
|
+
undefined,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useLocale,
|
|
3
|
+
useMutation,
|
|
4
|
+
usePrimitives,
|
|
5
|
+
useQuery,
|
|
6
|
+
useTranslation,
|
|
7
|
+
} from "@cosmicdrift/kumiko-renderer";
|
|
8
|
+
import { formatMoney } from "@cosmicdrift/kumiko-renderer/web";
|
|
9
|
+
import { type ReactNode, useState } from "react";
|
|
10
|
+
import type { BillingPlansResult, PlanSwitchPreview } from "../types.ts";
|
|
11
|
+
import {
|
|
12
|
+
type CheckoutConsentPayload,
|
|
13
|
+
CONSENT_TEXT_OUTDATED_CODE,
|
|
14
|
+
} from "./checkout-consent-dialog.tsx";
|
|
15
|
+
import { SubscriptionFoundationHandlers, SubscriptionFoundationQueries } from "./constants.ts";
|
|
16
|
+
import { resolveConsentLocale } from "./consumer-protection/consent-locale.ts";
|
|
17
|
+
import { intervalKey } from "./plan-price.ts";
|
|
18
|
+
|
|
19
|
+
type ConsumerProtectionView = NonNullable<BillingPlansResult["consumerProtection"]>;
|
|
20
|
+
|
|
21
|
+
type PlanSwitchPreviewReply = {
|
|
22
|
+
readonly preview: PlanSwitchPreview;
|
|
23
|
+
readonly target: {
|
|
24
|
+
readonly unitAmount: number;
|
|
25
|
+
readonly currency: string;
|
|
26
|
+
readonly interval: string | null;
|
|
27
|
+
readonly intervalCount: number | null;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export type PlanSwitchConfirmDialogProps = {
|
|
32
|
+
readonly open: boolean;
|
|
33
|
+
readonly onOpenChange: (open: boolean) => void;
|
|
34
|
+
readonly tier: string;
|
|
35
|
+
readonly fromPlanName: string;
|
|
36
|
+
readonly toPlanName: string;
|
|
37
|
+
readonly consumerProtection?: ConsumerProtectionView;
|
|
38
|
+
readonly onApplied: () => void;
|
|
39
|
+
readonly onConsentTextOutdated: () => void;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// kumiko-lint-ignore no-custom-primitives Uses usePrimitives().Modal internally, name is a billing domain action, not a primitive reimplementation
|
|
43
|
+
export function PlanSwitchConfirmDialog({
|
|
44
|
+
open,
|
|
45
|
+
onOpenChange,
|
|
46
|
+
tier,
|
|
47
|
+
fromPlanName,
|
|
48
|
+
toPlanName,
|
|
49
|
+
consumerProtection,
|
|
50
|
+
onApplied,
|
|
51
|
+
onConsentTextOutdated,
|
|
52
|
+
}: PlanSwitchConfirmDialogProps): ReactNode {
|
|
53
|
+
const t = useTranslation();
|
|
54
|
+
const locale = useLocale().locale();
|
|
55
|
+
const { Modal, Text, Field, Input, Button, Link, Banner } = usePrimitives();
|
|
56
|
+
const previewQuery = useQuery<PlanSwitchPreviewReply>(
|
|
57
|
+
SubscriptionFoundationQueries.planSwitchPreview,
|
|
58
|
+
{ tier },
|
|
59
|
+
);
|
|
60
|
+
const switchMutation = useMutation<{ readonly applied: true }>(
|
|
61
|
+
SubscriptionFoundationHandlers.switchPlan,
|
|
62
|
+
);
|
|
63
|
+
const [earlyPerformance, setEarlyPerformance] = useState(false);
|
|
64
|
+
const [withdrawalLoss, setWithdrawalLoss] = useState(false);
|
|
65
|
+
const [submitting, setSubmitting] = useState(false);
|
|
66
|
+
const [errorText, setErrorText] = useState<string | null>(null);
|
|
67
|
+
|
|
68
|
+
const consentLocale = resolveConsentLocale(locale);
|
|
69
|
+
const texts = consumerProtection?.consentTexts[consentLocale];
|
|
70
|
+
const legalLinks = consumerProtection?.legalLinks[consentLocale];
|
|
71
|
+
const consentGiven = consumerProtection === undefined || (earlyPerformance && withdrawalLoss);
|
|
72
|
+
|
|
73
|
+
async function confirm(): Promise<void> {
|
|
74
|
+
setSubmitting(true);
|
|
75
|
+
setErrorText(null);
|
|
76
|
+
const consent: CheckoutConsentPayload | undefined =
|
|
77
|
+
texts === undefined
|
|
78
|
+
? undefined
|
|
79
|
+
: {
|
|
80
|
+
earlyPerformanceRequested: true,
|
|
81
|
+
withdrawalLossAcknowledged: true,
|
|
82
|
+
consentTextVersion: texts.consentTextVersion,
|
|
83
|
+
locale: consentLocale,
|
|
84
|
+
};
|
|
85
|
+
const result = await switchMutation.mutate({ tier, ...(consent && { consent }) });
|
|
86
|
+
if (result.isSuccess) {
|
|
87
|
+
onApplied();
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
setSubmitting(false);
|
|
91
|
+
setErrorText(t(result.error.i18nKey, result.error.i18nParams));
|
|
92
|
+
if (result.error.code === CONSENT_TEXT_OUTDATED_CODE) {
|
|
93
|
+
setEarlyPerformance(false);
|
|
94
|
+
setWithdrawalLoss(false);
|
|
95
|
+
onConsentTextOutdated();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const reply = previewQuery.data;
|
|
100
|
+
const money = (amount: number, currency: string) => formatMoney(amount, currency, locale);
|
|
101
|
+
const recurringKey = reply === null ? undefined : intervalKey(reply.target);
|
|
102
|
+
const recurringPrice =
|
|
103
|
+
reply === null
|
|
104
|
+
? ""
|
|
105
|
+
: `${money(reply.target.unitAmount, reply.target.currency)}${
|
|
106
|
+
recurringKey === undefined
|
|
107
|
+
? ""
|
|
108
|
+
: ` ${t(recurringKey, { count: new Intl.NumberFormat(locale).format(reply.target.intervalCount ?? 1) })}`
|
|
109
|
+
}`;
|
|
110
|
+
|
|
111
|
+
return (
|
|
112
|
+
<Modal
|
|
113
|
+
open={open}
|
|
114
|
+
onOpenChange={onOpenChange}
|
|
115
|
+
title={t("billing-foundation.planSwitch.title")}
|
|
116
|
+
testId="plan-switch-confirm-dialog"
|
|
117
|
+
>
|
|
118
|
+
<div className="flex flex-col gap-4">
|
|
119
|
+
<Text>
|
|
120
|
+
{t("billing-foundation.planSwitch.summary", { from: fromPlanName, to: toPlanName })}
|
|
121
|
+
</Text>
|
|
122
|
+
{previewQuery.error !== null && (
|
|
123
|
+
<Banner variant="error" testId="plan-switch-preview-error">
|
|
124
|
+
{t(previewQuery.error.i18nKey, previewQuery.error.i18nParams)}
|
|
125
|
+
</Banner>
|
|
126
|
+
)}
|
|
127
|
+
{previewQuery.loading && reply === null && (
|
|
128
|
+
<Banner variant="loading" testId="plan-switch-preview-loading">
|
|
129
|
+
{t("kumiko.widget.loading")}
|
|
130
|
+
</Banner>
|
|
131
|
+
)}
|
|
132
|
+
{reply !== null && (
|
|
133
|
+
<div className="flex flex-col gap-1" data-testid="plan-switch-summary">
|
|
134
|
+
<Text>
|
|
135
|
+
{t("billing-foundation.planSwitch.dueNow", {
|
|
136
|
+
amount: money(reply.preview.amountDueNow, reply.preview.currency),
|
|
137
|
+
})}
|
|
138
|
+
{reply.preview.tax !== null &&
|
|
139
|
+
` (${t("billing-foundation.planSwitch.includesTax", {
|
|
140
|
+
tax: money(reply.preview.tax, reply.preview.currency),
|
|
141
|
+
})})`}
|
|
142
|
+
</Text>
|
|
143
|
+
<Text variant="muted">
|
|
144
|
+
{t("billing-foundation.planSwitch.credit", {
|
|
145
|
+
amount: money(reply.preview.credit, reply.preview.currency),
|
|
146
|
+
})}
|
|
147
|
+
</Text>
|
|
148
|
+
<Text variant="muted">
|
|
149
|
+
{t("billing-foundation.planSwitch.recurring", {
|
|
150
|
+
amount: recurringPrice,
|
|
151
|
+
})}
|
|
152
|
+
</Text>
|
|
153
|
+
<Text variant="muted">{t("billing-foundation.planSwitch.effective")}</Text>
|
|
154
|
+
<Text variant="muted">{t("billing-foundation.planSwitch.pendingNote")}</Text>
|
|
155
|
+
</div>
|
|
156
|
+
)}
|
|
157
|
+
{legalLinks !== undefined && (
|
|
158
|
+
<div className="flex flex-wrap gap-4">
|
|
159
|
+
<Link href={legalLinks.terms} target="_blank">
|
|
160
|
+
{t("billing-foundation.consent.link.terms")}
|
|
161
|
+
</Link>
|
|
162
|
+
<Link href={legalLinks.withdrawal} target="_blank">
|
|
163
|
+
{t("billing-foundation.consent.link.withdrawal")}
|
|
164
|
+
</Link>
|
|
165
|
+
<Link href={legalLinks.privacy} target="_blank">
|
|
166
|
+
{t("billing-foundation.consent.link.privacy")}
|
|
167
|
+
</Link>
|
|
168
|
+
</div>
|
|
169
|
+
)}
|
|
170
|
+
{texts !== undefined && (
|
|
171
|
+
<>
|
|
172
|
+
<Field
|
|
173
|
+
id="plan-switch-early-performance"
|
|
174
|
+
label={texts.earlyPerformance}
|
|
175
|
+
layout="inline"
|
|
176
|
+
>
|
|
177
|
+
<Input
|
|
178
|
+
kind="boolean"
|
|
179
|
+
id="plan-switch-early-performance"
|
|
180
|
+
name="plan-switch-early-performance"
|
|
181
|
+
value={earlyPerformance}
|
|
182
|
+
onChange={setEarlyPerformance}
|
|
183
|
+
disabled={submitting}
|
|
184
|
+
/>
|
|
185
|
+
</Field>
|
|
186
|
+
<Field id="plan-switch-withdrawal-loss" label={texts.withdrawalLoss} layout="inline">
|
|
187
|
+
<Input
|
|
188
|
+
kind="boolean"
|
|
189
|
+
id="plan-switch-withdrawal-loss"
|
|
190
|
+
name="plan-switch-withdrawal-loss"
|
|
191
|
+
value={withdrawalLoss}
|
|
192
|
+
onChange={setWithdrawalLoss}
|
|
193
|
+
disabled={submitting}
|
|
194
|
+
/>
|
|
195
|
+
</Field>
|
|
196
|
+
</>
|
|
197
|
+
)}
|
|
198
|
+
{errorText !== null && (
|
|
199
|
+
<Banner variant="error" testId="plan-switch-confirm-error">
|
|
200
|
+
{errorText}
|
|
201
|
+
</Banner>
|
|
202
|
+
)}
|
|
203
|
+
<div className="flex justify-end gap-2">
|
|
204
|
+
<Button
|
|
205
|
+
variant="secondary"
|
|
206
|
+
disabled={submitting}
|
|
207
|
+
onClick={() => onOpenChange(false)}
|
|
208
|
+
testId="plan-switch-confirm-cancel"
|
|
209
|
+
>
|
|
210
|
+
{t("billing-foundation.consent.back")}
|
|
211
|
+
</Button>
|
|
212
|
+
<Button
|
|
213
|
+
disabled={!consentGiven || reply === null || submitting}
|
|
214
|
+
loading={submitting}
|
|
215
|
+
onClick={confirm}
|
|
216
|
+
testId="plan-switch-confirm-order"
|
|
217
|
+
>
|
|
218
|
+
{t("billing-foundation.planSwitch.order")}
|
|
219
|
+
</Button>
|
|
220
|
+
</div>
|
|
221
|
+
</div>
|
|
222
|
+
</Modal>
|
|
223
|
+
);
|
|
224
|
+
}
|
|
@@ -95,7 +95,7 @@ export function createSubscriptionWebhookRoute(options: SubscriptionWebhookRoute
|
|
|
95
95
|
return c.json({ ignored: true }, 200);
|
|
96
96
|
}
|
|
97
97
|
const parsed = verified.event;
|
|
98
|
-
const tenantId = parsed.tenantId
|
|
98
|
+
const tenantId = parsed.tenantId;
|
|
99
99
|
if (parsed.kind === BillingEventKinds.payment) {
|
|
100
100
|
const dispatched = await deps.dispatchSystemWrite({
|
|
101
101
|
handlerQn: SubscriptionFoundationHandlers.processPaymentEvent,
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { v5 as uuidv5 } from "uuid";
|
|
2
2
|
|
|
3
|
-
// Fixed UUID
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// __tests__/drift.test.ts pinnt den UUID-Wert.
|
|
3
|
+
// Fixed UUID namespace for deriving cap-counter aggregate IDs.
|
|
4
|
+
// Generated once (2026-05-02) and immutable: changing it would re-key every
|
|
5
|
+
// existing aggregate stream, breaking event replay and counter history and
|
|
6
|
+
// losing the audit trail. The drift test in __tests__/drift.test.ts pins the UUID.
|
|
8
7
|
const CAP_COUNTER_NAMESPACE = "9c1bf2a3-6e4d-4f5b-8a9c-2d3e4f5a6b7c";
|
|
9
8
|
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
9
|
+
// Separate namespace for rolling-window counters. This prevents the aggregate ID
|
|
10
|
+
// from colliding with a calendar counter, even if "1970-01-01..." is passed as
|
|
11
|
+
// periodStart through the calendar path. The drift test in __tests__/drift.test.ts
|
|
12
|
+
// pins the UUID.
|
|
14
13
|
const CAP_COUNTER_ROLLING_NAMESPACE = "8b2ad0c6-1f3e-4f7c-9b8a-3c4d5e6f7a8b";
|
|
15
14
|
|
|
16
15
|
/**
|
|
@@ -473,7 +473,11 @@ async function consumeClaimedRow(
|
|
|
473
473
|
if (!booked.isSuccess) return booked;
|
|
474
474
|
await txDb.updateMany(
|
|
475
475
|
capReservationsTable,
|
|
476
|
-
{
|
|
476
|
+
{
|
|
477
|
+
consumedAmount: claimed.consumedAmount + options.units,
|
|
478
|
+
// Keep the tombstone alive past its last consume, else a later consume would start a fresh one and double count.
|
|
479
|
+
expiresAt: Temporal.Now.instant().add({ minutes: CAP_SETTLED_TOMBSTONE_TTL_MINUTES }),
|
|
480
|
+
},
|
|
477
481
|
ownRow,
|
|
478
482
|
);
|
|
479
483
|
return booked;
|
|
@@ -1,4 +1,22 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.388.0",
|
|
4
|
+
"type": "fix",
|
|
5
|
+
"title": "Consume on a released reservation extends its tombstone",
|
|
6
|
+
"detail": "Every consume against a released reservation tombstone now pushes its expiry out, so a long-running job that consumes across the sweep can no longer lose the tombstone and have its earlier units counted twice at settle."
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"version": "0.388.0",
|
|
10
|
+
"type": "fix",
|
|
11
|
+
"title": "Misconfigured cap period fails on every enforcement",
|
|
12
|
+
"detail": "A periodEndIso that is unparsable or not after periodStartIso now throws on each enforceCap or reservation call instead of only once the hard cap is reached, so a bad period no longer turns into a 500 at the limit instead of cap_exceeded."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"version": "0.388.0",
|
|
16
|
+
"type": "fix",
|
|
17
|
+
"title": "Stock cap lock covers the counted rows, not the error code",
|
|
18
|
+
"detail": "withStockCap serializes on the table and where filter that are counted, so two handlers capping the same rows under different codes can no longer both pass the check in parallel and exceed the cap together."
|
|
19
|
+
},
|
|
2
20
|
{
|
|
3
21
|
"version": "0.378.0",
|
|
4
22
|
"type": "fix",
|
|
@@ -3,20 +3,19 @@ export const CAP_COUNTER_FEATURE = "cap-counter" as const;
|
|
|
3
3
|
|
|
4
4
|
export const CAP_COUNTER_LIST_SCREEN_ID = "cap-list" as const;
|
|
5
5
|
|
|
6
|
-
// Aggregate types
|
|
7
|
-
// projection
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// muss.
|
|
6
|
+
// Aggregate types: calendar-period counters use CRUD events for the
|
|
7
|
+
// projection row. Rolling-window counters use a separate aggregate type
|
|
8
|
+
// with custom increment events (no projection—the read sums events from
|
|
9
|
+
// the last N days). They are separate so `r.entity-projection` does not
|
|
10
|
+
// also have to track rolling-counter rows.
|
|
12
11
|
export const CAP_COUNTER_ROLLING_AGGREGATE_TYPE = "cap-counter-rolling" as const;
|
|
13
12
|
|
|
14
|
-
// Custom event
|
|
15
|
-
// _SHORT —
|
|
16
|
-
// (
|
|
17
|
-
// _QN —
|
|
18
|
-
//
|
|
19
|
-
//
|
|
13
|
+
// Custom event types for rolling-window counters. The pair is symmetric:
|
|
14
|
+
// _SHORT — matches `r.defineEvent(short, schema)` in the registrar
|
|
15
|
+
// (the framework automatically prefixes it to the QN)
|
|
16
|
+
// _QN — qualified form for `ctx.unsafeAppendEvent({type})`, the
|
|
17
|
+
// `events.type` column, and `registry.getEvent(qn)` lookups
|
|
18
|
+
// Both MUST stay consistent; the feature test pins against drift.
|
|
20
19
|
export const ROLLING_INCREMENTED_EVENT_SHORT = "rolling-incremented" as const;
|
|
21
20
|
export const ROLLING_INCREMENTED_EVENT_QN = "cap-counter:event:rolling-incremented" as const;
|
|
22
21
|
|