@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
|
@@ -12,8 +12,8 @@ import { isPrincipalRowBlocked, type UserStatus, userTable } from "../user/index
|
|
|
12
12
|
// time would keep a since-revoked admin role for the token's whole (months-long)
|
|
13
13
|
// life. Returns null when the user has no membership in that tenant: removed
|
|
14
14
|
// from the tenant → the PAT stops authenticating there. Also null when the
|
|
15
|
-
// user's lifecycle status blocks them
|
|
16
|
-
//
|
|
15
|
+
// user's lifecycle status blocks them — collapsed onto the same "no roles"
|
|
16
|
+
// outcome as missing-membership so a blocked user's PAT
|
|
17
17
|
// gets an identical 401 to an unknown token (no status oracle).
|
|
18
18
|
export async function resolvePatRoles(
|
|
19
19
|
db: DbConnection,
|
|
@@ -22,9 +22,9 @@ export const statusQuery = defineQueryHandler({
|
|
|
22
22
|
// One gate for both halves: required keys/secrets of provider-features
|
|
23
23
|
// count only while their provider is the selected one (r.extensionSelector).
|
|
24
24
|
const gate = await buildProviderSelectionGate(ctx, ReadinessQueries.status, query.user, ctx.db);
|
|
25
|
-
// skipAccessFilter:
|
|
26
|
-
// Handler
|
|
27
|
-
//
|
|
25
|
+
// skipAccessFilter: the verdict must count ALL required keys—the
|
|
26
|
+
// Handler itself is TenantAdmin-gated; the per-key filter would falsely
|
|
27
|
+
// report ready:true for SystemAdmin-gated keys.
|
|
28
28
|
const missingConfig = await collectMissingRequiredConfig(
|
|
29
29
|
ctx,
|
|
30
30
|
ReadinessQueries.status,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
// RendererFoundationApi —
|
|
2
|
-
// (delivery, mail
|
|
3
|
-
//
|
|
4
|
-
//
|
|
1
|
+
// RendererFoundationApi — cross-feature interface. Consumers
|
|
2
|
+
// (delivery, mail sender, Solon NKA PDF generator) retrieve the appropriate
|
|
3
|
+
// plugin for each render call via `createRendererForTenant`.
|
|
4
|
+
// The pattern mirrors ai-foundation's `createLLMProviderForTenant`.
|
|
5
5
|
|
|
6
6
|
import type { TenantId } from "@cosmicdrift/kumiko-framework/engine";
|
|
7
7
|
import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
|
|
@@ -32,10 +32,9 @@ export type RendererFoundationApi = {
|
|
|
32
32
|
}) => RendererPlugin;
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
// Result in extraContext.
|
|
35
|
+
// The plugin pool is built at boot time from extension usages.
|
|
36
|
+
// The registry provides all registered plugins. The foundation feature builds
|
|
37
|
+
// the pool via `collectRendererPlugins(registry)` and puts it in extraContext.
|
|
39
38
|
export function createRendererFoundationApi(
|
|
40
39
|
plugins: ReadonlyArray<RendererPlugin>,
|
|
41
40
|
tenantConfigLookup: (tenantId: TenantId) => Record<string, string> | null = () => null,
|
|
@@ -50,7 +49,7 @@ export function createRendererFoundationApi(
|
|
|
50
49
|
if (tenantPluginName) {
|
|
51
50
|
const plugin = plugins.find((p) => p.name === tenantPluginName && p.kinds.includes(kind));
|
|
52
51
|
if (plugin) return plugin;
|
|
53
|
-
//
|
|
52
|
+
// The tenant configuration points to an unregistered plugin; fall through to the default.
|
|
54
53
|
}
|
|
55
54
|
|
|
56
55
|
// 2. Default-Plugin
|
|
@@ -60,7 +59,7 @@ export function createRendererFoundationApi(
|
|
|
60
59
|
if (plugin) return plugin;
|
|
61
60
|
}
|
|
62
61
|
|
|
63
|
-
// 3.
|
|
62
|
+
// 3. First plugin in the pool that serves the kind
|
|
64
63
|
const first = byKind.get(kind)?.[0];
|
|
65
64
|
if (first) return first;
|
|
66
65
|
|
|
@@ -85,14 +84,14 @@ function indexByKind(plugins: ReadonlyArray<RendererPlugin>): Map<RenderKind, Re
|
|
|
85
84
|
return map;
|
|
86
85
|
}
|
|
87
86
|
|
|
88
|
-
// Single
|
|
89
|
-
//
|
|
87
|
+
// Single source of truth for handlers that require renderer-foundation.
|
|
88
|
+
// The pattern mirrors requireTemplateResolver + requireTextContent.
|
|
90
89
|
export function requireRendererFoundation(
|
|
91
90
|
ctx: { readonly rendererFoundation?: RendererFoundationApi } | object,
|
|
92
91
|
callerName: string,
|
|
93
92
|
): RendererFoundationApi {
|
|
94
93
|
// @cast-boundary engine-bridge — rendererFoundation kommt per extraContext
|
|
95
|
-
//
|
|
94
|
+
// from the app bootstrap.
|
|
96
95
|
const api = (ctx as { rendererFoundation?: RendererFoundationApi }).rendererFoundation;
|
|
97
96
|
if (!api) {
|
|
98
97
|
throw new InternalError({
|
|
@@ -14,8 +14,8 @@ export {
|
|
|
14
14
|
type RenderKind,
|
|
15
15
|
} from "../template-resolver/index.ts";
|
|
16
16
|
|
|
17
|
-
// Standard
|
|
18
|
-
//
|
|
17
|
+
// Standard default plugin for each kind when the tenant has not set explicit configuration.
|
|
18
|
+
// App bootstrap can override this through TenantConfigKey.
|
|
19
19
|
export const DEFAULT_PLUGIN_BY_KIND: Readonly<Record<RenderKindLocal, string>> = {
|
|
20
20
|
mail: "mail-html",
|
|
21
21
|
"document-pdf": "puppeteer",
|
|
@@ -24,9 +24,9 @@ export function createRendererFoundationFeature() {
|
|
|
24
24
|
|
|
25
25
|
r.extendsRegistrar(RENDERER_EXTENSION, {
|
|
26
26
|
onRegister: () => {
|
|
27
|
-
// Plugin
|
|
28
|
-
// options (kinds, render
|
|
29
|
-
//
|
|
27
|
+
// Plugin conformance check could go here: validate the shape of
|
|
28
|
+
// options (kinds, render function present). No shape check currently —
|
|
29
|
+
// the caller's TypeScript type safety applies.
|
|
30
30
|
},
|
|
31
31
|
});
|
|
32
32
|
|
|
@@ -34,11 +34,11 @@ export function createRendererFoundationFeature() {
|
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
37
|
+
// Build the plugin pool at boot time. App bootstrap calls this after
|
|
38
|
+
// feature registration, builds the pool, and passes it to handlers via
|
|
39
|
+
// extraContext.
|
|
40
40
|
//
|
|
41
|
-
//
|
|
41
|
+
// Symmetric to collectChannels / collectRenderers in delivery-service.
|
|
42
42
|
export function collectRendererPlugins(registry: Registry): RendererPlugin[] {
|
|
43
43
|
const usages = registry.getExtensionUsages(RENDERER_EXTENSION);
|
|
44
44
|
return usages.map((usage) => {
|
|
@@ -10,9 +10,9 @@ import type {
|
|
|
10
10
|
} from "../template-resolver/index.ts";
|
|
11
11
|
import { type ContentFormat, RENDERER_EXTENSION, type RenderKind } from "./constants.ts";
|
|
12
12
|
|
|
13
|
-
// RenderRequest —
|
|
14
|
-
// (renderer-foundation
|
|
15
|
-
//
|
|
13
|
+
// RenderRequest — plugins receive this. The caller selects resource mode
|
|
14
|
+
// (renderer-foundation API) by kind or explicitly. Plugins do not decide this;
|
|
15
|
+
// they receive an already-resolved form.
|
|
16
16
|
export type RenderRequest =
|
|
17
17
|
| { kind: "mail"; payload: MailPayload }
|
|
18
18
|
| { kind: "document-pdf"; payload: DocumentPdfPayload; options?: PdfOptions }
|
|
@@ -157,13 +157,12 @@ export type ImageOptions = {
|
|
|
157
157
|
readonly quality?: number;
|
|
158
158
|
};
|
|
159
159
|
|
|
160
|
-
// RendererContext —
|
|
161
|
-
// + ChannelContext). Plugins
|
|
162
|
-
//
|
|
163
|
-
//
|
|
164
|
-
// Function-Factories statt App-ctx zu casten.
|
|
160
|
+
// RendererContext — a narrow surface (Kumiko-style, matching FileProviderContext
|
|
161
|
+
// + ChannelContext). Plugins that need services obtain templateResolver/etc. via
|
|
162
|
+
// direct bundle imports + ctx.db (cross-feature public API). No extraContext
|
|
163
|
+
// pass-through: plugins import pure function factories instead of casting App-ctx.
|
|
165
164
|
//
|
|
166
|
-
// **
|
|
165
|
+
// **Example renderer-mail-html:**
|
|
167
166
|
// import { createTemplateResolverApi } from "@cosmicdrift/kumiko-bundled-features/template-resolver";
|
|
168
167
|
// const tplApi = createTemplateResolverApi(ctx.db, ctx.registry);
|
|
169
168
|
// const layout = await tplApi.resolveTemplate({ tenantId: ctx.tenantId, slug, kind });
|
|
@@ -178,9 +177,9 @@ export type RendererContext = {
|
|
|
178
177
|
readonly filesForTenant?: (tenantId: string) => FileContext | undefined;
|
|
179
178
|
};
|
|
180
179
|
|
|
181
|
-
// RendererPlugin
|
|
182
|
-
// renderer-puppeteer-client).
|
|
183
|
-
//
|
|
180
|
+
// RendererPlugin contract — per plugin (renderer-mail-html,
|
|
181
|
+
// renderer-puppeteer-client). The plugin declares which kinds it can handle;
|
|
182
|
+
// the Foundation resolver selects one based on tenant config + kind.
|
|
184
183
|
//
|
|
185
184
|
// Plugin invariants:
|
|
186
185
|
// - `kinds` has at least one entry, otherwise the plugin is never picked.
|
|
@@ -71,15 +71,15 @@ export const JOIN_REQUEST_TRANSACTION_REASON =
|
|
|
71
71
|
"the secret write runs on the request transaction so a failing batch rolls it back together with the config writes";
|
|
72
72
|
|
|
73
73
|
// AppContext carries ctx.secrets via extraContext. requireSecretsContext
|
|
74
|
-
// wraps that raw context so every `.get(...)` call
|
|
75
|
-
// current user
|
|
76
|
-
//
|
|
74
|
+
// wraps that raw context so every `.get(...)` call automatically includes
|
|
75
|
+
// the current user and handler as audit metadata, preventing feature code
|
|
76
|
+
// from silently bypassing read auditing.
|
|
77
77
|
//
|
|
78
|
-
//
|
|
79
|
-
// FileProviderContext
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
//
|
|
78
|
+
// The context shape stays minimal: HandlerContext paths (Set/Delete handlers)
|
|
79
|
+
// and FileProviderContext paths (the S3 plugin in the worker) provide the same
|
|
80
|
+
// two fields, so importing the full HandlerContext is unnecessary.
|
|
81
|
+
// Handler contexts carry the caller as ctx.user; provider contexts set
|
|
82
|
+
// auditUserId, which takes precedence.
|
|
83
83
|
export function requireSecretsContext(
|
|
84
84
|
ctx: {
|
|
85
85
|
readonly secrets?: SecretsContext;
|
|
@@ -181,7 +181,7 @@ export function createSecretsFeature(
|
|
|
181
181
|
// Backing table: envelope/metadata/last_rotated_at + the (tenant,key)
|
|
182
182
|
// uniqueIndex are not expressible via the field-DSL (jsonb-without-default,
|
|
183
183
|
// now()-default), so the physical table is the DDL truth. Without this the
|
|
184
|
-
// generated migration omitted those columns → prod-500
|
|
184
|
+
// generated migration omitted those columns → prod-500.
|
|
185
185
|
r.entity({ name: "tenant-secret", ...tenantSecretEntity, backingTable: tenantSecretsTable });
|
|
186
186
|
|
|
187
187
|
// Read-audit domain-event. Registered here so ops tools + MSPs can
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
// secrets bundle constants — default RBAC for set/delete/list
|
|
1
|
+
// secrets bundle constants — default RBAC for set/delete/list.
|
|
2
2
|
|
|
3
3
|
import type { AccessRule } from "@cosmicdrift/kumiko-framework/engine";
|
|
4
4
|
|
|
5
5
|
// Default-RBAC of the set/delete/list handlers, hard-wired to ["TenantAdmin"]
|
|
6
|
-
// before
|
|
6
|
+
// before this default was established. Apps with their own role vocabulary override via
|
|
7
7
|
// createSecretsFeature({ roles }) or createSecretsFeature({ access }) — the
|
|
8
8
|
// rotate job stays untouched, it's a manual/ops path across all tenants by
|
|
9
9
|
// design, not a per-tenant RBAC surface.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// kumiko-lint-ignore app-feature-structure
|
|
1
|
+
// kumiko-lint-ignore app-feature-structure feature.ts is over 300 lines and not yet split
|
|
2
2
|
import { computeRevisionEtag } from "@cosmicdrift/kumiko-framework/api";
|
|
3
3
|
import {
|
|
4
4
|
defineFeature,
|
|
@@ -274,8 +274,8 @@ export function createSeoFeature(opts: SeoOptions): FeatureDefinition {
|
|
|
274
274
|
});
|
|
275
275
|
}
|
|
276
276
|
|
|
277
|
-
// Boot-
|
|
278
|
-
//
|
|
277
|
+
// Boot-check body extracted as a named function—directly unit-testable,
|
|
278
|
+
// following the same "thin job-shell calls testable function" pattern as
|
|
279
279
|
// legal-pages' runLegalPagesBootCheck.
|
|
280
280
|
r.job(
|
|
281
281
|
"seo-boot-check",
|
|
@@ -9,7 +9,7 @@ export const SessionHandlers = {
|
|
|
9
9
|
revoke: "sessions:write:user-session:revoke",
|
|
10
10
|
revokeAllOthers: "sessions:write:user-session:revoke-all-others",
|
|
11
11
|
/** Privileged: System-Caller (cross-feature) revokes ALL live sessions
|
|
12
|
-
*
|
|
12
|
+
* for a user. Used by user-data-rights:restrict-account
|
|
13
13
|
* (DSGVO Art. 18 Account-Freeze). */
|
|
14
14
|
revokeAllForUser: "sessions:write:user-session:revoke-all-for-user",
|
|
15
15
|
} as const;
|
|
@@ -51,7 +51,7 @@ export type SessionsFeatureOptions = {
|
|
|
51
51
|
// runtime binding.
|
|
52
52
|
readonly autoRevokeOnPasswordChange?: SessionMassRevoker;
|
|
53
53
|
// Session JWT / store_user_sessions TTL. Was previously auth.sessions.expiresInMs
|
|
54
|
-
//
|
|
54
|
+
// — lives on the sessions feature now that sessionStore is the wiring.
|
|
55
55
|
readonly expiresInMs?: number;
|
|
56
56
|
// Access preset for the admin list/detail queries and screens; they expose decrypted
|
|
57
57
|
// IP/user-agent of every session in the tenant. A preset name, not a role array, because
|
|
@@ -119,23 +119,23 @@ export function createSessionsFeature(options?: SessionsFeatureOptions): Feature
|
|
|
119
119
|
// events (the row columns ARE the audit trail). Registering it as
|
|
120
120
|
// r.entity would make it a rebuildable implicit projection whose replay
|
|
121
121
|
// finds zero session events and swaps an empty shadow over the live
|
|
122
|
-
// table — wiping every active session on the next projection rebuild
|
|
123
|
-
//
|
|
122
|
+
// table — wiping every active session on the next projection rebuild.
|
|
123
|
+
// r.storeTable keeps the migration DDL but opts the
|
|
124
124
|
// table out of implicit rebuild, like jobs/channel-in-app/feature-toggles
|
|
125
125
|
// which are direct-write stores too.
|
|
126
126
|
r.storeTable(
|
|
127
127
|
deriveEntityTableMeta(USER_SESSION_ENTITY_NAME, userSessionEntity, { source: "unmanaged" }),
|
|
128
128
|
{
|
|
129
129
|
reason: "read_side.user_sessions_direct_write",
|
|
130
|
-
// sessionCreator encrypts ip/userAgent via encryptForDirectWrite
|
|
130
|
+
// sessionCreator encrypts ip/userAgent via encryptForDirectWrite.
|
|
131
131
|
piiEncryptedOnWrite: true,
|
|
132
132
|
},
|
|
133
133
|
);
|
|
134
134
|
|
|
135
|
-
// Self-registers as auth-foundation's sessionStore provider
|
|
135
|
+
// Self-registers as auth-foundation's sessionStore provider —
|
|
136
136
|
// wraps the same createSessionCallbacks() used by the manual
|
|
137
|
-
// buildServer({ auth: { ... } }) wiring above;
|
|
138
|
-
//
|
|
137
|
+
// buildServer({ auth: { ... } }) wiring above; removes that manual
|
|
138
|
+
// wiring once the middleware resolves generically
|
|
139
139
|
// via resolveSessionStore().
|
|
140
140
|
r.useExtension(EXT_SESSION_STORE, "default", {
|
|
141
141
|
build: (deps): SessionStore => {
|
|
@@ -153,7 +153,7 @@ export function createSessionsFeature(options?: SessionsFeatureOptions): Feature
|
|
|
153
153
|
},
|
|
154
154
|
} satisfies SessionStoreProvider);
|
|
155
155
|
|
|
156
|
-
// Custom domain-event for cross-instance access-invalidation
|
|
156
|
+
// Custom domain-event for cross-instance access-invalidation.
|
|
157
157
|
// r.defineEvent registers the schema so ctx.unsafeAppendEvent (revoke,
|
|
158
158
|
// revoke-all-others) enforces it at append time. revoke-all-for-user
|
|
159
159
|
// appends via the low-level append() instead (needs to anchor on
|
|
@@ -161,7 +161,7 @@ export function createSessionsFeature(options?: SessionsFeatureOptions): Feature
|
|
|
161
161
|
// consult the registry, so that callsite parses against
|
|
162
162
|
// sessionRevokedSchema explicitly, same guarantee via a different path.
|
|
163
163
|
// No projection: the payload IS the read, consumed directly off the
|
|
164
|
-
// event-store NOTIFY
|
|
164
|
+
// event-store NOTIFY.
|
|
165
165
|
r.defineEvent(SESSION_REVOKED_EVENT_SHORT, sessionRevokedSchema, { piiFields: "none" });
|
|
166
166
|
|
|
167
167
|
const handlers = {
|
|
@@ -64,8 +64,8 @@ export const revokeAllForUserWrite = defineWriteHandler({
|
|
|
64
64
|
},
|
|
65
65
|
);
|
|
66
66
|
|
|
67
|
-
// Lightweight append alongside the direct-write above
|
|
68
|
-
//
|
|
67
|
+
// Lightweight append alongside the direct-write above; see revoke.write.ts
|
|
68
|
+
// for why this isn't a lifecycle event on
|
|
69
69
|
// store_user_sessions. Uses the low-level append() (not
|
|
70
70
|
// ctx.unsafeAppendEvent) because this handler is deliberately
|
|
71
71
|
// cross-tenant: the privileged caller's own tenantId (what
|
|
@@ -46,8 +46,8 @@ export const revokeAllOthersWrite = defineWriteHandler({
|
|
|
46
46
|
{ userId: event.user.id, revokedAt: null, id: { ne: keepSid } },
|
|
47
47
|
);
|
|
48
48
|
|
|
49
|
-
// Lightweight append alongside the direct-write above
|
|
50
|
-
//
|
|
49
|
+
// Lightweight append alongside the direct-write above; see revoke.write.ts
|
|
50
|
+
// for why this isn't a lifecycle event on
|
|
51
51
|
// store_user_sessions. Skipped when nothing was revoked (no other
|
|
52
52
|
// live sessions) — a spurious invalidation would be the failure mode.
|
|
53
53
|
if (updated.length > 0) {
|
|
@@ -50,7 +50,7 @@ export const revokeWrite = defineWriteHandler({
|
|
|
50
50
|
);
|
|
51
51
|
|
|
52
52
|
if (updated.length > 0) {
|
|
53
|
-
// Lightweight append alongside the direct-write above
|
|
53
|
+
// Lightweight append alongside the direct-write above — NOT a
|
|
54
54
|
// lifecycle event for store_user_sessions (that table stays an
|
|
55
55
|
// unmanaged direct-write store, see feature.ts). Own aggregate id per
|
|
56
56
|
// revoke, no predecessor to satisfy, no version_conflict against a
|
|
@@ -18,9 +18,9 @@ import { USER_SESSION_ENTITY_NAME } from "../constants.ts";
|
|
|
18
18
|
// mutate them via ctx.db inside a transaction, but no user request can bypass
|
|
19
19
|
// the revocation flow by poking the column directly.
|
|
20
20
|
export const userSessionEntity = createEntity({
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
21
|
+
// The entity key is "user-session"; snake-casing it would produce
|
|
22
|
+
// "read_user-sessions", which is invalid SQL without quoting. Use an explicit
|
|
23
|
+
// override with a valid read_-prefixed table name.
|
|
24
24
|
table: "store_user_sessions",
|
|
25
25
|
// sid-as-PK: the sessionCreator callback generates the UUID, returns it to
|
|
26
26
|
// the framework; the framework stamps it as `jti`; here the same value is
|
|
@@ -84,7 +84,7 @@ export const userSessionEntity = createEntity({
|
|
|
84
84
|
// Unmanaged direct-write store (r.storeTable in feature.ts, no event stream —
|
|
85
85
|
// revocation is a column write, not an aggregate). Handlers write via ctx.db;
|
|
86
86
|
// source: "unmanaged" makes the meta Writable so those writes compile. See
|
|
87
|
-
// feature.ts for the rebuild-exclusion rationale
|
|
87
|
+
// feature.ts for the rebuild-exclusion rationale.
|
|
88
88
|
export const userSessionTable = deriveEntityTableMeta(USER_SESSION_ENTITY_NAME, userSessionEntity, {
|
|
89
89
|
source: "unmanaged",
|
|
90
90
|
});
|
|
@@ -28,7 +28,7 @@ export const createSessionListScreen = (
|
|
|
28
28
|
pageSize: MAX_LIST_LIMIT,
|
|
29
29
|
// Mirrors list.query's own fallback (unrecognised/absent sort → createdAt
|
|
30
30
|
// desc) — kept in sync by hand, boot-validator only requires the field
|
|
31
|
-
// be present once the query accepts `sort
|
|
31
|
+
// be present once the query accepts `sort`.
|
|
32
32
|
defaultSort: { field: "createdAt", dir: "desc" },
|
|
33
33
|
columns: [
|
|
34
34
|
{ field: "id", label: i18nKey("sessions.list.col.id") },
|
|
@@ -90,7 +90,7 @@ export const createSessionDetailScreen = (
|
|
|
90
90
|
// The shim (projection-detail-shim.ts) stamps every field as
|
|
91
91
|
// type:"text" — field.renderer is the only way this screen
|
|
92
92
|
// type reaches real per-type formatting instead of a raw ISO
|
|
93
|
-
// string
|
|
93
|
+
// string.
|
|
94
94
|
{ field: "createdAt", renderer: { format: "timestamp" } },
|
|
95
95
|
{ field: "expiresAt", renderer: { format: "timestamp" } },
|
|
96
96
|
{ field: "revokedAt", renderer: { format: "timestamp" } },
|
|
@@ -256,11 +256,11 @@ export function createSessionCallbacks(opts: SessionCallbacksOptions): SessionCa
|
|
|
256
256
|
);
|
|
257
257
|
|
|
258
258
|
// Lightweight append alongside the direct-write above, same pattern
|
|
259
|
-
// as revoke.write.ts
|
|
259
|
+
// as revoke.write.ts — this callback is the password-change
|
|
260
260
|
// auto-revoke path (sessions/feature.ts postSave hook) and has no
|
|
261
261
|
// dispatcher ctx to call unsafeAppendEvent from, so it uses the raw
|
|
262
262
|
// append() like revoke-all-for-user.write.ts does. Without this, the
|
|
263
|
-
// access-invalidation consumer
|
|
263
|
+
// access-invalidation consumer never hears about a password
|
|
264
264
|
// change and an already-open SSE stream survives it — the exact
|
|
265
265
|
// "stale JWT mid-stream" gap this feature exists to close.
|
|
266
266
|
if (result.length > 0) {
|
|
@@ -2,11 +2,11 @@ import * as z from "zod";
|
|
|
2
2
|
|
|
3
3
|
// Lightweight custom event appended alongside the direct-write
|
|
4
4
|
// updateMany() in revoke.write.ts / revoke-all-others.write.ts /
|
|
5
|
-
// revoke-all-for-user.write.ts
|
|
5
|
+
// revoke-all-for-user.write.ts. store_user_sessions itself stays
|
|
6
6
|
// an unmanaged direct-write store (see feature.ts) — the row columns are
|
|
7
7
|
// the audit trail, this event is NOT a CRUD/lifecycle event for that
|
|
8
8
|
// table and carries no projection. Its only job is to give cross-instance
|
|
9
|
-
// consumers (access-invalidation
|
|
9
|
+
// consumers (access-invalidation) something to LISTEN for via the
|
|
10
10
|
// existing event-store NOTIFY, keyed by the affected userId.
|
|
11
11
|
//
|
|
12
12
|
// _SHORT/_QN pair mirrors cap-counter's rolling-incremented event:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { OwnershipMap } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
2
|
|
|
3
|
-
// Boot validation rejects `{ kind: "where" }` in access.write too
|
|
3
|
+
// Boot validation rejects `{ kind: "where" }` in access.write too;
|
|
4
4
|
// failing at factory time names the option instead of an entity scope.
|
|
5
5
|
export function assertNoWhereRuleInOwnershipWrite(
|
|
6
6
|
factoryName: string,
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
// active KMS that is ciphertext (self-describing: it names its own subject,
|
|
9
9
|
// so no entity/field context is needed for key selection). `field` must
|
|
10
10
|
// still match the field name used at encrypt time — it is part of the
|
|
11
|
-
// AAD
|
|
11
|
+
// AAD, so a mismatch fails decrypt loud rather than silently
|
|
12
12
|
// letting ciphertext cut-and-pasted from another field decrypt. An erased
|
|
13
13
|
// subject yields the sentinel, which matches no real value.
|
|
14
14
|
export async function decryptStoredPii(
|
|
@@ -11,7 +11,7 @@ import { subjectErasedConflict } from "@cosmicdrift/kumiko-framework/errors";
|
|
|
11
11
|
// Unmanaged direct-write stores (r.unmanagedTable) skip the executor, so its
|
|
12
12
|
// PII encryption never runs — every insert of subject-annotated fields must
|
|
13
13
|
// go through this instead, and the feature declares { piiEncryptedOnWrite:
|
|
14
|
-
// true } at the registration site (enforced by the registry
|
|
14
|
+
// true } at the registration site (enforced by the registry).
|
|
15
15
|
export async function encryptForDirectWrite(
|
|
16
16
|
entity: EntityDefinition,
|
|
17
17
|
entityName: string,
|
|
@@ -16,17 +16,18 @@ export async function mapWithConcurrency<T, R>(
|
|
|
16
16
|
fn: (item: T, index: number) => Promise<R>,
|
|
17
17
|
): Promise<R[]> {
|
|
18
18
|
const results: R[] = new Array(items.length);
|
|
19
|
-
|
|
19
|
+
const unclaimed = items.entries();
|
|
20
20
|
let failed = false;
|
|
21
21
|
async function worker(): Promise<void> {
|
|
22
22
|
for (;;) {
|
|
23
23
|
// skip: another worker already failed — stop claiming new items.
|
|
24
24
|
if (failed) return;
|
|
25
|
-
const
|
|
25
|
+
const claimed = unclaimed.next();
|
|
26
26
|
// skip: cursor exhausted, normal worker-loop exit
|
|
27
|
-
if (
|
|
27
|
+
if (claimed.done) return;
|
|
28
|
+
const [index, item] = claimed.value;
|
|
28
29
|
try {
|
|
29
|
-
results[index] = await fn(
|
|
30
|
+
results[index] = await fn(item, index);
|
|
30
31
|
} catch (err) {
|
|
31
32
|
failed = true;
|
|
32
33
|
throw err;
|
|
@@ -91,7 +91,7 @@ export async function hostRowIsGone(
|
|
|
91
91
|
return row === undefined || row["isDeleted"] === true;
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
// Write-path half of the parentRef gate
|
|
94
|
+
// Write-path half of the parentRef gate. Resolves the join entity's
|
|
95
95
|
// own `parentRef` declaration from the registry — the same object the read
|
|
96
96
|
// path's SQL gate reads — so the field names and the allowedTypes allowlist
|
|
97
97
|
// exist in exactly one place instead of once per path.
|
|
@@ -104,7 +104,7 @@ export async function joinRowParentIsVisible(
|
|
|
104
104
|
): Promise<boolean> {
|
|
105
105
|
const parentRef = registry.getEntity(joinEntityName)?.parentRef;
|
|
106
106
|
// A mount whose join entity lost its declaration can't derive a gate —
|
|
107
|
-
// deny rather than silently fall back to the
|
|
107
|
+
// deny rather than silently fall back to the open behaviour.
|
|
108
108
|
if (parentRef === undefined) return false;
|
|
109
109
|
|
|
110
110
|
const entityType = payload[parentRef.entityTypeField];
|
|
@@ -43,7 +43,7 @@ export async function verifyPassword(hashString: string, password: string): Prom
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
// Anti-enumeration timing equaliser
|
|
46
|
+
// Anti-enumeration timing equaliser. The login handler runs this on
|
|
47
47
|
// the no-user / no-hash path so a missing account costs the same argon2
|
|
48
48
|
// latency as a real verify — otherwise response timing leaks whether an
|
|
49
49
|
// email is registered. Derived from hashPassword once and cached, so it
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
// Cross-device try-first handover
|
|
2
|
-
// offlot-app#454): signup-request runs in whichever browser the activation
|
|
1
|
+
// Cross-device try-first handover: signup-request runs in whichever browser the activation
|
|
3
2
|
// link ends up opened in, which may not be the one holding the anonymous
|
|
4
3
|
// visitor's tenant-handover grant. This extension point lets
|
|
5
4
|
// auth-email-password bind a verified grant to the signup token server-side
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
//
|
|
26
26
|
// Every key is derived from sha256(token), never the raw token — Redis key
|
|
27
27
|
// names, MONITOR output, replica traffic, and memory/backup dumps never
|
|
28
|
-
// carry the bearer secret in the clear
|
|
28
|
+
// carry the bearer secret in the clear. The by-subject entry stores
|
|
29
29
|
// the *hash* of the live token, not the token itself, so it can only be
|
|
30
30
|
// used to invalidate (delete the matching forward entry) — never to
|
|
31
31
|
// recover or resend the original token. A resend therefore always mints a
|
|
@@ -1,33 +1,31 @@
|
|
|
1
1
|
// Feature name
|
|
2
2
|
export const SUBSCRIPTION_MOLLIE_FEATURE = "subscription-mollie" as const;
|
|
3
3
|
|
|
4
|
-
//
|
|
5
|
-
//
|
|
4
|
+
// Entity name under which the plugin registers against
|
|
5
|
+
// "subscriptionProvider". Matches the path segment in the webhook URL
|
|
6
6
|
// `/api/subscription/webhook/mollie`.
|
|
7
7
|
export const MOLLIE_PROVIDER_NAME = "mollie" as const;
|
|
8
8
|
|
|
9
9
|
// =============================================================================
|
|
10
|
-
// Mollie
|
|
10
|
+
// Mollie webhook pattern (unlike Stripe)
|
|
11
11
|
// =============================================================================
|
|
12
12
|
//
|
|
13
|
-
// Mollie
|
|
14
|
-
//
|
|
15
|
-
// - `id=tr_xxx` → payment
|
|
16
|
-
// - `id=sub_xxx` → subscription
|
|
13
|
+
// Mollie sends only the ID in the body for EVERY event (form-urlencoded
|
|
14
|
+
// or JSON). The plugin must ALWAYS fetch lazily via the Mollie API:
|
|
15
|
+
// - `id=tr_xxx` → payment ID, fetch payment + subscription
|
|
16
|
+
// - `id=sub_xxx` → subscription ID, fetch subscription directly
|
|
17
17
|
//
|
|
18
|
-
// **
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
// weiterreicht).
|
|
18
|
+
// **No native HMAC signature verification** in Mollie SDK 4.5.0. Mollie's
|
|
19
|
+
// security model relies on non-guessable IDs (~10^25 brute-force space)
|
|
20
|
+
// plus API lookup validation (garbage ID → 401 from the Mollie API). In
|
|
21
|
+
// addition, the app builder can place a URL-token wrapper before the
|
|
22
|
+
// foundation route (a custom extraRoute that verifies a secret token in
|
|
23
|
+
// the URL path and then forwards to the foundation).
|
|
25
24
|
//
|
|
26
|
-
// **Event
|
|
27
|
-
// typed events:
|
|
25
|
+
// **Event type mapping** is heuristic—Mollie has no explicitly typed events:
|
|
28
26
|
// - sub_xxx + status=canceled/completed → SubscriptionEventTypes.canceled
|
|
29
27
|
// - sub_xxx + status=active/pending → SubscriptionEventTypes.updated
|
|
30
28
|
// - tr_xxx + sequenceType=first + paid → SubscriptionEventTypes.created
|
|
31
29
|
// - tr_xxx + sequenceType=recurring + paid → SubscriptionEventTypes.invoicePaid
|
|
32
30
|
// - tr_xxx + sequenceType=recurring + failed → SubscriptionEventTypes.invoicePaymentFailed
|
|
33
|
-
// -
|
|
31
|
+
// - everything else → null (foundation 200 ignored)
|