@cosmicdrift/kumiko-bundled-features 0.385.0 → 0.387.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.js +0 -2
- 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/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 +3 -3
- 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-verify-screen.js +6 -6
- package/dist/billing-foundation/aggregate-id.d.ts +5 -5
- package/dist/billing-foundation/aggregate-id.js +10 -11
- package/dist/billing-foundation/entities.js +27 -27
- package/dist/billing-foundation/events.js +18 -17
- package/dist/billing-foundation/feature.js +42 -43
- 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/create-checkout-session.write.js +18 -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/process-event.write.js +20 -20
- 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 +40 -41
- package/dist/billing-foundation/types.js +20 -20
- package/dist/billing-foundation/web/billing-plans-panel.js +4 -4
- package/dist/cap-counter/aggregate-id.js +8 -9
- 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 +47 -48
- 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 +1 -1
- package/dist/cap-counter/with-cap-enforcement.d.ts +3 -5
- 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/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/resolver.js +4 -4
- package/dist/config/table.js +10 -10
- package/dist/config/write-helpers.js +1 -1
- package/dist/crypto-shredding/handlers/forget-subject.write.d.ts +2 -2
- package/dist/crypto-shredding/handlers/forget-subject.write.js +12 -11
- 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/feature.js +2 -2
- package/dist/delivery/handlers/log.query.js +1 -1
- package/dist/delivery/tables.js +9 -8
- package/dist/delivery/unsubscribe.js +4 -4
- 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-provider-inmemory/feature.d.ts +1 -1
- package/dist/file-provider-inmemory/feature.js +16 -16
- 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 +1 -1
- package/dist/form-draft/db/queries/owned-file-refs.js +1 -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/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.js +11 -11
- 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/tenant-destroy-hook.js +14 -16
- package/dist/inbound-mail-foundation/types.d.ts +45 -46
- 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 +57 -56
- 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.js +5 -6
- 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/job-instant.js +1 -1
- package/dist/jobs/job-run-logger.js +10 -11
- 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 +2 -2
- package/dist/mail-foundation/feature.js +24 -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.js +5 -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/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.js +8 -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.js +1 -1
- package/dist/shared/encrypt-for-direct-write.js +1 -1
- 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/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 +35 -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 +1 -1
- 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.js +10 -10
- package/dist/template-resolver/handlers/find-by-id.query.js +5 -5
- package/dist/template-resolver/handlers/list.query.js +1 -1
- package/dist/template-resolver/handlers/shared.js +2 -2
- package/dist/template-resolver/handlers/template-write.js +3 -3
- 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/seeding.js +4 -4
- package/dist/template-resolver/table.js +10 -11
- package/dist/template-resolver/web/client-plugin.js +2 -2
- package/dist/tenant/feature.js +7 -7
- package/dist/tenant/handlers/member-directory.query.js +1 -1
- 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.js +1 -1
- 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/feature.js +1 -1
- 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 +5 -5
- package/dist/tier-engine/handlers/set-tenant-tier.write.js +3 -3
- package/dist/tier-engine/tier-resolver.js +2 -2
- package/dist/tier-engine/trial.js +8 -8
- 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 +127 -233
- package/dist/user-data-rights/run-forget-cleanup.d.ts +16 -20
- package/dist/user-data-rights/run-forget-cleanup.js +63 -82
- 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/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 +10 -10
|
@@ -25,21 +25,21 @@ export function useAuthShell() {
|
|
|
25
25
|
export function AuthCard({ title, subtitle, className, headerClassName, titleClassName, bodyClassName, children, }) {
|
|
26
26
|
const { Card } = usePrimitives();
|
|
27
27
|
const shell = useAuthShell() ?? defaultAuthShell;
|
|
28
|
-
// h1 (
|
|
29
|
-
//
|
|
28
|
+
// Keep an h1 (page heading) through the header slot; the Card's default
|
|
29
|
+
// header would be h3. padded:false keeps the form edge-to-edge as before
|
|
30
|
+
// (bare form).
|
|
30
31
|
const card = (_jsx(Card, { className: cn("w-full max-w-sm", className), options: { padded: false }, slots: {
|
|
31
32
|
header: title !== undefined || subtitle !== undefined ? (_jsxs("div", { className: cn("flex flex-col space-y-1.5 p-6 pb-4", headerClassName), children: [title !== undefined && (_jsx("h1", { className: cn("text-xl font-semibold tracking-tight", titleClassName), children: title })), subtitle !== undefined && (_jsx("p", { className: "text-sm text-muted-foreground", children: subtitle }))] })) : undefined,
|
|
32
33
|
}, children: _jsx(BareFormProvider, { children: _jsx("div", { className: cn("p-6 pt-0 flex flex-col gap-4", bodyClassName), children: children }) }) }));
|
|
33
34
|
return shell(card);
|
|
34
35
|
}
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
// Browser nicht da ist (SSR-safety) oder der Parameter fehlt.
|
|
36
|
+
// Reads `?<paramName>=<value>` from the current URL, as used by token-bearing
|
|
37
|
+
// pages (reset, verify). Returns "" during SSR or when the parameter is absent.
|
|
38
38
|
//
|
|
39
|
-
//
|
|
40
|
-
// pattern
|
|
41
|
-
//
|
|
42
|
-
//
|
|
39
|
+
// This is intentionally not read through useState/useEffect: that would be a
|
|
40
|
+
// read-once-on-mount pattern, while URL changes are irrelevant here because
|
|
41
|
+
// token pages reload for new tokens. Callers can use
|
|
42
|
+
// useState(() => parseUrlToken(...)) when needed.
|
|
43
43
|
export function parseUrlToken(paramName = "token") {
|
|
44
44
|
if (typeof window === "undefined")
|
|
45
45
|
return "";
|
|
@@ -47,7 +47,7 @@ export function parseUrlToken(paramName = "token") {
|
|
|
47
47
|
}
|
|
48
48
|
// Reads the magic-link token from `?<paramName>=` once on mount, then strips
|
|
49
49
|
// that param from the URL via history.replaceState so the single-use token
|
|
50
|
-
// doesn't linger in browser history / Referer
|
|
50
|
+
// doesn't linger in browser history / Referer. An explicit `override`
|
|
51
51
|
// (server-injected token) short-circuits both the URL read and the scrub.
|
|
52
52
|
export function useUrlToken(override, paramName = "token") {
|
|
53
53
|
const [token] = useState(() => override ?? parseUrlToken(paramName));
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
// Auth
|
|
3
|
-
// "unauthenticated"
|
|
4
|
-
//
|
|
5
|
-
//
|
|
2
|
+
// Auth gate: renders the LoginScreen while the session status is
|
|
3
|
+
// "unauthenticated" and the children otherwise. "loading" shows a
|
|
4
|
+
// minimal placeholder—the initial refresh usually completes in <100ms,
|
|
5
|
+
// so a spinner would be excessive.
|
|
6
6
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
7
|
+
// The makeAuthGate factory closes over the LoginScreen component so the
|
|
8
|
+
// gate matches the ClientFeatureDefinition signature (only a `{ children }`
|
|
9
|
+
// prop). This lets the sample configure a custom login screen without
|
|
10
|
+
// replacing the gate.
|
|
11
11
|
import { useLocale } from "@cosmicdrift/kumiko-renderer";
|
|
12
12
|
import { useEffect, useMemo, useState } from "react";
|
|
13
13
|
import { assertNavigableUrl, buildLoginRedirectUrl, followNextOrLandingAfterLogin, } from "./auth-redirect.js";
|
|
@@ -20,12 +20,11 @@ import { SessionBootstrapErrorScreen } from "./session-bootstrap-error.js";
|
|
|
20
20
|
// their own standalone login route outside any gate (createPublicSurface
|
|
21
21
|
// apex pages stack providers, not gates — see auth-mount.tsx recipes).
|
|
22
22
|
// Handing an app raw LoginScreen + telling it to hand-roll the challenge-
|
|
23
|
-
// token swap itself is exactly how
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
// optional package).
|
|
23
|
+
// token swap itself is exactly how the login-time MFA step went missing in a
|
|
24
|
+
// real apex surface; this prevents the *most common* version of that mistake.
|
|
25
|
+
// MFA still only actually works once a consumer wires `mfaVerifyScreen` —
|
|
26
|
+
// omitting it is a silent no-MFA fallback, not something this route can catch
|
|
27
|
+
// on its own (auth-mfa is a separate, optional package).
|
|
29
28
|
export function createLoginRoute(opts = {}) {
|
|
30
29
|
const LoginComponent = opts.loginScreen ?? LoginScreen;
|
|
31
30
|
const MfaVerifyComponent = opts.mfaVerifyScreen;
|
|
@@ -38,7 +37,7 @@ export function createLoginRoute(opts = {}) {
|
|
|
38
37
|
// never considers this session authenticated until verify succeeds.
|
|
39
38
|
const [challengeToken, setChallengeToken] = useState(null);
|
|
40
39
|
const [setupRequest, setSetupRequest] = useState(null);
|
|
41
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
40
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
42
41
|
useEffect(() => {
|
|
43
42
|
if (status === "authenticated")
|
|
44
43
|
onAuthenticated?.();
|
|
@@ -125,7 +124,7 @@ export function makeAuthGate(opts = {}) {
|
|
|
125
124
|
? resolveLoginRedirectOrNull(loginUrl, locale, { origin, pathname, search, hash })
|
|
126
125
|
: null, [status, locale, origin, pathname, search, hash]);
|
|
127
126
|
const redirectUrl = loginRedirect?.kind === "redirect" ? loginRedirect.url : null;
|
|
128
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
127
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
129
128
|
useEffect(() => {
|
|
130
129
|
if (redirectUrl !== null)
|
|
131
130
|
window.location.replace(redirectUrl);
|
|
@@ -3,9 +3,9 @@ import type { ComponentType, ReactNode } from "react";
|
|
|
3
3
|
import { type AuthGateOptions, type MfaSetupComponentProps, type MfaVerifyComponentProps } from "./auth-gate.tsx";
|
|
4
4
|
import type { LoginScreenProps } from "./login-screen.tsx";
|
|
5
5
|
export type EmailPasswordClientOptions = {
|
|
6
|
-
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
/** Custom login screen. Default: the shadcn-styled LoginScreen
|
|
7
|
+
* from this module. Provide a component with the same signature for
|
|
8
|
+
* branding or layout overrides. */
|
|
9
9
|
readonly loginScreen?: ComponentType<LoginScreenProps>;
|
|
10
10
|
readonly loginScreenProps?: LoginScreenProps;
|
|
11
11
|
/** auth-mfa's MfaVerifyScreen, wired in from the app so this feature
|
|
@@ -26,10 +26,10 @@ export type EmailPasswordClientOptions = {
|
|
|
26
26
|
readonly loginUrl?: AuthGateOptions["loginUrl"];
|
|
27
27
|
/** Where logout navigates to (root-relative path or http(s) URL). Default: reload. */
|
|
28
28
|
readonly postLogoutUrl?: string;
|
|
29
|
-
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* (`fr`, `es`, …)
|
|
29
|
+
/** Per-locale key overrides. Merged with the default bundles (de/en)
|
|
30
|
+
* from `translations.ts`; each key supplied here takes precedence.
|
|
31
|
+
* Use this for branding ("Sign in" → "Login to Acme") or to add
|
|
32
|
+
* further languages (`fr`, `es`, …). */
|
|
33
33
|
readonly translations?: TranslationsByLocale;
|
|
34
34
|
/** Serve the forgot-password, reset-password and unlock-account pages at
|
|
35
35
|
* their convention paths for signed-out visitors. Apps with their own
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
// Client
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// Strings pro Locale, pro Key.
|
|
1
|
+
// Client feature factory for auth-email-password. App code mounts it in
|
|
2
|
+
// createKumikoApp({ clientFeatures: [emailPasswordClient()] }) to provide
|
|
3
|
+
// session context, AuthGate, and default UI translations (de/en). All of
|
|
4
|
+
// these can be overridden: the login screen and strings per locale and key.
|
|
6
5
|
import { makeSessionAuthGate, } from "./auth-gate.js";
|
|
7
6
|
import { emailPasswordClientActions } from "./client-actions.js";
|
|
8
7
|
import { DefaultAuthPagesGate } from "./default-auth-pages-gate.js";
|
|
@@ -16,7 +16,7 @@ export function ConfirmAccountUnlockScreen({ title, token: tokenProp, loginHref
|
|
|
16
16
|
const token = useUrlToken(tokenProp);
|
|
17
17
|
const [status, setStatus] = useState(token === "" ? "missing-token" : "verifying");
|
|
18
18
|
const startedRef = useRef(false);
|
|
19
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
19
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
20
20
|
useEffect(() => {
|
|
21
21
|
if (status !== "verifying")
|
|
22
22
|
return;
|
|
@@ -15,7 +15,7 @@ export const AuthHandlers = {
|
|
|
15
15
|
requestEmailVerification: "auth-email-password:write:request-email-verification",
|
|
16
16
|
verifyEmail: "auth-email-password:write:verify-email",
|
|
17
17
|
// Account-Unlock Magic-Link (fixes the lockout-DoS where the monotonic
|
|
18
|
-
// failure-counter re-locks immediately after expiry
|
|
18
|
+
// failure-counter re-locks immediately after expiry). Mirrors
|
|
19
19
|
// reset: request mints an HMAC token + mails it, confirm clears the
|
|
20
20
|
// Redis lockout state.
|
|
21
21
|
requestAccountUnlock: "auth-email-password:write:request-account-unlock",
|
|
@@ -81,7 +81,7 @@ export const AuthErrors = {
|
|
|
81
81
|
invalidSignupToken: "invalid_signup_token",
|
|
82
82
|
signupNotConfigured: "signup_not_configured",
|
|
83
83
|
// Self-signup: confirm rejects an already-registered email instead of
|
|
84
|
-
// reusing the existing user (account takeover
|
|
84
|
+
// reusing the existing user (account takeover). NO
|
|
85
85
|
// anti-enumeration collapse like invalidSignupToken: whoever gets here
|
|
86
86
|
// controls the inbox (has the magic link), so revealing "email exists"
|
|
87
87
|
// is not new information.
|
|
@@ -101,7 +101,7 @@ export const AuthErrors = {
|
|
|
101
101
|
// deliberate enumeration trade-off: the lockout event itself is already
|
|
102
102
|
// observable to the attacker, and legit users benefit from a clear signal.
|
|
103
103
|
accountLocked: "account_locked",
|
|
104
|
-
//
|
|
104
|
+
// (GDPR Art. 18) — account is in Restricted status. Login is
|
|
105
105
|
// explicitly refused with its own code (not collapsed into
|
|
106
106
|
// invalid_credentials) so the UI can say "account is currently paused,
|
|
107
107
|
// click here to lift it". Enumeration leak accepted: restriction is
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
export type DefaultTopbarActionsProps = {
|
|
3
|
-
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
/** Maps a tenant ID to a human-readable name (for example, a branded label
|
|
4
|
+
* per tenant). TenantSwitcher's default otherwise displays the first 8
|
|
5
|
+
* characters of the UUID. */
|
|
6
6
|
readonly tenantName?: (tenantId: string) => string;
|
|
7
|
-
/** Slot
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
/** Slot between TenantSwitcher and ThemeToggle. Typical use case:
|
|
8
|
+
* an app-specific LanguageSwitcher. ReactNode, rather than an array, so the
|
|
9
|
+
* app controls the ordering and spacing. */
|
|
10
10
|
readonly extras?: ReactNode;
|
|
11
|
-
/** Light-
|
|
12
|
-
* Lucide
|
|
11
|
+
/** Light-mode icon for ThemeToggle. Default: Unicode ☀. Apps that want
|
|
12
|
+
* Lucide icons or similar can provide a custom icon element. */
|
|
13
13
|
readonly lightIcon?: ReactNode;
|
|
14
14
|
/** Dark-Mode-Icon. Default: Unicode ☾. */
|
|
15
15
|
readonly darkIcon?: ReactNode;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
// TenantSwitcher (
|
|
5
|
-
// ThemeToggle → UserMenu (
|
|
6
|
-
//
|
|
7
|
-
//
|
|
2
|
+
// Composes the standard top-bar actions for apps with auth and workspaces.
|
|
3
|
+
// This bundles the pattern that each app sample would otherwise write by hand:
|
|
4
|
+
// TenantSwitcher (left) → optional extras (for example, LanguageSwitcher) →
|
|
5
|
+
// ThemeToggle → UserMenu (right). Apps with a custom arrangement can still
|
|
6
|
+
// import the individual components directly; DefaultTopbarActions is
|
|
7
|
+
// convenience, not a requirement.
|
|
8
8
|
import { ThemeToggle } from "@cosmicdrift/kumiko-renderer/web";
|
|
9
9
|
import { TenantSwitcher } from "./tenant-switcher.js";
|
|
10
10
|
import { UserMenu } from "./user-menu.js";
|
|
@@ -2,8 +2,8 @@ import { type ReactNode } from "react";
|
|
|
2
2
|
export type ForgotPasswordScreenProps = {
|
|
3
3
|
readonly title?: string;
|
|
4
4
|
readonly subtitle?: ReactNode;
|
|
5
|
-
/** href
|
|
6
|
-
*
|
|
5
|
+
/** href for the "Back to login" link in the success and form states. App-
|
|
6
|
+
* specific — defaults to "/login". */
|
|
7
7
|
readonly loginHref?: string;
|
|
8
8
|
};
|
|
9
9
|
export declare function ForgotPasswordScreen({ title, subtitle, loginHref, }: ForgotPasswordScreenProps): ReactNode;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// ForgotPasswordScreen —
|
|
3
|
-
// /api/auth/request-password-reset (silent
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
2
|
+
// ForgotPasswordScreen — form with an email input. Submission triggers
|
|
3
|
+
// /api/auth/request-password-reset (silent success, no account enumeration).
|
|
4
|
+
// The UI always shows a "If an account exists, the email is on its way"
|
|
5
|
+
// confirmation, even when the server determines internally that the email
|
|
6
|
+
// does not exist.
|
|
7
7
|
//
|
|
8
|
-
//
|
|
9
|
-
// /forgot-password)
|
|
10
|
-
// "
|
|
8
|
+
// The app is responsible for mounting and exposing the screen at a URL
|
|
9
|
+
// (for example, /forgot-password); the LoginScreen can link to that app
|
|
10
|
+
// route with a "Forgot password?" link.
|
|
11
11
|
import { usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
|
|
12
12
|
import { useState } from "react";
|
|
13
13
|
import { requestPasswordReset } from "./auth-client.js";
|
|
@@ -19,7 +19,7 @@ export function ForgotPasswordScreen({ title, subtitle, loginHref = "/login", })
|
|
|
19
19
|
const [submitting, setSubmitting] = useState(false);
|
|
20
20
|
const [done, setDone] = useState(false);
|
|
21
21
|
const [error, setError] = useState(null);
|
|
22
|
-
// guard:dup-ok —
|
|
22
|
+
// guard:dup-ok — same submission pattern as signup-screen, but with different API endpoints and state
|
|
23
23
|
const doSubmit = async () => {
|
|
24
24
|
setSubmitting(true);
|
|
25
25
|
setError(null);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
// Public exports
|
|
2
|
-
//
|
|
3
|
-
// password/web
|
|
4
|
-
// `@cosmicdrift/kumiko-bundled-features/auth-email-password`
|
|
5
|
-
// React-/DOM
|
|
1
|
+
// Public exports for the browser side of the auth-email-password feature.
|
|
2
|
+
// Consumed through the subpath export `@cosmicdrift/kumiko-bundled-features/auth-email-
|
|
3
|
+
// password/web`; the server side (defineFeature) lives in
|
|
4
|
+
// `@cosmicdrift/kumiko-bundled-features/auth-email-password` and has no
|
|
5
|
+
// React-/DOM dependencies. This keeps the separation clean, like renderer vs renderer/web.
|
|
6
6
|
export { AuthRequestError, confirmAccountUnlock, confirmSignup, requestAccountUnlock, requestEmailVerification, requestPasswordReset, requestSignup, resetPassword, toLoginResponse, verifyEmail, } from "./auth-client.js";
|
|
7
7
|
export { AuthCard, AuthShellProvider, useAuthShell } from "./auth-form-primitives.js";
|
|
8
8
|
export { createLoginRoute, makeAuthGate, makeSessionAuthGate } from "./auth-gate.js";
|
|
@@ -12,7 +12,7 @@ export type InviteAcceptScreenProps = {
|
|
|
12
12
|
tenantId: string;
|
|
13
13
|
roles: readonly string[];
|
|
14
14
|
}) => string);
|
|
15
|
-
/** Login
|
|
15
|
+
/** Login href for "Mit anderem Account anmelden". Default "/login". */
|
|
16
16
|
readonly loginHref?: string;
|
|
17
17
|
};
|
|
18
18
|
export declare function InviteAcceptScreen({ title, token: tokenProp, loggedInHref, loginHref, }: InviteAcceptScreenProps): ReactNode;
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// InviteAcceptScreen —
|
|
2
|
+
// InviteAcceptScreen — accepts tenant invitations through a magic link.
|
|
3
3
|
//
|
|
4
|
-
//
|
|
5
|
-
// - Logged
|
|
6
|
-
// invite-accept).
|
|
7
|
-
//
|
|
8
|
-
// - Anonymous:
|
|
9
|
-
//
|
|
10
|
-
//
|
|
4
|
+
// Reads `?token=...` from the URL and selects a flow based on session state:
|
|
5
|
+
// - Logged in with a matching email: one-click accept (Branch 1, via the
|
|
6
|
+
// invite-accept dispatcher). For an email mismatch, show an error and a
|
|
7
|
+
// "Sign in with a different account" link.
|
|
8
|
+
// - Anonymous: email and password form. The "Already have an account?" toggle
|
|
9
|
+
// selects Branch 2 (existing user, login + accept) or Branch 3 (new user,
|
|
10
|
+
// signup + accept).
|
|
11
11
|
//
|
|
12
|
-
// Anti-enumeration: invalidInviteToken
|
|
13
|
-
//
|
|
12
|
+
// Anti-enumeration: invalidInviteToken collapses token, user, and password
|
|
13
|
+
// failures into one code, using the same trade-off as reset.
|
|
14
14
|
//
|
|
15
|
-
// Auto-
|
|
16
|
-
//
|
|
17
|
-
//
|
|
15
|
+
// Auto-login: Branches 2 and 3 set cookies through the server, then the
|
|
16
|
+
// frontend redirects to loggedInHref. Branch 1 already has a session, but the
|
|
17
|
+
// frontend also redirects to loggedInHref so the invitee enters the new tenant.
|
|
18
18
|
import { usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
|
|
19
19
|
import { useContext, useState } from "react";
|
|
20
20
|
import { csrfHeader } from "./auth-client.js";
|
|
@@ -60,7 +60,7 @@ export function InviteAcceptScreen({ title, token: tokenProp, loggedInHref = "/"
|
|
|
60
60
|
const acceptLoggedIn = async () => {
|
|
61
61
|
setSubmitting(true);
|
|
62
62
|
setError(null);
|
|
63
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
63
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
64
64
|
const res = await fetch("/api/auth/invite-accept", {
|
|
65
65
|
method: "POST",
|
|
66
66
|
credentials: "same-origin",
|
|
@@ -79,7 +79,7 @@ export function InviteAcceptScreen({ title, token: tokenProp, loggedInHref = "/"
|
|
|
79
79
|
const acceptAnonExisting = async () => {
|
|
80
80
|
setSubmitting(true);
|
|
81
81
|
setError(null);
|
|
82
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
82
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
83
83
|
const res = await fetch("/api/auth/invite-accept-with-login", {
|
|
84
84
|
method: "POST",
|
|
85
85
|
credentials: "same-origin",
|
|
@@ -98,7 +98,7 @@ export function InviteAcceptScreen({ title, token: tokenProp, loggedInHref = "/"
|
|
|
98
98
|
const acceptAnonNew = async () => {
|
|
99
99
|
setSubmitting(true);
|
|
100
100
|
setError(null);
|
|
101
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
101
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
102
102
|
const res = await fetch("/api/auth/invite-signup-complete", {
|
|
103
103
|
method: "POST",
|
|
104
104
|
credentials: "same-origin",
|
|
@@ -12,7 +12,7 @@ export type LoginScreenProps = {
|
|
|
12
12
|
* default path once the server offers the reset flow (login-options);
|
|
13
13
|
* `null` hides the link deliberately. */
|
|
14
14
|
readonly forgotPasswordHref?: string | null;
|
|
15
|
-
/** Optional href to RequestAccountUnlockScreen
|
|
15
|
+
/** Optional href to RequestAccountUnlockScreen. When set, an
|
|
16
16
|
* account_locked login error renders an "Unlock account?" link inline —
|
|
17
17
|
* the account-lockout escape hatch, since forgotPasswordHref does NOT
|
|
18
18
|
* help here: the lockout gate blocks login before password verify even
|
|
@@ -9,9 +9,8 @@ import { DEFAULT_AUTH_PATHS, DEFAULT_FORGOT_PASSWORD_PATH } from "./auth-paths.j
|
|
|
9
9
|
import { followNextOrLandingAfterLogin } from "./auth-redirect.js";
|
|
10
10
|
import { AuthQueries } from "./constants.js";
|
|
11
11
|
import { useSession } from "./session.js";
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// fallen auf `auth.errors.loginFailed` zurück.
|
|
12
|
+
// Maps login-handler reason codes to i18n keys and optional interpolation parameters.
|
|
13
|
+
// Unknown codes fall back to `auth.errors.loginFailed`.
|
|
15
14
|
function reasonToKey(failure) {
|
|
16
15
|
switch (failure.reason) {
|
|
17
16
|
case "invalid_credentials":
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
2
|
export type ResetPasswordScreenProps = {
|
|
3
3
|
readonly title?: string;
|
|
4
|
-
/** Override
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
/** Override for the token from the URL. Apps that pass a token during
|
|
5
|
+
* server-side rendering need this. Default: parsed from `?token=...` in
|
|
6
|
+
* the URL. */
|
|
7
7
|
readonly token?: string;
|
|
8
|
-
/** href
|
|
8
|
+
/** href for the "Zum Login" link after success. Default "/login". */
|
|
9
9
|
readonly loginHref?: string;
|
|
10
10
|
};
|
|
11
11
|
export declare function ResetPasswordScreen({ title, token: tokenProp, loginHref, }: ResetPasswordScreenProps): ReactNode;
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// ResetPasswordScreen
|
|
3
|
-
// new
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
2
|
+
// ResetPasswordScreen reads `?token=...` from the URL and shows fields for
|
|
3
|
+
// a new and confirmed password. Submission calls /api/auth/reset-password
|
|
4
|
+
// with the token. The server collapses all token-verification failures into
|
|
5
|
+
// one code (anti-enumeration), so the UI shows the unified "link invalid or
|
|
6
|
+
// expired" message.
|
|
7
7
|
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// durch — dann bleibt die URL unangetastet.
|
|
8
|
+
// The token is read once via useUrlToken(): `?token=...` is read on mount and
|
|
9
|
+
// then scrubbed from the URL. Apps that need different behavior can pass a
|
|
10
|
+
// server-injected token through the `token` prop; the URL is then left intact.
|
|
12
11
|
import { usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
|
|
13
12
|
import { useState } from "react";
|
|
14
13
|
import { resetPassword } from "./auth-client.js";
|
|
@@ -56,10 +55,10 @@ export function ResetPasswordScreen({ title, token: tokenProp, loginHref = "/log
|
|
|
56
55
|
void doSubmit();
|
|
57
56
|
};
|
|
58
57
|
const effectiveTitle = title ?? t("auth.resetPassword.title");
|
|
59
|
-
//
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
//
|
|
58
|
+
// No token in the URL: the user should click the link from their email again
|
|
59
|
+
// or request a new reset. Submitting without a token would only show the
|
|
60
|
+
// invalidResetToken error, which is confusing, so show a clear message
|
|
61
|
+
// immediately instead.
|
|
63
62
|
if (token === "") {
|
|
64
63
|
return (_jsxs(AuthCard, { title: effectiveTitle, children: [_jsx("p", { className: "text-sm text-muted-foreground", children: t("auth.resetPassword.missingToken") }), _jsx(Link, { href: loginHref, variant: "muted", children: t("auth.resetPassword.goToLogin") })] }));
|
|
65
64
|
}
|
|
@@ -11,11 +11,12 @@ export type SessionState = {
|
|
|
11
11
|
readonly user: CurrentUserProfile | null;
|
|
12
12
|
readonly activeTenantId: string | null;
|
|
13
13
|
readonly tenants: readonly TenantSummary[];
|
|
14
|
-
/** Merged session
|
|
15
|
-
* SystemAdmin)
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* tenants[active].roles
|
|
14
|
+
/** Merged session roles for the active tenant: globalRoles (for example,
|
|
15
|
+
* SystemAdmin) plus the active tenant's membership roles. The server has
|
|
16
|
+
* already merged them into the JWT, but the JWT is HttpOnly and cannot be
|
|
17
|
+
* read by JavaScript; the client computes the same merge from
|
|
18
|
+
* user.globalRoles + tenants[active].roles so navigation filtering works.
|
|
19
|
+
* The result is deduplicated. */
|
|
19
20
|
readonly roles: readonly string[];
|
|
20
21
|
readonly bootstrapFailure: SessionBootstrapFailure | null;
|
|
21
22
|
/** Set when an authenticated session was ended server-side (revoked,
|
|
@@ -35,10 +36,10 @@ export type SessionApi = SessionState & {
|
|
|
35
36
|
export declare const UNAUTHENTICATED: SessionState;
|
|
36
37
|
export declare function hasLikelyAuthSession(cookieSource?: string): boolean;
|
|
37
38
|
export declare function computeActiveRoles(user: CurrentUserProfile | null, activeTenantId: string | null, tenants: readonly TenantSummary[]): readonly string[];
|
|
38
|
-
/** Internal — exposed
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
39
|
+
/** Internal — exposed so tests can pass a mock SessionApi value
|
|
40
|
+
* without going through SessionProvider's refresh lifecycle. Application
|
|
41
|
+
* code uses SessionProvider + useSession; direct context access is
|
|
42
|
+
* intended for tests/stories. */
|
|
42
43
|
export declare const SessionContext: import("react").Context<SessionApi | undefined>;
|
|
43
44
|
export declare function SessionProvider({ children, postLogoutUrl, }: {
|
|
44
45
|
readonly children: ReactNode;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
// Session
|
|
3
|
-
//
|
|
4
|
-
//
|
|
2
|
+
// Session state for the browser renderer. Holds the currently signed-in
|
|
3
|
+
// user (profile + active tenant assignment + memberships), responds to
|
|
4
|
+
// login/logout/tenant switching, and refreshes the data automatically.
|
|
5
5
|
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
6
|
+
// Context + useReducer is used instead of, for example, Zustand because
|
|
7
|
+
// the state is small (a handful of fields and a few transitions), avoiding
|
|
8
|
+
// another dependency in the browser bundle. Consumers live under
|
|
9
|
+
// `<SessionProvider>`; the `useSession()` hook provides the state
|
|
10
|
+
// and transitions.
|
|
11
11
|
import { CurrentUserProvider, useSessionEndedSignal, } from "@cosmicdrift/kumiko-renderer";
|
|
12
12
|
import { readCsrfToken } from "@cosmicdrift/kumiko-renderer/live";
|
|
13
13
|
import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from "react";
|
|
@@ -34,14 +34,14 @@ const INITIAL = {
|
|
|
34
34
|
bootstrapFailure: null,
|
|
35
35
|
signedOutReason: null,
|
|
36
36
|
};
|
|
37
|
-
// kumiko_auth
|
|
37
|
+
// kumiko_auth is HttpOnly; kumiko_csrf is set together with it at login.
|
|
38
38
|
export function hasLikelyAuthSession(cookieSource) {
|
|
39
39
|
return readCsrfToken(cookieSource) !== undefined;
|
|
40
40
|
}
|
|
41
|
-
// Exported
|
|
42
|
-
//
|
|
43
|
-
// login.write.ts
|
|
44
|
-
//
|
|
41
|
+
// Exported so tests can pin the merge path directly: this must be
|
|
42
|
+
// byte-identical to the server-side merge in auth-routes.ts +
|
|
43
|
+
// login.write.ts, otherwise the client sees different session roles
|
|
44
|
+
// from the server.
|
|
45
45
|
export function computeActiveRoles(user, activeTenantId, tenants) {
|
|
46
46
|
if (user === null)
|
|
47
47
|
return [];
|
|
@@ -51,13 +51,13 @@ export function computeActiveRoles(user, activeTenantId, tenants) {
|
|
|
51
51
|
// login.write.ts).
|
|
52
52
|
return Array.from(new Set([...user.globalRoles, ...membershipRoles]));
|
|
53
53
|
}
|
|
54
|
-
/** Internal — exposed
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
54
|
+
/** Internal — exposed so tests can pass a mock SessionApi value
|
|
55
|
+
* without going through SessionProvider's refresh lifecycle. Application
|
|
56
|
+
* code uses SessionProvider + useSession; direct context access is
|
|
57
|
+
* intended for tests/stories. */
|
|
58
58
|
export const SessionContext = createContext(undefined);
|
|
59
|
-
//
|
|
60
|
-
// /user:me.
|
|
59
|
+
// One refresh round: /auth/tenants → if 401, unauthenticated; otherwise
|
|
60
|
+
// /user:me. Together, both requests produce the complete SessionState.
|
|
61
61
|
async function refresh() {
|
|
62
62
|
if (!hasLikelyAuthSession()) {
|
|
63
63
|
return UNAUTHENTICATED;
|
|
@@ -103,14 +103,14 @@ export function SessionProvider({ children, postLogoutUrl, }) {
|
|
|
103
103
|
setState({ ...UNAUTHENTICATED, status: "error", bootstrapFailure: toBootstrapFailure(err) });
|
|
104
104
|
}
|
|
105
105
|
}, []);
|
|
106
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
106
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
107
107
|
useEffect(() => {
|
|
108
108
|
void doRefresh();
|
|
109
109
|
}, [doRefresh]);
|
|
110
110
|
const sessionEndedSignal = useSessionEndedSignal();
|
|
111
111
|
// Only an authenticated session can "end": an anonymous 401 on a public
|
|
112
112
|
// surface must not show the hint.
|
|
113
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
113
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
114
114
|
useEffect(() => {
|
|
115
115
|
return sessionEndedSignal?.subscribe(() => {
|
|
116
116
|
setState((prev) => prev.status === "authenticated"
|
|
@@ -134,20 +134,19 @@ export function SessionProvider({ children, postLogoutUrl, }) {
|
|
|
134
134
|
return;
|
|
135
135
|
}
|
|
136
136
|
setState(UNAUTHENTICATED);
|
|
137
|
-
// Hard
|
|
138
|
-
//
|
|
139
|
-
//
|
|
140
|
-
//
|
|
137
|
+
// Hard reload: the React tree, dispatcher live caches, and EventSource
|
|
138
|
+
// are all reset. After logout, this is the cheapest way to reach a clean
|
|
139
|
+
// state without having to invalidate every consumer through a context
|
|
140
|
+
// reset.
|
|
141
141
|
if (typeof window !== "undefined") {
|
|
142
142
|
window.location.reload();
|
|
143
143
|
}
|
|
144
144
|
}, [postLogoutUrl]);
|
|
145
145
|
const switchTenant = useCallback(async (tenantId) => {
|
|
146
146
|
await switchTenantApi(tenantId);
|
|
147
|
-
// Tenant
|
|
148
|
-
// tenant-
|
|
149
|
-
//
|
|
150
|
-
// halbe State-Übergänge.
|
|
147
|
+
// Tenant switching rotates the JWT + cookies. The React tree contains
|
|
148
|
+
// tenant-bound caches (queries, live events), so a simple reload is
|
|
149
|
+
// consistent with the logout path and avoids partial state transitions.
|
|
151
150
|
if (typeof window !== "undefined") {
|
|
152
151
|
window.location.reload();
|
|
153
152
|
}
|