@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
|
@@ -1,28 +1,30 @@
|
|
|
1
|
-
// Inbound-mail data
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
// event-sourced
|
|
1
|
+
// Inbound-mail data retention. DSGVO Art. 5 (data minimization):
|
|
2
|
+
// without retention, read_inbound_messages and the file-storage bodies grow
|
|
3
|
+
// without bound. Two targets, two mechanisms—the difference is
|
|
4
|
+
// event-sourced versus unmanaged:
|
|
5
5
|
//
|
|
6
|
-
// read_inbound_messages (event-sourced,
|
|
7
|
-
//
|
|
8
|
-
// (+ bodyRef
|
|
9
|
-
//
|
|
10
|
-
// forgotten-
|
|
11
|
-
// forget
|
|
12
|
-
// received
|
|
13
|
-
// loadAggregate
|
|
14
|
-
//
|
|
6
|
+
// read_inbound_messages (event-sourced, EXPLICIT r.projection):
|
|
7
|
+
// each Row older than messageRetentionDays → archiveStream + Row delete
|
|
8
|
+
// (+ delete the bodyRef object). archiveStream instead of executor.forget
|
|
9
|
+
// because the projection maps only the received domain event, not the
|
|
10
|
+
// forgotten auto-verb (which only ImplicitProjection registers). A
|
|
11
|
+
// forget event would be ignored during a rebuild, causing the Row to be
|
|
12
|
+
// resurrected from the received event. The archived stream makes
|
|
13
|
+
// loadAggregate empty, so received is not replicated in the first place.
|
|
14
|
+
// Same pattern as tenant-destroy-hook, but with a per-Row cutoff instead
|
|
15
|
+
// of an entire Tenant.
|
|
15
16
|
//
|
|
16
|
-
// store_mail_seen_messages (unmanaged, direct-write,
|
|
17
|
-
//
|
|
18
|
-
// via plain deleteMany,
|
|
19
|
-
// tenant_id
|
|
17
|
+
// store_mail_seen_messages (unmanaged, direct-write, not event-sourced):
|
|
18
|
+
// The deduplication anchor is needed only for the backfill/replay window →
|
|
19
|
+
// seenAt cutoff via plain deleteMany, with no stream/archive. Scoped
|
|
20
|
+
// directly through the table's tenant_id column (table-builder convention),
|
|
21
|
+
// without an Account join.
|
|
20
22
|
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
23
|
+
// LIMITATION: the PII in the message events remains decryptable under the
|
|
24
|
+
// TENANT subject key—per-Row retention does not shred a key. Actual Art.-17
|
|
25
|
+
// erasure of event payloads happens only during tenant-destroy (key erasure).
|
|
26
|
+
// The read Row and body file are gone after the sweep; the event log is
|
|
27
|
+
// append-only by design.
|
|
26
28
|
import { deleteMany, selectMany } from "@cosmicdrift/kumiko-framework/db";
|
|
27
29
|
import { archiveStream, deleteRowsWithoutReplayableStream, } from "@cosmicdrift/kumiko-framework/event-store";
|
|
28
30
|
import { seenMessageTable } from "./entities.js";
|
|
@@ -46,18 +48,18 @@ async function purgeExpiredMessages(args, cutoff) {
|
|
|
46
48
|
let messagesPurged = 0;
|
|
47
49
|
let bodyObjectsDeleted = 0;
|
|
48
50
|
let bodyObjectErrors = 0;
|
|
49
|
-
// Drain
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
// select
|
|
54
|
-
//
|
|
51
|
+
// Drain loop: each page deletes the Rows it reads, so the next page is fresh.
|
|
52
|
+
// Run archiveStream BEFORE deletion: if a crash occurs in between, the next
|
|
53
|
+
// run re-archives idempotently and deletes the Row. Delete strictly by the
|
|
54
|
+
// archived IDs, never with a cutoff WHERE; otherwise an old mail arriving
|
|
55
|
+
// between select and delete could be deleted without being archived and
|
|
56
|
+
// resurrected during a rebuild.
|
|
55
57
|
//
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
//
|
|
58
|
+
// A Row whose deleteBodyObject fails is NOT deleted; otherwise the only
|
|
59
|
+
// reference to the now-orphaned file object would be lost (no retry or
|
|
60
|
+
// dead-letter). The Row remains for the next sweep (archiveStream is
|
|
61
|
+
// idempotent). failedIds prevents such a Row from being selected endlessly
|
|
62
|
+
// during THIS run.
|
|
61
63
|
const failedIds = new Set();
|
|
62
64
|
for (;;) {
|
|
63
65
|
const rows = (await selectMany(args.db, inboundMessagesProjectionTable, { receivedAt: { lt: cutoff }, tenantId: args.tenantId }, { limit: BATCH_LIMIT })).filter((row) => !failedIds.has(row.id));
|
|
@@ -99,9 +101,9 @@ async function purgeExpiredMessages(args, cutoff) {
|
|
|
99
101
|
return { messagesPurged, bodyObjectsDeleted, bodyObjectErrors };
|
|
100
102
|
}
|
|
101
103
|
async function purgeExpiredSeenAnchors(db, tenantId, cutoff) {
|
|
102
|
-
// Seen
|
|
103
|
-
//
|
|
104
|
-
//
|
|
104
|
+
// Seen anchors inherit tenantId (table-builder: every Entity has tenant_id) →
|
|
105
|
+
// scoped directly to the tenant, without an Account join. This also includes
|
|
106
|
+
// anchors whose Account has already been disconnected or deleted.
|
|
105
107
|
const where = { tenantId, seenAt: { lt: cutoff } };
|
|
106
108
|
const expired = await selectMany(db, seenMessageTable, where);
|
|
107
109
|
if (expired.length === 0)
|
|
@@ -63,8 +63,6 @@ export const mailAccountListScreen = {
|
|
|
63
63
|
access: MAIL_ACCOUNT_ADMIN_ACCESS,
|
|
64
64
|
dormant: true,
|
|
65
65
|
};
|
|
66
|
-
// The reason is the audit label update-account requires; it is not in the
|
|
67
|
-
// layout, so the default is what gets written.
|
|
68
66
|
export const mailAccountEditScreen = {
|
|
69
67
|
id: MAIL_ACCOUNT_EDIT_SCREEN_ID,
|
|
70
68
|
type: "actionForm",
|
|
@@ -73,7 +71,6 @@ export const mailAccountEditScreen = {
|
|
|
73
71
|
fields: {
|
|
74
72
|
accountId: { type: "text", required: true },
|
|
75
73
|
displayName: { type: "text", required: true, maxLength: 200 },
|
|
76
|
-
reason: { type: "text", default: "tenant_admin" },
|
|
77
74
|
},
|
|
78
75
|
layout: {
|
|
79
76
|
sections: [{ fields: [{ field: "accountId", readOnly: true }, "displayName"] }],
|
|
@@ -1,21 +1,19 @@
|
|
|
1
|
-
// Tenant-destroy hooks
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
// entity-genau), jeweils:
|
|
1
|
+
// Tenant-destroy hooks remove all inbound-mail traces belonging to the tenant.
|
|
2
|
+
// One hook per tenant-subject entity (the gdpr-storage boot validator checks
|
|
3
|
+
// the EXT_TENANT_DATA registration per entity), each of which:
|
|
5
4
|
//
|
|
6
|
-
// 1.
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// VOR dem Delete eingesammelt.
|
|
5
|
+
// 1. Archives streams so a future projection rebuild cannot resurrect
|
|
6
|
+
// deleted data. Message streams are numerous, so loop over the
|
|
7
|
+
// projection rows (row PK = stream ID); tenant-destroy is a rare batch
|
|
8
|
+
// operation, so O(n) is acceptable.
|
|
9
|
+
// 2. Deletes the projection rows.
|
|
10
|
+
// 3. For mail-account only, deletes unmanaged sync state (cursors,
|
|
11
|
+
// seen anchors), which is keyed by accountId and must therefore be
|
|
12
|
+
// collected from the account rows BEFORE deletion.
|
|
15
13
|
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
14
|
+
// The actual PII erasure uses crypto-shredding: eraseSubjectKeys deletes the
|
|
15
|
+
// tenant subject key, making event-log payloads AND any ciphertext copies
|
|
16
|
+
// unreadable. These hooks dispose of the rows.
|
|
19
17
|
import { declareEscapeHatch } from "@cosmicdrift/kumiko-framework/engine";
|
|
20
18
|
import { archiveStream } from "@cosmicdrift/kumiko-framework/event-store";
|
|
21
19
|
import { seenMessageTable, syncCursorTable } from "./entities.js";
|
|
@@ -8,8 +8,9 @@ import { INBOUND_MAIL_PROVIDER_EXTENSION, type InboundMailAccountStatus } from "
|
|
|
8
8
|
* config — tenant config reads (host/port/... of the plugins)
|
|
9
9
|
* registry — extension lookup in the factory (not plugin-internal)
|
|
10
10
|
* secrets — tenant secret reads (IMAP password, OAuth refresh token)
|
|
11
|
-
* auditUserId — audit identity for secret reads. Handler path:
|
|
12
|
-
*
|
|
11
|
+
* auditUserId — audit identity for secret reads. Handler path: unset,
|
|
12
|
+
* requireSecretsContext falls back to ctx.user.id; worker/provider
|
|
13
|
+
* path: system identity set by the resolver.
|
|
13
14
|
* metricsFor — metrics handle of a feature by name, same behavior as
|
|
14
15
|
* HandlerContext.metricsFor: unregistered metrics are a silent
|
|
15
16
|
* no-op instead of a throw.
|
|
@@ -22,23 +23,23 @@ export type InboundMailContext = {
|
|
|
22
23
|
readonly metricsFor?: (featureName: string) => MetricsHandle;
|
|
23
24
|
};
|
|
24
25
|
/**
|
|
25
|
-
* Plaintext
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* withPiiCiphertextGuard
|
|
26
|
+
* Plaintext view of a connected mailbox exposed to providers.
|
|
27
|
+
* The Foundation decrypts `address` BEFORE the provider call; providers
|
|
28
|
+
* never receive `kumiko-pii:` ciphertext (guard analogous to
|
|
29
|
+
* withPiiCiphertextGuard in the transport path).
|
|
29
30
|
*/
|
|
30
31
|
export type MailAccountRecord = {
|
|
31
|
-
/** = aggregateId
|
|
32
|
+
/** = aggregateId of the mail-account stream and the secret-slot key. */
|
|
32
33
|
readonly id: string;
|
|
33
34
|
readonly tenantId: string;
|
|
34
|
-
/** Provider
|
|
35
|
+
/** Provider key registered with the extension ("imap", "m365-graph",
|
|
35
36
|
* "gmail-rest"). */
|
|
36
37
|
readonly provider: string;
|
|
37
|
-
/** "password" | "xoauth2" | "oauth" — imap
|
|
38
|
-
*
|
|
38
|
+
/** "password" | "xoauth2" | "oauth" — imap uses this to distinguish
|
|
39
|
+
* form-based connect from the XOAUTH2 fallback. */
|
|
39
40
|
readonly authMethod: string;
|
|
40
|
-
/** null = tenant-
|
|
41
|
-
*
|
|
41
|
+
/** null = tenant-shared mailbox; otherwise this user's personal mailbox
|
|
42
|
+
* (visibility scope). */
|
|
42
43
|
readonly ownerUserId: string | null;
|
|
43
44
|
/** Postfach-Adresse, Plaintext (decrypted). */
|
|
44
45
|
readonly address: string;
|
|
@@ -47,36 +48,35 @@ export type MailAccountRecord = {
|
|
|
47
48
|
readonly watchState: string;
|
|
48
49
|
};
|
|
49
50
|
/**
|
|
50
|
-
*
|
|
51
|
-
* Provider-
|
|
52
|
-
*
|
|
51
|
+
* Normalized incoming mail — provider output and ingest input.
|
|
52
|
+
* Provider-specific structures (IMAP flags, Graph objects) remain in the
|
|
53
|
+
* provider; this type contains only the domain-level boundary.
|
|
53
54
|
*/
|
|
54
55
|
export type RawInboundMessage = {
|
|
55
|
-
/** Provider-native
|
|
56
|
-
*
|
|
56
|
+
/** Provider-native message ID (IMAP UID, Graph id, Gmail id) — the
|
|
57
|
+
* idempotency anchor together with providerName. */
|
|
57
58
|
readonly providerMessageId: string;
|
|
58
|
-
/** RFC-5322 Message-ID
|
|
59
|
-
* (Foundation
|
|
59
|
+
/** RFC-5322 Message-ID header without <>; null when the header is missing
|
|
60
|
+
* (the Foundation falls back to a deterministic replacement). */
|
|
60
61
|
readonly messageIdHeader: string | null;
|
|
61
|
-
/** Provider-native
|
|
62
|
-
* conversationId, Gmail threadId); Foundation
|
|
63
|
-
* References
|
|
62
|
+
/** Provider-native thread/conversation ID when available (Graph
|
|
63
|
+
* conversationId, Gmail threadId); the Foundation prefers it over the
|
|
64
|
+
* References chain when building threadKey. */
|
|
64
65
|
readonly providerThreadId: string | null;
|
|
65
|
-
/** References/In-Reply-To
|
|
66
|
+
/** References/In-Reply-To chain (message IDs without <>), oldest first. */
|
|
66
67
|
readonly references: readonly string[];
|
|
67
68
|
readonly from: string;
|
|
68
69
|
readonly to: readonly string[];
|
|
69
70
|
readonly cc: readonly string[];
|
|
70
71
|
readonly subject: string;
|
|
71
|
-
/** Plaintext
|
|
72
|
+
/** Plaintext preview generated by the provider or truncated from the body. */
|
|
72
73
|
readonly snippet: string;
|
|
73
|
-
/** ISO
|
|
74
|
+
/** ISO instant — INTERNALDATE or receivedDateTime, not ingest time. */
|
|
74
75
|
readonly receivedAtIso: string;
|
|
75
|
-
/** Raw MIME; null
|
|
76
|
-
* file-foundation
|
|
77
|
-
* blob-frei. */
|
|
76
|
+
/** Raw MIME; null in snippet-only mode. The Foundation persists it through
|
|
77
|
+
* file-foundation and writes bodyRef, so the event store remains blob-free. */
|
|
78
78
|
readonly rawMime: Uint8Array | null;
|
|
79
|
-
/**
|
|
79
|
+
/** Generic scope hint ("inbox", folder name), with no application semantics. */
|
|
80
80
|
readonly scope: string;
|
|
81
81
|
};
|
|
82
82
|
/** Provider-opaker Cursor: IMAP {uidValidity,lastUid} · Graph {deltaLink}
|
|
@@ -86,8 +86,8 @@ export type SyncCursorPayload = Readonly<Record<string, unknown>>;
|
|
|
86
86
|
export type InboundFetchResult = {
|
|
87
87
|
readonly messages: readonly RawInboundMessage[];
|
|
88
88
|
readonly nextCursor: SyncCursorPayload;
|
|
89
|
-
/** true ⇒ Foundation
|
|
90
|
-
* (
|
|
89
|
+
/** true ⇒ the Foundation calls fetch again in the same poll tick
|
|
90
|
+
* (pagination) until false or the maxMessages budget is exhausted. */
|
|
91
91
|
readonly hasMore: boolean;
|
|
92
92
|
};
|
|
93
93
|
export type OAuthTokenSet = {
|
|
@@ -98,13 +98,13 @@ export type OAuthTokenSet = {
|
|
|
98
98
|
readonly scopesGranted: readonly string[];
|
|
99
99
|
};
|
|
100
100
|
/**
|
|
101
|
-
* OAuth
|
|
102
|
-
*
|
|
103
|
-
* `/inbound-mail/oauth/callback`)
|
|
104
|
-
*
|
|
101
|
+
* OAuth portion of the contract — OAuth providers only; imap in password
|
|
102
|
+
* mode omits `oauth`. The Foundation provides the routes
|
|
103
|
+
* (`/inbound-mail/connect`, `/inbound-mail/oauth/callback`) generically;
|
|
104
|
+
* providers MUST NOT register their own routes.
|
|
105
105
|
*/
|
|
106
106
|
export type InboundOAuthFlow = {
|
|
107
|
-
/** Scopes:
|
|
107
|
+
/** Scopes: request receive AND send in a SINGLE consent; re-consent is costly. */
|
|
108
108
|
readonly scopes: {
|
|
109
109
|
readonly receive: readonly string[];
|
|
110
110
|
readonly send?: readonly string[];
|
|
@@ -128,17 +128,17 @@ export type InboundOAuthFlow = {
|
|
|
128
128
|
}) => Promise<OAuthTokenSet>;
|
|
129
129
|
};
|
|
130
130
|
/**
|
|
131
|
-
* Inbound-
|
|
132
|
-
* (inbound-provider-imap, -m365-graph, -gmail-rest)
|
|
133
|
-
*
|
|
131
|
+
* Inbound-mail provider plugin contract. Each provider feature
|
|
132
|
+
* (inbound-provider-imap, -m365-graph, -gmail-rest) registers an
|
|
133
|
+
* implementation via `r.useExtension(INBOUND_MAIL_PROVIDER_EXTENSION,
|
|
134
134
|
* "<key>", plugin)`.
|
|
135
135
|
*/
|
|
136
136
|
export type InboundMailProviderPlugin = {
|
|
137
|
-
/**
|
|
138
|
-
*
|
|
137
|
+
/** Credential/reachability check during the connect flow — throws a
|
|
138
|
+
* typed error (InboundAuthError, etc.) and returns no value. */
|
|
139
139
|
readonly verify: (ctx: InboundMailContext, account: MailAccountRecord) => Promise<void>;
|
|
140
|
-
/**
|
|
141
|
-
*
|
|
140
|
+
/** Fetch since cursor. `cursor === null` means initial population,
|
|
141
|
+
* limited by backfillWindowDays. */
|
|
142
142
|
readonly fetch: (ctx: InboundMailContext, account: MailAccountRecord, cursor: SyncCursorPayload | null, opts: {
|
|
143
143
|
readonly backfillWindowDays: number;
|
|
144
144
|
readonly maxMessages: number;
|
|
@@ -147,18 +147,18 @@ export type InboundMailProviderPlugin = {
|
|
|
147
147
|
* for password accounts and providers without an oauth flow. */
|
|
148
148
|
readonly accessToken?: string;
|
|
149
149
|
/** Batch lookup of the provider message ids not yet ingested for this
|
|
150
|
-
* account (committed seen anchors,
|
|
150
|
+
* account (committed seen anchors; lists of any size are fine, queried in chunks). Call it after
|
|
151
151
|
* the listing/delta page and download MIME only for the returned ids.
|
|
152
152
|
* Ingest dedup stays the correctness anchor; this only saves downloads. */
|
|
153
153
|
readonly filterUnknownMessageIds?: (providerMessageIds: readonly string[]) => Promise<ReadonlySet<string>>;
|
|
154
154
|
}) => Promise<InboundFetchResult>;
|
|
155
155
|
/** Nur OAuth-Provider. */
|
|
156
156
|
readonly oauth?: InboundOAuthFlow;
|
|
157
|
-
/** Optional
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
157
|
+
/** Optional live push (IMAP IDLE, later Graph/Gmail webhooks).
|
|
158
|
+
* Returns stop(). Polling remains reconciliation: watch optimizes
|
|
159
|
+
* latency but is never the correctness anchor. `onError` reports a dead
|
|
160
|
+
* live connection (drop, auth revocation) to the supervisor, which
|
|
161
|
+
* restarts it with backoff; the provider does NOT reconnect itself. */
|
|
162
162
|
readonly watch?: (ctx: InboundMailContext, account: MailAccountRecord, handlers: {
|
|
163
163
|
readonly onMessages: (msgs: readonly RawInboundMessage[]) => Promise<void>;
|
|
164
164
|
readonly onError: (err: unknown) => void;
|
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
// Provider
|
|
1
|
+
// Provider contract for inbound-mail provider plugins.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
3
|
+
// Mirrored from mail-foundation's MailTransportContext/-Plugin —
|
|
4
|
+
// the Foundation/provider separation and slim context are identical.
|
|
5
5
|
//
|
|
6
|
-
// **
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
6
|
+
// **Why not a full HandlerContext?** fetch()/watch() run in the worker
|
|
7
|
+
// path (poll cron, IDLE supervisor), where there is no per-request
|
|
8
|
+
// `tx`/`actor`. A plugin that reads more would break the worker path at
|
|
9
|
+
// runtime, and this would only be noticed in production. Plugins that need
|
|
10
|
+
// more must explicitly extend InboundMailContext (a visible breaking change)
|
|
11
|
+
// instead of casting ctx.
|
|
12
12
|
import { INBOUND_MAIL_PROVIDER_EXTENSION } from "./constants.js";
|
|
13
|
-
//
|
|
14
|
-
//
|
|
13
|
+
// `options` in the extension usage is an engine payload (unknown), so
|
|
14
|
+
// validate its structure instead of casting blindly (patterned after
|
|
15
|
+
// isMailTransportPlugin).
|
|
15
16
|
export function isInboundMailProviderPlugin(o) {
|
|
16
17
|
return (typeof o === "object" &&
|
|
17
18
|
o !== null &&
|
|
@@ -21,18 +22,17 @@ export function isInboundMailProviderPlugin(o) {
|
|
|
21
22
|
typeof o.fetch === "function");
|
|
22
23
|
}
|
|
23
24
|
// =============================================================================
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
// InboundTransientError → Job-Retry (retries: 3, exponential)
|
|
25
|
+
// Typed errors handled uniformly by the Foundation during polling:
|
|
26
|
+
// InboundAuthError → status=auth_error, no retry
|
|
27
|
+
// InboundRateLimitError → abort poll, wait for the next cron tick
|
|
28
|
+
// InboundCursorInvalidError → reset cursor + full resync in the backfill
|
|
29
|
+
// window; deduplication handles duplicates
|
|
30
|
+
// InboundTransientError → job retry (retries: 3, exponential)
|
|
31
31
|
// =============================================================================
|
|
32
32
|
//
|
|
33
|
-
// `kind
|
|
34
|
-
//
|
|
35
|
-
//
|
|
33
|
+
// Use a `kind` discriminant instead of instanceof: plugins and the Foundation
|
|
34
|
+
// may run in separate bundles (dual-package-hazard), and instanceof is
|
|
35
|
+
// unreliable across realm or package-copy boundaries.
|
|
36
36
|
export class InboundAuthError extends Error {
|
|
37
37
|
kind = "inbound-auth-error";
|
|
38
38
|
constructor(message) {
|
|
@@ -3,13 +3,13 @@ import type { DistributedLock } from "@cosmicdrift/kumiko-framework/pipeline";
|
|
|
3
3
|
import { type OAuthAccessTokenManager } from "./oauth-access-token.ts";
|
|
4
4
|
import { type InboundMailContext, type MailAccountRecord, type RawInboundMessage } from "./types.ts";
|
|
5
5
|
export type InboundMailSupervisorDeps = {
|
|
6
|
-
/** Slim
|
|
7
|
-
*
|
|
6
|
+
/** Slim context for provider calls (`registry` is required; `secrets` is
|
|
7
|
+
* used for provider credential reads). */
|
|
8
8
|
readonly providerCtx: InboundMailContext;
|
|
9
|
-
/** App
|
|
10
|
-
*
|
|
9
|
+
/** App database — direct reads from read_mail_accounts (account snapshot)
|
|
10
|
+
* and direct writes to store_mail_sync_cursors (unmanaged store). */
|
|
11
11
|
readonly db: DbConnection;
|
|
12
|
-
/** Standard
|
|
12
|
+
/** Standard dispatcher with SystemUser — carries ingest-message and
|
|
13
13
|
* update-account. */
|
|
14
14
|
readonly dispatchWrite: (args: {
|
|
15
15
|
readonly handlerQn: string;
|
|
@@ -20,8 +20,8 @@ export type InboundMailSupervisorDeps = {
|
|
|
20
20
|
readonly data?: unknown;
|
|
21
21
|
readonly error?: unknown;
|
|
22
22
|
}>;
|
|
23
|
-
/**
|
|
24
|
-
*
|
|
23
|
+
/** Persists the raw MIME body (file-foundation) and returns its bodyRef
|
|
24
|
+
* for the event. Without this hook, runs in snippet-only mode
|
|
25
25
|
* (bodyRef = ""). */
|
|
26
26
|
readonly storeBody?: (account: MailAccountRecord, msg: RawInboundMessage) => Promise<string>;
|
|
27
27
|
readonly pollIntervalMs?: number;
|
|
@@ -33,7 +33,7 @@ export type InboundMailSupervisorDeps = {
|
|
|
33
33
|
* before `plugin.watch()`, ensureWatcher claims a TTL lease for the
|
|
34
34
|
* account via `lock.acquire` and renews it via `lock.renew` while the
|
|
35
35
|
* watcher lives. Omit for single-process deployments — every active
|
|
36
|
-
* account is watched locally, same as before
|
|
36
|
+
* account is watched locally, same as before. */
|
|
37
37
|
readonly lock?: DistributedLock;
|
|
38
38
|
/** Access-token lifecycle for OAuth accounts. Defaults to a manager built
|
|
39
39
|
* from `db` + `providerCtx.secrets`; pass the instance shared with
|
|
@@ -46,8 +46,8 @@ export type InboundMailSupervisorDeps = {
|
|
|
46
46
|
};
|
|
47
47
|
export type InboundMailSupervisor = {
|
|
48
48
|
readonly start: () => Promise<void>;
|
|
49
|
-
/**
|
|
50
|
-
*
|
|
49
|
+
/** Reconciliation run across all active accounts; also usable standalone
|
|
50
|
+
* for tests and manual operational triggers. */
|
|
51
51
|
readonly pollOnce: () => Promise<void>;
|
|
52
52
|
readonly stop: () => Promise<void>;
|
|
53
53
|
};
|