@cosmicdrift/kumiko-samples 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/README.md +1 -1
- package/package.json +2 -2
- package/packages/bundled-features/package.json +2 -2
- package/packages/bundled-features/src/agent-tools/tool-catalog.ts +1 -1
- package/packages/bundled-features/src/agent-tools/tool-dispatch.ts +0 -2
- package/packages/bundled-features/src/audit/screens.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/auth-user-row.ts +10 -10
- package/packages/bundled-features/src/auth-email-password/feature.ts +6 -6
- package/packages/bundled-features/src/auth-email-password/handlers/change-password.write.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/handlers/confirm-token-flow.ts +5 -5
- package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/invite-accept.write.ts +18 -18
- package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +12 -12
- package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/invite-signup-complete.write.ts +24 -26
- package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/self-registration-status.query.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/signup-confirm.write.ts +34 -37
- package/packages/bundled-features/src/auth-email-password/handlers/signup-request.write.ts +6 -7
- package/packages/bundled-features/src/auth-email-password/handlers/switch-tenant-mfa-gate.write.ts +1 -5
- package/packages/bundled-features/src/auth-email-password/index.ts +5 -5
- package/packages/bundled-features/src/auth-email-password/lockout-store.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/seeding.ts +63 -66
- package/packages/bundled-features/src/auth-email-password/signup-token-store.ts +8 -8
- package/packages/bundled-features/src/auth-email-password/testing.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +57 -57
- package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +14 -14
- package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +15 -16
- package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +11 -12
- package/packages/bundled-features/src/auth-email-password/web/confirm-account-unlock-screen.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/constants.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +14 -14
- package/packages/bundled-features/src/auth-email-password/web/forgot-password-screen.tsx +11 -11
- package/packages/bundled-features/src/auth-email-password/web/index.ts +5 -5
- package/packages/bundled-features/src/auth-email-password/web/invite-accept-screen.tsx +17 -17
- package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +3 -4
- package/packages/bundled-features/src/auth-email-password/web/reset-password-screen.tsx +16 -17
- package/packages/bundled-features/src/auth-email-password/web/session.tsx +34 -34
- package/packages/bundled-features/src/auth-email-password/web/signup-complete-screen.tsx +3 -3
- package/packages/bundled-features/src/auth-email-password/web/signup-screen.tsx +14 -14
- package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +26 -27
- package/packages/bundled-features/src/auth-email-password/web/use-shell-user.ts +12 -13
- package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +17 -18
- package/packages/bundled-features/src/auth-email-password/web/verify-email-screen.tsx +11 -12
- package/packages/bundled-features/src/auth-foundation/boot-checks.ts +4 -4
- package/packages/bundled-features/src/auth-foundation/resolve-anonymous-access.ts +4 -4
- package/packages/bundled-features/src/auth-foundation/types.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/handlers/disable.write.ts +3 -3
- package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +4 -4
- package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm.write.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/reencrypt.job.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/regenerate-recovery.write.ts +5 -5
- package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/token-secrets.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/web/client-plugin.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/web/i18n.ts +3 -3
- package/packages/bundled-features/src/auth-mfa/web/index.ts +4 -4
- package/packages/bundled-features/src/auth-mfa/web/mfa-client.ts +17 -16
- package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +6 -6
- package/packages/bundled-features/src/billing-foundation/aggregate-id.ts +10 -11
- package/packages/bundled-features/src/billing-foundation/entities.ts +27 -27
- package/packages/bundled-features/src/billing-foundation/events.ts +22 -21
- package/packages/bundled-features/src/billing-foundation/feature.ts +42 -43
- package/packages/bundled-features/src/billing-foundation/get-subscription-for-tenant.ts +3 -5
- package/packages/bundled-features/src/billing-foundation/handlers/create-checkout-session.write.ts +18 -17
- package/packages/bundled-features/src/billing-foundation/handlers/create-portal-session.write.ts +11 -12
- package/packages/bundled-features/src/billing-foundation/handlers/list-subscriptions.query.ts +4 -4
- package/packages/bundled-features/src/billing-foundation/handlers/process-event.write.ts +20 -20
- package/packages/bundled-features/src/billing-foundation/projection.ts +38 -37
- package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +3 -3
- package/packages/bundled-features/src/billing-foundation/tenant-destroy-hook.ts +7 -8
- package/packages/bundled-features/src/billing-foundation/types.ts +64 -65
- package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +4 -4
- package/packages/bundled-features/src/billing-foundation/webhook-handler.ts +1 -1
- package/packages/bundled-features/src/cap-counter/aggregate-id.ts +8 -9
- package/packages/bundled-features/src/cap-counter/constants.ts +11 -12
- package/packages/bundled-features/src/cap-counter/enforce-cap.ts +64 -67
- package/packages/bundled-features/src/cap-counter/entity.ts +29 -29
- package/packages/bundled-features/src/cap-counter/feature.ts +34 -35
- package/packages/bundled-features/src/cap-counter/handlers/increment-rolling.write.ts +31 -31
- package/packages/bundled-features/src/cap-counter/handlers/mark-soft-warned.write.ts +4 -5
- package/packages/bundled-features/src/cap-counter/stock-cap-guard.ts +1 -1
- package/packages/bundled-features/src/cap-counter/with-cap-enforcement.ts +3 -5
- package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +1 -3
- package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +1 -1
- package/packages/bundled-features/src/channel-email/smtp-transport.ts +34 -31
- package/packages/bundled-features/src/channel-in-app/handlers/unread-count.query.ts +3 -4
- package/packages/bundled-features/src/compliance-profiles/feature.ts +15 -16
- package/packages/bundled-features/src/compliance-profiles/handlers/for-tenant.query.ts +3 -6
- package/packages/bundled-features/src/compliance-profiles/handlers/list-profiles.query.ts +5 -5
- package/packages/bundled-features/src/compliance-profiles/handlers/needs-profile.query.ts +4 -4
- package/packages/bundled-features/src/compliance-profiles/handlers/set-profile.write.ts +13 -14
- package/packages/bundled-features/src/compliance-profiles/handlers/sub-processors.query.ts +9 -11
- package/packages/bundled-features/src/compliance-profiles/resolve-for-tenant.ts +7 -7
- package/packages/bundled-features/src/compliance-profiles/schema/profile-selection.ts +18 -23
- package/packages/bundled-features/src/compliance-profiles/seeding.ts +14 -15
- package/packages/bundled-features/src/compliance-profiles-ops/handlers/tenants-missing-profile.query.ts +3 -3
- package/packages/bundled-features/src/compliance-profiles-ops/index.ts +2 -2
- package/packages/bundled-features/src/config/handlers/readiness.query.ts +7 -7
- package/packages/bundled-features/src/config/handlers/reencrypt.job.ts +4 -5
- package/packages/bundled-features/src/config/handlers/set.write.ts +4 -4
- package/packages/bundled-features/src/config/resolver.ts +4 -4
- package/packages/bundled-features/src/config/table.ts +10 -10
- package/packages/bundled-features/src/config/write-helpers.ts +1 -1
- package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +13 -12
- package/packages/bundled-features/src/custom-fields/aggregate-id.ts +16 -17
- package/packages/bundled-features/src/custom-fields/entity.ts +49 -47
- package/packages/bundled-features/src/custom-fields/events.ts +7 -8
- package/packages/bundled-features/src/custom-fields/feature.ts +70 -72
- package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +9 -8
- package/packages/bundled-features/src/custom-fields/handlers/define-tenant-field.write.ts +28 -26
- package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +6 -7
- package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +12 -13
- package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +25 -28
- package/packages/bundled-features/src/custom-fields/handlers/update-tenant-field.write.ts +6 -6
- package/packages/bundled-features/src/custom-fields/lib/field-access.ts +2 -2
- package/packages/bundled-features/src/custom-fields/lib/parse-serialized-field.ts +1 -1
- package/packages/bundled-features/src/custom-fields/lib/quota.ts +1 -1
- package/packages/bundled-features/src/custom-fields/lib/value-schema.ts +10 -12
- package/packages/bundled-features/src/custom-fields/run-retention.ts +3 -3
- package/packages/bundled-features/src/custom-fields/schemas.ts +14 -14
- package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +2 -5
- package/packages/bundled-features/src/custom-fields/web/constants.ts +2 -2
- package/packages/bundled-features/src/custom-fields/web/custom-fields-form-section.tsx +26 -26
- package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +65 -67
- package/packages/bundled-features/src/custom-fields/wire-user-data-rights.ts +3 -3
- package/packages/bundled-features/src/data-retention/_internal/parse-override.ts +2 -3
- package/packages/bundled-features/src/data-retention/feature.ts +11 -18
- package/packages/bundled-features/src/data-retention/handlers/policy-for.query.ts +6 -6
- package/packages/bundled-features/src/data-retention/keep-for.ts +17 -17
- package/packages/bundled-features/src/data-retention/override-schema.ts +13 -15
- package/packages/bundled-features/src/data-retention/presets.ts +18 -23
- package/packages/bundled-features/src/data-retention/resolve-for-tenant.ts +1 -1
- package/packages/bundled-features/src/data-retention/resolve-tenant-preset.ts +17 -16
- package/packages/bundled-features/src/data-retention/resolver.ts +33 -32
- package/packages/bundled-features/src/data-retention/run-retention-cleanup.ts +71 -58
- package/packages/bundled-features/src/data-retention/schema/tenant-retention-override.ts +13 -11
- package/packages/bundled-features/src/delivery/feature.ts +3 -3
- package/packages/bundled-features/src/delivery/handlers/log.query.ts +1 -1
- package/packages/bundled-features/src/delivery/tables.ts +9 -8
- package/packages/bundled-features/src/delivery/unsubscribe.ts +4 -4
- package/packages/bundled-features/src/delivery/upsert-preference.ts +3 -4
- package/packages/bundled-features/src/document-ingest-foundation/entity.ts +5 -5
- package/packages/bundled-features/src/document-ingest-foundation/events.ts +2 -2
- package/packages/bundled-features/src/document-ingest-foundation/feature.ts +2 -2
- package/packages/bundled-features/src/document-ingest-foundation/pages.ts +1 -1
- package/packages/bundled-features/src/document-ingest-foundation/tenant-destroy-hook.ts +4 -4
- package/packages/bundled-features/src/feature-toggles/compose-tier-resolver.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/feature.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/global-feature-state-table.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/handlers/registered.query.ts +5 -5
- package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/toggle-sync-signal.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/web/constants.ts +1 -1
- package/packages/bundled-features/src/file-derivatives/feature.ts +2 -2
- package/packages/bundled-features/src/file-derivatives/handlers/public-variant.query.ts +1 -1
- package/packages/bundled-features/src/file-derivatives/presets.ts +1 -1
- package/packages/bundled-features/src/file-foundation/feature.ts +6 -6
- package/packages/bundled-features/src/file-provider-inmemory/feature.ts +16 -16
- package/packages/bundled-features/src/file-provider-s3/feature.ts +16 -16
- package/packages/bundled-features/src/file-provider-s3/lib/s3-provider.ts +6 -6
- package/packages/bundled-features/src/files/feature.ts +6 -6
- package/packages/bundled-features/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +5 -5
- package/packages/bundled-features/src/files-tenant-data/hooks.ts +24 -26
- package/packages/bundled-features/src/files-tenant-data/index.ts +1 -1
- package/packages/bundled-features/src/folders/feature.ts +1 -1
- package/packages/bundled-features/src/folders/web/folder-manager.tsx +2 -2
- package/packages/bundled-features/src/folders/web/tree.ts +5 -5
- package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +1 -1
- package/packages/bundled-features/src/form-draft/db/queries/owned-file-refs.ts +1 -1
- package/packages/bundled-features/src/form-draft/entity.ts +3 -3
- package/packages/bundled-features/src/form-draft/feature.ts +4 -5
- package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +1 -1
- package/packages/bundled-features/src/form-draft/release-file-refs.ts +6 -6
- package/packages/bundled-features/src/form-draft/schemas.ts +3 -3
- package/packages/bundled-features/src/form-draft/web/constants.ts +0 -2
- package/packages/bundled-features/src/inbound-mail-foundation/aggregate-id.ts +19 -19
- package/packages/bundled-features/src/inbound-mail-foundation/connect-routes.ts +4 -3
- package/packages/bundled-features/src/inbound-mail-foundation/constants.ts +30 -33
- package/packages/bundled-features/src/inbound-mail-foundation/entities.ts +47 -48
- package/packages/bundled-features/src/inbound-mail-foundation/events.ts +54 -50
- package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +39 -39
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/account-state.ts +8 -8
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/connect-account.write.ts +25 -26
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/disconnect-account.write.ts +7 -7
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/ingest-message.write.ts +50 -51
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-accounts.query.ts +8 -8
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-messages.query.ts +10 -10
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/scope-visibility.ts +3 -4
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/update-account.write.ts +11 -11
- package/packages/bundled-features/src/inbound-mail-foundation/oauth-state.ts +16 -15
- package/packages/bundled-features/src/inbound-mail-foundation/projection.ts +31 -29
- package/packages/bundled-features/src/inbound-mail-foundation/provider-factory.ts +9 -9
- package/packages/bundled-features/src/inbound-mail-foundation/retention-sweep.ts +45 -41
- package/packages/bundled-features/src/inbound-mail-foundation/tenant-destroy-hook.ts +14 -16
- package/packages/bundled-features/src/inbound-mail-foundation/types.ts +66 -67
- package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor.ts +69 -68
- package/packages/bundled-features/src/inbound-provider-imap/credential-document.ts +13 -13
- package/packages/bundled-features/src/inbound-provider-imap/feature.ts +42 -40
- package/packages/bundled-features/src/inbound-provider-imap/imap-client.ts +20 -19
- package/packages/bundled-features/src/inbound-provider-inmemory/feature.ts +21 -21
- package/packages/bundled-features/src/jobs/db/queries/retention.ts +2 -2
- package/packages/bundled-features/src/jobs/db/queries/stale-run-sweep.ts +3 -3
- package/packages/bundled-features/src/jobs/events.ts +1 -1
- package/packages/bundled-features/src/jobs/feature.ts +6 -7
- package/packages/bundled-features/src/jobs/handlers/detail.query.ts +4 -4
- package/packages/bundled-features/src/jobs/handlers/list.query.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/projection-rebuild.job.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/reindex-entity.job.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/retry.write.ts +1 -1
- package/packages/bundled-features/src/jobs/job-instant.ts +1 -1
- package/packages/bundled-features/src/jobs/job-run-logger.ts +14 -15
- package/packages/bundled-features/src/jobs/job-run-table.ts +3 -3
- package/packages/bundled-features/src/jobs/screens.ts +1 -1
- package/packages/bundled-features/src/jobs/tenant-job-failure-table.ts +1 -1
- package/packages/bundled-features/src/jobs/tenant-job-run-table.ts +1 -1
- package/packages/bundled-features/src/ledger/entity.ts +5 -5
- package/packages/bundled-features/src/ledger/feature.ts +3 -3
- package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +3 -3
- package/packages/bundled-features/src/ledger/recurring.ts +12 -12
- package/packages/bundled-features/src/ledger/schemas.ts +1 -1
- package/packages/bundled-features/src/ledger/web/constants.ts +2 -2
- package/packages/bundled-features/src/ledger/web/index.ts +7 -7
- package/packages/bundled-features/src/legal-pages/feature.ts +40 -41
- package/packages/bundled-features/src/legal-pages/markdown.ts +3 -3
- package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +23 -24
- package/packages/bundled-features/src/legal-pages/web/index.ts +0 -2
- package/packages/bundled-features/src/mail-foundation/feature.ts +26 -27
- package/packages/bundled-features/src/mail-transport-inmemory/feature.ts +27 -28
- package/packages/bundled-features/src/mail-transport-smtp/feature.ts +20 -20
- package/packages/bundled-features/src/managed-pages/branding.ts +6 -6
- package/packages/bundled-features/src/managed-pages/feature.ts +62 -62
- package/packages/bundled-features/src/managed-pages/handlers/by-slug.query.ts +5 -6
- package/packages/bundled-features/src/managed-pages/handlers/by-tenant-published.query.ts +8 -8
- package/packages/bundled-features/src/managed-pages/handlers/set.write.ts +5 -7
- package/packages/bundled-features/src/managed-pages/screens/page-screens.ts +11 -11
- package/packages/bundled-features/src/managed-pages/seeding.ts +8 -8
- package/packages/bundled-features/src/managed-pages/table.ts +16 -15
- package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +6 -6
- package/packages/bundled-features/src/managed-pages/web/i18n.ts +1 -1
- package/packages/bundled-features/src/notes-history/entity.ts +4 -4
- package/packages/bundled-features/src/notes-history/feature.ts +2 -2
- package/packages/bundled-features/src/notes-history-user-data/hooks.ts +1 -1
- package/packages/bundled-features/src/page-render/layout.ts +9 -9
- package/packages/bundled-features/src/page-render/markdown.ts +11 -11
- package/packages/bundled-features/src/page-render/security-headers.ts +7 -6
- package/packages/bundled-features/src/personal-access-tokens/feature.ts +5 -5
- package/packages/bundled-features/src/personal-access-tokens/roles.ts +2 -2
- package/packages/bundled-features/src/readiness/handlers/status.query.ts +3 -3
- package/packages/bundled-features/src/renderer-foundation/api.ts +12 -13
- package/packages/bundled-features/src/renderer-foundation/constants.ts +2 -2
- package/packages/bundled-features/src/renderer-foundation/feature.ts +7 -7
- package/packages/bundled-features/src/renderer-foundation/types.ts +11 -12
- package/packages/bundled-features/src/secrets/feature.ts +9 -9
- package/packages/bundled-features/src/secrets/web/constants.ts +2 -2
- package/packages/bundled-features/src/seo/feature.ts +3 -3
- package/packages/bundled-features/src/sessions/constants.ts +1 -1
- package/packages/bundled-features/src/sessions/feature.ts +9 -9
- package/packages/bundled-features/src/sessions/handlers/revoke-all-for-user.write.ts +2 -2
- package/packages/bundled-features/src/sessions/handlers/revoke-all-others.write.ts +2 -2
- package/packages/bundled-features/src/sessions/handlers/revoke.write.ts +1 -1
- package/packages/bundled-features/src/sessions/schema/user-session.ts +4 -4
- package/packages/bundled-features/src/sessions/screens.ts +2 -2
- package/packages/bundled-features/src/sessions/session-callbacks.ts +2 -2
- package/packages/bundled-features/src/sessions/session-revoked-event.ts +2 -2
- package/packages/bundled-features/src/shared/assert-no-where-rule-in-ownership-write.ts +1 -1
- package/packages/bundled-features/src/shared/decrypt-stored-pii.ts +1 -1
- package/packages/bundled-features/src/shared/encrypt-for-direct-write.ts +1 -1
- package/packages/bundled-features/src/shared/map-with-concurrency.ts +5 -4
- package/packages/bundled-features/src/shared/parent-visibility.ts +2 -2
- package/packages/bundled-features/src/shared/password-hashing.ts +1 -1
- package/packages/bundled-features/src/shared/signup-handover.ts +1 -2
- package/packages/bundled-features/src/shared/single-use-token-store.ts +1 -1
- package/packages/bundled-features/src/subscription-mollie/constants.ts +15 -17
- package/packages/bundled-features/src/subscription-mollie/feature.ts +41 -42
- package/packages/bundled-features/src/subscription-mollie/index.ts +3 -3
- package/packages/bundled-features/src/subscription-mollie/plugin-methods.ts +17 -16
- package/packages/bundled-features/src/subscription-mollie/verify-webhook.ts +34 -34
- package/packages/bundled-features/src/subscription-stripe/constants.ts +4 -6
- package/packages/bundled-features/src/subscription-stripe/feature.ts +44 -43
- package/packages/bundled-features/src/subscription-stripe/index.ts +6 -6
- package/packages/bundled-features/src/subscription-stripe/plugin-methods.ts +22 -27
- package/packages/bundled-features/src/subscription-stripe/runtime.ts +2 -2
- package/packages/bundled-features/src/subscription-stripe/verify-webhook.ts +62 -64
- package/packages/bundled-features/src/tags/feature.ts +3 -3
- package/packages/bundled-features/src/tags/screens.ts +1 -1
- package/packages/bundled-features/src/template-resolver/api.ts +10 -10
- package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +5 -5
- package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/shared.ts +2 -2
- package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +3 -3
- package/packages/bundled-features/src/template-resolver/handlers/upsert-system.write.ts +3 -4
- package/packages/bundled-features/src/template-resolver/handlers/upsert-tenant.write.ts +4 -5
- package/packages/bundled-features/src/template-resolver/seeding.ts +4 -4
- package/packages/bundled-features/src/template-resolver/table.ts +13 -14
- package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +2 -2
- package/packages/bundled-features/src/tenant/feature.ts +7 -7
- package/packages/bundled-features/src/tenant/handlers/member-directory.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/members.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/memberships.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/team-list.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/tenant-directory.query.ts +1 -1
- package/packages/bundled-features/src/tenant/invitation-table.ts +37 -40
- package/packages/bundled-features/src/tenant/membership-table.ts +3 -3
- package/packages/bundled-features/src/tenant/schema/tenant.ts +7 -9
- package/packages/bundled-features/src/tenant/screens.ts +1 -1
- package/packages/bundled-features/src/tenant/seeding.ts +19 -18
- package/packages/bundled-features/src/tenant/testing.ts +5 -6
- package/packages/bundled-features/src/tenant/web/constants.ts +2 -2
- package/packages/bundled-features/src/tenant-handover/events.ts +5 -7
- package/packages/bundled-features/src/tenant-handover/feature.ts +1 -1
- package/packages/bundled-features/src/tenant-handover/grant.ts +1 -1
- package/packages/bundled-features/src/tenant-handover/handlers/claim.write.ts +1 -1
- package/packages/bundled-features/src/tenant-handover/move-entity-graph.ts +8 -9
- package/packages/bundled-features/src/tenant-handover/signup-handover-provider.ts +1 -2
- package/packages/bundled-features/src/tenant-handover/transfer-graph.ts +4 -5
- package/packages/bundled-features/src/tenant-lifecycle/boot-checks.ts +1 -1
- package/packages/bundled-features/src/tenant-lifecycle/feature.ts +1 -1
- package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +2 -2
- package/packages/bundled-features/src/tenant-lifecycle/stages.ts +1 -1
- package/packages/bundled-features/src/tenant-settings/constants.ts +1 -1
- package/packages/bundled-features/src/tenant-settings/tenant-defaults.ts +12 -5
- package/packages/bundled-features/src/tier-engine/aggregate-id.ts +15 -16
- package/packages/bundled-features/src/tier-engine/compose-app.ts +14 -14
- package/packages/bundled-features/src/tier-engine/entity.ts +18 -19
- package/packages/bundled-features/src/tier-engine/feature.ts +88 -87
- package/packages/bundled-features/src/tier-engine/handlers/active-tier.query.ts +6 -7
- package/packages/bundled-features/src/tier-engine/handlers/get-tenant-tier.query.ts +4 -4
- package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +8 -8
- package/packages/bundled-features/src/tier-engine/tier-resolver.ts +2 -2
- package/packages/bundled-features/src/tier-engine/trial.ts +13 -13
- package/packages/bundled-features/src/tier-engine/web/index.ts +4 -4
- package/packages/bundled-features/src/user/db/queries/stream-tenant-backfill.ts +8 -8
- package/packages/bundled-features/src/user/handlers/create.write.ts +4 -4
- package/packages/bundled-features/src/user/schema/user.ts +45 -44
- package/packages/bundled-features/src/user/seeding.ts +40 -40
- package/packages/bundled-features/src/user/testing.ts +3 -3
- package/packages/bundled-features/src/user-data-rights/audit-download.ts +27 -28
- package/packages/bundled-features/src/user-data-rights/boot-checks.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/deletion-token.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/feature.ts +112 -113
- package/packages/bundled-features/src/user-data-rights/handlers/cancel-deletion.write.ts +9 -9
- package/packages/bundled-features/src/user-data-rights/handlers/confirm-deletion-by-token.write.ts +8 -8
- package/packages/bundled-features/src/user-data-rights/handlers/download-by-job.query.ts +29 -30
- package/packages/bundled-features/src/user-data-rights/handlers/download-by-token.query.ts +40 -42
- package/packages/bundled-features/src/user-data-rights/handlers/export-status.query.ts +8 -9
- package/packages/bundled-features/src/user-data-rights/handlers/lift-restriction.write.ts +7 -8
- package/packages/bundled-features/src/user-data-rights/handlers/list-download-attempts.query.ts +2 -2
- package/packages/bundled-features/src/user-data-rights/handlers/my-audit-log.query.ts +4 -4
- package/packages/bundled-features/src/user-data-rights/handlers/request-deletion-by-email.write.ts +30 -29
- package/packages/bundled-features/src/user-data-rights/handlers/request-deletion.write.ts +15 -18
- package/packages/bundled-features/src/user-data-rights/handlers/request-export.write.ts +42 -41
- package/packages/bundled-features/src/user-data-rights/handlers/restrict-account.write.ts +22 -19
- package/packages/bundled-features/src/user-data-rights/handlers/run-forget-cleanup.write.ts +8 -8
- package/packages/bundled-features/src/user-data-rights/index.ts +8 -10
- package/packages/bundled-features/src/user-data-rights/lib/default-mailers.ts +3 -3
- package/packages/bundled-features/src/user-data-rights/lib/update-user-lifecycle.ts +24 -27
- package/packages/bundled-features/src/user-data-rights/run-export-jobs.ts +166 -276
- package/packages/bundled-features/src/user-data-rights/run-forget-cleanup.ts +85 -107
- package/packages/bundled-features/src/user-data-rights/run-user-export.ts +67 -69
- package/packages/bundled-features/src/user-data-rights/schema/download-attempt.ts +11 -11
- package/packages/bundled-features/src/user-data-rights/schema/download-token.ts +37 -41
- package/packages/bundled-features/src/user-data-rights/schema/export-job.ts +65 -67
- package/packages/bundled-features/src/user-data-rights/token-helpers.ts +21 -25
- package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +6 -6
- package/packages/bundled-features/src/user-data-rights/web/confirm-deletion-screen.tsx +6 -5
- package/packages/bundled-features/src/user-data-rights/web/constants.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/web/index.ts +5 -5
- package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +14 -13
- package/packages/bundled-features/src/user-data-rights/web/public-deletion-gate.tsx +13 -12
- package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +6 -6
- package/packages/bundled-features/src/user-data-rights/zip-path.ts +41 -40
- package/packages/bundled-features/src/user-data-rights-defaults/feature.ts +15 -15
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.ts +3 -5
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +45 -51
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/job-run.userdata-hook.ts +2 -2
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/notification-preference.userdata-hook.ts +1 -1
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/user-session.userdata-hook.ts +3 -3
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/user.userdata-hook.ts +32 -31
- package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +13 -13
- package/packages/bundled-features/src/user-profile/index.ts +3 -3
- package/packages/bundled-features/src/user-profile/web/client-plugin.ts +1 -1
- package/packages/bundled-features/src/user-profile/web/constants.ts +1 -1
- package/packages/bundled-features/src/user-profile/web/profile-screen.tsx +1 -1
- package/packages/bundled-features/src/workflow-runner/aggregate-id.ts +1 -1
- package/packages/bundled-features/src/workflow-runner/event-subscriber.ts +4 -5
- package/packages/bundled-features/src/workflow-runner/event-trigger.ts +4 -15
- package/packages/bundled-features/src/workflow-runner/feature.ts +2 -2
- package/packages/bundled-features/src/workflow-runner/handlers/resume-run.write.ts +4 -4
- package/packages/bundled-features/src/workflow-runner/pending-projection.ts +6 -7
- package/packages/bundled-features/src/workflow-runner/runner.ts +6 -6
- package/packages/bundled-features/src/workflow-runner/tables.ts +6 -6
- package/packages/bundled-features/src/workflow-runner/workflow-registry.ts +1 -1
|
@@ -24,13 +24,12 @@ import {
|
|
|
24
24
|
|
|
25
25
|
export { type LegalPagesBootCheckCtx, runLegalPagesBootCheck } from "./lib/boot-check.ts";
|
|
26
26
|
|
|
27
|
-
// QN
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
// wie bei jedem API-Endpunkt.
|
|
27
|
+
// QN constant as the documented public contract of the template-resolver
|
|
28
|
+
// feature. A magic string is intentional instead of a code import: cross-feature
|
|
29
|
+
// calls use only the stable public API (handler name + payload shape), not
|
|
30
|
+
// internal module references. If template-resolver's handler name changes, it is
|
|
31
|
+
// a semver-major change and must be synchronized in both features—the same risk
|
|
32
|
+
// as with any API endpoint.
|
|
34
33
|
const TEXT_BLOCK_BY_SLUG_QN = "template-resolver:query:by-slug";
|
|
35
34
|
|
|
36
35
|
// Return shape of bySlugQuery (template-resolver/handlers/by-slug.query.ts).
|
|
@@ -53,25 +52,25 @@ const PUBLIC_PAGE_CACHE = { kind: "revalidate", maxAgeSeconds: 60 } as const;
|
|
|
53
52
|
// additional pages (e.g. terms/AGB).
|
|
54
53
|
//
|
|
55
54
|
// Cross-Feature-Decoupling:
|
|
56
|
-
// • Routes
|
|
57
|
-
// `template-resolver:query:by-slug
|
|
58
|
-
// •
|
|
59
|
-
//
|
|
60
|
-
// •
|
|
61
|
-
//
|
|
55
|
+
// • Routes use app.fetch to "/api/query" with the QN string
|
|
56
|
+
// `template-resolver:query:by-slug`—no code import from template-resolver
|
|
57
|
+
// • The boot check uses ctx.templateResolver (via extraContext), symmetrically
|
|
58
|
+
// with the config/tenant pattern
|
|
59
|
+
// • The single type import (TemplateResolverApi) remains; type-only imports do
|
|
60
|
+
// not violate cross-feature coupling
|
|
62
61
|
//
|
|
63
|
-
//
|
|
64
|
-
// • App
|
|
65
|
-
//
|
|
66
|
-
// • anonymousAccess: { defaultTenantId: SYSTEM_TENANT_ID }
|
|
67
|
-
//
|
|
62
|
+
// Production requirements:
|
|
63
|
+
// • App bootstrap must set extraContext: { templateResolver: createTemplateResolverApi(db,
|
|
64
|
+
// registry) } —otherwise the boot check throws at startup
|
|
65
|
+
// • anonymousAccess: { defaultTenantId: SYSTEM_TENANT_ID }—otherwise
|
|
66
|
+
// the routes respond with 503
|
|
68
67
|
export type LegalPagesWrapLayout = PublicPageWrapLayout;
|
|
69
68
|
|
|
70
69
|
export type LegalPagesOptions = {
|
|
71
|
-
/** Custom
|
|
72
|
-
* HTML
|
|
73
|
-
*
|
|
74
|
-
*
|
|
70
|
+
/** Custom layout wrapper for the /legal/* routes. Default: minimal
|
|
71
|
+
* HTML skeleton from markdown.ts (`wrapInLayout`). Apps that want to place
|
|
72
|
+
* their own marketing layout (header/footer/theme) around the legal body
|
|
73
|
+
* can provide their render function here. */
|
|
75
74
|
readonly wrapLayout?: LegalPagesWrapLayout;
|
|
76
75
|
/** Public HTML routes to register. Default: LEGAL_ROUTES (DACH: DE+EN
|
|
77
76
|
* imprint/privacy). Non-DACH apps (other default language, additional
|
|
@@ -140,18 +139,18 @@ export function createLegalPagesFeature(opts: LegalPagesOptions = {}): FeatureDe
|
|
|
140
139
|
// Public pages backed by a DB query: bound the per-IP read rate.
|
|
141
140
|
rateLimit: { per: "ip+handler", limit: 60, windowSeconds: 60 },
|
|
142
141
|
handler: async (c, { systemQuery }) => {
|
|
143
|
-
//
|
|
144
|
-
//
|
|
145
|
-
// legal-pages
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
//
|
|
142
|
+
// Architecture: 1 app = X tenants = 1 imprint. Regardless of which
|
|
143
|
+
// subdomain the visitor uses (apex, admin.*, tenant-x.*),
|
|
144
|
+
// legal-pages ALWAYS serves the SYSTEM_TENANT texts. systemQuery
|
|
145
|
+
// enforces SYSTEM_TENANT_ID in-process (no X-Tenant-Header trick
|
|
146
|
+
// through app.fetch—the host-based anonymousAccess resolver would
|
|
147
|
+
// see that as a client override and correctly reject it with
|
|
148
|
+
// resolverTrust: "authoritative").
|
|
150
149
|
let data: TextBlockQueryResult;
|
|
151
150
|
try {
|
|
152
151
|
// @cast-boundary engine-payload — dispatcher.query returnt
|
|
153
|
-
// unknown;
|
|
154
|
-
// (
|
|
152
|
+
// unknown; the shape is trusted because of bySlugQuery's handler return type
|
|
153
|
+
// (see template-resolver/handlers/by-slug.query.ts).
|
|
155
154
|
data = (await systemQuery(
|
|
156
155
|
TEXT_BLOCK_BY_SLUG_QN,
|
|
157
156
|
{ slug: route.slug, locale: route.lang },
|
|
@@ -178,8 +177,8 @@ export function createLegalPagesFeature(opts: LegalPagesOptions = {}): FeatureDe
|
|
|
178
177
|
String(data.modifiedAt ?? ""),
|
|
179
178
|
]);
|
|
180
179
|
const extra = { "content-type": "text/html; charset=utf-8" };
|
|
181
|
-
// 304 (
|
|
182
|
-
//
|
|
180
|
+
// Both 304 (unchanged revision) and HEAD skip Markdown rendering—the body
|
|
181
|
+
// would be discarded anyway.
|
|
183
182
|
if (
|
|
184
183
|
etagMatches(c.req.raw.headers.get("if-none-match"), etag) ||
|
|
185
184
|
c.req.method === "HEAD"
|
|
@@ -228,21 +227,21 @@ export function createLegalPagesFeature(opts: LegalPagesOptions = {}): FeatureDe
|
|
|
228
227
|
});
|
|
229
228
|
}
|
|
230
229
|
|
|
231
|
-
// Boot
|
|
232
|
-
//
|
|
233
|
-
//
|
|
230
|
+
// Boot check via ctx.templateResolver (extraContext pattern, symmetrical
|
|
231
|
+
// with requireConfigResolver in config). App bootstrap must wire
|
|
232
|
+
// templateResolver; the helper gives a clear wiring hint if it is missing.
|
|
234
233
|
//
|
|
235
|
-
//
|
|
236
|
-
//
|
|
237
|
-
// Pattern: thin job
|
|
238
|
-
//
|
|
234
|
+
// The body is extracted as the named function (`runLegalPagesBootCheck`) so
|
|
235
|
+
// the logic can be unit-tested directly instead of only indirectly through
|
|
236
|
+
// routes. Pattern: a thin job shell calls a testable function, avoiding
|
|
237
|
+
// coupling tests to the JobRunner.
|
|
239
238
|
r.job(
|
|
240
239
|
"legal-pages-boot-check",
|
|
241
240
|
{
|
|
242
241
|
trigger: { manual: true },
|
|
243
242
|
// bootGate, not runOnBoot: only an inline gate can actually abort the
|
|
244
243
|
// boot. runOnBoot merely enqueues, so a missing imprint would fail a
|
|
245
|
-
// queue job while the pod goes ready anyway
|
|
244
|
+
// queue job while the pod goes ready anyway.
|
|
246
245
|
bootGate: true,
|
|
247
246
|
runIn: "api",
|
|
248
247
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
// Re-export
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// Re-export from the shared page-rendering core (managed pages use
|
|
2
|
+
// the same hardened renderer and default layout). Keep these names stable
|
|
3
|
+
// for legal-pages' public API (index.ts exports renderMarkdownToHtml and
|
|
4
4
|
// wrapInLayout).
|
|
5
5
|
|
|
6
6
|
export { wrapInLayout } from "../page-render/layout.ts";
|
|
@@ -1,26 +1,25 @@
|
|
|
1
|
-
// Client
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
1
|
+
// Client feature factory for the legal-pages visual tree. Provides static
|
|
2
|
+
// tree nodes for the DACH compliance blocks (imprint, privacy in de/en).
|
|
3
|
+
// Each node links to text-content's edit action — pure cross-feature
|
|
4
|
+
// linking, with no own state or fetch required.
|
|
5
5
|
//
|
|
6
|
-
// **Static
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
6
|
+
// **Static instead of fetch**: legal-pages knows out of the box which blocks
|
|
7
|
+
// exist (LEGAL_REQUIRED_BLOCKS + LEGAL_OPTIONAL_BLOCKS from constants).
|
|
8
|
+
// Unlike text-content's provider (which fetches all tenant slugs), this list
|
|
9
|
+
// is known at build time — no /api/query round trip is needed.
|
|
10
10
|
//
|
|
11
|
-
// **Content
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
// fehlende Pflicht-Blocks.
|
|
11
|
+
// **Content state unknown**: no state marker is set; all nodes appear
|
|
12
|
+
// "filled" (default). A by-slug query could determine whether a block
|
|
13
|
+
// actually has a body and mark it as "stub" when empty (a provider-author hint
|
|
14
|
+
// that the block exists but must be filled). Currently, legal-pages's boot
|
|
15
|
+
// check is the primary guard for missing required blocks.
|
|
17
16
|
|
|
18
17
|
import type { TreeChildrenSubscribe, TreeNode } from "@cosmicdrift/kumiko-framework/engine";
|
|
19
18
|
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
20
19
|
import { LEGAL_OPTIONAL_BLOCKS, LEGAL_REQUIRED_BLOCKS } from "./constants.ts";
|
|
21
20
|
|
|
22
21
|
const treeProvider: TreeChildrenSubscribe = () => (emit) => {
|
|
23
|
-
//
|
|
22
|
+
// Slug-first nesting:
|
|
24
23
|
// 📁 Legal
|
|
25
24
|
// 📁 imprint
|
|
26
25
|
// de
|
|
@@ -29,10 +28,10 @@ const treeProvider: TreeChildrenSubscribe = () => (emit) => {
|
|
|
29
28
|
// de
|
|
30
29
|
// en
|
|
31
30
|
//
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
// Sub-
|
|
35
|
-
//
|
|
31
|
+
// The slug is the translation anchor — users maintain the DE+EN versions
|
|
32
|
+
// of the same content together instead of grouping them by language.
|
|
33
|
+
// Sub-items are language-only leaves; label = language, and target points
|
|
34
|
+
// to template-resolver:edit with slug+locale.
|
|
36
35
|
|
|
37
36
|
// Group all blocks by slug, collect set of langs per slug.
|
|
38
37
|
const bySlug = new Map<string, string[]>();
|
|
@@ -62,15 +61,15 @@ const treeProvider: TreeChildrenSubscribe = () => (emit) => {
|
|
|
62
61
|
});
|
|
63
62
|
}
|
|
64
63
|
|
|
65
|
-
//
|
|
66
|
-
//
|
|
64
|
+
// The app-side r.nav node IS the "Legal" container → the provider
|
|
65
|
+
// emits the slug folders directly beneath it.
|
|
67
66
|
emit(slugFolders);
|
|
68
67
|
return () => {};
|
|
69
68
|
};
|
|
70
69
|
|
|
71
|
-
// `navId` = QN
|
|
72
|
-
//
|
|
73
|
-
//
|
|
70
|
+
// `navId` = the QN of the r.nav({ provider: true }) node registered by the app.
|
|
71
|
+
// Static (no fetch, no entities) → no SSE refresh is needed. Without navId:
|
|
72
|
+
// no sidebar node (server-only consumers expose nothing).
|
|
74
73
|
export function legalPagesClient(opts?: { readonly navId?: string }): ClientFeatureDefinition {
|
|
75
74
|
const navId = opts?.navId;
|
|
76
75
|
return {
|
|
@@ -2,34 +2,33 @@
|
|
|
2
2
|
//
|
|
3
3
|
// mail-foundation as a Kumiko bundled feature.
|
|
4
4
|
//
|
|
5
|
-
// **
|
|
6
|
-
// 1. **Plugin
|
|
7
|
-
// ("mailTransport", ...)`. Provider
|
|
8
|
-
// mail-transport-brevo-api, ...)
|
|
9
|
-
// 2. **Tenant
|
|
10
|
-
//
|
|
11
|
-
// 3. **createTransportForTenant(ctx, tenantId)**
|
|
12
|
-
//
|
|
13
|
-
// aufruft.
|
|
5
|
+
// **What this feature provides:**
|
|
6
|
+
// 1. **Plugin API** for mail transport providers via `r.extendsRegistrar
|
|
7
|
+
// ("mailTransport", ...)`. Provider features (mail-transport-smtp,
|
|
8
|
+
// mail-transport-brevo-api, ...) register by name.
|
|
9
|
+
// 2. **Tenant config key** `provider`: a selection value that determines at
|
|
10
|
+
// runtime which registered plugin is used.
|
|
11
|
+
// 3. **createTransportForTenant(ctx, tenantId)** factory that looks up the
|
|
12
|
+
// selected plugin in the registry and calls its `build` method.
|
|
14
13
|
//
|
|
15
|
-
// **
|
|
16
|
-
//
|
|
17
|
-
// -
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
// -
|
|
22
|
-
//
|
|
23
|
-
//
|
|
14
|
+
// **What this foundation no longer does (compared with the first
|
|
15
|
+
// iteration):**
|
|
16
|
+
// - No SMTP/Brevo/Postmark-specific config keys in mail-foundation.
|
|
17
|
+
// Provider-specific config (host/port/from/authUser for SMTP,
|
|
18
|
+
// apiUrl/accountId for Brevo, etc.) lives in the respective provider
|
|
19
|
+
// plugin feature.
|
|
20
|
+
// - No direct import of `createSmtpTransport`. The foundation knows only
|
|
21
|
+
// the `EmailTransport` interface (type import, no runtime coupling), not
|
|
22
|
+
// the concrete implementation.
|
|
24
23
|
//
|
|
25
|
-
// **Pattern
|
|
26
|
-
// delivery
|
|
27
|
-
// channel-email
|
|
28
|
-
// "email", {...})`.
|
|
24
|
+
// **Pattern precedent:** identical to `delivery` + `channel-email`. The
|
|
25
|
+
// delivery feature declares `r.extendsRegistrar("deliveryChannel")`, and
|
|
26
|
+
// channel-email registers via `r.useExtension("deliveryChannel",
|
|
27
|
+
// "email", {...})`. The foundation ↔ provider separation is the same.
|
|
29
28
|
//
|
|
30
|
-
// **Standalone:**
|
|
31
|
-
// `channel-email` (
|
|
32
|
-
//
|
|
29
|
+
// **Standalone:** The foundation can be used without tier-engine. Existing
|
|
30
|
+
// `channel-email` (app-wide mail sender via delivery) remains unchanged—an
|
|
31
|
+
// additive feature.
|
|
33
32
|
|
|
34
33
|
import {
|
|
35
34
|
type EmailTransport,
|
|
@@ -97,8 +96,8 @@ export type MailTransportContext = {
|
|
|
97
96
|
* an EmailTransport. Per-call construction so a tenant editing config
|
|
98
97
|
* sees the change on the next mail.
|
|
99
98
|
*
|
|
100
|
-
* **Plugin-
|
|
101
|
-
*
|
|
99
|
+
* **Plugin-author warning:** `ctx` is EXPLICITLY a MailTransportContext,
|
|
100
|
+
* not a full HandlerContext (see the MailTransportContext doc).
|
|
102
101
|
*/
|
|
103
102
|
export type MailTransportPlugin = {
|
|
104
103
|
readonly build: (ctx: MailTransportContext, tenantId: string) => Promise<EmailTransport>;
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
// kumiko-feature-version: 1
|
|
2
2
|
//
|
|
3
|
-
// mail-transport-inmemory — In-
|
|
4
|
-
// foundation
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
3
|
+
// mail-transport-inmemory — In-memory email transport for the mail-
|
|
4
|
+
// foundation plugin API. Collects emails in a per-tenant buffer
|
|
5
|
+
// instead of sending them through a real SMTP server. Designed for
|
|
6
|
+
// demos, sample apps, and tests that should run without Mailpit,
|
|
7
|
+
// Mailcrab, or real SMTP.
|
|
8
8
|
//
|
|
9
|
-
// **
|
|
10
|
-
// 1. Plugin
|
|
11
|
-
// "inmemory", { build })`. Tenants
|
|
12
|
-
// "mail-foundation:config:provider"
|
|
13
|
-
//
|
|
14
|
-
// 2. **
|
|
15
|
-
//
|
|
16
|
-
//
|
|
9
|
+
// **What this feature provides:**
|
|
10
|
+
// 1. Plugin registration via `r.useExtension("mailTransport",
|
|
11
|
+
// "inmemory", { build })`. Tenants set
|
|
12
|
+
// "mail-foundation:config:provider" to "inmemory" and receive
|
|
13
|
+
// the buffered variant.
|
|
14
|
+
// 2. **Per-tenant inbox.** Each tenant has its own mail buffer
|
|
15
|
+
// (Map<tenantId, EmailMessage[]>). Demo apps can read the inbox
|
|
16
|
+
// via `getInbox(tenantId)` and render a UI.
|
|
17
17
|
//
|
|
18
|
-
// **Pattern
|
|
18
|
+
// **Pattern reference:** mirrors mail-transport-smtp.
|
|
19
19
|
//
|
|
20
|
-
// **
|
|
21
|
-
//
|
|
22
|
-
//
|
|
20
|
+
// **NOT for production.** The buffer is in process memory and is lost
|
|
21
|
+
// on restart. Cap counters and the audit trail remain correct because
|
|
22
|
+
// they are tied to the event store, not the transport.
|
|
23
23
|
|
|
24
24
|
import type {
|
|
25
25
|
EmailMessage,
|
|
@@ -39,9 +39,9 @@ const FEATURE_NAME = "mail-transport-inmemory";
|
|
|
39
39
|
// Per-tenant in-memory buffer
|
|
40
40
|
// =============================================================================
|
|
41
41
|
//
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
//
|
|
42
|
+
// The module-level Map is needed because the plugin build call creates
|
|
43
|
+
// a new transport wrapper for each send, while all wrappers for the
|
|
44
|
+
// same tenant must point to the same buffer. Map<tenantId,
|
|
45
45
|
// InMemoryTransport>.
|
|
46
46
|
|
|
47
47
|
const transportsByTenant = new Map<string, ReturnType<typeof createInMemoryTransport>>();
|
|
@@ -56,16 +56,16 @@ function getOrCreateTransportForTenant(tenantId: string) {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
|
-
* Demo/
|
|
60
|
-
*
|
|
59
|
+
* Demo/test helper: reads the emails "sent" for a tenant. A query
|
|
60
|
+
* handler in the sample app uses this to render the inbox UI.
|
|
61
61
|
*/
|
|
62
62
|
export function getInbox(tenantId: string): readonly EmailMessage[] {
|
|
63
63
|
return transportsByTenant.get(tenantId)?.sent ?? [];
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
/**
|
|
67
|
-
* Demo/
|
|
68
|
-
*
|
|
67
|
+
* Demo/test helper: clears a tenant's buffer, for example between
|
|
68
|
+
* test scenarios.
|
|
69
69
|
*/
|
|
70
70
|
export function clearInbox(tenantId: string): void {
|
|
71
71
|
const t = transportsByTenant.get(tenantId);
|
|
@@ -82,10 +82,9 @@ export function createMailTransportInMemoryFeature() {
|
|
|
82
82
|
r.describe(
|
|
83
83
|
'Registers an in-process `"inmemory"` provider for `mail-foundation` that buffers sent mails per tenant instead of contacting an SMTP server. Use `getInbox(tenantId)` and `clearInbox(tenantId)` in demo apps and tests; not for production (buffer is process-memory, lost on restart).',
|
|
84
84
|
);
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
// extension-point "mailTransport" definiert.
|
|
85
|
+
// No `config` or `secrets` requirement: the in-memory transport has
|
|
86
|
+
// no configuration and no secret. The only hard requirement is
|
|
87
|
+
// mail-foundation, which defines the "mailTransport" extension point.
|
|
89
88
|
r.requires({ features: ["mail-foundation"] });
|
|
90
89
|
|
|
91
90
|
const plugin: MailTransportPlugin = {
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
// kumiko-feature-version: 1
|
|
2
2
|
//
|
|
3
|
-
// mail-transport-smtp — concrete SMTP
|
|
4
|
-
// mail-foundation plugin
|
|
3
|
+
// mail-transport-smtp — concrete SMTP implementation for the
|
|
4
|
+
// mail-foundation plugin API.
|
|
5
5
|
//
|
|
6
|
-
// **
|
|
7
|
-
// 1. Provider-
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// API
|
|
11
|
-
// 2. **Plugin
|
|
12
|
-
// "smtp", { build })`.
|
|
13
|
-
//
|
|
14
|
-
// 3. `build(ctx, tenantId)`
|
|
15
|
-
// `createSmtpTransport()`
|
|
16
|
-
//
|
|
17
|
-
//
|
|
6
|
+
// **What this feature provides:**
|
|
7
|
+
// 1. Provider-specific tenant config (host/port/secure/from/authUser)
|
|
8
|
+
// and secret (smtp.password). Self-contained — mail-foundation does not
|
|
9
|
+
// know these keys; when an app owner switches between SMTP and the Brevo
|
|
10
|
+
// API, each plugin has its own independent config sets.
|
|
11
|
+
// 2. **Plugin registration** via `r.useExtension("mailTransport",
|
|
12
|
+
// "smtp", { build })`. At boot, mail-foundation's factory lookup maps
|
|
13
|
+
// the name "smtp" to the build function.
|
|
14
|
+
// 3. `build(ctx, tenantId)` reads the config keys and secret, then calls
|
|
15
|
+
// `createSmtpTransport()` from channel-email. This is the plugin's
|
|
16
|
+
// ONLY cross-feature import, deliberately kept local so
|
|
17
|
+
// mail-foundation remains provider-independent.
|
|
18
18
|
//
|
|
19
|
-
// **Pattern
|
|
20
|
-
// `delivery`.
|
|
21
|
-
// mail-foundation's "mailTransport"
|
|
19
|
+
// **Pattern reference:** mirrors `channel-email` registering itself for
|
|
20
|
+
// `delivery`. This feature is analogous: it registers for
|
|
21
|
+
// mail-foundation's "mailTransport" extension point.
|
|
22
22
|
//
|
|
23
|
-
// **Boot
|
|
23
|
+
// **Boot dependencies:**
|
|
24
24
|
// - `mail-foundation` — extension-point owner
|
|
25
|
-
// - `config` —
|
|
26
|
-
// - `secrets` —
|
|
25
|
+
// - `config` — for the tenant config keys
|
|
26
|
+
// - `secrets` — for the encrypted SMTP password
|
|
27
27
|
|
|
28
28
|
import type { lookup } from "node:dns/promises";
|
|
29
29
|
import {
|
|
@@ -20,13 +20,13 @@ import { type BrandingTokens, EMPTY_BRANDING } from "../page-render/index.ts";
|
|
|
20
20
|
// `write: access.withSystem(access.admin)` — tenant admins self-service via
|
|
21
21
|
// configEdit AND the system actor (ctx.systemWriteAs) may provision/migrate
|
|
22
22
|
// these keys. The scope default (`access.admin`, admin-only) has no system
|
|
23
|
-
// path, so a continuity migration could not set them
|
|
24
|
-
//
|
|
23
|
+
// path, so a continuity migration could not set them. Adding SYSTEM_ROLE
|
|
24
|
+
// keeps the keys human-writable (checkWriteAccess collapses to
|
|
25
25
|
// system-only only when system is the SOLE writer), so self-service survives.
|
|
26
26
|
//
|
|
27
|
-
// CONTINUITY (
|
|
27
|
+
// CONTINUITY (Prod trap): these keys land under
|
|
28
28
|
// `managed-pages:config:branding-*`, NOT the live `publicstatus:config:
|
|
29
|
-
// branding-*`. The publicstatus consumer
|
|
29
|
+
// branding-*`. The publicstatus consumer MUST migrate the existing
|
|
30
30
|
// read_config_values rows to the new QNs per tenant BEFORE switching the read
|
|
31
31
|
// path, or every tenant resets to defaults on deploy. The migration is
|
|
32
32
|
// deliberately NOT built here — the source QNs belong to the consumer app.
|
|
@@ -37,7 +37,7 @@ import { type BrandingTokens, EMPTY_BRANDING } from "../page-render/index.ts";
|
|
|
37
37
|
// also renders. text keys carry an explicit length cap too — `validateType`
|
|
38
38
|
// only checks the JS type, and the configEdit `maxLength` is client-side, so a
|
|
39
39
|
// direct config:write:set would otherwise be unbounded (the page body is
|
|
40
|
-
// likewise capped
|
|
40
|
+
// likewise capped).
|
|
41
41
|
const HEX_PATTERN = {
|
|
42
42
|
regex: "^$|^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
|
|
43
43
|
} as const;
|
|
@@ -67,7 +67,7 @@ export const MANAGED_PAGES_CSS_FEATURE = "managed-pages-css";
|
|
|
67
67
|
// site-url`. BRANDING_QN below is the single source those QN strings are read
|
|
68
68
|
// from (configEdit screen + render read); the integration test pins write-
|
|
69
69
|
// target == read-source end-to-end.
|
|
70
|
-
// Admin self-service + system provisioning
|
|
70
|
+
// Admin self-service + system provisioning.
|
|
71
71
|
const BRANDING_WRITE = access.withSystem(access.admin);
|
|
72
72
|
|
|
73
73
|
export const BRANDING_KEYS = {
|