@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,4 +1,4 @@
|
|
|
1
|
-
import { unsafeReadRetrying } from "@cosmicdrift/kumiko-framework/db";
|
|
1
|
+
import { toPostgresArrayLiteral, unsafeReadRetrying } from "@cosmicdrift/kumiko-framework/db";
|
|
2
2
|
import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
|
|
3
3
|
import { readStoredDraft } from "../../decrypt-draft.js";
|
|
4
4
|
// COALESCE(modified_at, inserted_at) — a draft's "last touched" timestamp is
|
|
@@ -6,7 +6,7 @@ import { readStoredDraft } from "../../decrypt-draft.js";
|
|
|
6
6
|
// once; a draft saved exactly once (create, never updated) has no
|
|
7
7
|
// modified_at yet, so falls back to inserted_at.
|
|
8
8
|
//
|
|
9
|
-
// Reads the blob + tenantId BEFORE anything is deleted
|
|
9
|
+
// Reads the blob + tenantId BEFORE anything is deleted — the
|
|
10
10
|
// caller (cleanup.job.ts) walks each row's blob for FileRefs and releases
|
|
11
11
|
// them per-tenant via ctx._fileProviderResolver, then deletes the batch
|
|
12
12
|
// per-row via formDraftExecutor.delete (event-sourced, not raw SQL — a
|
|
@@ -17,7 +17,7 @@ export async function selectStaleDraftsBatch(db, olderThanDays, batchSize, exclu
|
|
|
17
17
|
WHERE COALESCE("modified_at", "inserted_at") < now() - ($1::int * interval '1 day')
|
|
18
18
|
AND NOT ("id"::text = ANY($3::text[]))
|
|
19
19
|
ORDER BY COALESCE("modified_at", "inserted_at") ASC
|
|
20
|
-
LIMIT $2`, [olderThanDays, batchSize, [...excludeIds]]);
|
|
20
|
+
LIMIT $2`, [olderThanDays, batchSize, toPostgresArrayLiteral([...excludeIds])]);
|
|
21
21
|
return Promise.all(rows.map(async (row) => {
|
|
22
22
|
const base = {
|
|
23
23
|
id: row.id,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { instantToTimestamptzParam, toPostgresArrayLiteral, unsafeReadRetrying, } from "@cosmicdrift/kumiko-framework/db";
|
|
2
2
|
// Narrows a draft blob's raw FileRef-shaped storageKeys (collectDraftFileRefKeys
|
|
3
|
-
// output — extracted from free-form, client-supplied JSON
|
|
3
|
+
// output — extracted from free-form, client-supplied JSON) down to
|
|
4
4
|
// the ones with a real, non-deleted file_refs row owned by this exact
|
|
5
5
|
// (tenantId, ownerId). Without this, a crafted draft value like
|
|
6
6
|
// { storageKey: "<someone-else's-real-key>" } would reach the storage
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { requestContext } from "@cosmicdrift/kumiko-framework/api";
|
|
2
2
|
import { configuredPiiSubjectKms, decryptPiiFieldValues, isPiiCiphertext, } from "@cosmicdrift/kumiko-framework/crypto";
|
|
3
|
+
import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
|
|
3
4
|
import { formDraftBlobSchema } from "./schemas.js";
|
|
4
5
|
// Raw reads (fetchOne/selectMany/SQL) return the stored column, which is
|
|
5
6
|
// ciphertext once the owner's key exists. The field name is part of the AAD,
|
|
@@ -8,7 +9,10 @@ import { formDraftBlobSchema } from "./schemas.js";
|
|
|
8
9
|
export async function readStoredDraft(stored) {
|
|
9
10
|
let plain = stored;
|
|
10
11
|
const kms = configuredPiiSubjectKms();
|
|
11
|
-
if (isPiiCiphertext(stored)
|
|
12
|
+
if (isPiiCiphertext(stored)) {
|
|
13
|
+
// A silent null would make the stale-draft cleanup treat the draft as empty and leak its file refs.
|
|
14
|
+
if (!kms)
|
|
15
|
+
throw new InternalError({ message: "form-draft: pii kms not configured" });
|
|
12
16
|
const out = await decryptPiiFieldValues({ draft: stored }, ["draft"], kms, {
|
|
13
17
|
requestId: requestContext.get()?.requestId ?? "form-draft:read",
|
|
14
18
|
});
|
|
@@ -6,8 +6,8 @@ import { FORM_DRAFT_KEY_MAX_LENGTH, FORM_DRAFT_UNIQUE_KEY_CONSTRAINT } from "./w
|
|
|
6
6
|
// (tenant, ownerId): the same key from two different users, or the same
|
|
7
7
|
// user in two different tenants, is a different draft.
|
|
8
8
|
//
|
|
9
|
-
// Boundary
|
|
10
|
-
// lives in a domain stream — it's
|
|
9
|
+
// Boundary: form-draft never holds anything that already
|
|
10
|
+
// lives in a domain stream — it's an intermediate state BEFORE the domain entity
|
|
11
11
|
// is created. Consumers delete the draft (discard handler) once the real
|
|
12
12
|
// submit succeeds; partially-created domain data past that point is the
|
|
13
13
|
// consuming app's concern, not this feature's.
|
|
@@ -29,7 +29,7 @@ export const formDraftEntity = createEntity({
|
|
|
29
29
|
personal: false,
|
|
30
30
|
reason: "technical_reference",
|
|
31
31
|
}),
|
|
32
|
-
// The blob shape is fixed
|
|
32
|
+
// The blob shape is fixed, not left to the caller:
|
|
33
33
|
// { values: Record<string, unknown>, stepIndex: number, savedAt: string }.
|
|
34
34
|
// Free-form because `values` mirrors whatever fields the in-progress
|
|
35
35
|
// form has, so it can carry arbitrary user-entered PII. Encrypted under
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
// form-draft — a per-user, per-tenant working copy of an in-progress form,
|
|
2
|
-
// saved BEFORE the real domain entity exists. Backing for wizard-mode resume
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// uniqueness model.
|
|
2
|
+
// saved BEFORE the real domain entity exists. Backing for wizard-mode resume.
|
|
3
|
+
// A caller-assigned draftKey (typically screenId + optional hostEntityId)
|
|
4
|
+
// round-trips { values, stepIndex, savedAt } through save/discard/get. See
|
|
5
|
+
// entity.ts for the ownership + uniqueness model.
|
|
7
6
|
import { defineFeature } from "@cosmicdrift/kumiko-framework/engine";
|
|
8
7
|
import { formDraftEntity } from "./entity.js";
|
|
9
8
|
import { cleanupDraftsJob, formDraftRetentionDaysConfig } from "./handlers/cleanup.job.js";
|
|
@@ -63,7 +63,7 @@ export const discardDraftWrite = defineWriteHandler({
|
|
|
63
63
|
// Fail-closed erase of file_refs rows FIRST (outside the best-effort
|
|
64
64
|
// storage-hygiene loop). releaseDraftFileRefs swallows per-key errors
|
|
65
65
|
// by design — routing forget through it would report discarded:true
|
|
66
|
-
// while leaving the row behind
|
|
66
|
+
// while leaving the row behind.
|
|
67
67
|
for (const ref of ownedRefs) {
|
|
68
68
|
const forgetResult = await fileRefExecutor.forget({ id: ref.id }, event.user, ctx.db);
|
|
69
69
|
if (!forgetResult.isSuccess)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isPlainObject } from "@cosmicdrift/kumiko-types/type-guards";
|
|
2
|
-
// The draft blob's `values` is free-form by design
|
|
2
|
+
// The draft blob's `values` is free-form by design: form-draft
|
|
3
3
|
// never knows the consuming form's field schema, only { values, stepIndex,
|
|
4
4
|
// savedAt }). A FileRef pointer is therefore recognised purely by shape —
|
|
5
5
|
// any object anywhere in `values` carrying a non-empty string `storageKey`
|
|
@@ -45,11 +45,11 @@ export function collectDraftFileRefKeys(draft) {
|
|
|
45
45
|
//
|
|
46
46
|
// Takes an already-decided key list, not the draft blob — callers must run
|
|
47
47
|
// collectDraftFileRefKeys() output through db/queries' owned-storage-key
|
|
48
|
-
// filter first. `values` is free-form, client-supplied JSON
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
//
|
|
48
|
+
// filter first. `values` is free-form, client-supplied JSON; releasing a key
|
|
49
|
+
// straight out of it without verifying a real, owned file_refs row exists
|
|
50
|
+
// would let a crafted `{ storageKey: "<victim's key>" }` delete someone
|
|
51
|
+
// else's file — the same ownership check file-routes.ts runs before every
|
|
52
|
+
// read/delete (loadFileForTenant + FileAccessGuard).
|
|
53
53
|
export async function releaseDraftFileRefs(keys, deleteBinary, log) {
|
|
54
54
|
for (const key of keys) {
|
|
55
55
|
try {
|
|
@@ -10,9 +10,9 @@ function jsonByteLength(value) {
|
|
|
10
10
|
const draftValuesSchema = z
|
|
11
11
|
.record(z.string(), z.unknown())
|
|
12
12
|
.refine((values) => jsonByteLength(values) <= FORM_DRAFT_VALUES_MAX_BYTES, `values exceeds the ${FORM_DRAFT_VALUES_MAX_BYTES}-byte limit`);
|
|
13
|
-
// The draft blob shape — fixed
|
|
13
|
+
// The draft blob shape — fixed here, not left for consumers
|
|
14
14
|
// to invent per-app. `stepIndex` is in from the start so wizard-mode resume
|
|
15
|
-
//
|
|
15
|
+
// doesn't need a later migration.
|
|
16
16
|
export const formDraftBlobSchema = z.object({
|
|
17
17
|
values: z.record(z.string(), z.unknown()),
|
|
18
18
|
stepIndex: z.number().int().min(0),
|
|
@@ -30,7 +30,7 @@ export const saveDraftPayloadSchema = z.object({
|
|
|
30
30
|
// row right after the domain entity write already carries the same
|
|
31
31
|
// storageKeys forward — releasing them here would destroy files the entity
|
|
32
32
|
// now depends on. Only an actual abandon/abort flow should pass
|
|
33
|
-
// releaseFiles: true (
|
|
33
|
+
// releaseFiles: true (the "explicit abort" case).
|
|
34
34
|
export const discardDraftPayloadSchema = z.object({
|
|
35
35
|
draftKey: draftKeySchema,
|
|
36
36
|
releaseFiles: z.boolean().optional(),
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
// form-draft bundle constants — feature-name + qualified handler/query names.
|
|
2
|
-
//
|
|
3
|
-
// Part of CosmicDriftGameStudio/kumiko-framework#1883 (wizard mode), issue #1889.
|
|
4
2
|
export const FORM_DRAFT_FEATURE_NAME = "form-draft";
|
|
5
3
|
// Qualified handler/query names (QN format: scope:type:name). Clients
|
|
6
4
|
// reference the object instead of magic strings.
|
|
@@ -6,38 +6,29 @@ import { classifyHost, splitFirstSegment, tenantKeyFromPath } from "./host.js";
|
|
|
6
6
|
import { matchRedirect, sameOriginPath } from "./redirects.js";
|
|
7
7
|
import { validateHostRoutingOptions } from "./validate-options.js";
|
|
8
8
|
const tenantKeyExistsResultSchema = z.object({ exists: z.boolean() });
|
|
9
|
-
async function
|
|
9
|
+
async function existsViaSystemQuery(systemQuery, queryType, payload) {
|
|
10
10
|
let result;
|
|
11
11
|
try {
|
|
12
|
-
result = await systemQuery(
|
|
12
|
+
result = await systemQuery(queryType, payload, SYSTEM_TENANT_ID);
|
|
13
13
|
}
|
|
14
14
|
catch (error) {
|
|
15
15
|
if (error instanceof ValidationError)
|
|
16
16
|
return false;
|
|
17
|
-
// Over the rate limit every key looks the same: serve the
|
|
18
|
-
//
|
|
17
|
+
// Over the rate limit every key looks the same: serve the shell, which
|
|
18
|
+
// leaks nothing. The API resolver is authoritative and answers
|
|
19
|
+
// tenant_required for unknown hosts, while a 404 would hit visitors
|
|
20
|
+
// behind a shared NAT under load.
|
|
19
21
|
if (error instanceof RateLimitError)
|
|
20
22
|
return true;
|
|
21
23
|
throw error;
|
|
22
24
|
}
|
|
23
25
|
return tenantKeyExistsResultSchema.parse(result).exists;
|
|
24
26
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
31
|
-
if (error instanceof ValidationError)
|
|
32
|
-
return false;
|
|
33
|
-
// The shell is harmless: the API resolver is authoritative and answers
|
|
34
|
-
// tenant_required for unknown hosts, while a 404 would hit visitors behind
|
|
35
|
-
// a shared NAT under load.
|
|
36
|
-
if (error instanceof RateLimitError)
|
|
37
|
-
return true;
|
|
38
|
-
throw error;
|
|
39
|
-
}
|
|
40
|
-
return tenantKeyExistsResultSchema.parse(result).exists;
|
|
27
|
+
function isTenantKeyKnown(systemQuery, key) {
|
|
28
|
+
return existsViaSystemQuery(systemQuery, HostRoutingQueries.tenantKeyExists, { key });
|
|
29
|
+
}
|
|
30
|
+
function isHostKnown(systemQuery, host) {
|
|
31
|
+
return existsViaSystemQuery(systemQuery, HostRoutingQueries.hostTenantExists, { host });
|
|
41
32
|
}
|
|
42
33
|
function serve(surface, file = surface.file) {
|
|
43
34
|
return surface.csp === undefined
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Deterministic aggregate
|
|
3
|
-
* (accountId, providerMessageId):
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* Deterministic aggregate ID for an inbound message. The key is
|
|
3
|
+
* (accountId, providerMessageId): if the provider delivers the same message
|
|
4
|
+
* twice (IDLE duplicate notification, cursor overlap, watch-restart replay),
|
|
5
|
+
* both deliveries use the same stream, so the idempotency check in the
|
|
6
|
+
* ingest handler sees the event that was already appended.
|
|
7
7
|
*
|
|
8
|
-
* accountId
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* accountId, rather than tenantId, is part of the key because two accounts in
|
|
9
|
+
* the same tenant can receive the same email (CC'd to both inboxes); these
|
|
10
|
+
* are two distinct inbound messages.
|
|
11
11
|
*/
|
|
12
12
|
export declare function inboundMessageAggregateId(accountId: string, providerMessageId: string): string;
|
|
13
13
|
/**
|
|
14
|
-
* Deterministic aggregate
|
|
15
|
-
* (tenantId, threadKey)
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
14
|
+
* Deterministic aggregate ID for a mail thread. The key is
|
|
15
|
+
* (tenantId, threadKey): threads are tenant-wide, not account-specific, so a
|
|
16
|
+
* conversation spanning two connected inboxes is one thread. threadKey is
|
|
17
|
+
* normalized by the provider (References/In-Reply-To chain or provider
|
|
18
|
+
* thread ID).
|
|
19
19
|
*/
|
|
20
20
|
export declare function mailThreadAggregateId(tenantId: string, threadKey: string): string;
|
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
import { v5 as uuidv5 } from "uuid";
|
|
2
|
-
// Fixed UUID
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
/** Namespace
|
|
2
|
+
// Fixed UUID namespaces for deterministic aggregate-ID derivation.
|
|
3
|
+
// Generated once (2026-07-12) and immutable: changing one would re-key
|
|
4
|
+
// every existing aggregate stream, breaking message history and idempotency.
|
|
5
|
+
// Drift is pinned in __tests__/feature.test.ts.
|
|
6
|
+
/** Namespace for inbound-message streams. */
|
|
7
7
|
const INBOUND_MESSAGE_NAMESPACE = "7f2a9c41-3d6b-4e0f-9c58-2b1e7a4d8f63";
|
|
8
|
-
/** Namespace
|
|
8
|
+
/** Namespace for mail-thread streams. */
|
|
9
9
|
const MAIL_THREAD_NAMESPACE = "b48d1e72-5c9a-4f36-8e0d-6a3f9b2c7e15";
|
|
10
10
|
/**
|
|
11
|
-
* Deterministic aggregate
|
|
12
|
-
* (accountId, providerMessageId):
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
11
|
+
* Deterministic aggregate ID for an inbound message. The key is
|
|
12
|
+
* (accountId, providerMessageId): if the provider delivers the same message
|
|
13
|
+
* twice (IDLE duplicate notification, cursor overlap, watch-restart replay),
|
|
14
|
+
* both deliveries use the same stream, so the idempotency check in the
|
|
15
|
+
* ingest handler sees the event that was already appended.
|
|
16
16
|
*
|
|
17
|
-
* accountId
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* accountId, rather than tenantId, is part of the key because two accounts in
|
|
18
|
+
* the same tenant can receive the same email (CC'd to both inboxes); these
|
|
19
|
+
* are two distinct inbound messages.
|
|
20
20
|
*/
|
|
21
21
|
// @wrapper-known uuid-domain
|
|
22
22
|
export function inboundMessageAggregateId(accountId, providerMessageId) {
|
|
23
23
|
return uuidv5(`${accountId}:${providerMessageId}`, INBOUND_MESSAGE_NAMESPACE);
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
* Deterministic aggregate
|
|
27
|
-
* (tenantId, threadKey)
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
26
|
+
* Deterministic aggregate ID for a mail thread. The key is
|
|
27
|
+
* (tenantId, threadKey): threads are tenant-wide, not account-specific, so a
|
|
28
|
+
* conversation spanning two connected inboxes is one thread. threadKey is
|
|
29
|
+
* normalized by the provider (References/In-Reply-To chain or provider
|
|
30
|
+
* thread ID).
|
|
31
31
|
*/
|
|
32
32
|
// @wrapper-known uuid-domain
|
|
33
33
|
export function mailThreadAggregateId(tenantId, threadKey) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// createInboundMailConnectRoutes — declarative extraRoutes
|
|
2
|
-
//
|
|
1
|
+
// createInboundMailConnectRoutes — declarative extraRoutes the app owner mounts
|
|
2
|
+
// via `extraRoutes` in buildServer.
|
|
3
3
|
//
|
|
4
4
|
// GET /api/inbound-mail/connect (entry:"user" — signed-in caller)
|
|
5
5
|
// GET /inbound-mail/oauth/callback (entry:"signature" — anonymous,
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
// resolved via resolveInboundProviderForKey. The callback trusts ONLY the
|
|
11
11
|
// HMAC-verified state (CSRF-/foreign-claiming lock, see oauth-state.ts).
|
|
12
12
|
import { ExtraRouteRejection, signatureRoute } from "@cosmicdrift/kumiko-framework/api";
|
|
13
|
+
import { propertyOf } from "@cosmicdrift/kumiko-types/type-guards";
|
|
13
14
|
import { INBOUND_MAIL_FOUNDATION_FEATURE, InboundMailAuthMethods, InboundMailFoundationHandlers, inboundCredentialSecretKey, } from "./constants.js";
|
|
14
15
|
import { inboundRefreshTokenSecretOptions, } from "./oauth-access-token.js";
|
|
15
16
|
import { signOAuthState, verifyOAuthState } from "./oauth-state.js";
|
|
@@ -130,7 +131,7 @@ export function createInboundMailConnectRoutes(options) {
|
|
|
130
131
|
if (!dispatched.isSuccess) {
|
|
131
132
|
return errorJson(c, 502, "account_create_failed", JSON.stringify(dispatched.error ?? {}));
|
|
132
133
|
}
|
|
133
|
-
const accountId = dispatched.data
|
|
134
|
+
const accountId = propertyOf(dispatched.data, "accountId");
|
|
134
135
|
if (typeof accountId !== "string") {
|
|
135
136
|
return errorJson(c, 502, "account_create_failed", "connect-account returned no accountId");
|
|
136
137
|
}
|
|
@@ -1,53 +1,51 @@
|
|
|
1
1
|
export declare const INBOUND_MAIL_FOUNDATION_FEATURE: "inbound-mail-foundation";
|
|
2
2
|
export declare const INBOUND_MAIL_PROVIDER_EXTENSION: "inboundMailProvider";
|
|
3
3
|
export declare const InboundMailFoundationHandlers: {
|
|
4
|
-
/** Programmatic entry
|
|
5
|
-
* fetchSince
|
|
6
|
-
* PII
|
|
4
|
+
/** Programmatic entry point for provider plugins (watch callback +
|
|
5
|
+
* fetchSince sync): accepts a normalized message and atomically performs
|
|
6
|
+
* idempotency handling, PII encryption, event append, and thread update. */
|
|
7
7
|
readonly ingestMessage: "inbound-mail-foundation:write:ingest-message";
|
|
8
|
-
/** Tenant
|
|
9
|
-
*
|
|
10
|
-
* an. */
|
|
8
|
+
/** Tenant admin connects a mailbox (IMAP credentials via secrets or an
|
|
9
|
+
* OAuth redirect via oauth-routes). Creates the mail-account stream. */
|
|
11
10
|
readonly connectAccount: "inbound-mail-foundation:write:connect-account";
|
|
12
|
-
/** Account
|
|
13
|
-
*
|
|
11
|
+
/** Account status transitions (watch error/backoff, OAuth refresh
|
|
12
|
+
* failure, re-enabled). */
|
|
14
13
|
readonly updateAccount: "inbound-mail-foundation:write:update-account";
|
|
15
|
-
/** Tenant
|
|
16
|
-
*
|
|
14
|
+
/** Tenant admin disconnects a mailbox. The stream remains for auditing;
|
|
15
|
+
* the status becomes disconnected and the watch stops. */
|
|
17
16
|
readonly disconnectAccount: "inbound-mail-foundation:write:disconnect-account";
|
|
18
17
|
};
|
|
19
18
|
export declare const InboundMailFoundationQueries: {
|
|
20
|
-
/** Tenant-scoped
|
|
19
|
+
/** Tenant-scoped list of connected mailboxes. */
|
|
21
20
|
readonly listAccounts: "inbound-mail-foundation:query:account:list";
|
|
22
|
-
/** Tenant-scoped
|
|
23
|
-
|
|
21
|
+
/** Tenant-scoped message list (inbox cockpit). PII is decrypted on read.
|
|
22
|
+
*/
|
|
24
23
|
readonly listMessages: "inbound-mail-foundation:query:message:list";
|
|
25
24
|
};
|
|
26
25
|
export declare const InboundMailAccountStatuses: {
|
|
27
|
-
/**
|
|
26
|
+
/** Connected; watch/sync is running or ready to start. */
|
|
28
27
|
readonly active: "active";
|
|
29
|
-
/** Credentials
|
|
28
|
+
/** Credentials or token are invalid; the tenant admin must reconnect. */
|
|
30
29
|
readonly authError: "auth_error";
|
|
31
30
|
/** Transienter Fehler, Supervisor backoff-retried. */
|
|
32
31
|
readonly degraded: "degraded";
|
|
33
|
-
/**
|
|
32
|
+
/** Disconnected by the tenant admin; no further syncs run. */
|
|
34
33
|
readonly disconnected: "disconnected";
|
|
35
34
|
};
|
|
36
35
|
export type InboundMailAccountStatus = (typeof InboundMailAccountStatuses)[keyof typeof InboundMailAccountStatuses];
|
|
37
36
|
/**
|
|
38
|
-
* Tenant
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* verifiziert, kein Framework-Gap.
|
|
37
|
+
* Tenant secret slot for an account: IMAP app password OR OAuth refresh
|
|
38
|
+
* token. The provider interprets the contents according to `authMethod`.
|
|
39
|
+
* Dynamic per-account keying is supported by the secrets feature:
|
|
40
|
+
* SecretsContext.get/set accept arbitrary string keys (resolveKey in
|
|
41
|
+
* secrets-context.ts), so no framework change is required.
|
|
44
42
|
*/
|
|
45
43
|
export declare function inboundCredentialSecretKey(accountId: string): string;
|
|
46
44
|
export declare const InboundMailAuthMethods: {
|
|
47
45
|
/** Formular-Connect: Config (host/port/secure) + Tenant-Secret. */
|
|
48
46
|
readonly password: "password";
|
|
49
|
-
/** SASL XOAUTH2
|
|
50
|
-
*
|
|
47
|
+
/** SASL XOAUTH2 over IMAP — fallback for M365/Gmail accounts without a
|
|
48
|
+
* mounted enterprise provider (same secret slot). */
|
|
51
49
|
readonly xoauth2: "xoauth2";
|
|
52
50
|
/** Nativer OAuth-Provider (m365-graph, gmail-rest). */
|
|
53
51
|
readonly oauth: "oauth";
|
|
@@ -1,69 +1,66 @@
|
|
|
1
1
|
// Feature name
|
|
2
2
|
export const INBOUND_MAIL_FOUNDATION_FEATURE = "inbound-mail-foundation";
|
|
3
|
-
// Extension-point name
|
|
3
|
+
// Extension-point name for provider plugins (inbound-provider-imap,
|
|
4
4
|
// inbound-provider-m365-graph, inbound-provider-gmail-rest, ...).
|
|
5
5
|
export const INBOUND_MAIL_PROVIDER_EXTENSION = "inboundMailProvider";
|
|
6
6
|
// Qualified write handler names (QN format: scope:type:name).
|
|
7
7
|
export const InboundMailFoundationHandlers = {
|
|
8
|
-
/** Programmatic entry
|
|
9
|
-
* fetchSince
|
|
10
|
-
* PII
|
|
8
|
+
/** Programmatic entry point for provider plugins (watch callback +
|
|
9
|
+
* fetchSince sync): accepts a normalized message and atomically performs
|
|
10
|
+
* idempotency handling, PII encryption, event append, and thread update. */
|
|
11
11
|
ingestMessage: "inbound-mail-foundation:write:ingest-message",
|
|
12
|
-
/** Tenant
|
|
13
|
-
*
|
|
14
|
-
* an. */
|
|
12
|
+
/** Tenant admin connects a mailbox (IMAP credentials via secrets or an
|
|
13
|
+
* OAuth redirect via oauth-routes). Creates the mail-account stream. */
|
|
15
14
|
connectAccount: "inbound-mail-foundation:write:connect-account",
|
|
16
|
-
/** Account
|
|
17
|
-
*
|
|
15
|
+
/** Account status transitions (watch error/backoff, OAuth refresh
|
|
16
|
+
* failure, re-enabled). */
|
|
18
17
|
updateAccount: "inbound-mail-foundation:write:update-account",
|
|
19
|
-
/** Tenant
|
|
20
|
-
*
|
|
18
|
+
/** Tenant admin disconnects a mailbox. The stream remains for auditing;
|
|
19
|
+
* the status becomes disconnected and the watch stops. */
|
|
21
20
|
disconnectAccount: "inbound-mail-foundation:write:disconnect-account",
|
|
22
21
|
};
|
|
23
22
|
// Qualified query handler names.
|
|
24
23
|
export const InboundMailFoundationQueries = {
|
|
25
|
-
/** Tenant-scoped
|
|
24
|
+
/** Tenant-scoped list of connected mailboxes. */
|
|
26
25
|
listAccounts: "inbound-mail-foundation:query:account:list",
|
|
27
|
-
/** Tenant-scoped
|
|
28
|
-
|
|
26
|
+
/** Tenant-scoped message list (inbox cockpit). PII is decrypted on read.
|
|
27
|
+
*/
|
|
29
28
|
listMessages: "inbound-mail-foundation:query:message:list",
|
|
30
29
|
};
|
|
31
30
|
// Normalized account status values — provider-agnostic.
|
|
32
31
|
export const InboundMailAccountStatuses = {
|
|
33
|
-
/**
|
|
32
|
+
/** Connected; watch/sync is running or ready to start. */
|
|
34
33
|
active: "active",
|
|
35
|
-
/** Credentials
|
|
34
|
+
/** Credentials or token are invalid; the tenant admin must reconnect. */
|
|
36
35
|
authError: "auth_error",
|
|
37
36
|
/** Transienter Fehler, Supervisor backoff-retried. */
|
|
38
37
|
degraded: "degraded",
|
|
39
|
-
/**
|
|
38
|
+
/** Disconnected by the tenant admin; no further syncs run. */
|
|
40
39
|
disconnected: "disconnected",
|
|
41
40
|
};
|
|
42
41
|
/**
|
|
43
|
-
* Tenant
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* verifiziert, kein Framework-Gap.
|
|
42
|
+
* Tenant secret slot for an account: IMAP app password OR OAuth refresh
|
|
43
|
+
* token. The provider interprets the contents according to `authMethod`.
|
|
44
|
+
* Dynamic per-account keying is supported by the secrets feature:
|
|
45
|
+
* SecretsContext.get/set accept arbitrary string keys (resolveKey in
|
|
46
|
+
* secrets-context.ts), so no framework change is required.
|
|
49
47
|
*/
|
|
50
48
|
export function inboundCredentialSecretKey(accountId) {
|
|
51
49
|
return `${INBOUND_MAIL_FOUNDATION_FEATURE}:inbound.credential.${accountId}`;
|
|
52
50
|
}
|
|
53
|
-
//
|
|
54
|
-
//
|
|
55
|
-
//
|
|
51
|
+
// Authentication method for an account, set by the connect flow and read
|
|
52
|
+
// by providers (IMAP uses it to distinguish the password form from the
|
|
53
|
+
// XOAUTH2 fallback).
|
|
56
54
|
export const InboundMailAuthMethods = {
|
|
57
55
|
/** Formular-Connect: Config (host/port/secure) + Tenant-Secret. */
|
|
58
56
|
password: "password",
|
|
59
|
-
/** SASL XOAUTH2
|
|
60
|
-
*
|
|
57
|
+
/** SASL XOAUTH2 over IMAP — fallback for M365/Gmail accounts without a
|
|
58
|
+
* mounted enterprise provider (same secret slot). */
|
|
61
59
|
xoauth2: "xoauth2",
|
|
62
60
|
/** Nativer OAuth-Provider (m365-graph, gmail-rest). */
|
|
63
61
|
oauth: "oauth",
|
|
64
62
|
};
|
|
65
|
-
// **Multi-
|
|
66
|
-
// (
|
|
67
|
-
//
|
|
68
|
-
//
|
|
69
|
-
// connect-Flow.
|
|
63
|
+
// **Multi-provider:** no global `provider` config key
|
|
64
|
+
// (unlike mail-foundation, as with billing-foundation). A tenant can connect
|
|
65
|
+
// an IMAP mailbox and an M365 mailbox in parallel; the provider is stored per
|
|
66
|
+
// MailAccount row (`provider` field) and set by the connect flow.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* (= accountId, random uuid
|
|
1
|
+
/** A connected mailbox. One row per account, with PK = aggregateId
|
|
2
|
+
* (= accountId, random uuid on connect). */
|
|
3
3
|
export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
|
|
4
4
|
readonly provider: import("@cosmicdrift/kumiko-types/fields").EntityTextFieldDef & {
|
|
5
5
|
required: true;
|
|
@@ -38,8 +38,8 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
|
|
|
38
38
|
required: true;
|
|
39
39
|
};
|
|
40
40
|
}, "tenant">;
|
|
41
|
-
/**
|
|
42
|
-
*
|
|
41
|
+
/** An incoming mail (envelope + snippet, NO body — bodyRef
|
|
42
|
+
* points to file-foundation). PK = aggregateId =
|
|
43
43
|
* inboundMessageAggregateId(accountId, providerMessageId). */
|
|
44
44
|
export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
|
|
45
45
|
readonly accountId: import("@cosmicdrift/kumiko-types/fields").EntityTextFieldDef & {
|
|
@@ -138,10 +138,10 @@ export declare const mailThreadEntity: import("@cosmicdrift/kumiko-types/fields"
|
|
|
138
138
|
export declare const MAIL_ACCOUNT_PII_FIELDS: readonly string[];
|
|
139
139
|
export declare const INBOUND_MESSAGE_PII_FIELDS: readonly string[];
|
|
140
140
|
export declare const MAIL_THREAD_PII_FIELDS: readonly string[];
|
|
141
|
-
/** Provider
|
|
142
|
-
* Graph deltaLink, Gmail historyId.
|
|
143
|
-
* Write-locked
|
|
144
|
-
*
|
|
141
|
+
/** Provider cursor per account ("where was I?"): IMAP UIDVALIDITY:UIDNEXT,
|
|
142
|
+
* Graph deltaLink, Gmail historyId. One row per (accountId, scope).
|
|
143
|
+
* Write-locked to privileged — only Foundation handlers/supervisors
|
|
144
|
+
* write it; tenant requests cannot. */
|
|
145
145
|
export declare const syncCursorEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
|
|
146
146
|
readonly accountId: import("@cosmicdrift/kumiko-types/fields").EntityTextFieldDef & {
|
|
147
147
|
required: true;
|
|
@@ -168,10 +168,10 @@ export declare const syncCursorEntity: import("@cosmicdrift/kumiko-types/fields"
|
|
|
168
168
|
required: true;
|
|
169
169
|
};
|
|
170
170
|
}, "tenant">;
|
|
171
|
-
/**
|
|
172
|
-
*
|
|
173
|
-
* ingest
|
|
174
|
-
*
|
|
171
|
+
/** Deduplication anchor for O(1) idempotency without scanning the stream
|
|
172
|
+
* for very long message histories: (accountId, providerMessageId) UNIQUE.
|
|
173
|
+
* The ingest handler checks here first (cheap); the stream scan remains
|
|
174
|
+
* defense-in-depth. */
|
|
175
175
|
export declare const seenMessageEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
|
|
176
176
|
readonly accountId: import("@cosmicdrift/kumiko-types/fields").EntityTextFieldDef & {
|
|
177
177
|
required: true;
|