@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,8 +1,7 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// einen lockout-test-Knopf einbaut).
|
|
1
|
+
// `/testing` re-exports `/seeding`; it is no longer the home of the seed helpers.
|
|
2
|
+
// The helpers live in `/seeding` because they are also consumed by the
|
|
3
|
+
// development-server bootstrap (`runDevApp`), not only by tests. Keep their
|
|
4
|
+
// stable contract here; test-specific options do not belong in this module,
|
|
5
|
+
// because they could break development boots when a lockout-test option is added.
|
|
7
6
|
|
|
8
7
|
export * from "./seeding.ts";
|
|
@@ -21,11 +21,11 @@ export const MEMBER_ROLES_CELL_COMPONENT = "MemberRolesCell" as const;
|
|
|
21
21
|
|
|
22
22
|
/** Closed allowlist for invite-role picker — never free text (escalation guard). */
|
|
23
23
|
// Admin (rank 2) shares the invite-create screen with TenantAdmin — TenantAdmin
|
|
24
|
-
// must not appear here or Admin sees an unassignable option
|
|
24
|
+
// must not appear here or Admin sees an unassignable option.
|
|
25
25
|
export const DEFAULT_INVITE_ROLE_OPTIONS = ["User", "Editor", "Admin"] as const;
|
|
26
26
|
// Full rank list for memberRolesEditScreen: it is prefilled with a member's
|
|
27
27
|
// *current* roles, so it must represent every rank a membership can hold,
|
|
28
|
-
// including TenantAdmin
|
|
28
|
+
// including TenantAdmin. The screen hides what the caller may not
|
|
29
29
|
// assign via TenantQueries.memberRoleAvailability.
|
|
30
30
|
export const OWNER_INVITE_ROLE_OPTIONS = [
|
|
31
31
|
"User",
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import * as z from "zod";
|
|
2
2
|
|
|
3
|
-
// Audit trail for a completed claim (
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// no predecessor version and can never conflict with a concurrent write on
|
|
9
|
-
// the entity it describes.
|
|
3
|
+
// Audit trail for a completed claim (audit-entry requirement: names the source tenant, destination
|
|
4
|
+
// tenant, entities and their counts). Its own aggregate, decoupled from the transferred root's
|
|
5
|
+
// stream — same reasoning as sessions' SESSION_REVOKED_EVENT: a fresh aggregate id per occurrence
|
|
6
|
+
// needs no predecessor version and can never conflict with a concurrent write on the entity it
|
|
7
|
+
// describes.
|
|
10
8
|
//
|
|
11
9
|
// _SHORT — r.defineEvent(short, schema) in feature.ts, framework prefixes it
|
|
12
10
|
// to the QN below.
|
|
@@ -9,7 +9,7 @@ import { createSignupHandoverProvider } from "./signup-handover-provider.ts";
|
|
|
9
9
|
|
|
10
10
|
export type TenantHandoverFeatureOptions = ClaimTenantHandoverOptions;
|
|
11
11
|
|
|
12
|
-
// tenant-handover —
|
|
12
|
+
// tenant-handover — the ONE write a
|
|
13
13
|
// try-before-signup (or guest-checkout, demo-to-account) flow needs once an
|
|
14
14
|
// anonymous run is done and the visitor has a fresh tenant. No general
|
|
15
15
|
// tenant-merge tool, no copy — this is an ownership change on rows a
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Try-before-signup ownership handover
|
|
1
|
+
// Try-before-signup ownership handover, expressed as a
|
|
2
2
|
// row-bound grant: the subject is the transferred run's own row id, the
|
|
3
3
|
// anchor is the SOURCE tenant id it currently lives under. Redeeming the
|
|
4
4
|
// grant is the ownership change itself — the claim handler's commitAnchor
|
|
@@ -31,7 +31,7 @@ function notTransferable(entityType: string): ReturnType<typeof writeFailure> {
|
|
|
31
31
|
);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
// The try-before-signup ownership handover
|
|
34
|
+
// The try-before-signup ownership handover: claims an
|
|
35
35
|
// anonymous run into the caller's own tenant, legitimized by a row-bound
|
|
36
36
|
// grant the anonymous flow minted (see ../grant.ts). Idempotent — a second
|
|
37
37
|
// call with the same token fails the same way a forged one would, because
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// The actual ownership change
|
|
1
|
+
// The actual ownership change: raw SQL against the
|
|
2
2
|
// read-model tables, because moving a row across the tenant boundary is
|
|
3
3
|
// exactly the kind of write the framework's entity write map cannot express
|
|
4
4
|
// (it is single-tenant-scoped by design — that boundary is the whole point
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
// `transaction()` call, rolling back everything the handler already did).
|
|
16
16
|
// `moveRootRow` — called as row-bound-grant's `commitAnchor` — is therefore
|
|
17
17
|
// the ONLY statement that must itself combine the anchor-spend with the
|
|
18
|
-
// first write
|
|
19
|
-
// its work to a crash while the grant is already burned
|
|
18
|
+
// first write: a write issued after `ok: true` can lose
|
|
19
|
+
// its work to a crash while the grant is already burned. Everything after
|
|
20
20
|
// it rides the same transaction: if a later step throws (an undeclared
|
|
21
|
-
// child entity,
|
|
21
|
+
// child entity, the named-error requirement), the WHOLE
|
|
22
22
|
// transaction — root row included — rolls back, so a caller can safely
|
|
23
23
|
// retry the same token after fixing the app's `transferable` declarations.
|
|
24
24
|
|
|
@@ -64,8 +64,7 @@ export async function moveRootRow(args: {
|
|
|
64
64
|
// history + storage-usage counters — fileRef is a standard ES entity (see
|
|
65
65
|
// files-storage-tracking.md), so without those two follow-ups a later write
|
|
66
66
|
// against a moved fileRef can't load its stream, and a projection rebuild
|
|
67
|
-
// would put the row back into the source tenant
|
|
68
|
-
// gap, item 4).
|
|
67
|
+
// would put the row back into the source tenant.
|
|
69
68
|
async function moveFileRefs(args: {
|
|
70
69
|
readonly db: DbRunner;
|
|
71
70
|
readonly registry: Registry;
|
|
@@ -210,7 +209,7 @@ async function moveEdgeRows(args: {
|
|
|
210
209
|
// Everything the root ownership write does NOT cover: the root's own event
|
|
211
210
|
// history + attached files, plus the rows, event history and attached files of
|
|
212
211
|
// every descendant the declared transfer graph reaches, however deep and by
|
|
213
|
-
// however many paths
|
|
212
|
+
// however many paths.
|
|
214
213
|
// Returns a count per moved entity name (the
|
|
215
214
|
// write handler turns this into the audit entry) — `fileRef` is a single
|
|
216
215
|
// pooled count across root + every child, since it is not itself part of the
|
|
@@ -264,7 +263,7 @@ export async function moveTransferGraph(args: {
|
|
|
264
263
|
|
|
265
264
|
const adjacency = resolveTransferAdjacency(registry, rootEntityName);
|
|
266
265
|
|
|
267
|
-
// A worklist, not a level-wise walk
|
|
266
|
+
// A worklist, not a level-wise walk: each batch of rows that actually
|
|
268
267
|
// changed hands becomes the parent ids for the edges leading away from its
|
|
269
268
|
// type. The same edge therefore runs again whenever a later round discovers
|
|
270
269
|
// more rows of its parent type, which is what a type reachable by two paths
|
|
@@ -274,7 +273,7 @@ export async function moveTransferGraph(args: {
|
|
|
274
273
|
// every statement filters on `tenantCol = sourceTenantId` and RETURNS only
|
|
275
274
|
// the rows it flipped, so a row enters this worklist exactly once and the
|
|
276
275
|
// source tenant holds finitely many. Do not add an edge-level visited set to
|
|
277
|
-
// "bound" this — that
|
|
276
|
+
// "bound" this — that would reintroduce the bug.
|
|
278
277
|
let pending: readonly { readonly entityName: string; readonly rowIds: readonly string[] }[] = [
|
|
279
278
|
{ entityName: rootEntityName, rowIds: [rootRowId] },
|
|
280
279
|
];
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// tenant-handover's implementation of the shared signup-handover extension
|
|
2
|
-
// point
|
|
3
|
-
// auth-email-password's signup-request verify a grant against its root row
|
|
2
|
+
// point: lets auth-email-password's signup-request verify a grant against its root row
|
|
4
3
|
// WITHOUT spending the anchor (the anchor is spent once, by the claim
|
|
5
4
|
// signup-confirm runs afterwards, via a fresh short-lived grant this module
|
|
6
5
|
// mints) — see shared/signup-handover.ts for the extension contract and
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
// Resolves the declared transfer graph for a root entity type: the root
|
|
2
2
|
// itself, plus every registered entity that reaches it through a declared
|
|
3
|
-
// schema edge (
|
|
4
|
-
// the
|
|
5
|
-
// maintained per-app list).
|
|
3
|
+
// schema edge (framework CLAUDE.md premise 4 — the graph depth is read off
|
|
4
|
+
// the existing declarations, never a hand-maintained per-app list).
|
|
6
5
|
//
|
|
7
6
|
// The edge definition (parentRef + single-valued reference fields, minus
|
|
8
7
|
// `handover: "stay"`) lives in the framework so the boot validator's depth
|
|
9
8
|
// limit and the mover's traversal measure the same graph. What comes out is
|
|
10
9
|
// static adjacency, not a walk: the mover drives the actual traversal from the
|
|
11
|
-
// row ids it moves
|
|
12
|
-
//
|
|
10
|
+
// row ids it moves, because how deep a type sits depends on the rows found,
|
|
11
|
+
// not on the schema alone.
|
|
13
12
|
//
|
|
14
13
|
// `transferable: true` stays the only gate on what actually moves, and it is
|
|
15
14
|
// enforced by the caller against edges that turn out to have rows rather than
|
|
@@ -16,7 +16,7 @@ const log = createFallbackLogger("kumiko:boot");
|
|
|
16
16
|
|
|
17
17
|
// V4: tenantOwned-entity-without-hook gate. Mirrors user-data-rights' V3
|
|
18
18
|
// (validateGdprPiiHookCoverage) but for EXT_TENANT_DATA. Registered as this
|
|
19
|
-
// feature's own `r.bootCheck()` (
|
|
19
|
+
// feature's own `r.bootCheck()` (moved off the framework-internal
|
|
20
20
|
// boot-validator) — tenant-lifecycle owns EXT_TENANT_DATA
|
|
21
21
|
// (r.extendsRegistrar), so its own mount is the trigger, matching the
|
|
22
22
|
// original guard's "tenant-lifecycle mounted" gate exactly (unlike gating on
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.388.0",
|
|
4
|
+
"type": "fix",
|
|
5
|
+
"title": "Destroy sweep keeps a minimum time slice per tenant",
|
|
6
|
+
"detail": "With many tenants in destroying state the shared tick budget no longer shrinks a tenant's slice below two seconds, so chunking hooks make progress instead of failing the stage as no-progress attempts."
|
|
7
|
+
},
|
|
2
8
|
{
|
|
3
9
|
"version": "0.365.0",
|
|
4
10
|
"type": "fix",
|
|
@@ -62,3 +62,8 @@ export type TenantDestructionStageName = (typeof TENANT_DESTRUCTION_STAGES)[numb
|
|
|
62
62
|
// The sweep cron fires every minute with concurrency "skip", so a tick must
|
|
63
63
|
// finish well inside that window or the next one is skipped.
|
|
64
64
|
export const DESTRUCTION_STAGE_TICK_BUDGET_MS = 30_000;
|
|
65
|
+
|
|
66
|
+
// Lower bound of a tenant's share of the tick budget. Below it a chunking hook
|
|
67
|
+
// without a guaranteed first batch processes nothing, and a no-progress stage
|
|
68
|
+
// counts as a failed attempt, which would abandon the pipeline under load.
|
|
69
|
+
export const DESTRUCTION_STAGE_MIN_SLICE_MS = 2_000;
|
|
@@ -78,7 +78,7 @@ export function createTenantLifecycleFeature(): FeatureDefinition {
|
|
|
78
78
|
r.extendsRegistrar(EXT_TENANT_LIFECYCLE_STATUS, {});
|
|
79
79
|
r.useExtension(EXT_TENANT_LIFECYCLE_STATUS, "tenant-lifecycle", tenantLifecycleStatusPlugin);
|
|
80
80
|
|
|
81
|
-
// GDPR-storage guard V4
|
|
81
|
+
// GDPR-storage guard V4 — moved off the framework-internal
|
|
82
82
|
// boot-validator onto this feature's own r.bootCheck(), since it owns
|
|
83
83
|
// EXT_TENANT_DATA: its own mount is the trigger, matching the original
|
|
84
84
|
// guard's "tenant-lifecycle mounted" gate exactly.
|
|
@@ -23,6 +23,7 @@ import type { SearchAdapter } from "@cosmicdrift/kumiko-framework/search";
|
|
|
23
23
|
import { getTemporal } from "@cosmicdrift/kumiko-framework/time";
|
|
24
24
|
import { tenantEntity, tenantTable } from "../tenant/index.ts";
|
|
25
25
|
import {
|
|
26
|
+
DESTRUCTION_STAGE_MIN_SLICE_MS,
|
|
26
27
|
DESTRUCTION_STAGE_TICK_BUDGET_MS,
|
|
27
28
|
TENANT_AGGREGATE_TYPE,
|
|
28
29
|
TENANT_DESTRUCTION_COMPLETED_EVENT_QN,
|
|
@@ -427,7 +428,7 @@ export async function runTenantDestructionSweep(args: {
|
|
|
427
428
|
|
|
428
429
|
let triggered = 0;
|
|
429
430
|
for (const row of due) {
|
|
430
|
-
const tenantId = row.id
|
|
431
|
+
const tenantId = row.id;
|
|
431
432
|
const events = await loadAggregate(args.db, tenantId, tenantId);
|
|
432
433
|
const version = lastEventVersion(events);
|
|
433
434
|
const user = createSystemUser(tenantId);
|
|
@@ -461,7 +462,10 @@ export async function runTenantDestructionSweep(args: {
|
|
|
461
462
|
// window and starve the ones behind it. Each slice starts when its tenant
|
|
462
463
|
// starts: anchoring to a shared tick deadline would hand tenants after an
|
|
463
464
|
// overrun a zero slice, and a no-progress stage counts as a failed attempt.
|
|
464
|
-
const sliceMs =
|
|
465
|
+
const sliceMs = Math.max(
|
|
466
|
+
DESTRUCTION_STAGE_MIN_SLICE_MS,
|
|
467
|
+
DESTRUCTION_STAGE_TICK_BUDGET_MS / Math.max(1, destroying.length),
|
|
468
|
+
);
|
|
465
469
|
for (const row of destroying) {
|
|
466
470
|
const tenantDeadlineAt = Date.now() + sliceMs;
|
|
467
471
|
try {
|
|
@@ -469,7 +473,7 @@ export async function runTenantDestructionSweep(args: {
|
|
|
469
473
|
deadlineAt: tenantDeadlineAt,
|
|
470
474
|
db: args.db,
|
|
471
475
|
registry: args.registry,
|
|
472
|
-
tenantId: row.id
|
|
476
|
+
tenantId: row.id,
|
|
473
477
|
log: args.log,
|
|
474
478
|
fileProviderResolver: args.fileProviderResolver,
|
|
475
479
|
searchAdapter: args.searchAdapter,
|
|
@@ -60,7 +60,7 @@ export type DestructionStageCtx = {
|
|
|
60
60
|
// Derived search docs of the tenant record (its name) live in the writer's
|
|
61
61
|
// index, not the destroyed tenant's, so the subject-keys stage purges them.
|
|
62
62
|
readonly searchAdapter?: SearchAdapter;
|
|
63
|
-
//
|
|
63
|
+
// Sourced from the owning job's ctx (_escapeHatchAuditSink,
|
|
64
64
|
// systemUser.id); runTenantDataHooks uses them to attribute+audit any
|
|
65
65
|
// EXT_TENANT_DATA usage's declared escapeHatch.
|
|
66
66
|
readonly escapeHatchAuditSink?: EscapeHatchAuditSink;
|
|
@@ -14,7 +14,7 @@ export const TENANT_SETTINGS_FEATURE_NAME = "tenant-settings";
|
|
|
14
14
|
// strings (mirror tags' Handlers/Queries constants).
|
|
15
15
|
export const TenantSettingsConfig = {
|
|
16
16
|
// Shared with engine/constants.ts's TENANT_CURRENCY_CONFIG_KEY — a
|
|
17
|
-
// `money` field's `currency: { kind: "tenant" }` declaration
|
|
17
|
+
// `money` field's `currency: { kind: "tenant" }` declaration
|
|
18
18
|
// resolves against this same key.
|
|
19
19
|
currency: TENANT_CURRENCY_CONFIG_KEY,
|
|
20
20
|
locale: "tenant-settings:config:locale",
|
|
@@ -15,6 +15,8 @@ import {
|
|
|
15
15
|
type EntityDefinition,
|
|
16
16
|
type WriteHandlerDef,
|
|
17
17
|
} from "@cosmicdrift/kumiko-framework/engine";
|
|
18
|
+
import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
|
|
19
|
+
import { isPlainObject } from "@cosmicdrift/kumiko-types/type-guards";
|
|
18
20
|
import * as z from "zod";
|
|
19
21
|
import { TenantSettingsConfig } from "./constants.ts";
|
|
20
22
|
|
|
@@ -26,7 +28,7 @@ export function defineCreateWithTenantDefaults(
|
|
|
26
28
|
options: {
|
|
27
29
|
/** Required — this is a write-path helper; making it optional let a
|
|
28
30
|
* forgetful caller register a create handler with no access rule at
|
|
29
|
-
* all
|
|
31
|
+
* all. */
|
|
30
32
|
readonly access: AccessRule;
|
|
31
33
|
/** Money field names whose `currency` is filled from tenant-settings when missing. */
|
|
32
34
|
readonly currencyFields?: readonly string[];
|
|
@@ -53,11 +55,16 @@ export function defineCreateWithTenantDefaults(
|
|
|
53
55
|
schema,
|
|
54
56
|
access: options.access,
|
|
55
57
|
handler: async (event, ctx) => {
|
|
56
|
-
|
|
58
|
+
if (!isPlainObject(event.payload)) {
|
|
59
|
+
throw new InternalError({
|
|
60
|
+
message: `${entityName}:create payload must be an object after schema validation`,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const payload = { ...event.payload };
|
|
57
64
|
|
|
58
65
|
for (const field of options.currencyFields ?? []) {
|
|
59
|
-
const value = payload[field]
|
|
60
|
-
if (value &&
|
|
66
|
+
const value = payload[field];
|
|
67
|
+
if (isPlainObject(value) && !value["currency"]) {
|
|
61
68
|
const currency = await ctx.config?.(TenantSettingsConfig.currency);
|
|
62
69
|
if (typeof currency === "string") payload[field] = { ...value, currency };
|
|
63
70
|
}
|
|
@@ -68,7 +75,7 @@ export function defineCreateWithTenantDefaults(
|
|
|
68
75
|
}
|
|
69
76
|
|
|
70
77
|
// Re-validate against the unrelaxed entity schema so config-filled
|
|
71
|
-
// values still honor select/enum field constraints
|
|
78
|
+
// values still honor select/enum field constraints — and so
|
|
72
79
|
// a missing currency after failed/missing tenant-settings mount fails
|
|
73
80
|
// loud instead of inserting half-filled money rows.
|
|
74
81
|
const filled = baseSchema.parse(payload);
|
|
@@ -1,26 +1,25 @@
|
|
|
1
1
|
import { v5 as uuidv5 } from "uuid";
|
|
2
2
|
|
|
3
|
-
// Fixed UUID
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// drift-pin-Test in feature.test.ts pinnt diese Konstante.
|
|
3
|
+
// Fixed UUID namespace for deriving tier-assignment aggregate IDs.
|
|
4
|
+
// Generated once and immutable: changing it would re-key every existing
|
|
5
|
+
// aggregate stream, breaking event replay and projection rebuilds and losing
|
|
6
|
+
// the tier-change audit. The drift-pin test in feature.test.ts pins this constant.
|
|
8
7
|
const TIER_ASSIGNMENT_NAMESPACE = "8e91d2fc-8b7a-4d3e-9f4a-1c5d6e7f8a9b";
|
|
9
8
|
|
|
10
9
|
/**
|
|
11
|
-
* Deterministic aggregate
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* Deterministic aggregate ID for a tier assignment derived from `tenantId`.
|
|
11
|
+
* Each platform tenant has exactly one aggregate; uuidv5 is namespace-
|
|
12
|
+
* deterministic, so identical input produces the same UUID.
|
|
14
13
|
*
|
|
15
|
-
* **
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
14
|
+
* **When to use:** The `stripe-sync` feature wraps an idempotent
|
|
15
|
+
* set-tier handler with this function: a second Stripe webhook retry for
|
|
16
|
+
* the same `tenantId` targets the same aggregate stream, causing
|
|
17
|
+
* `version_conflict` from the event store instead of `pg-23505` from the
|
|
18
|
+
* read-model database. This enforces path uniqueness rather than a database
|
|
19
|
+
* constraint.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* Export bereit für Sprint 5.
|
|
21
|
+
* Standard CRUD handlers instead generate UUIDs via `gen_random_uuid()`.
|
|
22
|
+
* This utility is exported for use by the `stripe-sync` feature.
|
|
24
23
|
*/
|
|
25
24
|
// @wrapper-known uuid-domain
|
|
26
25
|
export function tierAssignmentAggregateId(tenantId: string): string {
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.388.0",
|
|
4
|
+
"type": "fix",
|
|
5
|
+
"title": "set-tenant-tier no longer accepts source default",
|
|
6
|
+
"detail": "The source field of set-tenant-tier is limited to manual and billing. The value default is reserved for the signup default tier and made a manual grant look like a billing row that the next sync overwrites."
|
|
7
|
+
},
|
|
2
8
|
{
|
|
3
9
|
"version": "0.370.0",
|
|
4
10
|
"type": "breaking",
|
|
@@ -3,17 +3,17 @@ import type { FeatureDefinition } from "@cosmicdrift/kumiko-framework/engine";
|
|
|
3
3
|
/**
|
|
4
4
|
* Tier definition — a named bundle of features + caps.
|
|
5
5
|
*
|
|
6
|
-
* **Generic
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* `as Record<string, unknown
|
|
10
|
-
* compile-time
|
|
6
|
+
* **Generic over `TCaps`:** the app defines its cap shape as a concrete
|
|
7
|
+
* type (e.g. `{ apps: number, mailsPerMonth: number, aiTokens: number }`)
|
|
8
|
+
* and the composeApp call returns exactly that shape. No
|
|
9
|
+
* `as Record<string, unknown>` casts are needed in app code; all cap reads
|
|
10
|
+
* are compile-time checked.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* free/pro/business/enterprise/self-host, PublicStatus
|
|
15
|
-
* free/starter/team/agency.
|
|
16
|
-
*
|
|
12
|
+
* The tier engine itself is **agnostic** to concrete tier values and cap
|
|
13
|
+
* dimensions. Each app defines its TierMap: kumiko.rocks has
|
|
14
|
+
* free/pro/business/enterprise/self-host, while PublicStatus has
|
|
15
|
+
* free/starter/team/agency. The engine stores only the tier name as a
|
|
16
|
+
* string and trusts the app's TierMap to define what it means at boot.
|
|
17
17
|
*/
|
|
18
18
|
export type TierDefinition<TCaps extends Readonly<Record<string, unknown>>> = {
|
|
19
19
|
/** Feature names to mount on top of the base set (no add-ons applied). */
|
|
@@ -26,9 +26,9 @@ export type TierDefinition<TCaps extends Readonly<Record<string, unknown>>> = {
|
|
|
26
26
|
* Add-On definition — a tier-orthogonal feature bundle that can be added
|
|
27
27
|
* to any tier (BYOK-Encryption, Dedicated-Stack, Custom-SLA, ...).
|
|
28
28
|
*
|
|
29
|
-
* `capOverrides`
|
|
30
|
-
*
|
|
31
|
-
* 100k
|
|
29
|
+
* `capOverrides` is `Partial<TCaps>` because an add-on overrides only
|
|
30
|
+
* individual cap values (e.g. “Dedicated-Stack increases mailsPerMonth to
|
|
31
|
+
* 100k”), rather than redefining the entire shape.
|
|
32
32
|
*/
|
|
33
33
|
export type AddOnDefinition<TCaps extends Readonly<Record<string, unknown>>> = {
|
|
34
34
|
/** Feature names to mount additionally when this add-on is active. */
|
|
@@ -70,7 +70,7 @@ export type ComposedApp<TCaps extends Readonly<Record<string, unknown>>> = {
|
|
|
70
70
|
* composeApp — compute the feature-set + caps for a platform-tenant.
|
|
71
71
|
*
|
|
72
72
|
* **Contract:**
|
|
73
|
-
* 1. base features always mount (Tier-Engine itself
|
|
73
|
+
* 1. base features always mount (the Tier-Engine itself is part of them)
|
|
74
74
|
* 2. plus tier-specific features (from tierMap[tier].features)
|
|
75
75
|
* 3. plus add-on features (from addOnMap[addOn].features for each active add-on)
|
|
76
76
|
* 4. caps = tier.caps ⊕ add-on.capOverrides (later add-ons override earlier)
|
|
@@ -5,28 +5,27 @@ import {
|
|
|
5
5
|
} from "@cosmicdrift/kumiko-framework/engine";
|
|
6
6
|
import { type TierAssignmentSource, TierAssignmentSources } from "./web/constants.ts";
|
|
7
7
|
|
|
8
|
-
// tier-assignment —
|
|
9
|
-
//
|
|
8
|
+
// tier-assignment — exactly one aggregate per platform tenant. The aggregate ID
|
|
9
|
+
// is derived deterministically from tenantId (uuidv5; see aggregate-id.ts).
|
|
10
10
|
//
|
|
11
|
-
// **Tenant
|
|
12
|
-
// `tenantId
|
|
13
|
-
//
|
|
14
|
-
//
|
|
11
|
+
// **Tenant scope:** applied automatically by Kumiko's tenant-scoped projection —
|
|
12
|
+
// the framework adds `tenantId` as a base column, and the CrudExecutor populates
|
|
13
|
+
// it from `event.user.tenantId`. Each platform tenant has exactly one
|
|
14
|
+
// Tier-Assignment row.
|
|
15
15
|
//
|
|
16
|
-
// **
|
|
17
|
-
// - tier: TierName
|
|
18
|
-
// "self-host").
|
|
19
|
-
//
|
|
20
|
-
// enumerierte Tier-Liste.
|
|
16
|
+
// **Fields**
|
|
17
|
+
// - tier: a TierName string (for example, "free", "pro", "business",
|
|
18
|
+
// "enterprise", or "self-host"). The app defines valid tier values in its
|
|
19
|
+
// TierMap (see compose-app.ts); the engine has no enumerated tier list.
|
|
21
20
|
//
|
|
22
|
-
// **
|
|
23
|
-
// - tenantId:
|
|
24
|
-
// - validFrom/validTo:
|
|
25
|
-
// time
|
|
26
|
-
// - addOns:
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
// -
|
|
21
|
+
// **Intentionally omitted from the entity**
|
|
22
|
+
// - tenantId: added automatically as a base column.
|
|
23
|
+
// - validFrom/validTo: redundant for event sourcing (events carry timestamps
|
|
24
|
+
// natively; time travel uses `ctx.loadAggregate({ asOf })`).
|
|
25
|
+
// - addOns: represented by a separate `tier-add-on` entity (1:n relation),
|
|
26
|
+
// allowing event-sourced Add/Remove events with clear audit granularity
|
|
27
|
+
// instead of replacing a JSON array.
|
|
28
|
+
// - Cap values: per-tier cap definitions belong in the app's TierMap.
|
|
30
29
|
export const tierAssignmentEntity = createEntity({
|
|
31
30
|
table: "read_tier_assignments",
|
|
32
31
|
description:
|