@cosmicdrift/kumiko-bundled-features 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/dist/agent-tools/tool-catalog.js +1 -1
- package/dist/agent-tools/tool-dispatch.d.ts +7 -7
- package/dist/agent-tools/tool-dispatch.js +9 -9
- package/dist/audit/handlers/audit-events.js +1 -1
- package/dist/audit/screens.js +1 -1
- package/dist/auth-email-password/feature.js +1 -1
- package/dist/auth-email-password/handlers/change-password.write.js +3 -3
- package/dist/auth-email-password/handlers/confirm-token-flow.js +5 -5
- package/dist/auth-email-password/handlers/invite-accept-with-login.write.js +1 -1
- package/dist/auth-email-password/handlers/invite-accept.write.js +18 -18
- package/dist/auth-email-password/handlers/invite-create.write.d.ts +2 -2
- package/dist/auth-email-password/handlers/invite-create.write.js +10 -10
- package/dist/auth-email-password/handlers/invite-info.query.js +1 -1
- package/dist/auth-email-password/handlers/invite-signup-complete.write.js +24 -26
- package/dist/auth-email-password/handlers/login.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/login.write.js +1 -1
- package/dist/auth-email-password/handlers/self-registration-status.query.js +1 -1
- package/dist/auth-email-password/handlers/signup-confirm.write.js +34 -37
- package/dist/auth-email-password/handlers/signup-request.write.js +6 -7
- package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.js +1 -4
- package/dist/auth-email-password/index.js +5 -5
- package/dist/auth-email-password/lockout-store.js +1 -1
- package/dist/auth-email-password/seeding.d.ts +42 -45
- package/dist/auth-email-password/seeding.js +51 -53
- package/dist/auth-email-password/signup-token-store.js +8 -8
- package/dist/auth-email-password/testing.js +3 -3
- package/dist/auth-email-password/web/auth-client.d.ts +2 -2
- package/dist/auth-email-password/web/auth-client.js +36 -37
- package/dist/auth-email-password/web/auth-form-primitives.js +10 -10
- package/dist/auth-email-password/web/auth-gate.js +15 -16
- package/dist/auth-email-password/web/client-plugin.d.ts +7 -7
- package/dist/auth-email-password/web/client-plugin.js +4 -5
- package/dist/auth-email-password/web/confirm-account-unlock-screen.js +1 -1
- package/dist/auth-email-password/web/constants.js +3 -3
- package/dist/auth-email-password/web/default-topbar-actions.d.ts +8 -8
- package/dist/auth-email-password/web/default-topbar-actions.js +6 -6
- package/dist/auth-email-password/web/forgot-password-screen.d.ts +2 -2
- package/dist/auth-email-password/web/forgot-password-screen.js +9 -9
- package/dist/auth-email-password/web/index.js +5 -5
- package/dist/auth-email-password/web/invite-accept-screen.d.ts +1 -1
- package/dist/auth-email-password/web/invite-accept-screen.js +16 -16
- package/dist/auth-email-password/web/login-screen.d.ts +1 -1
- package/dist/auth-email-password/web/login-screen.js +2 -3
- package/dist/auth-email-password/web/reset-password-screen.d.ts +4 -4
- package/dist/auth-email-password/web/reset-password-screen.js +12 -13
- package/dist/auth-email-password/web/session.d.ts +10 -9
- package/dist/auth-email-password/web/session.js +28 -29
- package/dist/auth-email-password/web/signup-complete-screen.js +3 -3
- package/dist/auth-email-password/web/signup-screen.d.ts +1 -1
- package/dist/auth-email-password/web/signup-screen.js +13 -13
- package/dist/auth-email-password/web/tenant-switcher.d.ts +4 -4
- package/dist/auth-email-password/web/tenant-switcher.js +21 -22
- package/dist/auth-email-password/web/use-shell-user.js +12 -13
- package/dist/auth-email-password/web/user-menu.d.ts +4 -4
- package/dist/auth-email-password/web/user-menu.js +12 -13
- package/dist/auth-email-password/web/verify-email-screen.d.ts +2 -2
- package/dist/auth-email-password/web/verify-email-screen.js +9 -10
- package/dist/auth-foundation/boot-checks.js +4 -4
- package/dist/auth-foundation/resolve-anonymous-access.d.ts +1 -1
- package/dist/auth-foundation/resolve-anonymous-access.js +3 -3
- package/dist/auth-foundation/types.js +2 -2
- package/dist/auth-mfa/feature-exports.d.ts +2 -2
- package/dist/auth-mfa/feature.js +8 -0
- package/dist/auth-mfa/handlers/disable.write.js +3 -3
- package/dist/auth-mfa/handlers/enable-confirm-preauth.write.js +4 -4
- package/dist/auth-mfa/handlers/enable-confirm.write.js +2 -2
- package/dist/auth-mfa/handlers/enable-start-preauth.write.js +1 -1
- package/dist/auth-mfa/handlers/reencrypt.job.js +1 -1
- package/dist/auth-mfa/handlers/regenerate-recovery.write.js +5 -5
- package/dist/auth-mfa/handlers/verify.write.js +1 -1
- package/dist/auth-mfa/token-secrets.js +1 -1
- package/dist/auth-mfa/web/client-plugin.d.ts +1 -1
- package/dist/auth-mfa/web/client-plugin.js +1 -1
- package/dist/auth-mfa/web/i18n.js +8 -4
- package/dist/auth-mfa/web/index.js +4 -4
- package/dist/auth-mfa/web/mfa-client.js +17 -16
- package/dist/auth-mfa/web/mfa-code-or-recovery-field.d.ts +11 -0
- package/dist/auth-mfa/web/mfa-code-or-recovery-field.js +12 -0
- package/dist/auth-mfa/web/mfa-disable-dialog.js +14 -3
- package/dist/auth-mfa/web/mfa-regenerate-recovery-dialog.js +14 -3
- package/dist/auth-mfa/web/mfa-setup-preauth-screen.js +10 -5
- package/dist/auth-mfa/web/mfa-verify-screen.js +32 -11
- package/dist/billing-foundation/aggregate-id.d.ts +5 -5
- package/dist/billing-foundation/aggregate-id.js +10 -11
- package/dist/billing-foundation/checkout-core.d.ts +9 -14
- package/dist/billing-foundation/checkout-core.js +24 -39
- package/dist/billing-foundation/consumer-protection/confirmation-mail.js +8 -2
- package/dist/billing-foundation/consumer-protection/consent-gate.d.ts +1 -0
- package/dist/billing-foundation/consumer-protection/consent-gate.js +1 -0
- package/dist/billing-foundation/consumer-protection/issue-confirmation.js +9 -3
- package/dist/billing-foundation/consumer-protection/mail-notifications.js +3 -1
- package/dist/billing-foundation/consumer-protection/termination-receipt-limit.d.ts +4 -2
- package/dist/billing-foundation/consumer-protection/termination-receipt-limit.js +6 -5
- package/dist/billing-foundation/consumer-protection/termination-record.d.ts +5 -1
- package/dist/billing-foundation/consumer-protection/termination-record.js +27 -17
- package/dist/billing-foundation/consumer-protection/termination-request.js +12 -7
- package/dist/billing-foundation/consumer-protection/termination-revoke.js +12 -7
- package/dist/billing-foundation/consumer-protection/termination-texts.d.ts +1 -1
- package/dist/billing-foundation/consumer-protection/termination-texts.js +3 -0
- package/dist/billing-foundation/consumer-protection/withdrawal-period.d.ts +5 -2
- package/dist/billing-foundation/consumer-protection/withdrawal-period.js +8 -9
- package/dist/billing-foundation/entities.js +27 -27
- package/dist/billing-foundation/events.d.ts +1 -0
- package/dist/billing-foundation/events.js +19 -17
- package/dist/billing-foundation/feature.js +45 -44
- package/dist/billing-foundation/get-subscription-for-tenant.d.ts +3 -3
- package/dist/billing-foundation/get-subscription-for-tenant.js +3 -5
- package/dist/billing-foundation/handlers/billing-plans.query.js +35 -5
- package/dist/billing-foundation/handlers/create-checkout-session.write.js +19 -17
- package/dist/billing-foundation/handlers/create-portal-session.write.js +11 -12
- package/dist/billing-foundation/handlers/list-subscriptions.query.js +4 -4
- package/dist/billing-foundation/handlers/plan-switch-preview.query.d.ts +13 -0
- package/dist/billing-foundation/handlers/plan-switch-preview.query.js +48 -0
- package/dist/billing-foundation/handlers/process-event.write.d.ts +6 -0
- package/dist/billing-foundation/handlers/process-event.write.js +28 -22
- package/dist/billing-foundation/handlers/start-plan-checkout.write.js +32 -5
- package/dist/billing-foundation/handlers/switch-plan.write.d.ts +2 -2
- package/dist/billing-foundation/handlers/switch-plan.write.js +56 -64
- package/dist/billing-foundation/handlers/sync-subscription.write.js +12 -1
- package/dist/billing-foundation/i18n.js +22 -0
- package/dist/billing-foundation/index.d.ts +1 -1
- package/dist/billing-foundation/plan-catalog.d.ts +21 -5
- package/dist/billing-foundation/plan-catalog.js +25 -16
- package/dist/billing-foundation/plan-switch.d.ts +12 -0
- package/dist/billing-foundation/plan-switch.js +60 -0
- package/dist/billing-foundation/projection.d.ts +15 -11
- package/dist/billing-foundation/projection.js +38 -37
- package/dist/billing-foundation/subscription-tier-sync.js +3 -3
- package/dist/billing-foundation/tenant-destroy-hook.d.ts +2 -2
- package/dist/billing-foundation/tenant-destroy-hook.js +7 -7
- package/dist/billing-foundation/types.d.ts +97 -42
- package/dist/billing-foundation/types.js +29 -20
- package/dist/billing-foundation/validate-options.js +17 -0
- package/dist/billing-foundation/web/billing-plans-panel.js +82 -36
- package/dist/billing-foundation/web/checkout-consent-dialog.d.ts +17 -3
- package/dist/billing-foundation/web/checkout-consent-dialog.js +14 -10
- package/dist/billing-foundation/web/constants.d.ts +4 -0
- package/dist/billing-foundation/web/constants.js +4 -0
- package/dist/billing-foundation/web/plan-price.d.ts +15 -0
- package/dist/billing-foundation/web/plan-price.js +32 -0
- package/dist/billing-foundation/web/plan-switch-confirm-dialog.d.ts +15 -0
- package/dist/billing-foundation/web/plan-switch-confirm-dialog.js +66 -0
- package/dist/cap-counter/aggregate-id.js +8 -9
- package/dist/cap-counter/cap-reservation.js +5 -1
- package/dist/cap-counter/constants.js +11 -12
- package/dist/cap-counter/enforce-cap.d.ts +59 -62
- package/dist/cap-counter/enforce-cap.js +49 -49
- package/dist/cap-counter/entity.js +29 -29
- package/dist/cap-counter/feature.js +34 -35
- package/dist/cap-counter/handlers/increment-rolling.write.d.ts +2 -2
- package/dist/cap-counter/handlers/increment-rolling.write.js +31 -31
- package/dist/cap-counter/handlers/mark-soft-warned.write.js +4 -5
- package/dist/cap-counter/stock-cap-guard.js +8 -2
- package/dist/cap-counter/with-cap-enforcement.d.ts +3 -5
- package/dist/channel-email/feature.js +1 -1
- package/dist/channel-email/smtp-transport.d.ts +18 -17
- package/dist/channel-email/smtp-transport.js +24 -21
- package/dist/channel-in-app/handlers/unread-count.query.js +3 -4
- package/dist/compliance-profiles/feature.js +4 -4
- package/dist/compliance-profiles/handlers/for-tenant.query.js +3 -6
- package/dist/compliance-profiles/handlers/list-profiles.query.js +5 -5
- package/dist/compliance-profiles/handlers/needs-profile.query.js +4 -4
- package/dist/compliance-profiles/handlers/set-profile.write.js +13 -14
- package/dist/compliance-profiles/handlers/sub-processors.query.js +9 -11
- package/dist/compliance-profiles/resolve-for-tenant.js +7 -7
- package/dist/compliance-profiles/schema/profile-selection.js +18 -23
- package/dist/compliance-profiles/seeding.js +14 -15
- package/dist/compliance-profiles-ops/handlers/tenants-missing-profile.query.js +3 -3
- package/dist/compliance-profiles-ops/index.js +2 -2
- package/dist/config/handlers/cascade.query.d.ts +5 -0
- package/dist/config/handlers/cascade.query.js +4 -3
- package/dist/config/handlers/readiness.query.d.ts +4 -4
- package/dist/config/handlers/readiness.query.js +1 -1
- package/dist/config/handlers/reencrypt.job.js +4 -5
- package/dist/config/handlers/set.write.js +4 -4
- package/dist/config/handlers/values.query.d.ts +5 -0
- package/dist/config/handlers/values.query.js +4 -3
- package/dist/config/resolver.js +4 -4
- package/dist/config/table.js +10 -10
- package/dist/config/write-helpers.d.ts +1 -0
- package/dist/config/write-helpers.js +19 -10
- package/dist/crypto-shredding/handlers/forget-subject.write.d.ts +2 -2
- package/dist/crypto-shredding/handlers/forget-subject.write.js +25 -21
- package/dist/custom-fields/aggregate-id.d.ts +12 -13
- package/dist/custom-fields/aggregate-id.js +16 -17
- package/dist/custom-fields/entity.js +49 -47
- package/dist/custom-fields/events.js +7 -8
- package/dist/custom-fields/feature.d.ts +14 -14
- package/dist/custom-fields/feature.js +53 -54
- package/dist/custom-fields/handlers/clear-custom-field.write.d.ts +3 -2
- package/dist/custom-fields/handlers/clear-custom-field.write.js +9 -8
- package/dist/custom-fields/handlers/define-tenant-field.write.d.ts +1 -1
- package/dist/custom-fields/handlers/define-tenant-field.write.js +2 -2
- package/dist/custom-fields/handlers/delete-system-field.write.js +6 -7
- package/dist/custom-fields/handlers/delete-tenant-field.write.d.ts +1 -1
- package/dist/custom-fields/handlers/delete-tenant-field.write.js +3 -3
- package/dist/custom-fields/handlers/set-custom-field.write.d.ts +3 -3
- package/dist/custom-fields/handlers/set-custom-field.write.js +25 -28
- package/dist/custom-fields/handlers/update-tenant-field.write.d.ts +1 -1
- package/dist/custom-fields/handlers/update-tenant-field.write.js +1 -1
- package/dist/custom-fields/lib/field-access.js +2 -2
- package/dist/custom-fields/lib/parse-serialized-field.js +1 -1
- package/dist/custom-fields/lib/quota.js +1 -1
- package/dist/custom-fields/lib/value-schema.js +10 -12
- package/dist/custom-fields/run-retention.js +3 -3
- package/dist/custom-fields/schemas.js +14 -14
- package/dist/custom-fields/web/client-plugin.js +2 -5
- package/dist/custom-fields/web/constants.js +2 -2
- package/dist/custom-fields/web/custom-fields-form-section.d.ts +4 -4
- package/dist/custom-fields/web/custom-fields-form-section.js +22 -22
- package/dist/custom-fields/wire-for-entity.js +65 -67
- package/dist/custom-fields/wire-user-data-rights.js +3 -3
- package/dist/data-retention/_internal/parse-override.js +2 -3
- package/dist/data-retention/feature.js +11 -18
- package/dist/data-retention/handlers/policy-for.query.js +6 -6
- package/dist/data-retention/keep-for.d.ts +7 -7
- package/dist/data-retention/keep-for.js +15 -15
- package/dist/data-retention/override-schema.d.ts +3 -4
- package/dist/data-retention/override-schema.js +13 -15
- package/dist/data-retention/presets.d.ts +4 -5
- package/dist/data-retention/presets.js +18 -23
- package/dist/data-retention/resolve-tenant-preset.js +17 -16
- package/dist/data-retention/resolver.d.ts +12 -12
- package/dist/data-retention/resolver.js +24 -23
- package/dist/data-retention/run-retention-cleanup.d.ts +8 -3
- package/dist/data-retention/run-retention-cleanup.js +61 -51
- package/dist/data-retention/schema/tenant-retention-override.js +13 -11
- package/dist/delivery/channel-context.js +6 -3
- package/dist/delivery/db/queries/preferences.js +2 -2
- package/dist/delivery/delivery-service.js +22 -7
- package/dist/delivery/feature.js +2 -2
- package/dist/delivery/handlers/log.query.js +1 -1
- package/dist/delivery/handlers/preferences.query.d.ts +1 -1
- package/dist/delivery/handlers/preferences.query.js +20 -1
- package/dist/delivery/handlers/unsubscribe-page-chrome.query.js +1 -1
- package/dist/delivery/tables.js +9 -8
- package/dist/delivery/unsubscribe-link.d.ts +3 -1
- package/dist/delivery/unsubscribe-page-strings.d.ts +1 -0
- package/dist/delivery/unsubscribe-page-strings.js +1 -0
- package/dist/delivery/unsubscribe-page.d.ts +2 -0
- package/dist/delivery/unsubscribe-page.js +5 -0
- package/dist/delivery/unsubscribe.js +29 -11
- package/dist/document-ingest-foundation/entity.js +4 -4
- package/dist/document-ingest-foundation/events.js +2 -2
- package/dist/document-ingest-foundation/feature.js +2 -2
- package/dist/document-ingest-foundation/pages.js +1 -1
- package/dist/document-ingest-foundation/tenant-destroy-hook.js +4 -4
- package/dist/feature-toggles/compose-tier-resolver.js +1 -1
- package/dist/feature-toggles/feature.js +1 -1
- package/dist/feature-toggles/global-feature-state-table.js +1 -1
- package/dist/feature-toggles/handlers/registered.query.js +5 -5
- package/dist/feature-toggles/toggle-sync-signal.js +1 -1
- package/dist/feature-toggles/web/constants.js +1 -1
- package/dist/file-derivatives/feature.d.ts +1 -1
- package/dist/file-derivatives/feature.js +1 -1
- package/dist/file-derivatives/handlers/public-variant.query.js +1 -1
- package/dist/file-derivatives/presets.js +1 -1
- package/dist/file-foundation/feature.js +6 -6
- package/dist/file-foundation/index.d.ts +1 -1
- package/dist/file-foundation/index.js +1 -1
- package/dist/file-foundation/read-file-ref-content.d.ts +3 -0
- package/dist/file-foundation/read-file-ref-content.js +6 -1
- package/dist/file-provider-inmemory/feature.d.ts +1 -1
- package/dist/file-provider-inmemory/feature.js +16 -16
- package/dist/file-provider-s3/env-named-feature.d.ts +0 -2
- package/dist/file-provider-s3/feature.js +16 -16
- package/dist/file-provider-s3/lib/s3-provider.js +6 -6
- package/dist/files/feature.js +6 -6
- package/dist/files-tenant-data/handlers/sweep-orphaned-derivatives.job.js +4 -4
- package/dist/files-tenant-data/hooks.js +24 -26
- package/dist/files-tenant-data/index.js +1 -1
- package/dist/folders/feature.d.ts +1 -1
- package/dist/folders/web/folder-manager.js +2 -2
- package/dist/folders/web/tree.js +5 -5
- package/dist/form-draft/db/queries/cleanup.js +3 -3
- package/dist/form-draft/db/queries/owned-file-refs.js +1 -1
- package/dist/form-draft/decrypt-draft.js +5 -1
- package/dist/form-draft/entity.js +3 -3
- package/dist/form-draft/feature.js +4 -5
- package/dist/form-draft/handlers/discard.write.js +1 -1
- package/dist/form-draft/release-file-refs.js +6 -6
- package/dist/form-draft/schemas.js +3 -3
- package/dist/form-draft/web/constants.js +0 -2
- package/dist/host-routing/dispatch.js +11 -20
- package/dist/inbound-mail-foundation/aggregate-id.d.ts +13 -13
- package/dist/inbound-mail-foundation/aggregate-id.js +19 -19
- package/dist/inbound-mail-foundation/connect-routes.js +4 -3
- package/dist/inbound-mail-foundation/constants.d.ts +22 -24
- package/dist/inbound-mail-foundation/constants.js +30 -33
- package/dist/inbound-mail-foundation/entities.d.ts +12 -12
- package/dist/inbound-mail-foundation/entities.js +47 -48
- package/dist/inbound-mail-foundation/events.d.ts +4 -3
- package/dist/inbound-mail-foundation/events.js +50 -47
- package/dist/inbound-mail-foundation/feature.js +39 -39
- package/dist/inbound-mail-foundation/handlers/account-state.js +8 -8
- package/dist/inbound-mail-foundation/handlers/connect-account.write.js +25 -26
- package/dist/inbound-mail-foundation/handlers/disconnect-account.write.js +7 -7
- package/dist/inbound-mail-foundation/handlers/ingest-message.write.js +50 -51
- package/dist/inbound-mail-foundation/handlers/list-accounts.query.js +8 -8
- package/dist/inbound-mail-foundation/handlers/list-messages.query.js +10 -10
- package/dist/inbound-mail-foundation/handlers/scope-visibility.js +3 -4
- package/dist/inbound-mail-foundation/handlers/update-account.write.d.ts +2 -2
- package/dist/inbound-mail-foundation/handlers/update-account.write.js +22 -14
- package/dist/inbound-mail-foundation/i18n.js +0 -1
- package/dist/inbound-mail-foundation/oauth-state.d.ts +5 -5
- package/dist/inbound-mail-foundation/oauth-state.js +11 -10
- package/dist/inbound-mail-foundation/projection.d.ts +4 -4
- package/dist/inbound-mail-foundation/projection.js +31 -29
- package/dist/inbound-mail-foundation/provider-factory.d.ts +4 -4
- package/dist/inbound-mail-foundation/provider-factory.js +9 -9
- package/dist/inbound-mail-foundation/retention-sweep.d.ts +5 -3
- package/dist/inbound-mail-foundation/retention-sweep.js +38 -36
- package/dist/inbound-mail-foundation/screens.js +0 -3
- package/dist/inbound-mail-foundation/tenant-destroy-hook.js +14 -16
- package/dist/inbound-mail-foundation/types.d.ts +49 -49
- package/dist/inbound-mail-foundation/types.js +21 -21
- package/dist/inbound-mail-foundation/watch-supervisor.d.ts +10 -10
- package/dist/inbound-mail-foundation/watch-supervisor.js +85 -67
- package/dist/inbound-provider-imap/credential-document.js +13 -13
- package/dist/inbound-provider-imap/feature.d.ts +2 -2
- package/dist/inbound-provider-imap/feature.js +42 -40
- package/dist/inbound-provider-imap/imap-client.d.ts +12 -11
- package/dist/inbound-provider-imap/imap-client.js +20 -19
- package/dist/inbound-provider-inmemory/feature.d.ts +9 -9
- package/dist/inbound-provider-inmemory/feature.js +19 -19
- package/dist/jobs/db/queries/retention.js +2 -2
- package/dist/jobs/db/queries/stale-run-sweep.js +3 -3
- package/dist/jobs/events.js +1 -1
- package/dist/jobs/feature.d.ts +1 -0
- package/dist/jobs/feature.js +13 -10
- package/dist/jobs/handlers/detail.query.js +4 -4
- package/dist/jobs/handlers/list.query.js +1 -1
- package/dist/jobs/handlers/projection-rebuild.job.js +1 -1
- package/dist/jobs/handlers/reindex-entity.job.js +1 -1
- package/dist/jobs/handlers/retry.write.js +1 -1
- package/dist/jobs/handlers/tenant-failures.query.d.ts +1 -1
- package/dist/jobs/handlers/tenant-failures.query.js +45 -41
- package/dist/jobs/handlers/tenant-runs.query.d.ts +1 -1
- package/dist/jobs/handlers/tenant-runs.query.js +54 -50
- package/dist/jobs/job-instant.js +1 -1
- package/dist/jobs/job-run-logger.js +15 -15
- package/dist/jobs/job-run-table.js +3 -3
- package/dist/jobs/screens.js +1 -1
- package/dist/jobs/tenant-job-failure-table.js +1 -1
- package/dist/jobs/tenant-job-run-table.js +1 -1
- package/dist/ledger/entity.js +5 -5
- package/dist/ledger/feature.js +3 -3
- package/dist/ledger/handlers/confirm-schedule-period.write.js +3 -3
- package/dist/ledger/recurring.js +12 -12
- package/dist/ledger/schemas.js +1 -1
- package/dist/ledger/web/constants.js +2 -2
- package/dist/ledger/web/index.js +7 -7
- package/dist/legal-pages/feature.d.ts +4 -4
- package/dist/legal-pages/feature.js +25 -26
- package/dist/legal-pages/markdown.js +3 -3
- package/dist/legal-pages/web/client-plugin.js +23 -24
- package/dist/legal-pages/web/index.js +0 -1
- package/dist/mail-foundation/feature.d.ts +5 -5
- package/dist/mail-foundation/feature.js +27 -25
- package/dist/mail-transport-inmemory/feature.d.ts +4 -4
- package/dist/mail-transport-inmemory/feature.js +27 -28
- package/dist/mail-transport-smtp/feature.js +20 -20
- package/dist/managed-pages/branding.js +6 -6
- package/dist/managed-pages/feature.d.ts +26 -26
- package/dist/managed-pages/feature.js +34 -34
- package/dist/managed-pages/handlers/by-slug.query.js +5 -6
- package/dist/managed-pages/handlers/by-tenant-published.query.js +2 -2
- package/dist/managed-pages/handlers/set.write.js +5 -7
- package/dist/managed-pages/screens/page-screens.js +11 -11
- package/dist/managed-pages/seeding.js +8 -8
- package/dist/managed-pages/table.js +13 -12
- package/dist/managed-pages/web/client-plugin.d.ts +1 -1
- package/dist/managed-pages/web/client-plugin.js +5 -5
- package/dist/managed-pages/web/i18n.js +1 -1
- package/dist/notes-history/entity.js +4 -4
- package/dist/notes-history/feature.d.ts +2 -2
- package/dist/notes-history-user-data/hooks.js +1 -1
- package/dist/page-render/layout.js +9 -9
- package/dist/page-render/markdown.js +11 -11
- package/dist/page-render/security-headers.js +7 -6
- package/dist/personal-access-tokens/feature.d.ts +1 -1
- package/dist/personal-access-tokens/feature.js +9 -5
- package/dist/personal-access-tokens/roles.js +2 -2
- package/dist/readiness/handlers/status.query.js +3 -3
- package/dist/renderer-foundation/api.js +12 -13
- package/dist/renderer-foundation/constants.js +2 -2
- package/dist/renderer-foundation/feature.js +7 -7
- package/dist/renderer-pdf/render-table-pdf.d.ts +1 -1
- package/dist/renderer-pdf/render-table-pdf.js +22 -10
- package/dist/secrets/feature.js +9 -9
- package/dist/secrets/web/constants.js +2 -2
- package/dist/seo/feature.js +3 -3
- package/dist/sessions/constants.d.ts +1 -1
- package/dist/sessions/constants.js +1 -1
- package/dist/sessions/feature.d.ts +2 -2
- package/dist/sessions/feature.js +12 -8
- package/dist/sessions/handlers/revoke-all-for-user.write.js +2 -2
- package/dist/sessions/handlers/revoke-all-others.write.js +2 -2
- package/dist/sessions/handlers/revoke.write.js +1 -1
- package/dist/sessions/schema/user-session.js +4 -4
- package/dist/sessions/screens.js +2 -2
- package/dist/sessions/session-callbacks.js +2 -2
- package/dist/sessions/session-revoked-event.js +2 -2
- package/dist/shared/assert-no-where-rule-in-ownership-write.js +1 -1
- package/dist/shared/decrypt-stored-pii.d.ts +1 -0
- package/dist/shared/decrypt-stored-pii.js +7 -2
- package/dist/shared/encrypt-for-direct-write.js +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/mail-template-body.d.ts +6 -2
- package/dist/shared/mail-template-body.js +7 -4
- package/dist/shared/map-with-concurrency.js +5 -4
- package/dist/shared/parent-visibility.js +2 -2
- package/dist/shared/password-hashing.js +1 -1
- package/dist/shared/signup-handover.js +1 -2
- package/dist/shared/single-use-token-store.js +1 -1
- package/dist/step-dispatcher/feature.js +1 -0
- package/dist/subscription-dodo/client.d.ts +17 -0
- package/dist/subscription-dodo/client.js +31 -0
- package/dist/subscription-dodo/constants.d.ts +12 -0
- package/dist/subscription-dodo/constants.js +19 -0
- package/dist/subscription-dodo/feature.d.ts +37 -0
- package/dist/subscription-dodo/feature.js +144 -0
- package/dist/subscription-dodo/index.d.ts +2 -0
- package/dist/subscription-dodo/index.js +4 -0
- package/dist/subscription-dodo/plugin-methods.d.ts +23 -0
- package/dist/subscription-dodo/plugin-methods.js +260 -0
- package/dist/subscription-dodo/runtime.d.ts +27 -0
- package/dist/subscription-dodo/runtime.js +89 -0
- package/dist/subscription-dodo/verify-webhook.d.ts +37 -0
- package/dist/subscription-dodo/verify-webhook.js +189 -0
- package/dist/subscription-mollie/constants.js +15 -17
- package/dist/subscription-mollie/feature.d.ts +17 -18
- package/dist/subscription-mollie/feature.js +24 -24
- package/dist/subscription-mollie/index.js +3 -3
- package/dist/subscription-mollie/plugin-methods.d.ts +2 -2
- package/dist/subscription-mollie/plugin-methods.js +15 -14
- package/dist/subscription-mollie/verify-webhook.d.ts +10 -10
- package/dist/subscription-mollie/verify-webhook.js +27 -27
- package/dist/subscription-stripe/constants.js +4 -6
- package/dist/subscription-stripe/feature.d.ts +14 -14
- package/dist/subscription-stripe/feature.js +36 -34
- package/dist/subscription-stripe/index.js +6 -6
- package/dist/subscription-stripe/plugin-methods.js +18 -18
- package/dist/subscription-stripe/runtime.d.ts +1 -1
- package/dist/subscription-stripe/runtime.js +8 -7
- package/dist/subscription-stripe/verify-webhook.d.ts +11 -11
- package/dist/subscription-stripe/verify-webhook.js +59 -61
- package/dist/tags/feature.d.ts +3 -3
- package/dist/tags/screens.js +1 -1
- package/dist/template-resolver/api.d.ts +3 -2
- package/dist/template-resolver/api.js +34 -12
- package/dist/template-resolver/compile-document-body.js +1 -0
- package/dist/template-resolver/feature.js +2 -2
- package/dist/template-resolver/handlers/bundle-import.js +3 -3
- package/dist/template-resolver/handlers/copy-locale.write.d.ts +5 -1
- package/dist/template-resolver/handlers/copy-locale.write.js +22 -7
- package/dist/template-resolver/handlers/diff-to-system.query.js +3 -2
- package/dist/template-resolver/handlers/document-base.js +3 -2
- package/dist/template-resolver/handlers/find-by-id.query.js +8 -7
- package/dist/template-resolver/handlers/list.query.js +6 -7
- package/dist/template-resolver/handlers/overview.query.d.ts +3 -0
- package/dist/template-resolver/handlers/overview.query.js +6 -3
- package/dist/template-resolver/handlers/shared.js +2 -2
- package/dist/template-resolver/handlers/template-write.js +3 -3
- package/dist/template-resolver/handlers/tenant-override-counts.query.js +1 -3
- package/dist/template-resolver/handlers/tenant-override-selection.d.ts +2 -1
- package/dist/template-resolver/handlers/tenant-overrides.query.js +28 -5
- package/dist/template-resolver/handlers/upsert-system.write.js +3 -4
- package/dist/template-resolver/handlers/upsert-tenant.write.js +4 -5
- package/dist/template-resolver/handlers/usage.query.d.ts +2 -1
- package/dist/template-resolver/handlers/usage.query.js +26 -16
- package/dist/template-resolver/handlers/validate.query.js +7 -2
- package/dist/template-resolver/seeding.js +30 -14
- package/dist/template-resolver/store-template-resource.d.ts +1 -0
- package/dist/template-resolver/store-template-resource.js +19 -4
- package/dist/template-resolver/table.js +10 -11
- package/dist/template-resolver/template-delivery-policy.d.ts +0 -5
- package/dist/template-resolver/template-delivery-policy.js +0 -6
- package/dist/template-resolver/template-meta.js +7 -4
- package/dist/template-resolver/template-preview.js +4 -3
- package/dist/template-resolver/web/client-plugin.js +2 -2
- package/dist/template-resolver/web/constants.d.ts +2 -2
- package/dist/template-resolver/web/constants.js +3 -3
- package/dist/template-resolver/web/index.d.ts +1 -0
- package/dist/template-resolver/web/index.js +1 -0
- package/dist/template-resolver/web/mail-layout-constants.d.ts +5 -0
- package/dist/template-resolver/web/mail-layout-constants.js +7 -0
- package/dist/tenant/feature.js +7 -7
- package/dist/tenant/handlers/member-directory.query.d.ts +1 -0
- package/dist/tenant/handlers/member-directory.query.js +11 -4
- package/dist/tenant/handlers/members.query.js +1 -1
- package/dist/tenant/handlers/team-list.query.js +1 -1
- package/dist/tenant/handlers/tenant-directory.query.d.ts +1 -0
- package/dist/tenant/handlers/tenant-directory.query.js +9 -5
- package/dist/tenant/invitation-table.js +37 -40
- package/dist/tenant/membership-table.js +3 -3
- package/dist/tenant/schema/tenant.js +7 -9
- package/dist/tenant/screens.js +1 -1
- package/dist/tenant/seeding.d.ts +6 -5
- package/dist/tenant/seeding.js +12 -12
- package/dist/tenant/testing.js +5 -6
- package/dist/tenant/web/constants.js +2 -2
- package/dist/tenant-handover/events.js +5 -7
- package/dist/tenant-handover/feature.js +1 -1
- package/dist/tenant-handover/grant.js +1 -1
- package/dist/tenant-handover/handlers/claim.write.js +1 -1
- package/dist/tenant-handover/move-entity-graph.js +8 -9
- package/dist/tenant-handover/signup-handover-provider.js +1 -2
- package/dist/tenant-handover/transfer-graph.js +4 -5
- package/dist/tenant-lifecycle/boot-checks.js +1 -1
- package/dist/tenant-lifecycle/constants.d.ts +1 -0
- package/dist/tenant-lifecycle/constants.js +4 -0
- package/dist/tenant-lifecycle/feature.js +1 -1
- package/dist/tenant-lifecycle/run-tenant-destroy.js +2 -2
- package/dist/tenant-settings/constants.js +1 -1
- package/dist/tenant-settings/tenant-defaults.d.ts +1 -1
- package/dist/tenant-settings/tenant-defaults.js +9 -2
- package/dist/tier-engine/aggregate-id.d.ts +11 -11
- package/dist/tier-engine/aggregate-id.js +15 -16
- package/dist/tier-engine/compose-app.d.ts +14 -14
- package/dist/tier-engine/compose-app.js +1 -1
- package/dist/tier-engine/entity.js +18 -19
- package/dist/tier-engine/feature.d.ts +19 -17
- package/dist/tier-engine/feature.js +68 -69
- package/dist/tier-engine/handlers/active-tier.query.js +6 -7
- package/dist/tier-engine/handlers/get-tenant-tier.query.js +4 -4
- package/dist/tier-engine/handlers/set-tenant-tier.write.d.ts +7 -8
- package/dist/tier-engine/handlers/set-tenant-tier.write.js +7 -4
- package/dist/tier-engine/tier-resolver.js +2 -2
- package/dist/tier-engine/trial.js +8 -8
- package/dist/tier-engine/web/constants.js +2 -2
- package/dist/tier-engine/web/index.js +4 -4
- package/dist/user/db/queries/stream-tenant-backfill.js +8 -8
- package/dist/user/handlers/create.write.js +4 -4
- package/dist/user/schema/user.d.ts +11 -11
- package/dist/user/schema/user.js +45 -44
- package/dist/user/seeding.d.ts +15 -15
- package/dist/user/seeding.js +28 -28
- package/dist/user/testing.js +3 -3
- package/dist/user-data-rights/audit-download.d.ts +8 -8
- package/dist/user-data-rights/audit-download.js +19 -20
- package/dist/user-data-rights/boot-checks.js +1 -1
- package/dist/user-data-rights/deletion-token.js +1 -1
- package/dist/user-data-rights/feature.d.ts +49 -50
- package/dist/user-data-rights/feature.js +54 -53
- package/dist/user-data-rights/handlers/cancel-deletion.write.js +9 -9
- package/dist/user-data-rights/handlers/confirm-deletion-by-token.write.js +8 -8
- package/dist/user-data-rights/handlers/download-by-job.query.js +29 -30
- package/dist/user-data-rights/handlers/download-by-token.query.js +40 -42
- package/dist/user-data-rights/handlers/export-status.query.js +8 -9
- package/dist/user-data-rights/handlers/lift-restriction.write.js +7 -8
- package/dist/user-data-rights/handlers/list-download-attempts.query.js +2 -2
- package/dist/user-data-rights/handlers/my-audit-log.query.js +4 -4
- package/dist/user-data-rights/handlers/request-deletion-by-email.write.d.ts +5 -5
- package/dist/user-data-rights/handlers/request-deletion-by-email.write.js +16 -15
- package/dist/user-data-rights/handlers/request-deletion.write.d.ts +2 -2
- package/dist/user-data-rights/handlers/request-deletion.write.js +7 -9
- package/dist/user-data-rights/handlers/request-export.write.js +42 -41
- package/dist/user-data-rights/handlers/restrict-account.write.js +22 -19
- package/dist/user-data-rights/handlers/run-forget-cleanup.write.js +8 -8
- package/dist/user-data-rights/index.js +8 -10
- package/dist/user-data-rights/lib/default-mailers.js +3 -3
- package/dist/user-data-rights/lib/update-user-lifecycle.js +14 -17
- package/dist/user-data-rights/run-export-jobs.d.ts +38 -42
- package/dist/user-data-rights/run-export-jobs.js +130 -237
- package/dist/user-data-rights/run-forget-cleanup.d.ts +16 -20
- package/dist/user-data-rights/run-forget-cleanup.js +65 -83
- package/dist/user-data-rights/run-user-export.d.ts +34 -33
- package/dist/user-data-rights/run-user-export.js +55 -57
- package/dist/user-data-rights/schema/download-attempt.js +11 -11
- package/dist/user-data-rights/schema/download-token.js +37 -41
- package/dist/user-data-rights/schema/export-job.d.ts +4 -4
- package/dist/user-data-rights/schema/export-job.js +65 -67
- package/dist/user-data-rights/token-helpers.d.ts +8 -9
- package/dist/user-data-rights/token-helpers.js +21 -25
- package/dist/user-data-rights/web/client-plugin.d.ts +5 -5
- package/dist/user-data-rights/web/client-plugin.js +1 -1
- package/dist/user-data-rights/web/confirm-deletion-screen.js +6 -5
- package/dist/user-data-rights/web/constants.js +1 -1
- package/dist/user-data-rights/web/index.js +5 -5
- package/dist/user-data-rights/web/privacy-center-screen.js +14 -13
- package/dist/user-data-rights/web/public-deletion-gate.d.ts +4 -4
- package/dist/user-data-rights/web/request-deletion-screen.js +6 -6
- package/dist/user-data-rights/zip-path.d.ts +15 -15
- package/dist/user-data-rights/zip-path.js +41 -40
- package/dist/user-data-rights-defaults/feature.js +15 -15
- package/dist/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.js +3 -5
- package/dist/user-data-rights-defaults/hooks/file-ref.userdata-hook.js +45 -51
- package/dist/user-data-rights-defaults/hooks/job-run.userdata-hook.js +2 -2
- package/dist/user-data-rights-defaults/hooks/notification-preference.userdata-hook.js +1 -1
- package/dist/user-data-rights-defaults/hooks/user-session.userdata-hook.js +3 -3
- package/dist/user-data-rights-defaults/hooks/user.userdata-hook.js +32 -31
- package/dist/user-profile/handlers/change-email.write.js +13 -13
- package/dist/user-profile/index.js +3 -3
- package/dist/user-profile/web/client-plugin.js +1 -1
- package/dist/user-profile/web/constants.js +1 -1
- package/dist/user-profile/web/profile-screen.js +1 -1
- package/dist/waitlist/handlers/export-purge.write.js +2 -1
- package/dist/waitlist/handlers/submit.write.js +5 -5
- package/dist/waitlist/import.d.ts +1 -0
- package/dist/waitlist/import.js +4 -0
- package/dist/waitlist/legacy-migrate.js +17 -6
- package/dist/waitlist/link-on-signup.js +18 -6
- package/dist/waitlist/options.d.ts +3 -0
- package/dist/workflow-runner/aggregate-id.d.ts +1 -1
- package/dist/workflow-runner/aggregate-id.js +1 -1
- package/dist/workflow-runner/event-subscriber.js +4 -5
- package/dist/workflow-runner/event-trigger.js +4 -17
- package/dist/workflow-runner/feature.js +2 -2
- package/dist/workflow-runner/handlers/resume-run.write.js +4 -4
- package/dist/workflow-runner/pending-projection.js +6 -7
- package/dist/workflow-runner/runner.js +6 -6
- package/dist/workflow-runner/tables.js +6 -6
- package/dist/workflow-runner/workflow-registry.js +1 -1
- package/package.json +20 -10
- package/src/agent-tools/changes.json +6 -0
- package/src/audit/changes.json +12 -0
- package/src/auth-mfa/changes.json +6 -0
- package/src/billing-foundation/changes.json +55 -0
- package/src/cap-counter/changes.json +18 -0
- package/src/channel-email/changes.json +6 -0
- package/src/config/changes.json +12 -0
- package/src/crypto-shredding/changes.json +6 -0
- package/src/delivery/changes.json +30 -0
- package/src/form-draft/changes.json +6 -0
- package/src/host-routing/changes.json +6 -0
- package/src/inbound-mail-foundation/changes.json +18 -0
- package/src/jobs/changes.json +13 -0
- package/src/mail-foundation/changes.json +6 -0
- package/src/renderer-pdf/changes.json +6 -0
- package/src/step-dispatcher/changes.json +6 -0
- package/src/subscription-dodo/changes.json +14 -0
- package/src/subscription-stripe/changes.json +12 -0
- package/src/template-resolver/changes.json +48 -0
- package/src/tenant/changes.json +6 -0
- package/src/tenant-lifecycle/changes.json +6 -0
- package/src/tier-engine/changes.json +6 -0
- package/src/waitlist/changes.json +18 -0
- package/dist/billing-foundation/consumer-protection/stored-user-email.d.ts +0 -1
- package/dist/billing-foundation/consumer-protection/stored-user-email.js +0 -8
|
@@ -10,25 +10,18 @@ export { resolveTenantRetentionPreset, } from "./resolve-tenant-preset.js";
|
|
|
10
10
|
export { resolveRetentionPolicy, } from "./resolver.js";
|
|
11
11
|
export { runRetentionCleanup, } from "./run-retention-cleanup.js";
|
|
12
12
|
export { tenantRetentionOverrideEntity, tenantRetentionOverrideTable, } from "./schema/tenant-retention-override.js";
|
|
13
|
-
// data-retention —
|
|
13
|
+
// data-retention — automated retention and deletion per entity.
|
|
14
14
|
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
// - Retention-Presets (dsgvo-basic, dsgvo-hgb, swiss-dsg, default)
|
|
18
|
-
// - tenantRetentionOverride-Entity für per-Tenant Edge-Cases
|
|
15
|
+
// Retention is resolved through three layers: entity default → tenant preset →
|
|
16
|
+
// tenant override stored in `tenantRetentionOverride`.
|
|
19
17
|
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
18
|
+
// The retention-cleanup cron performs batched hard deletes and soft deletes per
|
|
19
|
+
// tenant. The tenant preset can be derived from the compliance profile, while
|
|
20
|
+
// anonymization is deferred and uses an idempotency marker; see
|
|
21
|
+
// `run-retention-cleanup.ts`.
|
|
24
22
|
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
// Cross-Feature-Hinweis: Plan-Roadmap docs/plans/datenschutz/
|
|
29
|
-
// core-data-retention.md — Forget-Flow konsultiert blockDelete via
|
|
30
|
-
// retention.policyFor → anonymize statt hardDelete bei Aufbewahrungs-
|
|
31
|
-
// pflicht. Das Wiring kommt in Sprint 2.U5.
|
|
23
|
+
// The forget flow consults `retention.policyFor` and anonymizes records instead
|
|
24
|
+
// of hard-deleting them while a mandatory retention period applies.
|
|
32
25
|
export function createDataRetentionFeature() {
|
|
33
26
|
return defineFeature("data-retention", (r) => {
|
|
34
27
|
r.describe("Resolves the effective retention policy for any entity using a 3-layer stack: entity-level default \u2192 tenant preset (`dsgvo-basic`, `dsgvo-hgb`, `swiss-dsg`) \u2192 per-tenant override stored in `tenantRetentionOverride`. Other features query the resolved policy via the `retention.policyFor` cross-feature API \u2014 most notably `user-data-rights`, which uses it to decide whether to anonymize instead of hard-delete a record that is still within a mandatory retention window.");
|
|
@@ -38,10 +31,10 @@ export function createDataRetentionFeature() {
|
|
|
38
31
|
recommended: false,
|
|
39
32
|
});
|
|
40
33
|
r.entity({ name: "tenant-retention-override", ...tenantRetentionOverrideEntity });
|
|
41
|
-
//
|
|
34
|
+
// Cross-feature API for the forget flow and cleanup job
|
|
42
35
|
r.exposesApi("retention.policyFor");
|
|
43
36
|
r.queryHandler(policyForQuery);
|
|
44
|
-
//
|
|
37
|
+
// Autonomous retention cleanup. perTenant fan-out (one run per
|
|
45
38
|
// active tenant, like soft-delete-cleanup): runRetentionCleanup's raw
|
|
46
39
|
// query helpers need the unfiltered runner, so the handler declares
|
|
47
40
|
// escapeHatch and reaches for ctx.db.unsafeRaw(). Without this cron,
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
2
|
import * as z from "zod";
|
|
3
3
|
import { resolveRetentionPolicyForTenant } from "../resolve-for-tenant.js";
|
|
4
|
-
// retention:query:policy-for — Cross-
|
|
4
|
+
// retention:query:policy-for — Cross-feature API for the forget flow.
|
|
5
5
|
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
6
|
+
// The forget flow calls this for each entity to determine whether it should
|
|
7
|
+
// use "delete", "anonymize", or "blockDelete-bis-Frist". The cleanup job uses
|
|
8
|
+
// it for the same purpose.
|
|
9
9
|
//
|
|
10
10
|
// Delegates to resolveRetentionPolicyForTenant so forget, the cleanup cron and
|
|
11
11
|
// this query can never disagree about the tenant preset. Letting the resolver
|
|
12
12
|
// load the preset itself costs one read per call, fine for a single lookup.
|
|
13
13
|
//
|
|
14
|
-
// access: openToAll —
|
|
15
|
-
//
|
|
14
|
+
// access: openToAll — other features in the same tenant may retrieve this.
|
|
15
|
+
// The result contains no PII, only policy metadata.
|
|
16
16
|
export const policyForQuery = defineQueryHandler({
|
|
17
17
|
name: "policy-for",
|
|
18
18
|
schema: z.object({
|
|
@@ -4,17 +4,17 @@ export declare class InvalidKeepForError extends Error {
|
|
|
4
4
|
}
|
|
5
5
|
export type Instant = InstanceType<ReturnType<typeof getTemporal>["Instant"]>;
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Computes the cutoff instant — rows with reference < cutoff are expired
|
|
8
|
+
* and removed by the cleanup job.
|
|
9
9
|
*
|
|
10
|
-
* @param spec keepFor
|
|
11
|
-
* @param now
|
|
12
|
-
*
|
|
10
|
+
* @param spec keepFor string such as "30d", "10y", "6m", "1w", "24h"
|
|
11
|
+
* @param now Current point in time (injection parameter for time-travel tests;
|
|
12
|
+
* not global Temporal.Now)
|
|
13
13
|
*/
|
|
14
14
|
export declare function computeCutoff(spec: string, now: Instant): Instant;
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* Determines whether referenceTimestamp is older than the keepFor cutoff at now.
|
|
17
|
+
* The cleanup job uses this for each row.
|
|
18
18
|
*/
|
|
19
19
|
export declare function isPastCutoff(args: {
|
|
20
20
|
readonly referenceTimestamp: Instant;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
// keepFor
|
|
1
|
+
// keepFor format parser: "30d" / "10y" / "6m" / "1w" / "24h" → cutoff instant.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
3
|
+
// Not millisecond-precise — GDPR retention requirements use day/month
|
|
4
|
+
// granularity. "6m" = 6×30d, "10y" = 10×365d. The cleanup job runs daily,
|
|
5
|
+
// so a difference of a few days at the cutoff is acceptable.
|
|
6
6
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
7
|
+
// The boot validator already checked the format against /^\d+[hdwmy]$/
|
|
8
|
+
// — validate defensively again here for migration edge cases.
|
|
9
9
|
//
|
|
10
|
-
// Temporal
|
|
11
|
-
// `getTemporal()`
|
|
10
|
+
// Temporal is provided via globalThis (the polyfill is installed during framework boot).
|
|
11
|
+
// `getTemporal()` from framework/time provides typed access.
|
|
12
12
|
import { getTemporal } from "@cosmicdrift/kumiko-framework/time";
|
|
13
13
|
const KEEP_FOR_PATTERN = /^(\d+)([hdwmy])$/;
|
|
14
14
|
const UNIT_TO_DAYS = {
|
|
@@ -23,12 +23,12 @@ export class InvalidKeepForError extends Error {
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
26
|
+
* Computes the cutoff instant — rows with reference < cutoff are expired
|
|
27
|
+
* and removed by the cleanup job.
|
|
28
28
|
*
|
|
29
|
-
* @param spec keepFor
|
|
30
|
-
* @param now
|
|
31
|
-
*
|
|
29
|
+
* @param spec keepFor string such as "30d", "10y", "6m", "1w", "24h"
|
|
30
|
+
* @param now Current point in time (injection parameter for time-travel tests;
|
|
31
|
+
* not global Temporal.Now)
|
|
32
32
|
*/
|
|
33
33
|
export function computeCutoff(spec, now) {
|
|
34
34
|
const match = KEEP_FOR_PATTERN.exec(spec);
|
|
@@ -47,8 +47,8 @@ export function computeCutoff(spec, now) {
|
|
|
47
47
|
return now.subtract({ hours: amount * daysFactor * 24 });
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
50
|
+
* Determines whether referenceTimestamp is older than the keepFor cutoff at now.
|
|
51
|
+
* The cleanup job uses this for each row.
|
|
52
52
|
*/
|
|
53
53
|
export function isPastCutoff(args) {
|
|
54
54
|
const T = getTemporal();
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import * as z from "zod";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* undefined behavior weiterzumachen.
|
|
3
|
+
* Strict Zod schema for RetentionOverride, used by the set-override handler
|
|
4
|
+
* and the cleanup job's DB loader. The loader logs invalid JSON from the
|
|
5
|
+
* config column and skips it instead of continuing with undefined behavior.
|
|
7
6
|
*/
|
|
8
7
|
export declare const retentionOverrideSchema: z.ZodObject<{
|
|
9
8
|
keepFor: z.ZodOptional<z.ZodString>;
|
|
@@ -1,25 +1,23 @@
|
|
|
1
|
-
// Zod
|
|
1
|
+
// Strict Zod schema for RetentionOverride.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
3
|
+
// Symmetric with compliance-profiles override-schema.ts.
|
|
4
|
+
// Every user-configurable JSON override uses strict Zod validation
|
|
5
|
+
// with enum validation.
|
|
6
6
|
//
|
|
7
|
-
//
|
|
8
|
-
// - Top-
|
|
9
|
-
// - Strategy
|
|
10
|
-
// - keepFor
|
|
7
|
+
// Protects against:
|
|
8
|
+
// - Top-level typos ("keepfor" instead of "keepFor") — strict() rejects them
|
|
9
|
+
// - Strategy enum drift ("delete" instead of "hardDelete") — z.enum rejects it
|
|
10
|
+
// - keepFor format drift ("30days" instead of "30d") — regex rejects it
|
|
11
11
|
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// gueltig sein.
|
|
12
|
+
// A tenant override may omit all three properties (the resolver falls back
|
|
13
|
+
// to the preset/entity default), but every property that is set must be valid.
|
|
15
14
|
import * as z from "zod";
|
|
16
15
|
const KEEP_FOR_PATTERN = /^\d+[hdwmy]$/;
|
|
17
16
|
const retentionStrategySchema = z.enum(["hardDelete", "softDelete", "anonymize", "blockDelete"]);
|
|
18
17
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* undefined behavior weiterzumachen.
|
|
18
|
+
* Strict Zod schema for RetentionOverride, used by the set-override handler
|
|
19
|
+
* and the cleanup job's DB loader. The loader logs invalid JSON from the
|
|
20
|
+
* config column and skips it instead of continuing with undefined behavior.
|
|
23
21
|
*/
|
|
24
22
|
export const retentionOverrideSchema = z
|
|
25
23
|
.object({
|
|
@@ -8,13 +8,12 @@ import type { RetentionDef } from "@cosmicdrift/kumiko-framework/engine";
|
|
|
8
8
|
export type RetentionPreset = Readonly<Record<string, RetentionDef>>;
|
|
9
9
|
export type RetentionPresetKey = "default" | "dsgvo-basic" | "dsgvo-hgb" | "swiss-dsg";
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
* pipeda-default, ca-quebec-l25)
|
|
11
|
+
* Available presets. Additional options (hipaa, ccpa, aggressive-gdpr,
|
|
12
|
+
* pipeda-default, ca-quebec-l25) can be added on demand.
|
|
13
13
|
*/
|
|
14
14
|
export declare const RETENTION_PRESETS: Readonly<Record<RetentionPresetKey, RetentionPreset>>;
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* echtes Preset.
|
|
16
|
+
* Presets available in the onboarding banner. `default` is a migration edge
|
|
17
|
+
* case and is not displayed; production tenants must choose an actual preset.
|
|
19
18
|
*/
|
|
20
19
|
export declare const SELECTABLE_RETENTION_PRESETS: readonly RetentionPresetKey[];
|
|
@@ -1,32 +1,28 @@
|
|
|
1
|
-
// Retention
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
1
|
+
// Retention presets — predefined bundles of per-entity retention
|
|
2
|
+
// configurations for each compliance regime. The tenant admin selects ONE
|
|
3
|
+
// (analogous to compliance profiles); the entity default and tenant override
|
|
4
|
+
// are layered above it as layers 1 and 3 (see resolver.ts).
|
|
5
5
|
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// rest folgt on-demand wenn Customer fragt.
|
|
9
|
-
//
|
|
10
|
-
// Presets sind pure Daten — keine Logik. Erweitern = Constant erweitern,
|
|
11
|
-
// kein Code-Eingriff.
|
|
6
|
+
// The presets are pure data with no logic. Extending them means extending the
|
|
7
|
+
// constant; no code changes are required.
|
|
12
8
|
/**
|
|
13
|
-
*
|
|
14
|
-
* pipeda-default, ca-quebec-l25)
|
|
9
|
+
* Available presets. Additional options (hipaa, ccpa, aggressive-gdpr,
|
|
10
|
+
* pipeda-default, ca-quebec-l25) can be added on demand.
|
|
15
11
|
*/
|
|
16
12
|
export const RETENTION_PRESETS = {
|
|
17
|
-
// Default —
|
|
18
|
-
//
|
|
19
|
-
//
|
|
13
|
+
// Default — no automatic action; intended only for Dev/Staging.
|
|
14
|
+
// A production tenant that leaves `default` selected causes the cleanup job
|
|
15
|
+
// to write the audit entry "skipped: no preset selected".
|
|
20
16
|
default: {},
|
|
21
|
-
// DSGVO Basic —
|
|
17
|
+
// DSGVO Basic — data minimization without accounting retention obligations.
|
|
22
18
|
"dsgvo-basic": {
|
|
23
19
|
"audit-log": { keepFor: "1y", strategy: "hardDelete", reference: "createdAt" },
|
|
24
20
|
session: { keepFor: "30d", strategy: "hardDelete", reference: "lastSeenAt" },
|
|
25
21
|
"http-log": { keepFor: "90d", strategy: "hardDelete", reference: "createdAt" },
|
|
26
22
|
},
|
|
27
|
-
// DSGVO + HGB —
|
|
28
|
-
//
|
|
29
|
-
//
|
|
23
|
+
// DSGVO + HGB — German statutory retention obligations take precedence.
|
|
24
|
+
// Orders are anonymized (PII removed while business data remains); invoices
|
|
25
|
+
// and bookings are blockDelete for up to 10 years, then anonymized.
|
|
30
26
|
"dsgvo-hgb": {
|
|
31
27
|
"audit-log": { keepFor: "1y", strategy: "hardDelete", reference: "createdAt" },
|
|
32
28
|
session: { keepFor: "30d", strategy: "hardDelete", reference: "lastSeenAt" },
|
|
@@ -36,7 +32,7 @@ export const RETENTION_PRESETS = {
|
|
|
36
32
|
contract: { keepFor: "6y", strategy: "blockDelete", reference: "createdAt" },
|
|
37
33
|
order: { keepFor: "6y", strategy: "anonymize", reference: "completedAt" },
|
|
38
34
|
},
|
|
39
|
-
//
|
|
35
|
+
// Swiss DSG — similar to DSGVO, with retention under OR Art. 958f.
|
|
40
36
|
"swiss-dsg": {
|
|
41
37
|
"audit-log": { keepFor: "1y", strategy: "hardDelete", reference: "createdAt" },
|
|
42
38
|
session: { keepFor: "30d", strategy: "hardDelete", reference: "lastSeenAt" },
|
|
@@ -44,9 +40,8 @@ export const RETENTION_PRESETS = {
|
|
|
44
40
|
},
|
|
45
41
|
};
|
|
46
42
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* echtes Preset.
|
|
43
|
+
* Presets available in the onboarding banner. `default` is a migration edge
|
|
44
|
+
* case and is not displayed; production tenants must choose an actual preset.
|
|
50
45
|
*/
|
|
51
46
|
export const SELECTABLE_RETENTION_PRESETS = [
|
|
52
47
|
"dsgvo-basic",
|
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
1
|
+
// Derives a tenant's Layer-2 retention preset from its compliance profile.
|
|
2
|
+
// The retention-cleanup cron calls this once per fan-out tenant.
|
|
3
3
|
//
|
|
4
|
-
// **Soft
|
|
5
|
-
// compliance-profiles
|
|
6
|
-
//
|
|
7
|
-
// (Layer 1)
|
|
8
|
-
//
|
|
4
|
+
// **Soft dependency:** data-retention remains mountable standalone. A preset is
|
|
5
|
+
// derived only when compliance-profiles is mounted as well (its entity is
|
|
6
|
+
// registered); otherwise this returns null, leaving only entity defaults
|
|
7
|
+
// (Layer 1) and per-entity tenant overrides (Layer 3). No r.requires is used,
|
|
8
|
+
// so an app can use data-retention without compliance-profiles.
|
|
9
9
|
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
10
|
+
// The mapping is intentional: compliance profiles (regions) and retention
|
|
11
|
+
// presets are both built around the same three regimes (EU/CH/DE-HGB).
|
|
12
|
+
// swiss-dsg even has the same name. minimal-no-region maps to "default"
|
|
13
|
+
// (a no-op preset).
|
|
13
14
|
import { resolveProfileForTenant } from "../compliance-profiles/index.js";
|
|
14
|
-
//
|
|
15
|
-
//
|
|
15
|
+
// Entity name from compliance-profiles/feature.ts — check that the feature is
|
|
16
|
+
// mounted before reading its table; otherwise fetchOne throws.
|
|
16
17
|
const COMPLIANCE_PROFILE_ENTITY = "tenant-compliance-profile";
|
|
17
18
|
const PROFILE_TO_PRESET = {
|
|
18
19
|
"eu-dsgvo": "dsgvo-basic",
|
|
@@ -24,11 +25,11 @@ export async function resolveTenantRetentionPreset(args) {
|
|
|
24
25
|
if (!args.registry.getEntity(COMPLIANCE_PROFILE_ENTITY)) {
|
|
25
26
|
return null;
|
|
26
27
|
}
|
|
27
|
-
// resolveProfileForTenant
|
|
28
|
-
// by tenantId
|
|
29
|
-
//
|
|
28
|
+
// resolveProfileForTenant reads the tenant's 1:1 profile row from the boot DB,
|
|
29
|
+
// filtered by tenantId, and falls back to minimal-no-region when the tenant
|
|
30
|
+
// has not selected a profile yet.
|
|
30
31
|
const effective = await resolveProfileForTenant({ db: args.db, tenantId: args.tenantId });
|
|
31
32
|
return PROFILE_TO_PRESET[effective.profile.key] ?? null;
|
|
32
33
|
}
|
|
33
|
-
//
|
|
34
|
+
// Exported for the unit test that checks completeness against ComplianceProfileKey.
|
|
34
35
|
export { PROFILE_TO_PRESET };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { EntityDefinition, RetentionDef } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
2
|
import { type RetentionPresetKey } from "./presets.ts";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Raw override from the database table (the config column as a JSON string).
|
|
5
|
+
* Unlike RetentionDef, every property is optional because an override may
|
|
6
|
+
* replace individual properties.
|
|
7
7
|
*/
|
|
8
8
|
export interface RetentionOverride {
|
|
9
9
|
readonly keepFor?: string;
|
|
@@ -11,13 +11,13 @@ export interface RetentionOverride {
|
|
|
11
11
|
readonly reference?: string;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* Effective policy after the resolver ran. `source` records WHICH layer
|
|
15
|
+
* supplied the value, as an audit trail for the DPO.
|
|
16
16
|
*
|
|
17
|
-
* `override-incomplete`
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
17
|
+
* `override-incomplete` means a tenant override is set but fills keepFor
|
|
18
|
+
* neither itself nor through the preset/entity fallback. The cleanup job
|
|
19
|
+
* logs a warning and skips instead of deleting everything at once with a
|
|
20
|
+
* default "0d".
|
|
21
21
|
*/
|
|
22
22
|
export interface EffectiveRetentionPolicy {
|
|
23
23
|
readonly entityName: string;
|
|
@@ -31,8 +31,8 @@ export interface ResolveRetentionPolicyArgs {
|
|
|
31
31
|
readonly tenantOverride: RetentionOverride | null;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
34
|
+
* Resolves the three layers. This is a pure function with no database
|
|
35
|
+
* access; the caller supplies all inputs (the cleanup job aggregates them
|
|
36
|
+
* per tenant beforehand).
|
|
37
37
|
*/
|
|
38
38
|
export declare function resolveRetentionPolicy(args: ResolveRetentionPolicyArgs): EffectiveRetentionPolicy;
|
|
@@ -1,42 +1,43 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Three-layer retention resolver.
|
|
2
2
|
//
|
|
3
|
-
// Layer 1: Entity
|
|
4
|
-
// Layer 2: Tenant
|
|
5
|
-
// Layer 3: Tenant
|
|
3
|
+
// Layer 1: Entity default — Feature author sets r.entity({retention})
|
|
4
|
+
// Layer 2: Tenant preset — Tenant admin selects a bundle (RETENTION_PRESETS)
|
|
5
|
+
// Layer 3: Tenant override — per (tenantId, entityName) JSON override
|
|
6
6
|
//
|
|
7
|
-
//
|
|
7
|
+
// Resolution order:
|
|
8
8
|
// effective = override(tenantId, entityName)
|
|
9
9
|
// ?? preset[tenant.retentionPreset][entityName]
|
|
10
|
-
// ?? entity.retention (
|
|
11
|
-
// ?? null (
|
|
10
|
+
// ?? entity.retention (code default from EntityDefinition)
|
|
11
|
+
// ?? null (no automatic action)
|
|
12
12
|
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
// blockDelete-
|
|
13
|
+
// The cleanup job resolves this for each (tenantId, entityName) and
|
|
14
|
+
// decides what to do (hardDelete / softDelete / anonymize /
|
|
15
|
+
// blockDelete with a grace-period check).
|
|
16
16
|
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
17
|
+
// The cross-feature API r.exposesApi("retention.policyFor")
|
|
18
|
+
// makes this consumable by user-data-rights — the forget flow
|
|
19
|
+
// queries blockDelete fields and anonymizes them instead of deleting them.
|
|
20
20
|
import { RETENTION_PRESETS } from "./presets.js";
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
22
|
+
* Resolves the three layers. This is a pure function with no database
|
|
23
|
+
* access; the caller supplies all inputs (the cleanup job aggregates them
|
|
24
|
+
* per tenant beforehand).
|
|
25
25
|
*/
|
|
26
26
|
export function resolveRetentionPolicy(args) {
|
|
27
27
|
const { entityName, entityDef, tenantPreset, tenantOverride } = args;
|
|
28
|
-
// Layer 3: Override wins,
|
|
29
|
-
//
|
|
28
|
+
// Layer 3: Override wins, but it may omit fields, which then
|
|
29
|
+
// fall back to the individual properties from Layer 2 or 1.
|
|
30
30
|
if (tenantOverride !== null) {
|
|
31
31
|
const baseFromPreset = tenantPreset !== null ? (RETENTION_PRESETS[tenantPreset]?.[entityName] ?? null) : null;
|
|
32
32
|
const baseFromEntity = entityDef?.retention ?? null;
|
|
33
33
|
const base = baseFromPreset ?? baseFromEntity;
|
|
34
34
|
const keepFor = tenantOverride.keepFor ?? base?.keepFor;
|
|
35
35
|
const strategy = tenantOverride.strategy ?? base?.strategy;
|
|
36
|
-
// keepFor + strategy
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
36
|
+
// keepFor + strategy are required for every active policy. If
|
|
37
|
+
// neither the override nor the base supplies them, the override is
|
|
38
|
+
// semantically incomplete — the cleanup job must warn instead of
|
|
39
|
+
// immediately deleting everything with the default "0d". The source
|
|
40
|
+
// marker documents this.
|
|
40
41
|
if (keepFor === undefined || strategy === undefined) {
|
|
41
42
|
return { entityName, policy: null, source: "override-incomplete" };
|
|
42
43
|
}
|
|
@@ -58,6 +59,6 @@ export function resolveRetentionPolicy(args) {
|
|
|
58
59
|
if (entityDef?.retention) {
|
|
59
60
|
return { entityName, policy: entityDef.retention, source: "entity-default" };
|
|
60
61
|
}
|
|
61
|
-
//
|
|
62
|
+
// No policy is defined, so the cleanup job skips this entity for this tenant.
|
|
62
63
|
return { entityName, policy: null, source: "none" };
|
|
63
64
|
}
|
|
@@ -11,14 +11,16 @@ export interface RunRetentionCleanupArgs {
|
|
|
11
11
|
/** Layer-2 preset from resolveTenantRetentionPreset, resolved once per tenant
|
|
12
12
|
* by the caller rather than per entity here. null = layers 1 and 3 only. */
|
|
13
13
|
readonly preloadedTenantPreset: RetentionPresetKey | null;
|
|
14
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* Injects the current time so tests can pin it without mocking the date (pattern keep-for.ts).
|
|
16
|
+
*/
|
|
15
17
|
readonly now: Instant;
|
|
16
18
|
readonly batchLimit?: number;
|
|
17
19
|
/** Storage access for hardDelete entities with file/image/files/images fields.
|
|
18
20
|
* Missing while fileRefs are due → the row stays (skipped "missing_file_storage"),
|
|
19
21
|
* fail-closed instead of orphaning bytes. */
|
|
20
22
|
readonly files?: FileContext;
|
|
21
|
-
/** KMS for erasing a hardDeleted row's own subject key
|
|
23
|
+
/** KMS for erasing a hardDeleted row's own subject key. Defaults
|
|
22
24
|
* to configuredPiiSubjectKms() (same fallback as run-forget-cleanup.ts);
|
|
23
25
|
* undefined/no-KMS-configured skips erasure entirely — the row is still
|
|
24
26
|
* hard-deleted, only crypto-shredding of its DEK is not attempted. */
|
|
@@ -33,7 +35,10 @@ export interface RunRetentionCleanupResult {
|
|
|
33
35
|
readonly softDeleted: number;
|
|
34
36
|
/** Rows deren anonymize-Feld-Funktionen angewendet wurden (anonymize + abgelaufene blockDelete). */
|
|
35
37
|
readonly anonymized: number;
|
|
36
|
-
/**
|
|
38
|
+
/**
|
|
39
|
+
* Anomalies where the policy references a missing table column or anonymize has no anonymize
|
|
40
|
+
* fields.
|
|
41
|
+
*/
|
|
37
42
|
readonly skipped: readonly RetentionCleanupSkip[];
|
|
38
43
|
}
|
|
39
44
|
export declare function runRetentionCleanup(args: RunRetentionCleanupArgs): Promise<RunRetentionCleanupResult>;
|