@cosmicdrift/kumiko-samples 0.338.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 +57 -0
- package/README.md +14 -0
- package/package.json +34 -0
- package/packages/bundled-features/package.json +647 -0
- package/packages/bundled-features/src/admin-shell/changes.json +27 -0
- package/packages/bundled-features/src/admin-shell/constants.ts +11 -0
- package/packages/bundled-features/src/admin-shell/feature.ts +184 -0
- package/packages/bundled-features/src/admin-shell/i18n.ts +54 -0
- package/packages/bundled-features/src/admin-shell/index.ts +17 -0
- package/packages/bundled-features/src/admin-shell/overview-allowlist.ts +47 -0
- package/packages/bundled-features/src/admin-shell/overview-panels.ts +225 -0
- package/packages/bundled-features/src/admin-shell/web/client-plugin.tsx +16 -0
- package/packages/bundled-features/src/admin-shell/web/i18n.ts +11 -0
- package/packages/bundled-features/src/admin-shell/web/index.ts +2 -0
- package/packages/bundled-features/src/agent-tools/agent-doc-lint.ts +166 -0
- package/packages/bundled-features/src/agent-tools/agent-manifest.ts +460 -0
- package/packages/bundled-features/src/agent-tools/changes.json +40 -0
- package/packages/bundled-features/src/agent-tools/feature.ts +36 -0
- package/packages/bundled-features/src/agent-tools/filter-ops.ts +5 -0
- package/packages/bundled-features/src/agent-tools/index.ts +25 -0
- package/packages/bundled-features/src/agent-tools/tool-catalog.ts +658 -0
- package/packages/bundled-features/src/agent-tools/tool-dispatch.ts +374 -0
- package/packages/bundled-features/src/agent-tools/types.ts +222 -0
- package/packages/bundled-features/src/audit/changes.json +40 -0
- package/packages/bundled-features/src/audit/constants.ts +26 -0
- package/packages/bundled-features/src/audit/escape-hatch-audit-sink.ts +52 -0
- package/packages/bundled-features/src/audit/feature.ts +145 -0
- package/packages/bundled-features/src/audit/handlers/details.query.ts +49 -0
- package/packages/bundled-features/src/audit/handlers/list.query.ts +130 -0
- package/packages/bundled-features/src/audit/i18n.ts +22 -0
- package/packages/bundled-features/src/audit/index.ts +3 -0
- package/packages/bundled-features/src/audit/web/client-plugin.tsx +16 -0
- package/packages/bundled-features/src/audit/web/i18n.ts +8 -0
- package/packages/bundled-features/src/audit/web/index.ts +3 -0
- package/packages/bundled-features/src/auth-email-password/auth-paths.ts +28 -0
- package/packages/bundled-features/src/auth-email-password/auth-user-row.ts +51 -0
- package/packages/bundled-features/src/auth-email-password/changes.json +143 -0
- package/packages/bundled-features/src/auth-email-password/constants.ts +146 -0
- package/packages/bundled-features/src/auth-email-password/email-templates.ts +198 -0
- package/packages/bundled-features/src/auth-email-password/errors.ts +112 -0
- package/packages/bundled-features/src/auth-email-password/feature.ts +269 -0
- package/packages/bundled-features/src/auth-email-password/handlers/change-password.write.ts +70 -0
- package/packages/bundled-features/src/auth-email-password/handlers/confirm-account-unlock.write.ts +61 -0
- package/packages/bundled-features/src/auth-email-password/handlers/confirm-token-flow.ts +148 -0
- package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +290 -0
- package/packages/bundled-features/src/auth-email-password/handlers/invite-accept.write.ts +195 -0
- package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +232 -0
- package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +90 -0
- package/packages/bundled-features/src/auth-email-password/handlers/invite-signup-complete.write.ts +221 -0
- package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +344 -0
- package/packages/bundled-features/src/auth-email-password/handlers/logout.write.ts +16 -0
- package/packages/bundled-features/src/auth-email-password/handlers/request-account-unlock.write.ts +40 -0
- package/packages/bundled-features/src/auth-email-password/handlers/request-email-verification.write.ts +37 -0
- package/packages/bundled-features/src/auth-email-password/handlers/request-password-reset.write.ts +39 -0
- package/packages/bundled-features/src/auth-email-password/handlers/reset-password.write.ts +62 -0
- package/packages/bundled-features/src/auth-email-password/handlers/self-registration-status.query.ts +26 -0
- package/packages/bundled-features/src/auth-email-password/handlers/signup-confirm.write.ts +249 -0
- package/packages/bundled-features/src/auth-email-password/handlers/signup-request.write.ts +229 -0
- package/packages/bundled-features/src/auth-email-password/handlers/token-request-handler.ts +170 -0
- package/packages/bundled-features/src/auth-email-password/handlers/verify-email.write.ts +62 -0
- package/packages/bundled-features/src/auth-email-password/i18n.ts +153 -0
- package/packages/bundled-features/src/auth-email-password/index.ts +47 -0
- package/packages/bundled-features/src/auth-email-password/invite-token-store.ts +78 -0
- package/packages/bundled-features/src/auth-email-password/lockout-store.ts +34 -0
- package/packages/bundled-features/src/auth-email-password/magic-link-mail.ts +87 -0
- package/packages/bundled-features/src/auth-email-password/password-policy.ts +2108 -0
- package/packages/bundled-features/src/auth-email-password/reset-token.ts +30 -0
- package/packages/bundled-features/src/auth-email-password/seeding.ts +368 -0
- package/packages/bundled-features/src/auth-email-password/self-registration-toggle.ts +25 -0
- package/packages/bundled-features/src/auth-email-password/signed-token.ts +4 -0
- package/packages/bundled-features/src/auth-email-password/signup-token-store.ts +155 -0
- package/packages/bundled-features/src/auth-email-password/testing.ts +5 -0
- package/packages/bundled-features/src/auth-email-password/unlock-token.ts +28 -0
- package/packages/bundled-features/src/auth-email-password/verification-token.ts +29 -0
- package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +472 -0
- package/packages/bundled-features/src/auth-email-password/web/auth-form-logic.ts +40 -0
- package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +112 -0
- package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +179 -0
- package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +69 -0
- package/packages/bundled-features/src/auth-email-password/web/confirm-account-unlock-screen.tsx +96 -0
- package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +47 -0
- package/packages/bundled-features/src/auth-email-password/web/forgot-password-screen.tsx +111 -0
- package/packages/bundled-features/src/auth-email-password/web/index.ts +81 -0
- package/packages/bundled-features/src/auth-email-password/web/invite-accept-screen.tsx +272 -0
- package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +298 -0
- package/packages/bundled-features/src/auth-email-password/web/request-account-unlock-screen.tsx +112 -0
- package/packages/bundled-features/src/auth-email-password/web/reset-password-screen.tsx +149 -0
- package/packages/bundled-features/src/auth-email-password/web/session-bootstrap-error.tsx +66 -0
- package/packages/bundled-features/src/auth-email-password/web/session.tsx +231 -0
- package/packages/bundled-features/src/auth-email-password/web/signup-complete-screen.tsx +181 -0
- package/packages/bundled-features/src/auth-email-password/web/signup-screen.tsx +128 -0
- package/packages/bundled-features/src/auth-email-password/web/tenant-menu-items.tsx +47 -0
- package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +123 -0
- package/packages/bundled-features/src/auth-email-password/web/use-shell-user.ts +37 -0
- package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +149 -0
- package/packages/bundled-features/src/auth-email-password/web/verify-email-screen.tsx +99 -0
- package/packages/bundled-features/src/auth-foundation/boot-checks.ts +150 -0
- package/packages/bundled-features/src/auth-foundation/changes.json +20 -0
- package/packages/bundled-features/src/auth-foundation/feature.ts +157 -0
- package/packages/bundled-features/src/auth-foundation/index.ts +37 -0
- package/packages/bundled-features/src/auth-foundation/resolve-anonymous-access.ts +62 -0
- package/packages/bundled-features/src/auth-foundation/types.ts +180 -0
- package/packages/bundled-features/src/auth-mfa/base32.ts +51 -0
- package/packages/bundled-features/src/auth-mfa/changes.json +62 -0
- package/packages/bundled-features/src/auth-mfa/config.ts +26 -0
- package/packages/bundled-features/src/auth-mfa/constants.ts +47 -0
- package/packages/bundled-features/src/auth-mfa/db/queries.ts +45 -0
- package/packages/bundled-features/src/auth-mfa/errors.ts +66 -0
- package/packages/bundled-features/src/auth-mfa/feature.ts +251 -0
- package/packages/bundled-features/src/auth-mfa/handlers/disable.write.ts +83 -0
- package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +242 -0
- package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm.write.ts +123 -0
- package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +104 -0
- package/packages/bundled-features/src/auth-mfa/handlers/enable-start.write.ts +95 -0
- package/packages/bundled-features/src/auth-mfa/handlers/reencrypt.job.ts +223 -0
- package/packages/bundled-features/src/auth-mfa/handlers/regenerate-recovery.write.ts +88 -0
- package/packages/bundled-features/src/auth-mfa/handlers/status.query.ts +32 -0
- package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +203 -0
- package/packages/bundled-features/src/auth-mfa/hmac-token-codec.ts +79 -0
- package/packages/bundled-features/src/auth-mfa/i18n.ts +50 -0
- package/packages/bundled-features/src/auth-mfa/index.ts +30 -0
- package/packages/bundled-features/src/auth-mfa/mfa-challenge-token.ts +39 -0
- package/packages/bundled-features/src/auth-mfa/mfa-code-verifier.ts +45 -0
- package/packages/bundled-features/src/auth-mfa/mfa-preauth-setup-token.ts +38 -0
- package/packages/bundled-features/src/auth-mfa/mfa-setup-token.ts +96 -0
- package/packages/bundled-features/src/auth-mfa/mfa-status-checker.ts +98 -0
- package/packages/bundled-features/src/auth-mfa/mfa-verify-attempts.ts +32 -0
- package/packages/bundled-features/src/auth-mfa/otpauth-uri.ts +21 -0
- package/packages/bundled-features/src/auth-mfa/recovery-codes.ts +54 -0
- package/packages/bundled-features/src/auth-mfa/schema/user-mfa.ts +65 -0
- package/packages/bundled-features/src/auth-mfa/screens.ts +124 -0
- package/packages/bundled-features/src/auth-mfa/testing.ts +5 -0
- package/packages/bundled-features/src/auth-mfa/token-secrets.ts +41 -0
- package/packages/bundled-features/src/auth-mfa/totp.ts +67 -0
- package/packages/bundled-features/src/auth-mfa/verify-factor.ts +58 -0
- package/packages/bundled-features/src/auth-mfa/web/client-plugin.ts +36 -0
- package/packages/bundled-features/src/auth-mfa/web/i18n.ts +66 -0
- package/packages/bundled-features/src/auth-mfa/web/index.ts +25 -0
- package/packages/bundled-features/src/auth-mfa/web/mfa-client.ts +196 -0
- package/packages/bundled-features/src/auth-mfa/web/mfa-disable-dialog.tsx +70 -0
- package/packages/bundled-features/src/auth-mfa/web/mfa-recovery-codes-reveal.tsx +53 -0
- package/packages/bundled-features/src/auth-mfa/web/mfa-regenerate-recovery-dialog.tsx +69 -0
- package/packages/bundled-features/src/auth-mfa/web/mfa-setup-preauth-screen.tsx +269 -0
- package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +117 -0
- package/packages/bundled-features/src/auth-mfa/web/qrcode-browser.d.ts +11 -0
- package/packages/bundled-features/src/auth-mfa-user-data/changes.json +1 -0
- package/packages/bundled-features/src/auth-mfa-user-data/hooks.ts +60 -0
- package/packages/bundled-features/src/auth-mfa-user-data/index.ts +21 -0
- package/packages/bundled-features/src/billing-foundation/aggregate-id.ts +74 -0
- package/packages/bundled-features/src/billing-foundation/billing-info-query.ts +95 -0
- package/packages/bundled-features/src/billing-foundation/changes.json +162 -0
- package/packages/bundled-features/src/billing-foundation/checkout-core.ts +395 -0
- package/packages/bundled-features/src/billing-foundation/constants.ts +237 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/confirmation-mail.ts +170 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/consent-gate.ts +140 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/consent-locale.ts +18 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/consent-text.ts +55 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/issue-confirmation.ts +200 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/register-consent.ts +97 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/register-termination.ts +39 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-mail.ts +128 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-pages.ts +339 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-record.ts +206 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-request.ts +377 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-texts.ts +242 -0
- package/packages/bundled-features/src/billing-foundation/db/queries/payment-projection.ts +19 -0
- package/packages/bundled-features/src/billing-foundation/db/queries/subscription-projection.ts +15 -0
- package/packages/bundled-features/src/billing-foundation/entities.ts +132 -0
- package/packages/bundled-features/src/billing-foundation/events.ts +215 -0
- package/packages/bundled-features/src/billing-foundation/feature.ts +290 -0
- package/packages/bundled-features/src/billing-foundation/get-subscription-for-tenant.ts +58 -0
- package/packages/bundled-features/src/billing-foundation/handlers/billing-plans.query.ts +54 -0
- package/packages/bundled-features/src/billing-foundation/handlers/create-checkout-session.write.ts +132 -0
- package/packages/bundled-features/src/billing-foundation/handlers/create-portal-session.write.ts +103 -0
- package/packages/bundled-features/src/billing-foundation/handlers/list-subscriptions.query.ts +37 -0
- package/packages/bundled-features/src/billing-foundation/handlers/process-event.write.ts +244 -0
- package/packages/bundled-features/src/billing-foundation/handlers/process-payment-event.write.ts +122 -0
- package/packages/bundled-features/src/billing-foundation/handlers/start-plan-checkout.write.ts +100 -0
- package/packages/bundled-features/src/billing-foundation/handlers/switch-plan.write.ts +109 -0
- package/packages/bundled-features/src/billing-foundation/handlers/sync-subscription.write.ts +163 -0
- package/packages/bundled-features/src/billing-foundation/i18n.ts +133 -0
- package/packages/bundled-features/src/billing-foundation/index.ts +92 -0
- package/packages/bundled-features/src/billing-foundation/plan-catalog.ts +235 -0
- package/packages/bundled-features/src/billing-foundation/projection.ts +227 -0
- package/packages/bundled-features/src/billing-foundation/screens.ts +25 -0
- package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +175 -0
- package/packages/bundled-features/src/billing-foundation/tenant-destroy-hook.ts +81 -0
- package/packages/bundled-features/src/billing-foundation/types.ts +478 -0
- package/packages/bundled-features/src/billing-foundation/validate-options.ts +111 -0
- package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +361 -0
- package/packages/bundled-features/src/billing-foundation/web/cancel-contract-dialog.tsx +201 -0
- package/packages/bundled-features/src/billing-foundation/web/checkout-consent-dialog.tsx +146 -0
- package/packages/bundled-features/src/billing-foundation/web/client-plugin.tsx +21 -0
- package/packages/bundled-features/src/billing-foundation/web/index.ts +23 -0
- package/packages/bundled-features/src/billing-foundation/webhook-handler.ts +165 -0
- package/packages/bundled-features/src/cap-counter/aggregate-id.ts +49 -0
- package/packages/bundled-features/src/cap-counter/book-cap-usage.ts +205 -0
- package/packages/bundled-features/src/cap-counter/changes.json +47 -0
- package/packages/bundled-features/src/cap-counter/constants.ts +34 -0
- package/packages/bundled-features/src/cap-counter/enforce-cap.ts +415 -0
- package/packages/bundled-features/src/cap-counter/entity.ts +57 -0
- package/packages/bundled-features/src/cap-counter/feature.ts +135 -0
- package/packages/bundled-features/src/cap-counter/handlers/get-counter.query.ts +37 -0
- package/packages/bundled-features/src/cap-counter/handlers/increment-rolling.write.ts +80 -0
- package/packages/bundled-features/src/cap-counter/handlers/increment.write.ts +51 -0
- package/packages/bundled-features/src/cap-counter/handlers/mark-soft-warned.write.ts +30 -0
- package/packages/bundled-features/src/cap-counter/i18n.ts +13 -0
- package/packages/bundled-features/src/cap-counter/index.ts +50 -0
- package/packages/bundled-features/src/cap-counter/stock-cap-guard.ts +80 -0
- package/packages/bundled-features/src/cap-counter/with-cap-enforcement.ts +183 -0
- package/packages/bundled-features/src/cap-overview/access.ts +35 -0
- package/packages/bundled-features/src/cap-overview/changes.json +57 -0
- package/packages/bundled-features/src/cap-overview/constants.ts +26 -0
- package/packages/bundled-features/src/cap-overview/feature.ts +87 -0
- package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +109 -0
- package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +306 -0
- package/packages/bundled-features/src/cap-overview/handlers/tenant-options.query.ts +35 -0
- package/packages/bundled-features/src/cap-overview/i18n.ts +31 -0
- package/packages/bundled-features/src/cap-overview/index.ts +21 -0
- package/packages/bundled-features/src/cap-overview/screens.ts +109 -0
- package/packages/bundled-features/src/cap-overview/types.ts +66 -0
- package/packages/bundled-features/src/cap-overview/usage-math.ts +34 -0
- package/packages/bundled-features/src/cap-overview/web/cap-cards-panel.tsx +119 -0
- package/packages/bundled-features/src/cap-overview/web/cap-usage-bar.tsx +56 -0
- package/packages/bundled-features/src/cap-overview/web/cap-usage-cell.tsx +21 -0
- package/packages/bundled-features/src/cap-overview/web/client-plugin.tsx +27 -0
- package/packages/bundled-features/src/cap-overview/web/index.ts +10 -0
- package/packages/bundled-features/src/channel-email/changes.json +15 -0
- package/packages/bundled-features/src/channel-email/email-channel.ts +127 -0
- package/packages/bundled-features/src/channel-email/feature.ts +26 -0
- package/packages/bundled-features/src/channel-email/index.ts +10 -0
- package/packages/bundled-features/src/channel-email/pii-guard.ts +55 -0
- package/packages/bundled-features/src/channel-email/smtp-transport.ts +111 -0
- package/packages/bundled-features/src/channel-email/types.ts +43 -0
- package/packages/bundled-features/src/channel-in-app/changes.json +1 -0
- package/packages/bundled-features/src/channel-in-app/constants.ts +11 -0
- package/packages/bundled-features/src/channel-in-app/feature.ts +45 -0
- package/packages/bundled-features/src/channel-in-app/handlers/inbox.query.ts +30 -0
- package/packages/bundled-features/src/channel-in-app/handlers/mark-all-read.write.ts +27 -0
- package/packages/bundled-features/src/channel-in-app/handlers/mark-read.write.ts +34 -0
- package/packages/bundled-features/src/channel-in-app/handlers/unread-count.query.ts +29 -0
- package/packages/bundled-features/src/channel-in-app/in-app-channel.ts +41 -0
- package/packages/bundled-features/src/channel-in-app/index.ts +4 -0
- package/packages/bundled-features/src/channel-in-app/tables.ts +31 -0
- package/packages/bundled-features/src/channel-push/changes.json +1 -0
- package/packages/bundled-features/src/channel-push/feature.ts +25 -0
- package/packages/bundled-features/src/channel-push/index.ts +3 -0
- package/packages/bundled-features/src/channel-push/push-channel.ts +34 -0
- package/packages/bundled-features/src/channel-push/types.ts +22 -0
- package/packages/bundled-features/src/compliance-profiles/README.md +88 -0
- package/packages/bundled-features/src/compliance-profiles/_internal/parse-override.ts +20 -0
- package/packages/bundled-features/src/compliance-profiles/changes.json +8 -0
- package/packages/bundled-features/src/compliance-profiles/constants.ts +20 -0
- package/packages/bundled-features/src/compliance-profiles/feature.ts +114 -0
- package/packages/bundled-features/src/compliance-profiles/handlers/for-tenant.query.ts +50 -0
- package/packages/bundled-features/src/compliance-profiles/handlers/list-profiles.query.ts +52 -0
- package/packages/bundled-features/src/compliance-profiles/handlers/needs-profile.query.ts +75 -0
- package/packages/bundled-features/src/compliance-profiles/handlers/set-profile.write.ts +142 -0
- package/packages/bundled-features/src/compliance-profiles/handlers/sub-processors.query.ts +46 -0
- package/packages/bundled-features/src/compliance-profiles/i18n.ts +31 -0
- package/packages/bundled-features/src/compliance-profiles/index.ts +13 -0
- package/packages/bundled-features/src/compliance-profiles/resolve-for-tenant.ts +57 -0
- package/packages/bundled-features/src/compliance-profiles/schema/profile-selection.ts +53 -0
- package/packages/bundled-features/src/compliance-profiles/seeding.ts +101 -0
- package/packages/bundled-features/src/compliance-profiles/web/client-plugin.tsx +25 -0
- package/packages/bundled-features/src/compliance-profiles/web/compliance-profile-catalog.tsx +55 -0
- package/packages/bundled-features/src/compliance-profiles/web/i18n.ts +9 -0
- package/packages/bundled-features/src/compliance-profiles/web/index.ts +6 -0
- package/packages/bundled-features/src/compliance-profiles-ops/handlers/tenants-missing-profile.query.ts +56 -0
- package/packages/bundled-features/src/compliance-profiles-ops/index.ts +34 -0
- package/packages/bundled-features/src/config/changes.json +35 -0
- package/packages/bundled-features/src/config/constants.ts +30 -0
- package/packages/bundled-features/src/config/db/queries/resolver.ts +51 -0
- package/packages/bundled-features/src/config/feature.ts +169 -0
- package/packages/bundled-features/src/config/handlers/cascade.query.ts +94 -0
- package/packages/bundled-features/src/config/handlers/readiness.query.ts +164 -0
- package/packages/bundled-features/src/config/handlers/reencrypt.job.ts +274 -0
- package/packages/bundled-features/src/config/handlers/reset.write.ts +76 -0
- package/packages/bundled-features/src/config/handlers/schema.query.ts +36 -0
- package/packages/bundled-features/src/config/handlers/selected-extensions.query.ts +71 -0
- package/packages/bundled-features/src/config/handlers/set.write.ts +227 -0
- package/packages/bundled-features/src/config/handlers/values.query.ts +92 -0
- package/packages/bundled-features/src/config/i18n.ts +4 -0
- package/packages/bundled-features/src/config/index.ts +38 -0
- package/packages/bundled-features/src/config/read-redaction.ts +64 -0
- package/packages/bundled-features/src/config/resolver.ts +687 -0
- package/packages/bundled-features/src/config/table.ts +40 -0
- package/packages/bundled-features/src/config/web/client-plugin.ts +24 -0
- package/packages/bundled-features/src/config/web/i18n.ts +48 -0
- package/packages/bundled-features/src/config/web/index.ts +7 -0
- package/packages/bundled-features/src/config/write-helpers.ts +377 -0
- package/packages/bundled-features/src/crypto-shredding/changes.json +58 -0
- package/packages/bundled-features/src/crypto-shredding/constants.ts +11 -0
- package/packages/bundled-features/src/crypto-shredding/feature.ts +30 -0
- package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +454 -0
- package/packages/bundled-features/src/crypto-shredding/index.ts +13 -0
- package/packages/bundled-features/src/custom-fields/aggregate-id.ts +34 -0
- package/packages/bundled-features/src/custom-fields/changes.json +15 -0
- package/packages/bundled-features/src/custom-fields/constants.ts +79 -0
- package/packages/bundled-features/src/custom-fields/db/queries/field-access.ts +17 -0
- package/packages/bundled-features/src/custom-fields/db/queries/projection.ts +84 -0
- package/packages/bundled-features/src/custom-fields/db/queries/quota.ts +20 -0
- package/packages/bundled-features/src/custom-fields/db/queries/retention.ts +43 -0
- package/packages/bundled-features/src/custom-fields/db/queries/user-data-rights.ts +39 -0
- package/packages/bundled-features/src/custom-fields/entity.ts +112 -0
- package/packages/bundled-features/src/custom-fields/events.ts +25 -0
- package/packages/bundled-features/src/custom-fields/executor.ts +10 -0
- package/packages/bundled-features/src/custom-fields/feature.ts +289 -0
- package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +82 -0
- package/packages/bundled-features/src/custom-fields/handlers/define-system-field.write.ts +45 -0
- package/packages/bundled-features/src/custom-fields/handlers/define-tenant-field.write.ts +108 -0
- package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +49 -0
- package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +74 -0
- package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +124 -0
- package/packages/bundled-features/src/custom-fields/handlers/update-tenant-field.write.ts +98 -0
- package/packages/bundled-features/src/custom-fields/index.ts +40 -0
- package/packages/bundled-features/src/custom-fields/lib/define-or-resurrect.ts +52 -0
- package/packages/bundled-features/src/custom-fields/lib/field-access.ts +75 -0
- package/packages/bundled-features/src/custom-fields/lib/field-definition-row.ts +33 -0
- package/packages/bundled-features/src/custom-fields/lib/parse-serialized-field.ts +64 -0
- package/packages/bundled-features/src/custom-fields/lib/quota.ts +5 -0
- package/packages/bundled-features/src/custom-fields/lib/value-schema.ts +91 -0
- package/packages/bundled-features/src/custom-fields/run-retention.ts +201 -0
- package/packages/bundled-features/src/custom-fields/schemas.ts +98 -0
- package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +27 -0
- package/packages/bundled-features/src/custom-fields/web/custom-fields-form-section.tsx +247 -0
- package/packages/bundled-features/src/custom-fields/web/i18n.ts +22 -0
- package/packages/bundled-features/src/custom-fields/web/index.ts +8 -0
- package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +226 -0
- package/packages/bundled-features/src/custom-fields/wire-user-data-rights.ts +79 -0
- package/packages/bundled-features/src/data-retention/_internal/parse-override.ts +34 -0
- package/packages/bundled-features/src/data-retention/changes.json +50 -0
- package/packages/bundled-features/src/data-retention/feature.ts +123 -0
- package/packages/bundled-features/src/data-retention/handlers/policy-for.query.ts +46 -0
- package/packages/bundled-features/src/data-retention/index.ts +20 -0
- package/packages/bundled-features/src/data-retention/keep-for.ts +75 -0
- package/packages/bundled-features/src/data-retention/override-schema.ts +37 -0
- package/packages/bundled-features/src/data-retention/presets.ts +72 -0
- package/packages/bundled-features/src/data-retention/resolve-for-tenant.ts +84 -0
- package/packages/bundled-features/src/data-retention/resolve-tenant-preset.ts +54 -0
- package/packages/bundled-features/src/data-retention/resolver.ts +107 -0
- package/packages/bundled-features/src/data-retention/run-retention-cleanup.ts +814 -0
- package/packages/bundled-features/src/data-retention/schema/tenant-retention-override.ts +50 -0
- package/packages/bundled-features/src/delivery/address-opt-out.ts +204 -0
- package/packages/bundled-features/src/delivery/attempt-log.ts +66 -0
- package/packages/bundled-features/src/delivery/changes.json +86 -0
- package/packages/bundled-features/src/delivery/channel-context.ts +17 -0
- package/packages/bundled-features/src/delivery/constants.ts +36 -0
- package/packages/bundled-features/src/delivery/db/queries/address-opt-outs.ts +23 -0
- package/packages/bundled-features/src/delivery/db/queries/preferences.ts +32 -0
- package/packages/bundled-features/src/delivery/delivery-service.ts +625 -0
- package/packages/bundled-features/src/delivery/events.ts +24 -0
- package/packages/bundled-features/src/delivery/feature.ts +206 -0
- package/packages/bundled-features/src/delivery/handlers/log.query.ts +177 -0
- package/packages/bundled-features/src/delivery/handlers/preferences.query.ts +42 -0
- package/packages/bundled-features/src/delivery/handlers/resubscribe-address.write.ts +42 -0
- package/packages/bundled-features/src/delivery/handlers/resubscribe-user.write.ts +41 -0
- package/packages/bundled-features/src/delivery/handlers/set-preference.write.ts +47 -0
- package/packages/bundled-features/src/delivery/handlers/unsubscribe-address.write.ts +40 -0
- package/packages/bundled-features/src/delivery/handlers/unsubscribe-user.write.ts +43 -0
- package/packages/bundled-features/src/delivery/i18n.ts +11 -0
- package/packages/bundled-features/src/delivery/index.ts +52 -0
- package/packages/bundled-features/src/delivery/jobs.ts +169 -0
- package/packages/bundled-features/src/delivery/public-names.ts +60 -0
- package/packages/bundled-features/src/delivery/tables.ts +155 -0
- package/packages/bundled-features/src/delivery/testing.ts +53 -0
- package/packages/bundled-features/src/delivery/types.ts +121 -0
- package/packages/bundled-features/src/delivery/unsubscribe.ts +429 -0
- package/packages/bundled-features/src/delivery/upsert-preference.ts +154 -0
- package/packages/bundled-features/src/delivery/web/client-plugin.tsx +19 -0
- package/packages/bundled-features/src/delivery/web/delivery-status-cell.tsx +26 -0
- package/packages/bundled-features/src/delivery/web/index.ts +3 -0
- package/packages/bundled-features/src/derivatives-sharp/changes.json +19 -0
- package/packages/bundled-features/src/derivatives-sharp/feature.ts +22 -0
- package/packages/bundled-features/src/derivatives-sharp/index.ts +2 -0
- package/packages/bundled-features/src/derivatives-sharp/render.ts +431 -0
- package/packages/bundled-features/src/document-ingest-foundation/boot-checks.ts +58 -0
- package/packages/bundled-features/src/document-ingest-foundation/changes.json +44 -0
- package/packages/bundled-features/src/document-ingest-foundation/entity.ts +59 -0
- package/packages/bundled-features/src/document-ingest-foundation/events.ts +43 -0
- package/packages/bundled-features/src/document-ingest-foundation/executor.ts +12 -0
- package/packages/bundled-features/src/document-ingest-foundation/feature.ts +226 -0
- package/packages/bundled-features/src/document-ingest-foundation/file-ref-liveness.ts +10 -0
- package/packages/bundled-features/src/document-ingest-foundation/forget-extract-with-file-ref.ts +84 -0
- package/packages/bundled-features/src/document-ingest-foundation/index.ts +34 -0
- package/packages/bundled-features/src/document-ingest-foundation/pages.ts +34 -0
- package/packages/bundled-features/src/document-ingest-foundation/providers.ts +87 -0
- package/packages/bundled-features/src/document-ingest-foundation/tenant-destroy-hook.ts +34 -0
- package/packages/bundled-features/src/document-ingest-foundation/write-document-extract.ts +57 -0
- package/packages/bundled-features/src/feature-toggles/changes.json +31 -0
- package/packages/bundled-features/src/feature-toggles/compose-tier-resolver.ts +134 -0
- package/packages/bundled-features/src/feature-toggles/constants.ts +40 -0
- package/packages/bundled-features/src/feature-toggles/events.ts +18 -0
- package/packages/bundled-features/src/feature-toggles/feature.ts +173 -0
- package/packages/bundled-features/src/feature-toggles/global-feature-state-table.ts +47 -0
- package/packages/bundled-features/src/feature-toggles/handlers/list.query.ts +45 -0
- package/packages/bundled-features/src/feature-toggles/handlers/registered.query.ts +87 -0
- package/packages/bundled-features/src/feature-toggles/handlers/set.write.ts +194 -0
- package/packages/bundled-features/src/feature-toggles/i18n.ts +11 -0
- package/packages/bundled-features/src/feature-toggles/index.ts +20 -0
- package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +135 -0
- package/packages/bundled-features/src/feature-toggles/toggle-sync-signal.ts +64 -0
- package/packages/bundled-features/src/feature-toggles/web/client-plugin.tsx +18 -0
- package/packages/bundled-features/src/feature-toggles/web/i18n.ts +17 -0
- package/packages/bundled-features/src/feature-toggles/web/index.ts +5 -0
- package/packages/bundled-features/src/file-derivatives/changes.json +27 -0
- package/packages/bundled-features/src/file-derivatives/feature.ts +236 -0
- package/packages/bundled-features/src/file-derivatives/handlers/public-variant-by-file-ref.query.ts +57 -0
- package/packages/bundled-features/src/file-derivatives/handlers/public-variant.query.ts +156 -0
- package/packages/bundled-features/src/file-derivatives/index.ts +11 -0
- package/packages/bundled-features/src/file-derivatives/presets.ts +10 -0
- package/packages/bundled-features/src/file-foundation/changes.json +9 -0
- package/packages/bundled-features/src/file-foundation/feature.ts +72 -0
- package/packages/bundled-features/src/file-foundation/index.ts +9 -0
- package/packages/bundled-features/src/file-provider-inmemory/changes.json +1 -0
- package/packages/bundled-features/src/file-provider-inmemory/feature.ts +84 -0
- package/packages/bundled-features/src/file-provider-inmemory/index.ts +3 -0
- package/packages/bundled-features/src/file-provider-s3/changes.json +1 -0
- package/packages/bundled-features/src/file-provider-s3/feature.ts +176 -0
- package/packages/bundled-features/src/file-provider-s3/index.ts +3 -0
- package/packages/bundled-features/src/file-provider-s3-env/changes.json +1 -0
- package/packages/bundled-features/src/file-provider-s3-env/feature.ts +58 -0
- package/packages/bundled-features/src/file-provider-s3-env/index.ts +3 -0
- package/packages/bundled-features/src/files/README.md +50 -0
- package/packages/bundled-features/src/files/changes.json +1 -0
- package/packages/bundled-features/src/files/feature.ts +7 -0
- package/packages/bundled-features/src/files/index.ts +1 -0
- package/packages/bundled-features/src/files-provider-s3/changes.json +1 -0
- package/packages/bundled-features/src/files-provider-s3/env-helper.ts +49 -0
- package/packages/bundled-features/src/files-provider-s3/index.ts +3 -0
- package/packages/bundled-features/src/files-provider-s3/s3-provider.ts +196 -0
- package/packages/bundled-features/src/files-tenant-data/changes.json +9 -0
- package/packages/bundled-features/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +168 -0
- package/packages/bundled-features/src/files-tenant-data/hooks.ts +203 -0
- package/packages/bundled-features/src/files-tenant-data/index.ts +68 -0
- package/packages/bundled-features/src/folders/aggregate-id.ts +23 -0
- package/packages/bundled-features/src/folders/changes.json +9 -0
- package/packages/bundled-features/src/folders/constants.ts +40 -0
- package/packages/bundled-features/src/folders/entity.ts +87 -0
- package/packages/bundled-features/src/folders/executor.ts +11 -0
- package/packages/bundled-features/src/folders/feature.ts +192 -0
- package/packages/bundled-features/src/folders/handlers/clear-folder.write.ts +51 -0
- package/packages/bundled-features/src/folders/handlers/delete-folder.write.ts +43 -0
- package/packages/bundled-features/src/folders/handlers/set-folder.write.ts +99 -0
- package/packages/bundled-features/src/folders/index.ts +23 -0
- package/packages/bundled-features/src/folders/schemas.ts +18 -0
- package/packages/bundled-features/src/folders/web/client-plugin.tsx +16 -0
- package/packages/bundled-features/src/folders/web/folder-manager.tsx +562 -0
- package/packages/bundled-features/src/folders/web/folder-section.tsx +205 -0
- package/packages/bundled-features/src/folders/web/i18n.ts +34 -0
- package/packages/bundled-features/src/folders/web/index.ts +6 -0
- package/packages/bundled-features/src/folders/web/tree.ts +65 -0
- package/packages/bundled-features/src/folders-user-data/changes.json +1 -0
- package/packages/bundled-features/src/folders-user-data/hooks.ts +76 -0
- package/packages/bundled-features/src/folders-user-data/index.ts +33 -0
- package/packages/bundled-features/src/form-draft/changes.json +1 -0
- package/packages/bundled-features/src/form-draft/constants.ts +50 -0
- package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +72 -0
- package/packages/bundled-features/src/form-draft/db/queries/draft-count.ts +21 -0
- package/packages/bundled-features/src/form-draft/db/queries/owned-file-refs.ts +74 -0
- package/packages/bundled-features/src/form-draft/entity.ts +59 -0
- package/packages/bundled-features/src/form-draft/executor.ts +7 -0
- package/packages/bundled-features/src/form-draft/feature.ts +59 -0
- package/packages/bundled-features/src/form-draft/handlers/cleanup.job.ts +200 -0
- package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +110 -0
- package/packages/bundled-features/src/form-draft/handlers/get.query.ts +38 -0
- package/packages/bundled-features/src/form-draft/handlers/list.query.ts +54 -0
- package/packages/bundled-features/src/form-draft/handlers/save.write.ts +86 -0
- package/packages/bundled-features/src/form-draft/index.ts +28 -0
- package/packages/bundled-features/src/form-draft/lookup.ts +62 -0
- package/packages/bundled-features/src/form-draft/release-file-refs.ts +69 -0
- package/packages/bundled-features/src/form-draft/schemas.ts +61 -0
- package/packages/bundled-features/src/form-draft-user-data/changes.json +1 -0
- package/packages/bundled-features/src/form-draft-user-data/hooks.ts +57 -0
- package/packages/bundled-features/src/form-draft-user-data/index.ts +21 -0
- package/packages/bundled-features/src/foundation-shared/changes.json +1 -0
- package/packages/bundled-features/src/foundation-shared/config-helpers.ts +97 -0
- package/packages/bundled-features/src/foundation-shared/host-allowlist.ts +17 -0
- package/packages/bundled-features/src/foundation-shared/index.ts +14 -0
- package/packages/bundled-features/src/foundation-shared/mail-host-policy.ts +60 -0
- package/packages/bundled-features/src/inbound-mail-foundation/aggregate-id.ts +40 -0
- package/packages/bundled-features/src/inbound-mail-foundation/changes.json +32 -0
- package/packages/bundled-features/src/inbound-mail-foundation/connect-routes.ts +253 -0
- package/packages/bundled-features/src/inbound-mail-foundation/constants.ts +80 -0
- package/packages/bundled-features/src/inbound-mail-foundation/db/queries/inbound-projections.ts +38 -0
- package/packages/bundled-features/src/inbound-mail-foundation/entities.ts +222 -0
- package/packages/bundled-features/src/inbound-mail-foundation/events.ts +147 -0
- package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +265 -0
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/account-state.ts +23 -0
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/connect-account.write.ts +118 -0
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/disconnect-account.write.ts +72 -0
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/ingest-message.write.ts +339 -0
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-accounts.query.ts +44 -0
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-messages.query.ts +59 -0
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/scope-visibility.ts +14 -0
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/update-account.write.ts +80 -0
- package/packages/bundled-features/src/inbound-mail-foundation/index.ts +96 -0
- package/packages/bundled-features/src/inbound-mail-foundation/oauth-state.ts +103 -0
- package/packages/bundled-features/src/inbound-mail-foundation/projection.ts +155 -0
- package/packages/bundled-features/src/inbound-mail-foundation/provider-factory.ts +53 -0
- package/packages/bundled-features/src/inbound-mail-foundation/retention-sweep.ts +168 -0
- package/packages/bundled-features/src/inbound-mail-foundation/tenant-destroy-hook.ts +88 -0
- package/packages/bundled-features/src/inbound-mail-foundation/types.ts +257 -0
- package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor.ts +678 -0
- package/packages/bundled-features/src/inbound-provider-imap/changes.json +14 -0
- package/packages/bundled-features/src/inbound-provider-imap/credential-document.ts +51 -0
- package/packages/bundled-features/src/inbound-provider-imap/feature.ts +286 -0
- package/packages/bundled-features/src/inbound-provider-imap/imap-client.ts +216 -0
- package/packages/bundled-features/src/inbound-provider-imap/index.ts +17 -0
- package/packages/bundled-features/src/inbound-provider-inmemory/changes.json +1 -0
- package/packages/bundled-features/src/inbound-provider-inmemory/feature.ts +154 -0
- package/packages/bundled-features/src/inbound-provider-inmemory/index.ts +12 -0
- package/packages/bundled-features/src/jobs/changes.json +47 -0
- package/packages/bundled-features/src/jobs/constants.ts +33 -0
- package/packages/bundled-features/src/jobs/db/queries/retention.ts +60 -0
- package/packages/bundled-features/src/jobs/db/queries/stale-run-sweep.ts +84 -0
- package/packages/bundled-features/src/jobs/events.ts +36 -0
- package/packages/bundled-features/src/jobs/feature.ts +256 -0
- package/packages/bundled-features/src/jobs/handlers/catalog.query.ts +42 -0
- package/packages/bundled-features/src/jobs/handlers/detail.query.ts +69 -0
- package/packages/bundled-features/src/jobs/handlers/list.query.ts +79 -0
- package/packages/bundled-features/src/jobs/handlers/projection-rebuild.job.ts +43 -0
- package/packages/bundled-features/src/jobs/handlers/reindex-entity.job.ts +56 -0
- package/packages/bundled-features/src/jobs/handlers/retention-cleanup.job.ts +23 -0
- package/packages/bundled-features/src/jobs/handlers/retry.write.ts +100 -0
- package/packages/bundled-features/src/jobs/handlers/stale-run-sweep.job.ts +30 -0
- package/packages/bundled-features/src/jobs/handlers/tenant-failures.query.ts +73 -0
- package/packages/bundled-features/src/jobs/handlers/trigger.write.ts +85 -0
- package/packages/bundled-features/src/jobs/i18n.ts +54 -0
- package/packages/bundled-features/src/jobs/index.ts +7 -0
- package/packages/bundled-features/src/jobs/is-manual-trigger.ts +5 -0
- package/packages/bundled-features/src/jobs/job-instant.ts +9 -0
- package/packages/bundled-features/src/jobs/job-run-logger.ts +457 -0
- package/packages/bundled-features/src/jobs/job-run-table.ts +101 -0
- package/packages/bundled-features/src/jobs/tenant-job-failure-table.ts +38 -0
- package/packages/bundled-features/src/jobs/web/client-plugin.tsx +16 -0
- package/packages/bundled-features/src/jobs/web/i18n.ts +8 -0
- package/packages/bundled-features/src/jobs/web/index.ts +2 -0
- package/packages/bundled-features/src/ledger/changes.json +16 -0
- package/packages/bundled-features/src/ledger/constants.ts +60 -0
- package/packages/bundled-features/src/ledger/entity.ts +177 -0
- package/packages/bundled-features/src/ledger/executor.ts +18 -0
- package/packages/bundled-features/src/ledger/feature.ts +180 -0
- package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +134 -0
- package/packages/bundled-features/src/ledger/handlers/create-transaction.write.ts +48 -0
- package/packages/bundled-features/src/ledger/handlers/reports.query.ts +84 -0
- package/packages/bundled-features/src/ledger/handlers/reverse-transaction.write.ts +95 -0
- package/packages/bundled-features/src/ledger/index.ts +71 -0
- package/packages/bundled-features/src/ledger/recurring.ts +149 -0
- package/packages/bundled-features/src/ledger/reports.ts +164 -0
- package/packages/bundled-features/src/ledger/schemas.ts +71 -0
- package/packages/bundled-features/src/ledger/subject-reference.ts +10 -0
- package/packages/bundled-features/src/ledger/web/index.ts +36 -0
- package/packages/bundled-features/src/legal-pages/README.md +238 -0
- package/packages/bundled-features/src/legal-pages/changes.json +8 -0
- package/packages/bundled-features/src/legal-pages/constants.ts +54 -0
- package/packages/bundled-features/src/legal-pages/feature.ts +287 -0
- package/packages/bundled-features/src/legal-pages/index.ts +16 -0
- package/packages/bundled-features/src/legal-pages/markdown.ts +7 -0
- package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +81 -0
- package/packages/bundled-features/src/legal-pages/web/index.ts +4 -0
- package/packages/bundled-features/src/mail-foundation/changes.json +1 -0
- package/packages/bundled-features/src/mail-foundation/feature.ts +233 -0
- package/packages/bundled-features/src/mail-foundation/index.ts +17 -0
- package/packages/bundled-features/src/mail-transport-inmemory/changes.json +1 -0
- package/packages/bundled-features/src/mail-transport-inmemory/feature.ts +97 -0
- package/packages/bundled-features/src/mail-transport-inmemory/index.ts +3 -0
- package/packages/bundled-features/src/mail-transport-smtp/changes.json +20 -0
- package/packages/bundled-features/src/mail-transport-smtp/feature.ts +268 -0
- package/packages/bundled-features/src/mail-transport-smtp/index.ts +8 -0
- package/packages/bundled-features/src/managed-pages/branding.ts +173 -0
- package/packages/bundled-features/src/managed-pages/changes.json +25 -0
- package/packages/bundled-features/src/managed-pages/css-gate.ts +24 -0
- package/packages/bundled-features/src/managed-pages/feature.ts +267 -0
- package/packages/bundled-features/src/managed-pages/handlers/branding.query.ts +37 -0
- package/packages/bundled-features/src/managed-pages/handlers/by-slug.query.ts +40 -0
- package/packages/bundled-features/src/managed-pages/handlers/by-tenant-published.query.ts +55 -0
- package/packages/bundled-features/src/managed-pages/handlers/page-crud.ts +49 -0
- package/packages/bundled-features/src/managed-pages/handlers/set.write.ts +133 -0
- package/packages/bundled-features/src/managed-pages/i18n.ts +62 -0
- package/packages/bundled-features/src/managed-pages/index.ts +30 -0
- package/packages/bundled-features/src/managed-pages/screens/branding-screen.ts +115 -0
- package/packages/bundled-features/src/managed-pages/screens/page-screens.ts +89 -0
- package/packages/bundled-features/src/managed-pages/seeding.ts +99 -0
- package/packages/bundled-features/src/managed-pages/table.ts +80 -0
- package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +22 -0
- package/packages/bundled-features/src/managed-pages/web/i18n.ts +19 -0
- package/packages/bundled-features/src/managed-pages/web/index.ts +3 -0
- package/packages/bundled-features/src/metrics/changes.json +21 -0
- package/packages/bundled-features/src/metrics/compute.ts +243 -0
- package/packages/bundled-features/src/metrics/constants.ts +22 -0
- package/packages/bundled-features/src/metrics/default-metrics.ts +133 -0
- package/packages/bundled-features/src/metrics/feature.ts +159 -0
- package/packages/bundled-features/src/metrics/i18n.ts +18 -0
- package/packages/bundled-features/src/metrics/index.ts +33 -0
- package/packages/bundled-features/src/metrics/types.ts +81 -0
- package/packages/bundled-features/src/metrics/validate.ts +73 -0
- package/packages/bundled-features/src/metrics/window.ts +89 -0
- package/packages/bundled-features/src/notes-history/changes.json +30 -0
- package/packages/bundled-features/src/notes-history/constants.ts +34 -0
- package/packages/bundled-features/src/notes-history/entity.ts +128 -0
- package/packages/bundled-features/src/notes-history/executor.ts +22 -0
- package/packages/bundled-features/src/notes-history/feature.ts +150 -0
- package/packages/bundled-features/src/notes-history/handlers/add-note.write.ts +118 -0
- package/packages/bundled-features/src/notes-history/i18n.ts +3 -0
- package/packages/bundled-features/src/notes-history/index.ts +25 -0
- package/packages/bundled-features/src/notes-history/schemas.ts +17 -0
- package/packages/bundled-features/src/notes-history/web/client-plugin.tsx +16 -0
- package/packages/bundled-features/src/notes-history/web/i18n.ts +22 -0
- package/packages/bundled-features/src/notes-history/web/index.ts +8 -0
- package/packages/bundled-features/src/notes-history/web/notes-section.tsx +190 -0
- package/packages/bundled-features/src/notes-history-user-data/changes.json +8 -0
- package/packages/bundled-features/src/notes-history-user-data/hooks.ts +131 -0
- package/packages/bundled-features/src/notes-history-user-data/index.ts +34 -0
- package/packages/bundled-features/src/page-render/branding.ts +100 -0
- package/packages/bundled-features/src/page-render/cached-page-response.ts +25 -0
- package/packages/bundled-features/src/page-render/changes.json +14 -0
- package/packages/bundled-features/src/page-render/css-sanitize.ts +344 -0
- package/packages/bundled-features/src/page-render/index.ts +22 -0
- package/packages/bundled-features/src/page-render/layout.ts +115 -0
- package/packages/bundled-features/src/page-render/markdown.ts +31 -0
- package/packages/bundled-features/src/page-render/security-headers.ts +19 -0
- package/packages/bundled-features/src/page-render/web.ts +14 -0
- package/packages/bundled-features/src/personal-access-tokens/changes.json +25 -0
- package/packages/bundled-features/src/personal-access-tokens/constants.ts +45 -0
- package/packages/bundled-features/src/personal-access-tokens/expiry.ts +7 -0
- package/packages/bundled-features/src/personal-access-tokens/feature.ts +184 -0
- package/packages/bundled-features/src/personal-access-tokens/handlers/available-scopes.query.ts +29 -0
- package/packages/bundled-features/src/personal-access-tokens/handlers/create.write.ts +124 -0
- package/packages/bundled-features/src/personal-access-tokens/handlers/list.query.ts +117 -0
- package/packages/bundled-features/src/personal-access-tokens/handlers/revoke.write.ts +62 -0
- package/packages/bundled-features/src/personal-access-tokens/hash.ts +17 -0
- package/packages/bundled-features/src/personal-access-tokens/i18n.ts +64 -0
- package/packages/bundled-features/src/personal-access-tokens/index.ts +43 -0
- package/packages/bundled-features/src/personal-access-tokens/pat-revoked-event.ts +23 -0
- package/packages/bundled-features/src/personal-access-tokens/resolver.ts +53 -0
- package/packages/bundled-features/src/personal-access-tokens/revoke-for-user.ts +62 -0
- package/packages/bundled-features/src/personal-access-tokens/roles.ts +37 -0
- package/packages/bundled-features/src/personal-access-tokens/schema/api-token.ts +93 -0
- package/packages/bundled-features/src/personal-access-tokens/scopes.ts +43 -0
- package/packages/bundled-features/src/personal-access-tokens/screens.ts +131 -0
- package/packages/bundled-features/src/presets/changes.json +8 -0
- package/packages/bundled-features/src/presets/dsgvo-self-service.ts +33 -0
- package/packages/bundled-features/src/presets/index.ts +2 -0
- package/packages/bundled-features/src/presets/security-baseline.ts +19 -0
- package/packages/bundled-features/src/rate-limiting/changes.json +14 -0
- package/packages/bundled-features/src/rate-limiting/constants.ts +10 -0
- package/packages/bundled-features/src/rate-limiting/feature.ts +30 -0
- package/packages/bundled-features/src/rate-limiting/handlers/bucket-access.ts +45 -0
- package/packages/bundled-features/src/rate-limiting/handlers/status.query.ts +60 -0
- package/packages/bundled-features/src/rate-limiting/i18n.ts +10 -0
- package/packages/bundled-features/src/rate-limiting/index.ts +2 -0
- package/packages/bundled-features/src/readiness/changes.json +1 -0
- package/packages/bundled-features/src/readiness/constants.ts +7 -0
- package/packages/bundled-features/src/readiness/feature.ts +31 -0
- package/packages/bundled-features/src/readiness/handlers/status.query.ts +55 -0
- package/packages/bundled-features/src/readiness/index.ts +3 -0
- package/packages/bundled-features/src/renderer-foundation/README.md +86 -0
- package/packages/bundled-features/src/renderer-foundation/api.ts +106 -0
- package/packages/bundled-features/src/renderer-foundation/changes.json +8 -0
- package/packages/bundled-features/src/renderer-foundation/constants.ts +25 -0
- package/packages/bundled-features/src/renderer-foundation/feature.ts +52 -0
- package/packages/bundled-features/src/renderer-foundation/index.ts +28 -0
- package/packages/bundled-features/src/renderer-foundation/types.ts +131 -0
- package/packages/bundled-features/src/renderer-simple/changes.json +1 -0
- package/packages/bundled-features/src/renderer-simple/feature.ts +57 -0
- package/packages/bundled-features/src/renderer-simple/index.ts +2 -0
- package/packages/bundled-features/src/renderer-simple/resolve-variables.ts +57 -0
- package/packages/bundled-features/src/renderer-simple/simple-renderer.ts +65 -0
- package/packages/bundled-features/src/secrets/changes.json +29 -0
- package/packages/bundled-features/src/secrets/constants.ts +12 -0
- package/packages/bundled-features/src/secrets/db/queries/read.ts +16 -0
- package/packages/bundled-features/src/secrets/feature.ts +197 -0
- package/packages/bundled-features/src/secrets/handlers/delete.write.ts +29 -0
- package/packages/bundled-features/src/secrets/handlers/list.query.ts +40 -0
- package/packages/bundled-features/src/secrets/handlers/rotate.job.ts +166 -0
- package/packages/bundled-features/src/secrets/handlers/set.write.ts +60 -0
- package/packages/bundled-features/src/secrets/i18n.ts +10 -0
- package/packages/bundled-features/src/secrets/index.ts +23 -0
- package/packages/bundled-features/src/secrets/secrets-context.ts +261 -0
- package/packages/bundled-features/src/secrets/table.ts +69 -0
- package/packages/bundled-features/src/secrets/write-gate.ts +62 -0
- package/packages/bundled-features/src/seo/changes.json +20 -0
- package/packages/bundled-features/src/seo/constants.ts +60 -0
- package/packages/bundled-features/src/seo/feature.ts +317 -0
- package/packages/bundled-features/src/seo/handlers/seo-config.query.ts +38 -0
- package/packages/bundled-features/src/seo/index.ts +24 -0
- package/packages/bundled-features/src/seo/llms-txt.ts +33 -0
- package/packages/bundled-features/src/seo/robots-txt.ts +33 -0
- package/packages/bundled-features/src/seo/schema-builders.ts +57 -0
- package/packages/bundled-features/src/seo/sitemap.ts +33 -0
- package/packages/bundled-features/src/sessions/changes.json +45 -0
- package/packages/bundled-features/src/sessions/constants.ts +58 -0
- package/packages/bundled-features/src/sessions/db/queries/cleanup.ts +21 -0
- package/packages/bundled-features/src/sessions/feature.ts +240 -0
- package/packages/bundled-features/src/sessions/handlers/cleanup.job.ts +83 -0
- package/packages/bundled-features/src/sessions/handlers/detail.query.ts +51 -0
- package/packages/bundled-features/src/sessions/handlers/list.query.ts +92 -0
- package/packages/bundled-features/src/sessions/handlers/mine.query.ts +67 -0
- package/packages/bundled-features/src/sessions/handlers/revoke-all-for-user.write.ts +122 -0
- package/packages/bundled-features/src/sessions/handlers/revoke-all-others.write.ts +68 -0
- package/packages/bundled-features/src/sessions/handlers/revoke.write.ts +94 -0
- package/packages/bundled-features/src/sessions/i18n.ts +33 -0
- package/packages/bundled-features/src/sessions/index.ts +25 -0
- package/packages/bundled-features/src/sessions/schema/user-session.ts +91 -0
- package/packages/bundled-features/src/sessions/screens.ts +157 -0
- package/packages/bundled-features/src/sessions/session-callbacks.ts +302 -0
- package/packages/bundled-features/src/sessions/session-revoked-event.ts +37 -0
- package/packages/bundled-features/src/sessions/testing.ts +55 -0
- package/packages/bundled-features/src/shared/assert-erased.ts +26 -0
- package/packages/bundled-features/src/shared/changes.json +14 -0
- package/packages/bundled-features/src/shared/chunked-entity-migration.ts +89 -0
- package/packages/bundled-features/src/shared/classify-stored-envelope.ts +21 -0
- package/packages/bundled-features/src/shared/decrypt-stored-pii.ts +26 -0
- package/packages/bundled-features/src/shared/encrypt-for-direct-write.ts +29 -0
- package/packages/bundled-features/src/shared/entities-of.ts +17 -0
- package/packages/bundled-features/src/shared/grace-period.ts +21 -0
- package/packages/bundled-features/src/shared/has-where-rule.ts +11 -0
- package/packages/bundled-features/src/shared/identity-v3-hash.ts +97 -0
- package/packages/bundled-features/src/shared/index.ts +53 -0
- package/packages/bundled-features/src/shared/is-tenant-db.ts +9 -0
- package/packages/bundled-features/src/shared/lockout-counter.ts +108 -0
- package/packages/bundled-features/src/shared/map-with-concurrency.ts +38 -0
- package/packages/bundled-features/src/shared/parent-visibility.ts +104 -0
- package/packages/bundled-features/src/shared/password-hashing.ts +55 -0
- package/packages/bundled-features/src/shared/row-bound-grant.ts +128 -0
- package/packages/bundled-features/src/shared/run-in-sub-transaction.ts +35 -0
- package/packages/bundled-features/src/shared/session-locale-field.ts +9 -0
- package/packages/bundled-features/src/shared/session-timezone-field.ts +8 -0
- package/packages/bundled-features/src/shared/signed-token.ts +101 -0
- package/packages/bundled-features/src/shared/signup-handover.ts +67 -0
- package/packages/bundled-features/src/shared/single-use-token-store.ts +148 -0
- package/packages/bundled-features/src/shared/system-query.ts +5 -0
- package/packages/bundled-features/src/shared/token-burn-store.ts +57 -0
- package/packages/bundled-features/src/step-dispatcher/changes.json +32 -0
- package/packages/bundled-features/src/step-dispatcher/feature.ts +299 -0
- package/packages/bundled-features/src/step-dispatcher/index.ts +25 -0
- package/packages/bundled-features/src/step-dispatcher/mail-runner.ts +39 -0
- package/packages/bundled-features/src/step-dispatcher/webhook-runner.ts +221 -0
- package/packages/bundled-features/src/subscription-mollie/changes.json +28 -0
- package/packages/bundled-features/src/subscription-mollie/constants.ts +33 -0
- package/packages/bundled-features/src/subscription-mollie/feature.ts +169 -0
- package/packages/bundled-features/src/subscription-mollie/index.ts +14 -0
- package/packages/bundled-features/src/subscription-mollie/plugin-methods.ts +97 -0
- package/packages/bundled-features/src/subscription-mollie/verify-webhook.ts +259 -0
- package/packages/bundled-features/src/subscription-stripe/changes.json +80 -0
- package/packages/bundled-features/src/subscription-stripe/constants.ts +35 -0
- package/packages/bundled-features/src/subscription-stripe/feature.ts +251 -0
- package/packages/bundled-features/src/subscription-stripe/index.ts +18 -0
- package/packages/bundled-features/src/subscription-stripe/plugin-methods.ts +646 -0
- package/packages/bundled-features/src/subscription-stripe/runtime.ts +193 -0
- package/packages/bundled-features/src/subscription-stripe/verify-webhook.ts +436 -0
- package/packages/bundled-features/src/tags/aggregate-id.ts +23 -0
- package/packages/bundled-features/src/tags/changes.json +16 -0
- package/packages/bundled-features/src/tags/constants.ts +61 -0
- package/packages/bundled-features/src/tags/entity.ts +99 -0
- package/packages/bundled-features/src/tags/executor.ts +24 -0
- package/packages/bundled-features/src/tags/feature.ts +219 -0
- package/packages/bundled-features/src/tags/handlers/assign-tag.write.ts +101 -0
- package/packages/bundled-features/src/tags/handlers/create-tag.write.ts +27 -0
- package/packages/bundled-features/src/tags/handlers/delete-tag.write.ts +60 -0
- package/packages/bundled-features/src/tags/handlers/remove-tag.write.ts +53 -0
- package/packages/bundled-features/src/tags/handlers/update-tag.write.ts +36 -0
- package/packages/bundled-features/src/tags/i18n.ts +9 -0
- package/packages/bundled-features/src/tags/index.ts +48 -0
- package/packages/bundled-features/src/tags/schemas.ts +61 -0
- package/packages/bundled-features/src/tags/screens.ts +70 -0
- package/packages/bundled-features/src/tags/web/client-plugin.tsx +30 -0
- package/packages/bundled-features/src/tags/web/entity-tags.tsx +54 -0
- package/packages/bundled-features/src/tags/web/i18n.ts +34 -0
- package/packages/bundled-features/src/tags/web/index.ts +18 -0
- package/packages/bundled-features/src/tags/web/tag-chip.tsx +65 -0
- package/packages/bundled-features/src/tags/web/tag-filter.tsx +100 -0
- package/packages/bundled-features/src/tags/web/tag-manager.tsx +391 -0
- package/packages/bundled-features/src/tags/web/tag-picker.tsx +55 -0
- package/packages/bundled-features/src/tags/web/tag-section.tsx +179 -0
- package/packages/bundled-features/src/tags/web/tags-cell.tsx +46 -0
- package/packages/bundled-features/src/template-resolver/README.md +255 -0
- package/packages/bundled-features/src/template-resolver/api.ts +202 -0
- package/packages/bundled-features/src/template-resolver/changes.json +16 -0
- package/packages/bundled-features/src/template-resolver/constants.ts +54 -0
- package/packages/bundled-features/src/template-resolver/feature.ts +99 -0
- package/packages/bundled-features/src/template-resolver/handlers/by-slug.query.ts +61 -0
- package/packages/bundled-features/src/template-resolver/handlers/by-tenant.query.ts +63 -0
- package/packages/bundled-features/src/template-resolver/handlers/collection-item.query.ts +53 -0
- package/packages/bundled-features/src/template-resolver/handlers/collection-list.query.ts +56 -0
- package/packages/bundled-features/src/template-resolver/handlers/collection-set.write.ts +117 -0
- package/packages/bundled-features/src/template-resolver/handlers/collection-shared.ts +90 -0
- package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +44 -0
- package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +60 -0
- package/packages/bundled-features/src/template-resolver/handlers/set.write.ts +126 -0
- package/packages/bundled-features/src/template-resolver/handlers/shared.ts +51 -0
- package/packages/bundled-features/src/template-resolver/handlers/toggle-status.write.ts +46 -0
- package/packages/bundled-features/src/template-resolver/handlers/upsert-system.write.ts +81 -0
- package/packages/bundled-features/src/template-resolver/handlers/upsert-tenant.write.ts +105 -0
- package/packages/bundled-features/src/template-resolver/index.ts +44 -0
- package/packages/bundled-features/src/template-resolver/qualified-names.ts +40 -0
- package/packages/bundled-features/src/template-resolver/seeding.ts +323 -0
- package/packages/bundled-features/src/template-resolver/table.ts +90 -0
- package/packages/bundled-features/src/template-resolver/testing.ts +199 -0
- package/packages/bundled-features/src/template-resolver/user-content-table.ts +68 -0
- package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +516 -0
- package/packages/bundled-features/src/template-resolver/web/i18n.ts +25 -0
- package/packages/bundled-features/src/template-resolver/web/index.ts +8 -0
- package/packages/bundled-features/src/template-resolver-user-data/hooks.ts +40 -0
- package/packages/bundled-features/src/template-resolver-user-data/index.ts +25 -0
- package/packages/bundled-features/src/tenant/cancel-pending-invitation.ts +43 -0
- package/packages/bundled-features/src/tenant/changes.json +105 -0
- package/packages/bundled-features/src/tenant/command-schemas.ts +37 -0
- package/packages/bundled-features/src/tenant/constants.ts +78 -0
- package/packages/bundled-features/src/tenant/feature.ts +213 -0
- package/packages/bundled-features/src/tenant/handlers/active-tenant-ids.query.ts +30 -0
- package/packages/bundled-features/src/tenant/handlers/add-member.write.ts +64 -0
- package/packages/bundled-features/src/tenant/handlers/cancel-invitation.write.ts +68 -0
- package/packages/bundled-features/src/tenant/handlers/create.write.ts +37 -0
- package/packages/bundled-features/src/tenant/handlers/invitations.query.ts +58 -0
- package/packages/bundled-features/src/tenant/handlers/is-system-admin.ts +5 -0
- package/packages/bundled-features/src/tenant/handlers/list.query.ts +30 -0
- package/packages/bundled-features/src/tenant/handlers/me.query.ts +38 -0
- package/packages/bundled-features/src/tenant/handlers/member-directory.query.ts +108 -0
- package/packages/bundled-features/src/tenant/handlers/members.query.ts +73 -0
- package/packages/bundled-features/src/tenant/handlers/memberships.query.ts +58 -0
- package/packages/bundled-features/src/tenant/handlers/remove-member.write.ts +142 -0
- package/packages/bundled-features/src/tenant/handlers/resolve-user-ids.query.ts +44 -0
- package/packages/bundled-features/src/tenant/handlers/team-list.query.ts +257 -0
- package/packages/bundled-features/src/tenant/handlers/tenant-directory.query.ts +71 -0
- package/packages/bundled-features/src/tenant/handlers/toggle-enabled.write.ts +37 -0
- package/packages/bundled-features/src/tenant/handlers/update-member-roles.write.ts +208 -0
- package/packages/bundled-features/src/tenant/handlers/update.write.ts +55 -0
- package/packages/bundled-features/src/tenant/i18n.ts +61 -0
- package/packages/bundled-features/src/tenant/index.ts +24 -0
- package/packages/bundled-features/src/tenant/invitation-table.ts +104 -0
- package/packages/bundled-features/src/tenant/invited-membership.ts +97 -0
- package/packages/bundled-features/src/tenant/is-tenant-serving-public-content.ts +13 -0
- package/packages/bundled-features/src/tenant/last-tenant-admin.ts +43 -0
- package/packages/bundled-features/src/tenant/membership-roles.ts +34 -0
- package/packages/bundled-features/src/tenant/membership-table.ts +32 -0
- package/packages/bundled-features/src/tenant/schema/tenant.ts +73 -0
- package/packages/bundled-features/src/tenant/screens.ts +221 -0
- package/packages/bundled-features/src/tenant/seeding.ts +335 -0
- package/packages/bundled-features/src/tenant/testing.ts +8 -0
- package/packages/bundled-features/src/tenant/web/client-plugin.tsx +25 -0
- package/packages/bundled-features/src/tenant/web/index.ts +4 -0
- package/packages/bundled-features/src/tenant/web/member-roles-cell.tsx +21 -0
- package/packages/bundled-features/src/tenant/web/member-status-cell.tsx +27 -0
- package/packages/bundled-features/src/tenant/web/translate-or-raw.ts +13 -0
- package/packages/bundled-features/src/tenant-handover/changes.json +34 -0
- package/packages/bundled-features/src/tenant-handover/events.ts +32 -0
- package/packages/bundled-features/src/tenant-handover/feature.ts +46 -0
- package/packages/bundled-features/src/tenant-handover/grant.ts +43 -0
- package/packages/bundled-features/src/tenant-handover/handlers/claim.write.ts +134 -0
- package/packages/bundled-features/src/tenant-handover/index.ts +9 -0
- package/packages/bundled-features/src/tenant-handover/move-entity-graph.ts +355 -0
- package/packages/bundled-features/src/tenant-handover/root-anchor.ts +50 -0
- package/packages/bundled-features/src/tenant-handover/signup-handover-provider.ts +62 -0
- package/packages/bundled-features/src/tenant-handover/transfer-graph.ts +128 -0
- package/packages/bundled-features/src/tenant-lifecycle/boot-checks.ts +79 -0
- package/packages/bundled-features/src/tenant-lifecycle/changes.json +8 -0
- package/packages/bundled-features/src/tenant-lifecycle/constants.ts +56 -0
- package/packages/bundled-features/src/tenant-lifecycle/events.ts +46 -0
- package/packages/bundled-features/src/tenant-lifecycle/feature.ts +150 -0
- package/packages/bundled-features/src/tenant-lifecycle/handlers/cancel-destruction.write.ts +86 -0
- package/packages/bundled-features/src/tenant-lifecycle/handlers/request-destruction.write.ts +94 -0
- package/packages/bundled-features/src/tenant-lifecycle/index.ts +7 -0
- package/packages/bundled-features/src/tenant-lifecycle/lib/revoke-tenant-sessions.ts +16 -0
- package/packages/bundled-features/src/tenant-lifecycle/lifecycle-gate.ts +87 -0
- package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +387 -0
- package/packages/bundled-features/src/tenant-lifecycle/stages.ts +242 -0
- package/packages/bundled-features/src/tenant-settings/changes.json +1 -0
- package/packages/bundled-features/src/tenant-settings/config.ts +43 -0
- package/packages/bundled-features/src/tenant-settings/constants.ts +21 -0
- package/packages/bundled-features/src/tenant-settings/feature.ts +55 -0
- package/packages/bundled-features/src/tenant-settings/index.ts +8 -0
- package/packages/bundled-features/src/tenant-settings/tenant-defaults.ts +78 -0
- package/packages/bundled-features/src/tier-engine/aggregate-id.ts +28 -0
- package/packages/bundled-features/src/tier-engine/changes.json +16 -0
- package/packages/bundled-features/src/tier-engine/compose-app.ts +153 -0
- package/packages/bundled-features/src/tier-engine/constants.ts +28 -0
- package/packages/bundled-features/src/tier-engine/entity.ts +55 -0
- package/packages/bundled-features/src/tier-engine/feature.ts +549 -0
- package/packages/bundled-features/src/tier-engine/handlers/active-tier.query.ts +25 -0
- package/packages/bundled-features/src/tier-engine/handlers/get-tenant-tier.query.ts +32 -0
- package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +108 -0
- package/packages/bundled-features/src/tier-engine/i18n.ts +31 -0
- package/packages/bundled-features/src/tier-engine/index.ts +32 -0
- package/packages/bundled-features/src/tier-engine/tier-resolver.ts +38 -0
- package/packages/bundled-features/src/tier-engine/trial.ts +26 -0
- package/packages/bundled-features/src/tier-engine/web/client-plugin.tsx +21 -0
- package/packages/bundled-features/src/tier-engine/web/index.ts +7 -0
- package/packages/bundled-features/src/user/changes.json +48 -0
- package/packages/bundled-features/src/user/command-schemas.ts +15 -0
- package/packages/bundled-features/src/user/constants.ts +32 -0
- package/packages/bundled-features/src/user/db/queries/stream-tenant-backfill.ts +113 -0
- package/packages/bundled-features/src/user/feature.ts +61 -0
- package/packages/bundled-features/src/user/handlers/create.write.ts +136 -0
- package/packages/bundled-features/src/user/handlers/detail.query.ts +34 -0
- package/packages/bundled-features/src/user/handlers/find-for-auth.query.ts +51 -0
- package/packages/bundled-features/src/user/handlers/list.query.ts +123 -0
- package/packages/bundled-features/src/user/handlers/me.query.ts +38 -0
- package/packages/bundled-features/src/user/handlers/update-roles.ts +203 -0
- package/packages/bundled-features/src/user/handlers/update.write.ts +112 -0
- package/packages/bundled-features/src/user/i18n.ts +23 -0
- package/packages/bundled-features/src/user/index.ts +19 -0
- package/packages/bundled-features/src/user/principal-status.ts +47 -0
- package/packages/bundled-features/src/user/roles-input-schema.ts +20 -0
- package/packages/bundled-features/src/user/schema/user.ts +215 -0
- package/packages/bundled-features/src/user/screens.ts +54 -0
- package/packages/bundled-features/src/user/seeding.ts +139 -0
- package/packages/bundled-features/src/user/testing.ts +5 -0
- package/packages/bundled-features/src/user-data-rights/COMPLIANCE.md +202 -0
- package/packages/bundled-features/src/user-data-rights/README.md +109 -0
- package/packages/bundled-features/src/user-data-rights/audit-download.ts +125 -0
- package/packages/bundled-features/src/user-data-rights/boot-checks.ts +71 -0
- package/packages/bundled-features/src/user-data-rights/changes.json +116 -0
- package/packages/bundled-features/src/user-data-rights/constants.ts +63 -0
- package/packages/bundled-features/src/user-data-rights/db/queries/export-jobs.ts +28 -0
- package/packages/bundled-features/src/user-data-rights/db/queries/forget-cleanup.ts +25 -0
- package/packages/bundled-features/src/user-data-rights/deletion-token.ts +58 -0
- package/packages/bundled-features/src/user-data-rights/email-templates.ts +175 -0
- package/packages/bundled-features/src/user-data-rights/feature.ts +808 -0
- package/packages/bundled-features/src/user-data-rights/handlers/cancel-deletion.write.ts +83 -0
- package/packages/bundled-features/src/user-data-rights/handlers/confirm-deletion-by-token.write.ts +107 -0
- package/packages/bundled-features/src/user-data-rights/handlers/deletion-grace-period.ts +138 -0
- package/packages/bundled-features/src/user-data-rights/handlers/download-attempt-list.query.ts +20 -0
- package/packages/bundled-features/src/user-data-rights/handlers/download-by-job.query.ts +220 -0
- package/packages/bundled-features/src/user-data-rights/handlers/download-by-token.query.ts +259 -0
- package/packages/bundled-features/src/user-data-rights/handlers/export-job-detail.query.ts +13 -0
- package/packages/bundled-features/src/user-data-rights/handlers/export-job-list.query.ts +14 -0
- package/packages/bundled-features/src/user-data-rights/handlers/export-status.query.ts +75 -0
- package/packages/bundled-features/src/user-data-rights/handlers/lift-restriction.write.ts +88 -0
- package/packages/bundled-features/src/user-data-rights/handlers/list-download-attempts.query.ts +49 -0
- package/packages/bundled-features/src/user-data-rights/handlers/my-audit-log.query.ts +87 -0
- package/packages/bundled-features/src/user-data-rights/handlers/request-deletion-by-email.write.ts +127 -0
- package/packages/bundled-features/src/user-data-rights/handlers/request-deletion.write.ts +117 -0
- package/packages/bundled-features/src/user-data-rights/handlers/request-export.write.ts +165 -0
- package/packages/bundled-features/src/user-data-rights/handlers/restrict-account.write.ts +133 -0
- package/packages/bundled-features/src/user-data-rights/handlers/run-forget-cleanup.write.ts +95 -0
- package/packages/bundled-features/src/user-data-rights/i18n.ts +39 -0
- package/packages/bundled-features/src/user-data-rights/index.ts +33 -0
- package/packages/bundled-features/src/user-data-rights/lib/default-mailers.ts +120 -0
- package/packages/bundled-features/src/user-data-rights/lib/deny-if-target-outside-admin-tenant.ts +32 -0
- package/packages/bundled-features/src/user-data-rights/lib/is-admin-actor.ts +19 -0
- package/packages/bundled-features/src/user-data-rights/lib/mail-transport-resolver.ts +50 -0
- package/packages/bundled-features/src/user-data-rights/lib/resolve-tenant-model.ts +34 -0
- package/packages/bundled-features/src/user-data-rights/lib/storage-provider-resolver.ts +49 -0
- package/packages/bundled-features/src/user-data-rights/lib/update-user-lifecycle.ts +126 -0
- package/packages/bundled-features/src/user-data-rights/run-export-jobs.ts +998 -0
- package/packages/bundled-features/src/user-data-rights/run-forget-cleanup.ts +665 -0
- package/packages/bundled-features/src/user-data-rights/run-user-export.ts +346 -0
- package/packages/bundled-features/src/user-data-rights/schema/download-attempt.ts +57 -0
- package/packages/bundled-features/src/user-data-rights/schema/download-token.ts +119 -0
- package/packages/bundled-features/src/user-data-rights/schema/export-job.ts +174 -0
- package/packages/bundled-features/src/user-data-rights/screens.ts +77 -0
- package/packages/bundled-features/src/user-data-rights/token-helpers.ts +67 -0
- package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +52 -0
- package/packages/bundled-features/src/user-data-rights/web/confirm-deletion-screen.tsx +97 -0
- package/packages/bundled-features/src/user-data-rights/web/i18n.ts +93 -0
- package/packages/bundled-features/src/user-data-rights/web/index.ts +15 -0
- package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +185 -0
- package/packages/bundled-features/src/user-data-rights/web/public-deletion-gate.tsx +42 -0
- package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +104 -0
- package/packages/bundled-features/src/user-data-rights/zip-path.ts +94 -0
- package/packages/bundled-features/src/user-data-rights-defaults/changes.json +13 -0
- package/packages/bundled-features/src/user-data-rights-defaults/feature.ts +136 -0
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/api-token.userdata-hook.ts +36 -0
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/config-value.userdata-hook.ts +57 -0
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.ts +36 -0
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/feature-mounted.ts +10 -0
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +280 -0
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/in-app-message.userdata-hook.ts +37 -0
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/job-run.userdata-hook.ts +34 -0
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/notification-preference.userdata-hook.ts +63 -0
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/tenant-invitation.userdata-hook.ts +144 -0
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/user-session.userdata-hook.ts +41 -0
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/user.userdata-hook.ts +126 -0
- package/packages/bundled-features/src/user-data-rights-defaults/index.ts +32 -0
- package/packages/bundled-features/src/user-profile/changes.json +21 -0
- package/packages/bundled-features/src/user-profile/constants.ts +35 -0
- package/packages/bundled-features/src/user-profile/feature.ts +154 -0
- package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +99 -0
- package/packages/bundled-features/src/user-profile/i18n.ts +46 -0
- package/packages/bundled-features/src/user-profile/index.ts +11 -0
- package/packages/bundled-features/src/user-profile/web/client-plugin.ts +45 -0
- package/packages/bundled-features/src/user-profile/web/index.ts +6 -0
- package/packages/bundled-features/src/user-profile/web/profile-screen.tsx +234 -0
- package/packages/bundled-features/src/workflow-runner/aggregate-id.ts +20 -0
- package/packages/bundled-features/src/workflow-runner/changes.json +20 -0
- package/packages/bundled-features/src/workflow-runner/db/queries/due-runs.ts +24 -0
- package/packages/bundled-features/src/workflow-runner/event-subscriber.ts +113 -0
- package/packages/bundled-features/src/workflow-runner/event-trigger.ts +121 -0
- package/packages/bundled-features/src/workflow-runner/feature.ts +96 -0
- package/packages/bundled-features/src/workflow-runner/handlers/resume-run.write.ts +358 -0
- package/packages/bundled-features/src/workflow-runner/index.ts +12 -0
- package/packages/bundled-features/src/workflow-runner/pending-projection.ts +158 -0
- package/packages/bundled-features/src/workflow-runner/runner.ts +153 -0
- package/packages/bundled-features/src/workflow-runner/tables.ts +95 -0
- package/packages/bundled-features/src/workflow-runner/workflow-registry.ts +23 -0
- package/samples/apps/admin-console/README.md +90 -0
- package/samples/apps/admin-console/package.json +22 -0
- package/samples/apps/admin-console/playwright.config.ts +13 -0
- package/samples/apps/admin-console/src/app/auth-constants.ts +10 -0
- package/samples/apps/admin-console/src/app/client.tsx +29 -0
- package/samples/apps/admin-console/src/app/home-screen.tsx +14 -0
- package/samples/apps/admin-console/src/app/seed-users.ts +42 -0
- package/samples/apps/admin-console/src/app/server.ts +35 -0
- package/samples/apps/admin-console/src/app/shell.tsx +48 -0
- package/samples/apps/admin-console/src/run-config.ts +60 -0
- package/samples/apps/admin-console/tsconfig.json +23 -0
- package/samples/apps/cap-billing-demo/README.md +151 -0
- package/samples/apps/cap-billing-demo/bin/server.ts +37 -0
- package/samples/apps/cap-billing-demo/package.json +16 -0
- package/samples/apps/cap-billing-demo/src/feature.ts +208 -0
- package/samples/apps/cap-billing-demo/src/run-config.ts +51 -0
- package/samples/apps/cap-billing-demo/src/tier-map.ts +46 -0
- package/samples/apps/cap-billing-demo/tsconfig.json +21 -0
- package/samples/apps/config-demo/README.md +81 -0
- package/samples/apps/config-demo/package.json +22 -0
- package/samples/apps/config-demo/playwright.config.ts +11 -0
- package/samples/apps/config-demo/src/app/client.tsx +12 -0
- package/samples/apps/config-demo/src/app/server.ts +31 -0
- package/samples/apps/config-demo/src/app/shell.tsx +31 -0
- package/samples/apps/config-demo/src/features/demo/feature.ts +84 -0
- package/samples/apps/config-demo/src/features/demo/i18n.ts +23 -0
- package/samples/apps/config-demo/src/features/demo/web/index.ts +7 -0
- package/samples/apps/config-demo/tsconfig.json +41 -0
- package/samples/apps/marketing-demo/README.md +89 -0
- package/samples/apps/marketing-demo/package.json +22 -0
- package/samples/apps/marketing-demo/playwright.config.ts +16 -0
- package/samples/apps/marketing-demo/src/app/client.tsx +13 -0
- package/samples/apps/marketing-demo/src/app/seed-data.ts +443 -0
- package/samples/apps/marketing-demo/src/app/seed.ts +143 -0
- package/samples/apps/marketing-demo/src/app/server.ts +25 -0
- package/samples/apps/marketing-demo/src/app/shell.tsx +37 -0
- package/samples/apps/marketing-demo/src/db/queries/seed-counts.ts +18 -0
- package/samples/apps/marketing-demo/src/features/assets/feature.ts +54 -0
- package/samples/apps/marketing-demo/src/features/assets/i18n.ts +103 -0
- package/samples/apps/marketing-demo/src/features/assets/schema/asset.ts +129 -0
- package/samples/apps/marketing-demo/src/features/assets/schema/index.ts +11 -0
- package/samples/apps/marketing-demo/src/features/assets/web/index.ts +10 -0
- package/samples/apps/marketing-demo/src/features/helpdesk/feature.ts +52 -0
- package/samples/apps/marketing-demo/src/features/helpdesk/i18n.ts +100 -0
- package/samples/apps/marketing-demo/src/features/helpdesk/schema/index.ts +13 -0
- package/samples/apps/marketing-demo/src/features/helpdesk/schema/ticket.ts +136 -0
- package/samples/apps/marketing-demo/src/features/helpdesk/web/index.ts +7 -0
- package/samples/apps/marketing-demo/tsconfig.json +23 -0
- package/samples/apps/showcase/README.md +123 -0
- package/samples/apps/showcase/kumiko.config.ts +10 -0
- package/samples/apps/showcase/package.json +23 -0
- package/samples/apps/showcase/playwright.config.ts +13 -0
- package/samples/apps/showcase/src/app/client.tsx +15 -0
- package/samples/apps/showcase/src/app/mount-public-screenshots.ts +26 -0
- package/samples/apps/showcase/src/app/seed-items.ts +129 -0
- package/samples/apps/showcase/src/app/server.ts +30 -0
- package/samples/apps/showcase/src/app/shell.tsx +110 -0
- package/samples/apps/showcase/src/features/demos/feature.ts +168 -0
- package/samples/apps/showcase/src/features/demos/i18n.ts +45 -0
- package/samples/apps/showcase/src/features/demos/index.ts +5 -0
- package/samples/apps/showcase/src/features/demos/web/components/page.tsx +50 -0
- package/samples/apps/showcase/src/features/demos/web/index.ts +30 -0
- package/samples/apps/showcase/src/features/demos/web/pages/banner.tsx +36 -0
- package/samples/apps/showcase/src/features/demos/web/pages/buttons.tsx +55 -0
- package/samples/apps/showcase/src/features/demos/web/pages/dialog.tsx +89 -0
- package/samples/apps/showcase/src/features/demos/web/pages/inputs.tsx +242 -0
- package/samples/apps/showcase/src/features/demos/web/pages/layout.tsx +203 -0
- package/samples/apps/showcase/src/features/demos/web/pages/sidebar-panel.tsx +144 -0
- package/samples/apps/showcase/src/features/demos/web/pages/text.tsx +27 -0
- package/samples/apps/showcase/src/features/demos/web/pages/toast.tsx +71 -0
- package/samples/apps/showcase/src/features/items/feature.ts +109 -0
- package/samples/apps/showcase/src/features/items/i18n.ts +79 -0
- package/samples/apps/showcase/src/features/items/index.ts +6 -0
- package/samples/apps/showcase/src/features/items/schema/index.ts +13 -0
- package/samples/apps/showcase/src/features/items/schema/item.ts +215 -0
- package/samples/apps/showcase/src/features/items/web/index.ts +15 -0
- package/samples/apps/styleguide/README.md +47 -0
- package/samples/apps/styleguide/package.json +22 -0
- package/samples/apps/styleguide/playwright.config.ts +11 -0
- package/samples/apps/styleguide/src/app/client.tsx +28 -0
- package/samples/apps/styleguide/src/app/seed.ts +58 -0
- package/samples/apps/styleguide/src/app/server.ts +51 -0
- package/samples/apps/styleguide/src/app/shell.tsx +66 -0
- package/samples/apps/styleguide/src/features/ai-settings/catalog.ts +82 -0
- package/samples/apps/styleguide/src/features/ai-settings/feature.ts +295 -0
- package/samples/apps/styleguide/src/features/ai-settings/i18n.ts +54 -0
- package/samples/apps/styleguide/src/features/ai-settings/seed.ts +29 -0
- package/samples/apps/styleguide/src/features/ai-settings/web.ts +14 -0
- package/samples/apps/styleguide/src/features/content/feature.ts +39 -0
- package/samples/apps/styleguide/src/features/content/web.tsx +160 -0
- package/samples/apps/styleguide/src/features/demo/feature.ts +288 -0
- package/samples/apps/styleguide/src/features/demo/i18n.ts +38 -0
- package/samples/apps/styleguide/src/features/demo/web.ts +13 -0
- package/samples/apps/styleguide/src/features/examples/feature.ts +173 -0
- package/samples/apps/styleguide/src/features/examples/i18n.ts +69 -0
- package/samples/apps/styleguide/src/features/examples/web.ts +14 -0
- package/samples/apps/styleguide/src/features/gallery/feature.ts +35 -0
- package/samples/apps/styleguide/src/features/gallery/web/Gallery.tsx +832 -0
- package/samples/apps/styleguide/src/features/gallery/web/index.ts +16 -0
- package/samples/apps/styleguide/src/features/shared-i18n.ts +16 -0
- package/samples/apps/styleguide/src/features/widgets/ai-text-demo.ts +70 -0
- package/samples/apps/styleguide/src/features/widgets/feature.ts +314 -0
- package/samples/apps/styleguide/src/features/widgets/i18n.ts +208 -0
- package/samples/apps/styleguide/src/features/widgets/lib/format.ts +32 -0
- package/samples/apps/styleguide/src/features/widgets/web/DashboardFilterEcho.tsx +21 -0
- package/samples/apps/styleguide/src/features/widgets/web/DashboardKpiIcon.tsx +20 -0
- package/samples/apps/styleguide/src/features/widgets/web/FormExamples.tsx +352 -0
- package/samples/apps/styleguide/src/features/widgets/web/Widgets.tsx +656 -0
- package/samples/apps/styleguide/src/features/widgets/web/index.ts +30 -0
- package/samples/apps/styleguide/tsconfig.json +41 -0
- package/samples/apps/ui-walkthrough/README.md +105 -0
- package/samples/apps/ui-walkthrough/kumiko/schema.ts +14 -0
- package/samples/apps/ui-walkthrough/package.json +23 -0
- package/samples/apps/ui-walkthrough/playwright.config.ts +29 -0
- package/samples/apps/ui-walkthrough/scripts/emit-e2e-data.ts +19 -0
- package/samples/apps/ui-walkthrough/src/app/assistant-action.tsx +49 -0
- package/samples/apps/ui-walkthrough/src/app/auth-constants.ts +20 -0
- package/samples/apps/ui-walkthrough/src/app/client.tsx +21 -0
- package/samples/apps/ui-walkthrough/src/app/seed-rental.ts +266 -0
- package/samples/apps/ui-walkthrough/src/app/seed-vehicles.ts +172 -0
- package/samples/apps/ui-walkthrough/src/app/seed.ts +25 -0
- package/samples/apps/ui-walkthrough/src/app/server.ts +56 -0
- package/samples/apps/ui-walkthrough/src/app/shell.tsx +67 -0
- package/samples/apps/ui-walkthrough/src/db/queries/row-counts.ts +24 -0
- package/samples/apps/ui-walkthrough/src/db/queries/task-counts.ts +10 -0
- package/samples/apps/ui-walkthrough/src/features/rental/entities.ts +57 -0
- package/samples/apps/ui-walkthrough/src/features/rental/feature.ts +258 -0
- package/samples/apps/ui-walkthrough/src/features/rental/i18n.ts +214 -0
- package/samples/apps/ui-walkthrough/src/features/rental/index.ts +2 -0
- package/samples/apps/ui-walkthrough/src/features/rental/lease-support.ts +110 -0
- package/samples/apps/ui-walkthrough/src/features/rental/qualified-names.ts +12 -0
- package/samples/apps/ui-walkthrough/src/features/rental/screens.ts +450 -0
- package/samples/apps/ui-walkthrough/src/features/rental/web/index.ts +12 -0
- package/samples/apps/ui-walkthrough/src/features/rental/web/lease-hub-components.tsx +29 -0
- package/samples/apps/ui-walkthrough/src/features/tasks/feature.ts +49 -0
- package/samples/apps/ui-walkthrough/src/features/tasks/i18n.ts +39 -0
- package/samples/apps/ui-walkthrough/src/features/tasks/index.ts +4 -0
- package/samples/apps/ui-walkthrough/src/features/tasks/schema/index.ts +3 -0
- package/samples/apps/ui-walkthrough/src/features/tasks/schema/task.ts +85 -0
- package/samples/apps/ui-walkthrough/src/features/tasks/web/index.ts +10 -0
- package/samples/apps/ui-walkthrough/src/features/translations.ts +17 -0
- package/samples/apps/ui-walkthrough/src/features/vehicles/campaign-support.ts +22 -0
- package/samples/apps/ui-walkthrough/src/features/vehicles/entities.ts +89 -0
- package/samples/apps/ui-walkthrough/src/features/vehicles/feature.ts +95 -0
- package/samples/apps/ui-walkthrough/src/features/vehicles/i18n.ts +222 -0
- package/samples/apps/ui-walkthrough/src/features/vehicles/index.ts +2 -0
- package/samples/apps/ui-walkthrough/src/features/vehicles/qualified-names.ts +7 -0
- package/samples/apps/ui-walkthrough/src/features/vehicles/screens.ts +188 -0
- package/samples/apps/ui-walkthrough/src/features/vehicles/web/index.ts +7 -0
- package/samples/apps/ui-walkthrough/src/run-config.ts +15 -0
- package/samples/apps/ui-walkthrough/tsconfig.json +19 -0
- package/samples/apps/use-all-bundled/README.md +57 -0
- package/samples/apps/use-all-bundled/bin/main.ts +53 -0
- package/samples/apps/use-all-bundled/feature-manifest.json +2963 -0
- package/samples/apps/use-all-bundled/kumiko/migrations/0003_notes-history.rebuild.json +4 -0
- package/samples/apps/use-all-bundled/kumiko/migrations/0005_user-content-entries.rebuild.json +4 -0
- package/samples/apps/use-all-bundled/kumiko/migrations/0007_form-draft.rebuild.json +4 -0
- package/samples/apps/use-all-bundled/kumiko/migrations/0008_ledger-date-column-1924.rebuild.json +4 -0
- package/samples/apps/use-all-bundled/kumiko/migrations/0009_form-draft-owner-required.rebuild.json +4 -0
- package/samples/apps/use-all-bundled/kumiko/migrations/0012_add-user-email-unique-index.rebuild.json +4 -0
- package/samples/apps/use-all-bundled/kumiko/migrations/0015_pii-field-api-v2-bidx.rebuild.json +4 -0
- package/samples/apps/use-all-bundled/kumiko/migrations/0023_add-note-mentions.rebuild.json +4 -0
- package/samples/apps/use-all-bundled/kumiko/migrations/0028_add-ledger-account-code-unique-index.rebuild.json +4 -0
- package/samples/apps/use-all-bundled/kumiko/schema.ts +24 -0
- package/samples/apps/use-all-bundled/kumiko.config.ts +24 -0
- package/samples/apps/use-all-bundled/package.json +30 -0
- package/samples/apps/use-all-bundled/playwright.config.ts +10 -0
- package/samples/apps/use-all-bundled/schema/generate.ts +577 -0
- package/samples/apps/use-all-bundled/schema/migrations/meta/0000_snapshot.json +3055 -0
- package/samples/apps/use-all-bundled/schema/migrations/meta/_journal.json +13 -0
- package/samples/apps/use-all-bundled/schema/schema.generated.ts +88 -0
- package/samples/apps/use-all-bundled/schema/schema.ts +9 -0
- package/samples/apps/use-all-bundled/scripts/check-coverage.ts +203 -0
- package/samples/apps/use-all-bundled/scripts/gen-feature-manifest.ts +85 -0
- package/samples/apps/use-all-bundled/scripts/gen-sample-index.ts +290 -0
- package/samples/apps/use-all-bundled/src/app/auth-constants.ts +16 -0
- package/samples/apps/use-all-bundled/src/app/cap-overview-caps.ts +71 -0
- package/samples/apps/use-all-bundled/src/app/cap-overview-labels-feature.ts +18 -0
- package/samples/apps/use-all-bundled/src/app/client.tsx +126 -0
- package/samples/apps/use-all-bundled/src/app/collection-labels-feature.ts +16 -0
- package/samples/apps/use-all-bundled/src/app/dev-app-options.ts +75 -0
- package/samples/apps/use-all-bundled/src/app/notes-feature.ts +174 -0
- package/samples/apps/use-all-bundled/src/app/screens-feature.ts +39 -0
- package/samples/apps/use-all-bundled/src/app/seed.ts +429 -0
- package/samples/apps/use-all-bundled/src/app/server.ts +5 -0
- package/samples/apps/use-all-bundled/src/app/shell.tsx +62 -0
- package/samples/apps/use-all-bundled/src/run-config.ts +433 -0
- package/samples/apps/use-all-bundled/tsconfig.json +31 -0
- package/samples/apps/user-data-rights-demo/README.md +159 -0
- package/samples/apps/user-data-rights-demo/bin/server.ts +35 -0
- package/samples/apps/user-data-rights-demo/package.json +16 -0
- package/samples/apps/user-data-rights-demo/src/feature.ts +200 -0
- package/samples/apps/user-data-rights-demo/src/run-config.ts +48 -0
- package/samples/apps/user-data-rights-demo/tsconfig.json +21 -0
- package/samples/apps/workspaces/README.md +69 -0
- package/samples/apps/workspaces/package.json +20 -0
- package/samples/apps/workspaces/playwright.config.ts +18 -0
- package/samples/apps/workspaces/src/app/auth-constants.ts +6 -0
- package/samples/apps/workspaces/src/app/client.tsx +11 -0
- package/samples/apps/workspaces/src/app/server.ts +47 -0
- package/samples/apps/workspaces/src/app/shell.tsx +51 -0
- package/samples/apps/workspaces/src/features/demo/feature.ts +89 -0
- package/samples/apps/workspaces/src/features/demo/i18n.ts +20 -0
- package/samples/apps/workspaces/src/features/demo/index.ts +2 -0
- package/samples/apps/workspaces/src/features/demo/schema/index.ts +1 -0
- package/samples/apps/workspaces/src/features/demo/schema/order.ts +43 -0
- package/samples/apps/workspaces/src/features/demo/web/index.ts +7 -0
- package/samples/apps/workspaces/src/features/demo-driver/feature.ts +31 -0
- package/samples/apps/workspaces/src/features/demo-driver/i18n.ts +10 -0
- package/samples/apps/workspaces/src/features/demo-driver/index.ts +2 -0
- package/samples/apps/workspaces/src/features/demo-driver/web/index.ts +7 -0
- package/samples/recipes/access-control/README.md +21 -0
- package/samples/recipes/access-control/package.json +8 -0
- package/samples/recipes/access-control/src/feature.ts +145 -0
- package/samples/recipes/anonymous-access/README.md +21 -0
- package/samples/recipes/anonymous-access/package.json +8 -0
- package/samples/recipes/anonymous-access/src/feature.ts +132 -0
- package/samples/recipes/anonymous-access-multitenant/README.md +21 -0
- package/samples/recipes/anonymous-access-multitenant/package.json +8 -0
- package/samples/recipes/anonymous-access-multitenant/src/feature.ts +65 -0
- package/samples/recipes/anonymous-access-multitenant/src/subdomain-resolver.ts +105 -0
- package/samples/recipes/apex-landing/README.md +32 -0
- package/samples/recipes/apex-landing/package.json +16 -0
- package/samples/recipes/apex-landing/playwright.config.ts +23 -0
- package/samples/recipes/apex-landing/src/constants.ts +7 -0
- package/samples/recipes/apex-landing/src/feature.ts +307 -0
- package/samples/recipes/apex-surface-auth/README.md +114 -0
- package/samples/recipes/apex-surface-auth/package.json +9 -0
- package/samples/recipes/apex-surface-auth/src/feature.ts +113 -0
- package/samples/recipes/api-worker-split/README.md +68 -0
- package/samples/recipes/api-worker-split/bin/api.ts +13 -0
- package/samples/recipes/api-worker-split/bin/kumiko.ts +7 -0
- package/samples/recipes/api-worker-split/bin/worker.ts +24 -0
- package/samples/recipes/api-worker-split/package.json +16 -0
- package/samples/recipes/api-worker-split/src/feature.ts +167 -0
- package/samples/recipes/auth-claims/README.md +21 -0
- package/samples/recipes/auth-claims/package.json +8 -0
- package/samples/recipes/auth-claims/src/feature.ts +123 -0
- package/samples/recipes/auth-foundation-providers/README.md +19 -0
- package/samples/recipes/auth-foundation-providers/package.json +9 -0
- package/samples/recipes/auth-foundation-providers/src/feature.ts +76 -0
- package/samples/recipes/auth-mfa/README.md +67 -0
- package/samples/recipes/auth-mfa/package.json +9 -0
- package/samples/recipes/auth-mfa/src/feature.ts +72 -0
- package/samples/recipes/basic-entity/README.md +64 -0
- package/samples/recipes/basic-entity/package.json +8 -0
- package/samples/recipes/basic-entity/src/feature.ts +45 -0
- package/samples/recipes/boot-check/README.md +54 -0
- package/samples/recipes/boot-check/package.json +8 -0
- package/samples/recipes/boot-check/src/feature.ts +29 -0
- package/samples/recipes/compliance-profiles-demo/README.md +68 -0
- package/samples/recipes/compliance-profiles-demo/package.json +9 -0
- package/samples/recipes/compliance-profiles-demo/src/feature.ts +27 -0
- package/samples/recipes/cross-feature-events/README.md +63 -0
- package/samples/recipes/cross-feature-events/package.json +9 -0
- package/samples/recipes/cross-feature-events/src/feature.ts +122 -0
- package/samples/recipes/crypto-shredding-hr/README.md +74 -0
- package/samples/recipes/crypto-shredding-hr/package.json +8 -0
- package/samples/recipes/crypto-shredding-hr/src/feature.ts +38 -0
- package/samples/recipes/currencies-global/README.md +21 -0
- package/samples/recipes/currencies-global/package.json +8 -0
- package/samples/recipes/currencies-global/src/entities/currency.ts +15 -0
- package/samples/recipes/currencies-global/src/entities/invoice.ts +18 -0
- package/samples/recipes/currencies-global/src/entities/tenant-currency.ts +19 -0
- package/samples/recipes/currencies-global/src/feature.ts +62 -0
- package/samples/recipes/currencies-global/src/handlers/invoice-create.write.ts +68 -0
- package/samples/recipes/currencies-global/src/handlers/invoice-detail.query.ts +19 -0
- package/samples/recipes/currencies-global/src/handlers/tenant-currency-assign.write.ts +40 -0
- package/samples/recipes/currencies-per-tenant/README.md +21 -0
- package/samples/recipes/currencies-per-tenant/package.json +8 -0
- package/samples/recipes/currencies-per-tenant/src/entities/currency.ts +20 -0
- package/samples/recipes/currencies-per-tenant/src/entities/invoice.ts +18 -0
- package/samples/recipes/currencies-per-tenant/src/feature.ts +29 -0
- package/samples/recipes/currencies-per-tenant/src/handlers/currency-create.write.ts +24 -0
- package/samples/recipes/currencies-per-tenant/src/handlers/invoice-create.write.ts +66 -0
- package/samples/recipes/currencies-per-tenant/src/handlers/invoice-detail.query.ts +19 -0
- package/samples/recipes/custom-fields-basic/README.md +84 -0
- package/samples/recipes/custom-fields-basic/package.json +9 -0
- package/samples/recipes/custom-fields-basic/src/feature.ts +98 -0
- package/samples/recipes/custom-handlers/README.md +46 -0
- package/samples/recipes/custom-handlers/package.json +8 -0
- package/samples/recipes/custom-handlers/src/feature.ts +118 -0
- package/samples/recipes/delivery-notifications/README.md +48 -0
- package/samples/recipes/delivery-notifications/package.json +9 -0
- package/samples/recipes/delivery-notifications/src/feature.ts +108 -0
- package/samples/recipes/designer-demo/README.md +16 -0
- package/samples/recipes/designer-demo/package.json +8 -0
- package/samples/recipes/designer-demo/src/feature.ts +55 -0
- package/samples/recipes/e2e-generator/README.md +19 -0
- package/samples/recipes/e2e-generator/package.json +8 -0
- package/samples/recipes/e2e-generator/src/feature.ts +83 -0
- package/samples/recipes/embedded/README.md +33 -0
- package/samples/recipes/embedded/package.json +8 -0
- package/samples/recipes/embedded/src/entities/contact.ts +46 -0
- package/samples/recipes/embedded/src/entities/invoice.ts +35 -0
- package/samples/recipes/embedded/src/entities/product.ts +14 -0
- package/samples/recipes/embedded/src/feature.ts +58 -0
- package/samples/recipes/embedded/src/handlers/contact-create.write.ts +45 -0
- package/samples/recipes/embedded/src/handlers/contact-detail.query.ts +20 -0
- package/samples/recipes/embedded-entity-form/README.md +65 -0
- package/samples/recipes/embedded-entity-form/package.json +14 -0
- package/samples/recipes/embedded-entity-form/src/entities/prospect.ts +21 -0
- package/samples/recipes/embedded-entity-form/src/entities/suggestion.ts +22 -0
- package/samples/recipes/embedded-entity-form/src/feature.ts +120 -0
- package/samples/recipes/embedded-entity-form/src/screens/prospect-accept-screen.ts +13 -0
- package/samples/recipes/embedded-entity-form/src/web/accept-suggestion-drawer.tsx +125 -0
- package/samples/recipes/embedded-entity-form/tsconfig.json +8 -0
- package/samples/recipes/encrypted-tenant-config/README.md +131 -0
- package/samples/recipes/encrypted-tenant-config/package.json +9 -0
- package/samples/recipes/encrypted-tenant-config/src/feature.ts +100 -0
- package/samples/recipes/error-contract/README.md +97 -0
- package/samples/recipes/error-contract/package.json +8 -0
- package/samples/recipes/error-contract/src/feature.ts +238 -0
- package/samples/recipes/event-sourcing/README.md +70 -0
- package/samples/recipes/event-sourcing/package.json +9 -0
- package/samples/recipes/event-sourcing/src/feature.ts +486 -0
- package/samples/recipes/event-sourcing/tsconfig.json +26 -0
- package/samples/recipes/feature-toggles/README.md +21 -0
- package/samples/recipes/feature-toggles/package.json +9 -0
- package/samples/recipes/feature-toggles/src/feature.ts +111 -0
- package/samples/recipes/field-access/README.md +71 -0
- package/samples/recipes/field-access/package.json +8 -0
- package/samples/recipes/field-access/src/feature.ts +32 -0
- package/samples/recipes/files-post-processing/README.md +21 -0
- package/samples/recipes/files-post-processing/package.json +12 -0
- package/samples/recipes/files-post-processing/src/feature.ts +138 -0
- package/samples/recipes/i18n/README.md +36 -0
- package/samples/recipes/i18n/package.json +8 -0
- package/samples/recipes/i18n/src/feature.ts +52 -0
- package/samples/recipes/idempotency/README.md +21 -0
- package/samples/recipes/idempotency/package.json +8 -0
- package/samples/recipes/idempotency/src/feature.ts +50 -0
- package/samples/recipes/inbound-mail-triage/README.md +30 -0
- package/samples/recipes/inbound-mail-triage/package.json +9 -0
- package/samples/recipes/inbound-mail-triage/src/feature.ts +68 -0
- package/samples/recipes/lane-routing/README.md +21 -0
- package/samples/recipes/lane-routing/package.json +8 -0
- package/samples/recipes/lane-routing/src/feature.ts +106 -0
- package/samples/recipes/ledger-banking/README.md +47 -0
- package/samples/recipes/ledger-banking/package.json +9 -0
- package/samples/recipes/ledger-banking/src/usage.ts +86 -0
- package/samples/recipes/ledger-invoicing/README.md +54 -0
- package/samples/recipes/ledger-invoicing/package.json +9 -0
- package/samples/recipes/ledger-invoicing/src/usage.ts +93 -0
- package/samples/recipes/legal-pages/README.md +204 -0
- package/samples/recipes/legal-pages/package.json +9 -0
- package/samples/recipes/legal-pages/src/feature.ts +50 -0
- package/samples/recipes/lifecycle-hooks/README.md +46 -0
- package/samples/recipes/lifecycle-hooks/package.json +8 -0
- package/samples/recipes/lifecycle-hooks/src/feature.ts +104 -0
- package/samples/recipes/managed-config/README.md +136 -0
- package/samples/recipes/managed-config/package.json +9 -0
- package/samples/recipes/managed-config/src/feature.ts +88 -0
- package/samples/recipes/managed-pages/README.md +158 -0
- package/samples/recipes/managed-pages/package.json +9 -0
- package/samples/recipes/managed-pages/src/feature.ts +25 -0
- package/samples/recipes/notes-history-basic/README.md +93 -0
- package/samples/recipes/notes-history-basic/package.json +9 -0
- package/samples/recipes/notes-history-basic/src/feature.ts +72 -0
- package/samples/recipes/notes-history-basic/src/usage.ts +42 -0
- package/samples/recipes/ownership/README.md +21 -0
- package/samples/recipes/ownership/package.json +8 -0
- package/samples/recipes/ownership/src/feature.ts +98 -0
- package/samples/recipes/pipeline-basics/README.md +106 -0
- package/samples/recipes/pipeline-basics/package.json +8 -0
- package/samples/recipes/pipeline-basics/src/feature.ts +424 -0
- package/samples/recipes/pipeline-basics/tsconfig.json +15 -0
- package/samples/recipes/public-share-token/README.md +37 -0
- package/samples/recipes/public-share-token/package.json +8 -0
- package/samples/recipes/public-share-token/src/feature.ts +197 -0
- package/samples/recipes/rate-limiting/README.md +21 -0
- package/samples/recipes/rate-limiting/package.json +8 -0
- package/samples/recipes/rate-limiting/src/feature.ts +26 -0
- package/samples/recipes/realtime-sse/README.md +21 -0
- package/samples/recipes/realtime-sse/package.json +8 -0
- package/samples/recipes/realtime-sse/src/feature.ts +27 -0
- package/samples/recipes/record-detail-layout/README.md +25 -0
- package/samples/recipes/record-detail-layout/package.json +22 -0
- package/samples/recipes/record-detail-layout/src/feature.ts +140 -0
- package/samples/recipes/reference-data/README.md +21 -0
- package/samples/recipes/reference-data/package.json +8 -0
- package/samples/recipes/reference-data/src/feature.ts +37 -0
- package/samples/recipes/relations/README.md +21 -0
- package/samples/recipes/relations/package.json +8 -0
- package/samples/recipes/relations/src/feature.ts +81 -0
- package/samples/recipes/screens-nav/README.md +19 -0
- package/samples/recipes/screens-nav/package.json +8 -0
- package/samples/recipes/screens-nav/src/feature.ts +142 -0
- package/samples/recipes/search/README.md +21 -0
- package/samples/recipes/search/package.json +8 -0
- package/samples/recipes/search/src/feature.ts +72 -0
- package/samples/recipes/secrets-demo/README.md +21 -0
- package/samples/recipes/secrets-demo/package.json +9 -0
- package/samples/recipes/secrets-demo/src/feature.ts +88 -0
- package/samples/recipes/security-baseline/README.md +81 -0
- package/samples/recipes/security-baseline/package.json +9 -0
- package/samples/recipes/security-baseline/src/feature.ts +19 -0
- package/samples/recipes/seed-migration/README.md +81 -0
- package/samples/recipes/seed-migration/package.json +10 -0
- package/samples/recipes/seed-migration/scripts/smoke.ts +125 -0
- package/samples/recipes/seed-migration/seeds/2026-01-01-initial-tenants.ts +32 -0
- package/samples/recipes/seed-migration/seeds/2026-02-01-fix-admin-roles.ts +38 -0
- package/samples/recipes/session-revocation/README.md +49 -0
- package/samples/recipes/session-revocation/package.json +9 -0
- package/samples/recipes/session-revocation/src/feature.ts +50 -0
- package/samples/recipes/state-machine/README.md +21 -0
- package/samples/recipes/state-machine/package.json +9 -0
- package/samples/recipes/state-machine/src/entities/invoice.ts +35 -0
- package/samples/recipes/state-machine/src/events.ts +32 -0
- package/samples/recipes/state-machine/src/feature.ts +89 -0
- package/samples/recipes/state-machine/src/handlers/_helpers.ts +68 -0
- package/samples/recipes/state-machine/src/handlers/create.ts +27 -0
- package/samples/recipes/state-machine/src/handlers/transitions.ts +137 -0
- package/samples/recipes/state-machine/src/reducer.ts +50 -0
- package/samples/recipes/state-machine/tsconfig.json +26 -0
- package/samples/recipes/tags-basic/README.md +100 -0
- package/samples/recipes/tags-basic/package.json +9 -0
- package/samples/recipes/tags-basic/src/feature.ts +71 -0
- package/samples/recipes/tags-basic/src/usage.ts +50 -0
- package/samples/recipes/tenant-isolation/README.md +21 -0
- package/samples/recipes/tenant-isolation/package.json +8 -0
- package/samples/recipes/tenant-isolation/src/feature.ts +28 -0
- package/samples/recipes/tenant-settings/README.md +112 -0
- package/samples/recipes/tenant-settings/package.json +9 -0
- package/samples/recipes/tenant-settings/src/feature.ts +35 -0
- package/samples/recipes/tier-admin/README.md +80 -0
- package/samples/recipes/tier-admin/package.json +9 -0
- package/samples/recipes/tier-admin/src/feature.ts +60 -0
- package/samples/recipes/timezones/README.md +97 -0
- package/samples/recipes/timezones/package.json +8 -0
- package/samples/recipes/timezones/src/feature.ts +72 -0
- package/samples/recipes/tsconfig.base.json +23 -0
- package/samples/recipes/user-data-rights/README.md +100 -0
- package/samples/recipes/user-data-rights/package.json +9 -0
- package/samples/recipes/user-data-rights/src/feature.ts +97 -0
- package/samples/recipes/user-profile/README.md +86 -0
- package/samples/recipes/user-profile/package.json +9 -0
- package/samples/recipes/user-profile/src/feature.ts +73 -0
- package/samples/recipes/webhook-step/README.md +47 -0
- package/samples/recipes/webhook-step/package.json +9 -0
- package/samples/recipes/webhook-step/src/feature.ts +203 -0
- package/samples/recipes/webhook-step/tsconfig.json +18 -0
- package/samples/recipes/wizard-form/README.md +79 -0
- package/samples/recipes/wizard-form/package.json +23 -0
- package/samples/recipes/wizard-form/src/entities/listing.ts +27 -0
- package/samples/recipes/wizard-form/src/feature.ts +48 -0
- package/samples/recipes/wizard-form/src/web/index.ts +16 -0
- package/samples/recipes/wizard-form/src/web/listing-review-section.tsx +21 -0
- package/samples/recipes/wizard-form/tsconfig.json +8 -0
- package/samples/recipes/workflow-engine/README.md +21 -0
- package/samples/recipes/workflow-engine/package.json +9 -0
- package/samples/recipes/workflow-engine/src/cron-scheduler.ts +110 -0
- package/samples/recipes/workflow-engine/src/db/queries/suspended-runs.ts +14 -0
- package/samples/recipes/workflow-engine/src/event-trigger.ts +84 -0
- package/samples/recipes/workflow-engine/src/feature.ts +167 -0
- package/samples/recipes/workflow-engine/src/postgres-resume-loop.ts +98 -0
- package/samples/recipes/workflow-engine/src/resume-loop.ts +209 -0
- package/samples/recipes/workflow-engine/src/workflow-runner.ts +97 -0
- package/samples/recipes/workflow-engine/tsconfig.json +21 -0
- package/samples/recipes/writeform-section/README.md +30 -0
- package/samples/recipes/writeform-section/package.json +23 -0
- package/samples/recipes/writeform-section/src/feature.ts +123 -0
- package/samples/recipes/writeform-section/src/note-fixture.ts +8 -0
- package/samples/recipes/writeform-section/tsconfig.json +8 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# DSGVO Compliance — Operator-Guide
|
|
2
|
+
|
|
3
|
+
Dieses Dokument bündelt die **technischen Fakten** zur DSGVO-Pipeline
|
|
4
|
+
(Art. 15/17/18/20) als Grundlage für:
|
|
5
|
+
|
|
6
|
+
- **Verarbeitungsverzeichnis** (Art. 30) — was wird wo wie lange gespeichert
|
|
7
|
+
- **Datenschutzerklärung** — welche Endpoints decken welchen Artikel ab
|
|
8
|
+
- **AVV mit Sub-Processors** — welche TOM sind eingebaut
|
|
9
|
+
- **Operator-Runbook** — was triggert wann, wer kann was sehen
|
|
10
|
+
|
|
11
|
+
> Juristische Texte (AVV-Wortlaut, Datenschutzerklärung-Bausteine,
|
|
12
|
+
> Verarbeitungsverzeichnis-Strukturierung) gehören zu Marc + Anwalt —
|
|
13
|
+
> dieses Dokument liefert nur die technischen Fakten dafür.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. Endpoint → Artikel-Mapping
|
|
18
|
+
|
|
19
|
+
| Artikel | Endpoint / Runner | Wer ruft auf | Was passiert |
|
|
20
|
+
|---------|-------------------|--------------|--------------|
|
|
21
|
+
| **Art. 15 (Auskunft, light)** | `user-data-rights:query:my-audit-log` | User | Liest eigene Framework-Events aus `kumiko_events` (account-weit über alle Memberships). Filterbar nach `eventType`, `aggregateType`, `from`/`to`. Domain-Entities ohne `ctx.appendEvent` erscheinen NICHT — die kommen im Export-Bundle (Art. 20). |
|
|
22
|
+
| **Art. 15 + 20 (Auskunft + Portabilität)** | `user-data-rights:write:request-export` | User | Async Job → ZIP mit user-Profil + fileRefs + alle EXT_USER_DATA-Provider-Daten (cross-tenant) + signed Magic-Link per Email. Idempotent: nur 1 active Job pro User (`ACTIVE_JOB_CONSTRAINT`). |
|
|
23
|
+
| **Art. 15 + 20** | `GET /user-export/by-token` (interstitial) + `POST /user-export/by-token` (exchange) | Anonym (Magic-Link-Pfad) | Email-Link trägt den Token als URL-Fragment (`#token=`, nie an den Server gesendet, issue #1271); Interstitial-Script liest das Fragment client-seitig und tauscht es per POST-Body gegen die signed Storage-URL. Kein `?token=`-Query-Fallback (#1512) — Query-Param landet unveränderlich in Proxy-/Access-Logs. Multi-use innerhalb TTL. Audit: `lastUsedAt`, `lastUsedFromIp`, `lastUsedUserAgent`. |
|
|
24
|
+
| **Art. 15 + 20** | `GET /user-export/by-job/:jobId` | User (Session-Auth) | UI-Klick-Pfad. Cross-tenant-same-user: User in Tenant B kann Job aus Tenant A laden wenn er der Owner ist. |
|
|
25
|
+
| **Art. 17 (Löschung)** | `user-data-rights:write:request-deletion` | User | Soft-Delete: `status=DeletionRequested` + `gracePeriodEnd = now + profile.gracePeriod`. Cron `run-forget-cleanup` führt nach Grace die Anonymisierung durch. |
|
|
26
|
+
| **Art. 17** | `user-data-rights:write:cancel-deletion` | User | Während Grace: status zurück auf `Active`. |
|
|
27
|
+
| **Art. 17** | `run-forget-cleanup` (Cron) | System | Findet User mit `status=DeletionRequested AND gracePeriodEnd < now`. Pro User Sub-TX über alle EXT_USER_DATA-Provider mit Strategy aus `retention.policyFor`. user-Hook anonymisiert (PII raus, Sentinel-Email). |
|
|
28
|
+
| **Art. 18 (Restriction)** | `user-data-rights:write:restrict-account` | Admin / SystemAdmin | Status-Flip → Auth-Middleware-Guard blockt Logins. `sessions.revokeAllForUser` killt aktive Sessions. |
|
|
29
|
+
| **Art. 18** | `user-data-rights:write:lift-restriction` | Admin / SystemAdmin | Restriction aufheben. |
|
|
30
|
+
| **Operator (DPO)** | `user-data-rights:query:list-download-attempts` | Admin / SystemAdmin | Brute-Force-Detection: zeigt invalid Download-Versuche (notFound / expired / failed / signedUrlNotSupported) gefiltert nach Result, IP, Zeitraum. |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. Speicherorte (Verarbeitungsverzeichnis Art. 30)
|
|
35
|
+
|
|
36
|
+
| Tabelle | Inhalt | Personenbezug | Retention | Zweck |
|
|
37
|
+
|---------|--------|---------------|-----------|-------|
|
|
38
|
+
| `read_users` | User-Profil (email, displayName, passwordHash, locale, status, gracePeriodEnd, roles) | direkt | per Domain (typ. blockDelete bei Aufbewahrungspflicht, sonst hardDelete via Forget-Pipeline) | Authentifizierung, Nutzer-Profil |
|
|
39
|
+
| `read_tenant_memberships` | User↔Tenant-Verknüpfung + Rollen | direkt (via userId) | per Tenant-Lifecycle | Mehrmandant-Zuordnung |
|
|
40
|
+
| `kumiko_events` | Event-Store (alle write-Events) | direkt (`createdBy = userId`) | per Domain-Policy via `data-retention` | Audit-Trail (Art. 15-Selbstauskunft Quelle), Event-Sourcing |
|
|
41
|
+
| `read_export_jobs` | Async Export-Status (queued/running/done/failed), userId, requestedAt, doneAt, storageKey | direkt (userId) | per `compliance-profiles` Profil-Default | Idempotenz + Status-Polling |
|
|
42
|
+
| `read_export_download_tokens` | Magic-Link-Hash (SHA-256), TTL, useCount, lastUsedAt, lastUsedFromIp, lastUsedUserAgent | indirekt (Token→Job→User) | `compliance-profiles.userRights.exportDownloadTtl` (default 7d) | Magic-Link-Auth + Multi-Use-Audit |
|
|
43
|
+
| `read_download_attempts` | Invalid Download-Versuche: result, via, tokenHash, ip, userAgent, attemptedAt | indirekt (IP) | **90d hardDelete** (Entity-Default, Disk-Bomb-Schutz) | DPO-Brute-Force-Detection |
|
|
44
|
+
| `read_tenant_compliance_profiles` | Per-Tenant Profile-Wahl + Override | nein | unbounded (Konfiguration) | Region-/Branchen-Defaults |
|
|
45
|
+
| `read_tenant_retention_overrides` | Per-Tenant Retention-Override pro Entity | nein | unbounded (Konfiguration) | Aufbewahrungspflicht-Edge-Cases |
|
|
46
|
+
| Storage-Provider (Local / S3) | Export-ZIPs + File-Binaries | indirekt (Inhalt) | Local: per `exportDownloadTtl` Cleanup. S3: lifecycle-Policy (App-Author-Verantwortung) | Daten-Export-Auslieferung |
|
|
47
|
+
|
|
48
|
+
### Bekanntes Residuum: `createdBy` / `metadata.userId` in `kumiko_events`
|
|
49
|
+
|
|
50
|
+
Nach der Forget-Pipeline (Art. 17, Abschnitt 1) bleiben `kumiko_events.created_by`
|
|
51
|
+
und `metadata.userId` (Event-Store-Schema `events-schema.ts`, EventMetadata-Feld)
|
|
52
|
+
als Klartext-UUID stehen. Die Forget-Hooks aus `user-data-rights-defaults` fassen
|
|
53
|
+
`kumiko_events` nicht an — `createdBy`/`metadata.userId` sind keine über
|
|
54
|
+
`defineEvent(..., { piiFields })` deklarierten Payload-PII-Felder (siehe
|
|
55
|
+
`packages/framework/src/crypto/event-pii.ts`) und laufen deshalb nicht durch die
|
|
56
|
+
Payload-Verschlüsselung. Löschung dieser Rows erfolgt ausschließlich über die
|
|
57
|
+
zeitbasierte `data-retention`-Policy (`keepFor`, s. `kumiko_events`-Zeile in Abschnitt
|
|
58
|
+
2 oben), unabhängig vom User-Forget-Antrag.
|
|
59
|
+
|
|
60
|
+
Technische Basis: Der `read_users`-Row zur betroffenen UUID wird beim Forget-Run
|
|
61
|
+
in-place anonymisiert, nicht hard-gelöscht (Sentinel-Pattern, siehe Abschnitt 4
|
|
62
|
+
„Integrität"). Email, Displayname und Passwort-Hash werden dabei entfernt/ersetzt —
|
|
63
|
+
das ist der Schlüssel, der die Verknüpfung kappt: Sobald diese Felder weg sind, gibt
|
|
64
|
+
es keinen Rückweg von der UUID in `created_by` zu einer realen Identität mehr. Die
|
|
65
|
+
UUID bleibt als stabiler, aber orphaned Pseudonym-Wert bestehen, bis die
|
|
66
|
+
Retention-Policy irgendwann das Event selbst löscht.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 3. Compliance-Profile
|
|
71
|
+
|
|
72
|
+
| Profil | gracePeriod | exportDownloadTtl | Stale-After | Sub-Processors |
|
|
73
|
+
|--------|-------------|-------------------|-------------|----------------|
|
|
74
|
+
| `eu-dsgvo` | 30d | 7d | 30d | per Tenant konfigurierbar |
|
|
75
|
+
| `swiss-dsg` | 30d | 7d | 30d | + EDÖB-Meldepfad |
|
|
76
|
+
| `de-hr-dsgvo-hgb` | 30d | 7d | 30d | + HR-Aufbewahrung 10y für HR-Entities (anonymize statt delete) |
|
|
77
|
+
| `minimal-no-region` | 30d | 7d | 30d | Migration-Edge-Case ohne Region |
|
|
78
|
+
|
|
79
|
+
Tenant kann via `compliance-profiles:write:set-profile` + Override (`override.userRights.gracePeriod={ days: N }` etc.) eigene Werte setzen.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 4. Technische und Organisatorische Maßnahmen (TOM)
|
|
84
|
+
|
|
85
|
+
Eingebaute Schutzmaßnahmen — können 1:1 in den AVV-Anhang "Technische
|
|
86
|
+
und Organisatorische Maßnahmen" übernommen werden:
|
|
87
|
+
|
|
88
|
+
### Vertraulichkeit / Zugriffskontrolle
|
|
89
|
+
|
|
90
|
+
- **Magic-Link-Token-Hashing**: Plain-Token landet NIE in DB / Event-Store. SHA-256-Hash via `crypto.subtle.digest` (Web-Crypto-API). Plain-Token kommt nur ephemeral via Email-Callback an die App-Author-Implementation.
|
|
91
|
+
- **Download-Token Multi-Use within TTL**: kein consume-on-use (Pattern Google Takeout) — User kann ZIP mehrfach laden, aber TTL gilt absolut.
|
|
92
|
+
- **Audit-Felder am Token**: useCount, lastUsedAt, lastUsedFromIp, lastUsedUserAgent. Operator sieht ob Token mehrfach verwendet wurde, von welcher IP.
|
|
93
|
+
- **Account-weite Auskunft via `ctx.db.raw`**: `my-audit-log` umgeht TenantDb-Auto-Filter explizit (Account-weite Sicht für Art. 15 ist Pflicht); Sicherung über hard-coded `WHERE createdBy = ctx.user.id` (kein userId-Parameter, kein Cross-User-Snooping möglich).
|
|
94
|
+
- **Cross-User-Schutz im Download-Pfad**: `download-by-job` checkt `jobRow.userId === session.user.id` — User kann nur eigene Jobs laden.
|
|
95
|
+
- **Restriction killt Sessions**: `restrict-account` triggert `sessions.revokeAllForUser` — restricted User kann existierende Tabs nicht weiternutzen.
|
|
96
|
+
|
|
97
|
+
### Integrität
|
|
98
|
+
|
|
99
|
+
- **Event-Sourcing first-class**: alle DSGVO-Schreib-Operationen (request-deletion, restrict, lift, request-export) sind Events im `kumiko_events`-Store mit `version_conflict`-Schutz.
|
|
100
|
+
- **Forget-Strategy aus `data-retention`**: Cleanup-Runner konsultiert `retention.policyFor` pro Entity — `blockDelete` für gesetzliche Aufbewahrungspflicht (HR/HGB), `anonymize` als Alternative zu `hardDelete`.
|
|
101
|
+
- **Strategy-respect-Pattern in Default-Hooks**: user-Hook anonymisiert mit Sentinel-Pattern `deleted-<id>@anonymized.invalid` — Unique-Constraint + FK-Refs bleiben intakt.
|
|
102
|
+
|
|
103
|
+
### Verfügbarkeit / Belastbarkeit
|
|
104
|
+
|
|
105
|
+
- **Best-Effort-Audit beim Download**: Audit-INSERT in `read_download_attempts` ist `try/catch` swallowed — Audit-Failure killt nicht den User-facing 4xx.
|
|
106
|
+
- **Idempotenz im Export-Job**: `ACTIVE_JOB_CONSTRAINT` (UNIQUE-Index auf `(userId, status='active')`) verhindert Doppel-Jobs. Worker-Crash → Job bleibt `running`, Recovery-Pfad via Job-Run-Tracking aus `jobs`-Feature.
|
|
107
|
+
- **Per-User Sub-TX im Forget-Runner**: Ein User-Hook-Throw rollback'd nur diesen User; andere User im Batch laufen weiter.
|
|
108
|
+
- **Best-Effort-Notification-Callbacks**: send-Throw für Job A killt nicht Batch B/C (Memory: Atom 5.fix3).
|
|
109
|
+
|
|
110
|
+
### Brute-Force-Schutz
|
|
111
|
+
|
|
112
|
+
- **Edge-Rate-Limit auf Download-Endpoint**: `rateLimit: { per: "ip", limit: 30, windowSeconds: 60 }` für `download-by-token`.
|
|
113
|
+
- **Download-Attempt-Audit** mit 90d hardDelete: invalid Versuche werden persistiert für DPO-Detection, Tabelle ist begrenzt → kein Disk-Bomb durch Brute-Force.
|
|
114
|
+
- **Token-Hash-Suchraum**: 32-Byte-Random = 256 Bit, Brute-Force über Edge-Limit praktisch nicht möglich.
|
|
115
|
+
|
|
116
|
+
### Zweckbindung / Datenminimierung
|
|
117
|
+
|
|
118
|
+
- **Export-Bundle Default-PII-Filter**: user-Hook entfernt `passwordHash`, `roles`, `status` aus dem Bundle (App-Author kann das per Custom-Hook überschreiben).
|
|
119
|
+
- **fileRefs separat**: Export-Bundle enthält Datei-Metadaten (id, fileName, mimeType, size); Binaries werden via signed-URL separat ins ZIP gepackt — kein Inline-Base64-Memory-Druck.
|
|
120
|
+
|
|
121
|
+
### Auftragskontrolle (gegenüber Sub-Processors)
|
|
122
|
+
|
|
123
|
+
- **Storage-Provider als Plugin** (`file-foundation` + `file-provider-{s3,inmemory}`): App-Author wählt Provider; AVV mit S3-Hoster (Hetzner / AWS) ist vom Provider abhängig.
|
|
124
|
+
- **Email-Transport als Plugin** (`mail-foundation` + `mail-transport-{smtp,inmemory}`): SMTP / SES / Resend per Plugin austauschbar.
|
|
125
|
+
- **`compliance-profiles:query:sub-processors`**: Per-Tenant Liste der aktiven Sub-Processors, abrufbar für AVV-Anhang.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 5. Cron-Jobs / Operationale Trigger
|
|
130
|
+
|
|
131
|
+
| Job | Trigger | Was passiert | Operator-Sichtbarkeit |
|
|
132
|
+
|-----|---------|--------------|------------------------|
|
|
133
|
+
| `run-forget-cleanup` | Cron (per App-Author konfigurierbar, typisch täglich) | Findet User mit abgelaufener Grace, ruft `EXT_USER_DATA.delete` pro Provider, anonymisiert User, sendet `sendDeletionExecutedEmail`-Callback | `read_job_runs` (success/fail), Hook-Errors als `errors[]` im Result |
|
|
134
|
+
| `run-export-jobs` | Cron + Event-getriggert | Findet pending Export-Jobs, ruft `runUserExport` → ZIP-Bau → Storage-Upload → Magic-Link-Token → `sendExportReadyEmail` | `read_job_runs`, `read_export_jobs.status` |
|
|
135
|
+
| `data-retention-cleanup` | Cron (in `data-retention`) | Cleant abgelaufene Rows pro Entity per `retention.keepFor` | `read_job_runs` |
|
|
136
|
+
| Token-Cleanup (implizit) | Per `compliance-profiles.userRights.exportDownloadTtl` | Worker-Job entfernt expired Magic-Link-Tokens + Storage-Binaries | `read_export_download_tokens` |
|
|
137
|
+
| Download-Attempt-Cleanup | Per Entity-Default 90d | Cleant `read_download_attempts` | — |
|
|
138
|
+
|
|
139
|
+
App-Author registriert die Cron-Trigger im run-config; `jobs`-Feature
|
|
140
|
+
persistiert Run-Tracking + Retry-Pfad.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 6. Doku-Snippets für Marc
|
|
145
|
+
|
|
146
|
+
### Datenschutzerklärung — Betroffenenrechte
|
|
147
|
+
|
|
148
|
+
> **Recht auf Auskunft (Art. 15 DSGVO):** Sie können jederzeit eine
|
|
149
|
+
> Kopie aller bei uns über Sie gespeicherten Daten anfordern. Über die
|
|
150
|
+
> Funktion "Daten exportieren" in den Account-Einstellungen erhalten
|
|
151
|
+
> Sie ein vollständiges JSON-/ZIP-Bundle Ihrer Profildaten, hochgeladenen
|
|
152
|
+
> Dateien und [App-Author: Domain-Daten ergänzen] per signed Magic-Link
|
|
153
|
+
> auf Ihre hinterlegte E-Mail-Adresse. Der Link ist 7 Tage gültig.
|
|
154
|
+
|
|
155
|
+
> **Recht auf Löschung (Art. 17 DSGVO):** Über "Account löschen" können
|
|
156
|
+
> Sie Ihren Account jederzeit zur Löschung vormerken. Es gilt eine
|
|
157
|
+
> Karenzzeit von 30 Tagen, in der Sie den Antrag widerrufen können
|
|
158
|
+
> (Funktion "Löschung widerrufen"). Nach Ablauf werden Ihre Daten
|
|
159
|
+
> automatisch gelöscht oder anonymisiert. Daten mit gesetzlicher
|
|
160
|
+
> Aufbewahrungspflicht (z. B. Rechnungen nach §147 AO) bleiben bis zum
|
|
161
|
+
> Fristablauf gesperrt erhalten und werden danach automatisch gelöscht.
|
|
162
|
+
|
|
163
|
+
> **Recht auf Einschränkung (Art. 18 DSGVO):** Auf begründeten Antrag
|
|
164
|
+
> kann Ihr Account temporär gesperrt werden. Während der Sperre können
|
|
165
|
+
> Sie sich nicht mehr einloggen, Ihre Daten werden aber nicht gelöscht
|
|
166
|
+
> oder verändert.
|
|
167
|
+
|
|
168
|
+
### AVV-TOM-Anhang
|
|
169
|
+
|
|
170
|
+
Für den AVV-Anhang "Technische und Organisatorische Maßnahmen" siehe
|
|
171
|
+
**Abschnitt 4** dieses Dokuments — komplette Liste mit Verweisen auf
|
|
172
|
+
die Code-Implementierung.
|
|
173
|
+
|
|
174
|
+
### Verarbeitungsverzeichnis
|
|
175
|
+
|
|
176
|
+
Spalte "Speicherorte / Empfänger" → siehe **Abschnitt 2** (Tabellen-
|
|
177
|
+
Übersicht). Spalte "Löschfristen" → siehe **Abschnitt 3** + Spalte
|
|
178
|
+
"Retention" in Abschnitt 2.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 7. Was NICHT in diesem Framework abgedeckt ist
|
|
183
|
+
|
|
184
|
+
Bewusst ausserhalb — App-Author-Verantwortung:
|
|
185
|
+
|
|
186
|
+
- **Auswahl + AVV mit konkretem Storage-Provider** (Hetzner / AWS / etc.)
|
|
187
|
+
- **Auswahl + AVV mit konkretem Email-Provider** (SMTP-Host / SES / Resend)
|
|
188
|
+
- **Datenpannen-Meldung** an Aufsichtsbehörde (organisatorisch, nicht technisch)
|
|
189
|
+
- **DSFA** (Datenschutz-Folgenabschätzung) — Framework liefert die TOM-Inputs, App-Author macht die Bewertung
|
|
190
|
+
- **Cookie-Consent-Layer** (das ist Frontend-Sache + separate consent-Feature, nicht Teil von user-data-rights)
|
|
191
|
+
- **Tenant-Lifecycle-Destroy** (Account-Löschung des Tenants selbst, nicht der User darin) — kommt als separates `tenant-lifecycle`-Feature in Sprint 5
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Referenzen
|
|
196
|
+
|
|
197
|
+
- Code: `packages/bundled-features/src/user-data-rights/`
|
|
198
|
+
- Default-Hooks: `packages/bundled-features/src/user-data-rights-defaults/`
|
|
199
|
+
- Compliance-Profile: `packages/bundled-features/src/compliance-profiles/`
|
|
200
|
+
- Retention-Engine: `packages/bundled-features/src/data-retention/`
|
|
201
|
+
- Sample-App: `samples/apps/user-data-rights-demo/`
|
|
202
|
+
- Tests: `packages/bundled-features/src/user-data-rights/__tests__/` (188 Tests)
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# user-data-rights
|
|
2
|
+
|
|
3
|
+
DSGVO Art. 15 (Auskunft) + Art. 17 (Löschung) + Art. 18 (Restriction) +
|
|
4
|
+
Art. 20 (Portabilität) als Core-Feature.
|
|
5
|
+
|
|
6
|
+
**Status:** S2 abgeschlossen — alle Endpoints, Hooks, Default-Provider,
|
|
7
|
+
Cron-Pipeline, Tests + Sample wired.
|
|
8
|
+
|
|
9
|
+
## Pattern
|
|
10
|
+
|
|
11
|
+
Statt jedes Feature seine eigene Forget-/Export-Logik schreibt, hängt
|
|
12
|
+
es sich via `r.useExtension(EXT_USER_DATA, "<entity>", { export, delete })`
|
|
13
|
+
an. user-data-rights orchestriert Export- und Forget-Pipeline:
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
defineFeature("tasks", (r) => {
|
|
17
|
+
r.requires("user-data-rights");
|
|
18
|
+
r.useExtension(EXT_USER_DATA, "task", {
|
|
19
|
+
export: async (ctx) => ({
|
|
20
|
+
entity: "task",
|
|
21
|
+
rows: await ctx.db.select().from(tasksTable)
|
|
22
|
+
.where(eq(tasksTable.authorId, ctx.userId)),
|
|
23
|
+
}),
|
|
24
|
+
delete: async (ctx, strategy) => {
|
|
25
|
+
if (strategy === "anonymize") {
|
|
26
|
+
await ctx.db.update(tasksTable).set({ authorId: null })
|
|
27
|
+
.where(eq(tasksTable.authorId, ctx.userId));
|
|
28
|
+
} else {
|
|
29
|
+
await ctx.db.delete(tasksTable)
|
|
30
|
+
.where(eq(tasksTable.authorId, ctx.userId));
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Hook-Signaturen in `framework/src/engine/extensions/user-data.ts`:
|
|
38
|
+
|
|
39
|
+
- `UserDataExportHook(ctx) => Promise<UserDataExportSnippet | null>`
|
|
40
|
+
- `UserDataDeleteHook(ctx, strategy) => Promise<void>`
|
|
41
|
+
- `UserDataDeleteStrategy = "delete" | "anonymize"`
|
|
42
|
+
|
|
43
|
+
## Endpoints
|
|
44
|
+
|
|
45
|
+
| Article | Handler | Zweck |
|
|
46
|
+
|---------|---------|-------|
|
|
47
|
+
| Art. 15 | `user-data-rights:query:my-audit-log` | User sieht eigene Framework-Events (account-weit über alle Memberships). Domain-Entities ohne `ctx.appendEvent` erscheinen NICHT — nur im Export-Bundle. |
|
|
48
|
+
| Art. 15+20 | `user-data-rights:write:request-export` | Async Job → ZIP mit user-Profil + fileRefs + alle EXT_USER_DATA-Provider-Daten + signed Magic-Link |
|
|
49
|
+
| Art. 17 | `user-data-rights:write:request-deletion` | Soft-Delete mit Grace-Period, anschließend Cron anonymisiert User + cleant Domain-Entities |
|
|
50
|
+
| Art. 17 | `user-data-rights:write:cancel-deletion` | User widerruft seinen Forget-Request während der Grace |
|
|
51
|
+
| Art. 18 | `user-data-rights:write:restrict-account` | Auth-Middleware blockt Logins bis Lift |
|
|
52
|
+
| Art. 18 | `user-data-rights:write:lift-restriction` | Admin/SystemAdmin hebt Restriction auf |
|
|
53
|
+
| Operator | `user-data-rights:query:list-download-attempts` | DPO-Sicht auf invalid Download-Versuche (Brute-Force-Detection, Admin/SystemAdmin only) |
|
|
54
|
+
|
|
55
|
+
Plus 2 anonyme HTTP-Routes für Export-Download (Magic-Link-Pfad +
|
|
56
|
+
session-auth-Pfad), siehe `handlers/download-by-{token,job}.query.ts`.
|
|
57
|
+
|
|
58
|
+
## Cross-Feature-API
|
|
59
|
+
|
|
60
|
+
**Exposes:**
|
|
61
|
+
- `userDataRights.runExport` — über die public Runner-Exports
|
|
62
|
+
(`runUserExport`, `runForgetCleanup`)
|
|
63
|
+
- `userDataRights.runForget`
|
|
64
|
+
|
|
65
|
+
**Uses:**
|
|
66
|
+
- `compliance.forTenant` (Grace-Period aus Profile)
|
|
67
|
+
- `retention.policyFor` (blockDelete-Konsultation, anonymize statt delete)
|
|
68
|
+
- `sessions.revokeAllForUser` (Restriction killt aktive Sessions)
|
|
69
|
+
|
|
70
|
+
## Default-Hooks (`user-data-rights-defaults`)
|
|
71
|
+
|
|
72
|
+
Optional-mountbares Sub-Feature liefert Default-Hooks für
|
|
73
|
+
Core-Entities `user` (anonymize: email→`deleted-<id>@anonymized.invalid`,
|
|
74
|
+
displayName→`(deleted)`, passwordHash=null) und `fileRef` (delete: row +
|
|
75
|
+
storage-binary; anonymize: insertedById=null). App-Author kann es
|
|
76
|
+
weglassen wenn er Custom-Hooks registrieren will.
|
|
77
|
+
|
|
78
|
+
## Audit-Trail
|
|
79
|
+
|
|
80
|
+
| Tabelle | Zweck | Retention |
|
|
81
|
+
|---------|-------|-----------|
|
|
82
|
+
| `kumiko_events` | Framework-Event-Store, Quelle für `my-audit-log` | per Domain-Policy |
|
|
83
|
+
| `read_export_jobs` | Async Export-Status (queued / done / failed) | per `compliance-profiles` |
|
|
84
|
+
| `read_export_download_tokens` | Magic-Link-Hash + TTL + lastUsed-Audit | per `compliance-profiles` (default `exportDownloadTtl`) |
|
|
85
|
+
| `read_download_attempts` | Invalid-Download-Versuche für DPO-Brute-Force-Detection | **90d hardDelete** (Entity-Default — schützt vor Disk-Bomb bei aktiven Angriffen) |
|
|
86
|
+
|
|
87
|
+
## Tests
|
|
88
|
+
|
|
89
|
+
18 Testdateien, 188 Tests, alle grün:
|
|
90
|
+
|
|
91
|
+
| Datei | Pinst |
|
|
92
|
+
|-------|-------|
|
|
93
|
+
| `audit-log.integration.test.ts` | Cross-User-Isolation, Account-weite Sicht, eventType-Filter, Admin-only operator-query, download-attempt 90d-retention |
|
|
94
|
+
| `cross-data-matrix.integration.test.ts` | 3-Provider-Pipeline (user + fileRef + custom-domain), Cross-Tenant Forget mit user-anonymize, Other-User-Isolation |
|
|
95
|
+
| `download.integration.test.ts` | HTTP-e2e via `r.httpRoute`: Magic-Link, multi-use, expired, failed-job, storage-cleared, cross-tenant-same-user, malicious-filename |
|
|
96
|
+
| `request-export.integration.test.ts` | Idempotency, active-job-constraint, cross-tenant-anyMember-userId-pattern |
|
|
97
|
+
| `request-deletion-callback.integration.test.ts` + `request-cancel-deletion.integration.test.ts` | Grace + Cancel-Pfad + Email-Callback best-effort |
|
|
98
|
+
| `restriction-flow.integration.test.ts` | Status-Flip + Auth-Middleware-Block + Lift |
|
|
99
|
+
| `run-{export-jobs,forget-cleanup,user-export}.integration.test.ts` | Worker-Logic + Idempotency + Email-Callbacks |
|
|
100
|
+
| `policy-to-strategy.test.ts` | Retention.strategy → UserDataDeleteStrategy mapping |
|
|
101
|
+
| `user-data-rights.integration.test.ts` | Boot-Smoke + Feature-Meta |
|
|
102
|
+
| `token-helpers.test.ts` + `zip-path.test.ts` | Token-Hashing + Path-Traversal-Schutz |
|
|
103
|
+
| `export-job-{idempotency,schema}.test.ts` | Active-job-uniqueness + Schema-Constraints |
|
|
104
|
+
|
|
105
|
+
## Sample
|
|
106
|
+
|
|
107
|
+
`samples/apps/user-data-rights-demo` — runnable Demo mit todos-Domain,
|
|
108
|
+
EXT_USER_DATA-Hook für strategy-aware delete (anonymize → authorId=null,
|
|
109
|
+
delete → DROP), 3 living-doc Integration-Tests.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// Audit-Helper fuer Download-Endpoint (S2.U3 Atom 4b).
|
|
2
|
+
//
|
|
3
|
+
// Beim Download (Token-Pfad oder Job-Pfad) werden Audit-Felder am
|
|
4
|
+
// Token-Row aktualisiert:
|
|
5
|
+
// - useCount + 1
|
|
6
|
+
// - lastUsedAt = now
|
|
7
|
+
// - lastUsedFromIp = caller-IP (X-Forwarded-For oder Connection-IP)
|
|
8
|
+
// - lastUsedUserAgent = UA-Header
|
|
9
|
+
//
|
|
10
|
+
// **Best-Effort-Update:** version-conflicts (zwei parallel-Downloads
|
|
11
|
+
// raceen um den update) werden silent geswallowt — Audit ist "letzter
|
|
12
|
+
// Use", nicht "alle Uses". Der zweite Download succeeded trotzdem
|
|
13
|
+
// (kein download-block bei race).
|
|
14
|
+
//
|
|
15
|
+
// **ES via tokenCrud.update:** kein direct-UPDATE. Memory
|
|
16
|
+
// `feedback_no_fake_dispatcher` + `feedback_event_store_tenant_consistency`.
|
|
17
|
+
|
|
18
|
+
import type { DbRunner } from "@cosmicdrift/kumiko-framework/db";
|
|
19
|
+
import { createEventStoreExecutor, createTenantDb } from "@cosmicdrift/kumiko-framework/db";
|
|
20
|
+
import { createSystemUser, type TenantId } from "@cosmicdrift/kumiko-framework/engine";
|
|
21
|
+
import type { getTemporal } from "@cosmicdrift/kumiko-framework/time";
|
|
22
|
+
import { tokenCrud } from "./run-export-jobs.js";
|
|
23
|
+
import { downloadAttemptEntity, downloadAttemptsTable } from "./schema/download-attempt.js";
|
|
24
|
+
|
|
25
|
+
const attemptCrud = createEventStoreExecutor(downloadAttemptsTable, downloadAttemptEntity, {
|
|
26
|
+
entityName: "download-attempt",
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
type Instant = InstanceType<ReturnType<typeof getTemporal>["Instant"]>;
|
|
30
|
+
|
|
31
|
+
export interface RecordDownloadUseArgs {
|
|
32
|
+
readonly db: DbRunner;
|
|
33
|
+
readonly tokenId: string;
|
|
34
|
+
readonly tokenVersion: number;
|
|
35
|
+
readonly tokenUseCount: number;
|
|
36
|
+
/**
|
|
37
|
+
* Tenant fuer die system-mode-TenantDb. ExportDownloadToken ist
|
|
38
|
+
* tenant-agnostisch (1:1 zum tenant-agnostic Job), aber der event-
|
|
39
|
+
* store-Stream-Lookup braucht einen Tenant-Context. Wir nutzen
|
|
40
|
+
* job.requestedFromTenantId — dieselbe Identitaet wie beim
|
|
41
|
+
* Token-Create im Worker (Atom 4a).
|
|
42
|
+
*/
|
|
43
|
+
readonly tenantId: TenantId;
|
|
44
|
+
readonly now: Instant;
|
|
45
|
+
readonly ip: string | null;
|
|
46
|
+
readonly userAgent: string | null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Audit-Update: useCount, lastUsedAt, IP, UA. Best-effort —
|
|
51
|
+
* version-conflicts (parallel-downloads) werden swallowed, Download
|
|
52
|
+
* succeeded trotzdem.
|
|
53
|
+
*/
|
|
54
|
+
export async function recordDownloadUse(args: RecordDownloadUseArgs): Promise<void> {
|
|
55
|
+
const { db, tokenId, tokenVersion, tokenUseCount, tenantId, now, ip, userAgent } = args;
|
|
56
|
+
const executor = createSystemUser(tenantId);
|
|
57
|
+
const tdb = createTenantDb(db, tenantId, "system");
|
|
58
|
+
|
|
59
|
+
await tokenCrud
|
|
60
|
+
.update(
|
|
61
|
+
{
|
|
62
|
+
id: tokenId,
|
|
63
|
+
version: tokenVersion,
|
|
64
|
+
changes: {
|
|
65
|
+
useCount: tokenUseCount + 1,
|
|
66
|
+
lastUsedAt: now,
|
|
67
|
+
lastUsedFromIp: ip,
|
|
68
|
+
lastUsedUserAgent: userAgent,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
executor,
|
|
72
|
+
tdb,
|
|
73
|
+
)
|
|
74
|
+
.catch(() => {
|
|
75
|
+
// version-conflict bei parallelen Downloads → der erste hat
|
|
76
|
+
// bereits useCount inkrementiert. Wir behalten den Audit-Eintrag
|
|
77
|
+
// des ersten Downloads (lastUsedAt etc.). Kein download-block.
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// extractCallerIp lebt in feature.ts (extractAuditMeta) — query-handler
|
|
82
|
+
// haben keinen direkten Header-Zugriff (transport-agnostic), httpRoute-
|
|
83
|
+
// Wrapper extrahiert + steckt in payload.auditMeta.
|
|
84
|
+
|
|
85
|
+
export type DownloadAttemptResult = "notFound" | "expired" | "failed" | "signedUrlNotSupported";
|
|
86
|
+
|
|
87
|
+
export interface RecordInvalidAttemptArgs {
|
|
88
|
+
readonly db: DbRunner;
|
|
89
|
+
readonly tenantId: TenantId;
|
|
90
|
+
readonly now: Instant;
|
|
91
|
+
readonly result: DownloadAttemptResult;
|
|
92
|
+
readonly via: "token" | "job";
|
|
93
|
+
readonly tokenHash: string | null;
|
|
94
|
+
readonly jobId: string | null;
|
|
95
|
+
readonly attemptedByUserId: string | null;
|
|
96
|
+
readonly ip: string | null;
|
|
97
|
+
readonly userAgent: string | null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Best-effort INSERT in read_download_attempts. Throws im Audit-Pfad
|
|
101
|
+
// duerfen den Download-Endpoint nicht killen (User soll seinen 404
|
|
102
|
+
// bekommen, nicht 500); failures werden silent geswallowt.
|
|
103
|
+
export async function recordInvalidAttempt(args: RecordInvalidAttemptArgs): Promise<void> {
|
|
104
|
+
const { db, tenantId, now } = args;
|
|
105
|
+
const executor = createSystemUser(tenantId);
|
|
106
|
+
const tdb = createTenantDb(db, tenantId, "system");
|
|
107
|
+
await attemptCrud
|
|
108
|
+
.create(
|
|
109
|
+
{
|
|
110
|
+
result: args.result,
|
|
111
|
+
via: args.via,
|
|
112
|
+
tokenHash: args.tokenHash,
|
|
113
|
+
jobId: args.jobId,
|
|
114
|
+
attemptedByUserId: args.attemptedByUserId,
|
|
115
|
+
ip: args.ip,
|
|
116
|
+
userAgent: args.userAgent,
|
|
117
|
+
attemptedAt: now,
|
|
118
|
+
},
|
|
119
|
+
executor,
|
|
120
|
+
tdb,
|
|
121
|
+
)
|
|
122
|
+
.catch(() => {
|
|
123
|
+
// best-effort
|
|
124
|
+
});
|
|
125
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EXT_USER_DATA,
|
|
3
|
+
type FeatureDefinition,
|
|
4
|
+
type ResolvedPiiFlags,
|
|
5
|
+
} from "@cosmicdrift/kumiko-framework/engine";
|
|
6
|
+
import { entitiesOf } from "../shared/index.js";
|
|
7
|
+
|
|
8
|
+
// V2: export-without-erase gate. A feature that registers an EXT_USER_DATA
|
|
9
|
+
// export hook without a matching delete hook exports data under Art.20 but
|
|
10
|
+
// never erases it on forget — an Art.17 violation. Hard boot failure: no app
|
|
11
|
+
// should ship a GDPR export path with no erase path. Registry-level signal
|
|
12
|
+
// only; runtime no-ops (a delete hook that silently skips) are not detectable
|
|
13
|
+
// here — those are covered by the export/forget integration tests.
|
|
14
|
+
//
|
|
15
|
+
// Registered as an `r.bootCheck()` by this feature (#1314) — EXT_USER_DATA is
|
|
16
|
+
// owned by user-data-rights (r.extendsRegistrar(EXT_USER_DATA, {})), so any
|
|
17
|
+
// r.useExtension(EXT_USER_DATA, ...) usage across the app already requires
|
|
18
|
+
// user-data-rights to be mounted (boot-validator's extension-provider check
|
|
19
|
+
// fails otherwise); running this from user-data-rights' own bootCheck is
|
|
20
|
+
// equivalent to the framework-internal call it replaces.
|
|
21
|
+
export function validateGdprHookCompleteness(features: readonly FeatureDefinition[]): void {
|
|
22
|
+
for (const feature of features) {
|
|
23
|
+
for (const usage of feature.extensionUsages) {
|
|
24
|
+
if (usage.extensionName !== EXT_USER_DATA) continue;
|
|
25
|
+
const hasExport = typeof usage.options?.["export"] === "function";
|
|
26
|
+
const hasDelete = typeof usage.options?.["delete"] === "function";
|
|
27
|
+
if (hasExport && !hasDelete) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
`[kumiko:boot] Feature "${feature.name}" exports entity "${usage.entityName}" via EXT_USER_DATA but registers no delete hook — data is included in Art.20 exports but never erased on forget (Art.17 violation). Add a delete hook. If erasure is intentionally handled elsewhere (e.g. crypto-shredding key-erase, parent cascade), register a no-op delete: async () => {} with a comment explaining why.`,
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// V3: PII-entity-without-hook gate. V2 checks registered hooks for
|
|
37
|
+
// completeness; V3 catches the entity nobody registered at all — fields
|
|
38
|
+
// annotated as user-subject data (pii / userOwned / subjectRef) yet
|
|
39
|
+
// invisible to the Art.15/20 export and Art.17 forget pipeline. Hard boot
|
|
40
|
+
// failure: a
|
|
41
|
+
// subject-data entity that skips the pipeline is exactly the "feature built
|
|
42
|
+
// past GDPR" leak this gate exists to stop. No "is user-data-rights mounted"
|
|
43
|
+
// guard needed here (unlike the framework-internal predecessor) — this runs
|
|
44
|
+
// as user-data-rights' own bootCheck, so it's only reachable when mounted.
|
|
45
|
+
// Matching is by entity name across all features (usage.entityName is
|
|
46
|
+
// unqualified); a same-named entity in another feature can mask a gap —
|
|
47
|
+
// accepted, as the common case is a distinct entity name.
|
|
48
|
+
export function validateGdprPiiHookCoverage(features: readonly FeatureDefinition[]): void {
|
|
49
|
+
const hookedEntities = new Set<string>();
|
|
50
|
+
for (const f of features) {
|
|
51
|
+
for (const usage of f.extensionUsages) {
|
|
52
|
+
if (usage.extensionName === EXT_USER_DATA) hookedEntities.add(usage.entityName);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
for (const feature of features) {
|
|
57
|
+
for (const [entityName, entity] of entitiesOf(feature)) {
|
|
58
|
+
if (hookedEntities.has(entityName)) continue;
|
|
59
|
+
const subjectFields = Object.entries(entity.fields)
|
|
60
|
+
.filter(([, field]) => {
|
|
61
|
+
const annot = field as ResolvedPiiFlags; // @cast-boundary schema-walk
|
|
62
|
+
return Boolean(annot.pii) || Boolean(annot.userOwned) || Boolean(annot.subjectRef);
|
|
63
|
+
})
|
|
64
|
+
.map(([name]) => name);
|
|
65
|
+
if (subjectFields.length === 0) continue;
|
|
66
|
+
throw new Error(
|
|
67
|
+
`[kumiko:boot] Entity "${entityName}" (feature "${feature.name}") has user-subject fields (${subjectFields.join(", ")}) but no feature registers an EXT_USER_DATA hook for it — the data never appears in Art.15/20 exports and is never erased on forget (Art.17 gap). Register r.useExtension(EXT_USER_DATA, "${entityName}", { export, delete }) in the owning feature or a defaults feature. If this entity is intentionally out of the pipeline (e.g. crypto-shredding key-erase covers it), register a no-op hook { export: async () => null, delete: async () => {} } with a comment explaining why.`,
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.338.0",
|
|
4
|
+
"type": "fix",
|
|
5
|
+
"title": "Forget cleanup covers tenants the user already left",
|
|
6
|
+
"detail": "`runForgetCleanup` builds the per-user tenant list from live memberships plus the user's `tenant-membership.created` history (read from the event payload, so cross-tenant SystemAdmin adds count too), deduplicated. Delete hooks, such as the notes-history mention shred, therefore also run in tenants the user left before the request. The `tenantIdsBeforeDelete` list passed to the deletion-executed mail still contains only the live memberships. Mentions written before notes recorded structured mention rows for non-members are not covered."
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"version": "0.335.0",
|
|
10
|
+
"type": "fix",
|
|
11
|
+
"title": "Public deletion and download handlers rate-limit per IP and handler"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"version": "0.335.0",
|
|
15
|
+
"type": "fix",
|
|
16
|
+
"title": "Export cleanup reports a last-run timestamp gauge and still reports backlog age when the pass throws",
|
|
17
|
+
"detail": "The export storage-cleanup pass now also reports an `export_cleanup_last_run_timestamp` gauge (Unix seconds, set only when a pass completes) so a stalled cron can be alerted on with `time() - metric > interval + buffer`; the backlog gauge keeps its last value when the cron stops, so `absent()` never fires. The backlog gauge is now reported even when the pass throws. The workflow-runner event wakeup uses the framework `getTemporal()` instead of the global `Temporal`, and a redelivered `workflow.waiting-for-event` no longer resets an already matched trigger."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"version": "0.335.0",
|
|
21
|
+
"type": "fix",
|
|
22
|
+
"title": "Backlog gauge covers failed export orphans, explainer labels translated, unattributed escape-hatch actor constant",
|
|
23
|
+
"detail": "`OWNER_INVITE_ROLE_OPTIONS` is now exported from the tenant barrel so apps can compose it into custom invite screens. The privacy-center and profile deletion explainer descriptions are registered as `i18nKey()` labels with server-side English translations. The export storage-cleanup backlog gauge now also covers failed jobs with an orphaned ZIP. Escape-hatch audit events from the forget-cleanup, user-export and tenant-lifecycle runners use the exported `UNATTRIBUTED_ACTOR` constant (value `\"system\"`, unchanged) when no actor is passed. Deletion requests no longer query the tenant compliance profile for users that are not active."
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"version": "0.335.0",
|
|
27
|
+
"type": "fix",
|
|
28
|
+
"title": "cancel-deletion actions declare the x icon instead of resolving to the destructive trash icon"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"version": "0.330.0",
|
|
32
|
+
"type": "fix",
|
|
33
|
+
"title": "The privacy-center restriction and deletion dialog titles are registered in English by the feature",
|
|
34
|
+
"detail": "The new i18n-parity test in `use-all-bundled` harvests the English copy from the real registrations (feature translations, client plugins, renderer defaults, mail templates) and fails with `key -> locale` when `locale-de` or `locale-es` lacks a key or an en-catalog drifts. This added the missing German and Spanish copy for billing plans, the privacy-center status field and many more keys, and removed 110 translation keys no feature registers any more. German uses \"Ereignisprotokoll\" for the audit log everywhere. `userDataRights.privacyCenter.restriction.dialogTitle` and `.deletion.dialogTitle` are registered in English by the feature."
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"version": "0.320.0",
|
|
38
|
+
"type": "fix",
|
|
39
|
+
"title": "Audit IP comes from the framework's trustedProxyHops-aware resolver, not a self-parsed X-Forwarded-For",
|
|
40
|
+
"detail": "`extractAuditMeta` no longer reads `X-Forwarded-For`/`X-Real-IP` itself —\nit takes the `clientIp` the `/user-export/by-token` httpRoute handler now\nreceives from `HttpRouteHandlerDeps`, mapping the resolver's `unknown`\nsentinel to `null`. Closes the spoofed-first-XFF-entry gap for that\nroute. A caller invoking `/api/query`'s `download-by-token` handler\ndirectly (not through this httpRoute) can still pass its own `auditMeta`\nin the payload — a pre-existing, documented tradeoff (the handler's own\ncomment: audit data isn't security-relevant), unchanged by this fix."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"version": "0.313.0",
|
|
44
|
+
"type": "fix",
|
|
45
|
+
"title": "Privacy-center screen subtitle is now translatable",
|
|
46
|
+
"detail": "The Privacy screen's description was hardcoded English prose baked\ninto feature.ts instead of an i18n key, so it never localized. It's\nnow userDataRights.privacyCenter.subtitle, registered in i18n.ts with\nde/es translations."
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"version": "0.308.0",
|
|
50
|
+
"type": "fix",
|
|
51
|
+
"title": "The privacy-center screen's \"restrict\" action declares an explicit icon",
|
|
52
|
+
"detail": "The boot validator now requires every projectionDetail action to resolve an icon (fw#3234); \"restrict\" resolved none from the shared id-derived map, so it now declares `icon: \"lock\"` explicitly. \"request-deletion\" needed no change — it now resolves via the shared map's new `deletion: \"trash\"` entry (@cosmicdrift/kumiko-types)."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"version": "0.289.0",
|
|
56
|
+
"type": "improvement",
|
|
57
|
+
"title": "Deletion tokens are genuinely single-use, and a losing redeem no longer leaks status",
|
|
58
|
+
"detail": "`redeemDeletionToken` previously carried an `unsafeSkip` and a separate status check before the lifecycle write, so two concurrent redemptions of the same token could both get through. The lifecycle transition now rides the executor's `expect:` precondition inside the anchor spend, so exactly one redemption wins.\nExternally visible: the loser of a concurrent redeem now receives the same generic `invalid_or_expired_token` reason on the anonymous path as an unknown token, instead of `cannot_process_deletion`. That was the point — the old reason distinguished \"known token, wrong state\" from \"unknown token\" to an unauthenticated caller. Integrators matching on the old string on that endpoint should expect the generic one.\n`pendingDeletionRequestId` is now cleared on confirm as well, closing a pre-existing gap. `skipOptimisticLock: true` stays in the lifecycle path and now carries the reason it is correct there: callers structurally never hold a row version to pass through."
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"version": "0.287.0",
|
|
62
|
+
"type": "improvement",
|
|
63
|
+
"title": "export-cleanup cron now emits an export_cleanup_backlog_age gauge to surface stalled runs",
|
|
64
|
+
"detail": "storageCleanupPass deletes expired export bundles via provider.delete, but the storage provider only exposes list() (no timestamps), so a silent failure left unencrypted PII bundles sitting in the bucket with no signal. runExportJobs now accepts an optional MetricsHandle and, after the cleanup loop, reports the age in seconds of the oldest done-status job whose expiresAt+grace has passed while downloadStorageKey is still set (0 if none) via the new EXPORT_CLEANUP_BACKLOG_AGE_METRIC (\"export_cleanup_backlog_age\", a gauge — no _total/_seconds suffix per validateMetricName, unit: \"seconds\" carried in the r.metric() definition instead). feature.ts's job handler builds the handle itself with createMetricsHandle(ctx.meter, \"user-data-rights\") since JobContext has no bound ctx.metrics (that only exists on HandlerContext, built per write/query dispatch) — falls back to createNoopMetricsHandle() when ctx.meter is unset. Metric emission is wrapped in try/catch so an observability hiccup never fails an otherwise-successful cleanup pass. Scope is deliberately done-status only; failed-status cleanup candidates have no expiresAt/TTL."
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"version": "0.287.0",
|
|
68
|
+
"type": "fix",
|
|
69
|
+
"title": "GDPR forget only hard-deletes files that are PII of the forgotten person",
|
|
70
|
+
"detail": "fileRefDeleteHook picked rows via insertedById (who uploaded the file) and treated every matched row the same on strategy=\"delete\", so forgetting an uploader hard-deleted third-party business files they had merely uploaded (e.g. a dealer's vehicle photos uploaded by an employee). FileFieldDef/ImageFieldDef/FilesFieldDef/ImagesFieldDef now support \"& ResolvedPiiFlags\" like every other field type (createFileField/createImageField/createFilesField/createImagesField thread personal/reason through expandPersonalAnnotations), and fileRefDeleteHook's strategy=\"delete\" branch splits rows per-row via the new isPersonalFileRow/isPersonalPiiField predicates: pii/userOwned/recordOwned fields take the existing hard-delete path (storageProvider.delete() + derivatives + row), every other row (explicit personal:false, tenantOwned, subjectRef, no annotation, or an unresolvable entity/field) goes through severPersonLink instead, same as the existing strategy=\"anonymize\" path. Unattached uploads (no entityType/fieldName) still hard-delete. Derivatives have no own file_refs row, so they keep following their original's decision (the #2461 \"GDPR derivatives survive forget\" test stays green). POST /files now resolves entityType/fieldName against the registry and rejects the upload with 400 when they're set but don't resolve to a real field, closing the gap that let a client attach a file to a field the forget-hook could never look up; both unset (unattached upload) still passes. No new column or migration — the decision uses the entityType/fieldName file_refs already stores."
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"version": "0.285.2",
|
|
74
|
+
"type": "fix",
|
|
75
|
+
"title": "export ZIPs write to exports/{tenantId}/{jobId}.zip, enabling one bucket-wide S3 lifecycle rule",
|
|
76
|
+
"detail": "buildExportStorageKey previously put the tenant first ({tenantId}/exports/{jobId}.zip), so no S3 prefix rule could target \"all tenants, then /exports/\" without also matching normal user uploads in the same bucket. The key now starts with the fixed exports/ segment via the new @cosmicdrift/kumiko-framework/files tenantExportPrefix() helper, tenant stays as the second segment. downloadStorageKey is stored per job and never recomputed, so existing rows keep resolving through their old key — no migration needed. tenantStoragePrefixes() (also new in framework/files) lists every prefix a tenant's binaries can live under; files-tenant-data's fileRefStorageDestroyHook now sweeps all of them on tenant-destroy instead of only {tenantId}/, closing a gap where a destroyed tenant's decrypted GDPR export bundles would have survived under the new exports/ prefix."
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"version": "0.241.0",
|
|
80
|
+
"type": "breaking",
|
|
81
|
+
"title": "privacy-center is now a declarative screen; userDataRightsClient's privacyCenter.showDeletion option is removed (fw#2312).",
|
|
82
|
+
"detail": "`privacy-center` is now a declarative `projectionDetail` screen instead of a custom React component: the Restriction and Deletion sections render through the generic renderer (`EditFieldsSection` + `actions: RowAction[]`), preserving the original confirmation dialogs (`RowActionWriteHandler.confirm`) and visibility rules (`visible: {field, eq/ne}`) 1:1. The Export section (Art. 20) stays a custom `EditExtensionSection` — it needs polling + a signed-URL download — registered via the new `ClientFeatureDefinition.extensionSectionComponents` under `EXPORT_SECTION_EXTENSION_NAME`. `PrivacyCenterScreen` is a dead export (the renderer selects the screen by `screen.type`, not the client component registry). The single `status` field now renders through the `enumOption` format instead of the raw enum string; `gracePeriodEnd` is hidden when no deletion is pending instead of showing an empty date. Known UI regression, accepted for this pass: the confirm-dialog title is now always the action's `label` (the renderer hardcodes this) — the original's distinct `dialogTitle` copy and its dynamic composed banner sentence (e.g. \"Your account will be deleted on {date}\") are gone, replaced by the translated `status` label plus a separately labeled `gracePeriodEnd` date.",
|
|
83
|
+
"migration": "A declarative screen is registered once and can no longer be toggled per-app on the client: `userDataRightsClient(options)`'s `privacyCenter: { showDeletion }` option is removed. Move the flag server-side instead — replace `createUserDataRightsFeature({})` with `createUserDataRightsFeature({ privacyCenterShowDeletion: false })` (default `true`) — it conditionally omits the Deletion section and its `request-deletion`/`cancel-deletion` actions from the screen definition. Then drop the now-unused `privacyCenter` option from the matching `userDataRightsClient({ privacyCenter: { showDeletion: false } })` call. Known affected consumer: `money-horse` (`src/app/client-features.tsx:74`)."
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"version": "0.165.3",
|
|
87
|
+
"type": "improvement",
|
|
88
|
+
"title": "Forget cleanup purges derived Meili docs for searchable subject-PII (fw#1610).",
|
|
89
|
+
"detail": "run-forget-cleanup (and the forget cron path) call purgeSearchDocumentsForSubject after crypto-shred so searchable userOwned fields do not linger in Meili as plaintext after Art. 17."
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"version": "0.165.1",
|
|
93
|
+
"type": "fix",
|
|
94
|
+
"title": "restrict-account runs the same cross-tenant membership check as lift-restriction (fw#1543).",
|
|
95
|
+
"detail": "Any Admin/TenantAdmin — not just SystemAdmin — could restrict a user's account and force-revoke their sessions regardless of tenant, as long as they held an admin role in some tenant. Also: the GET /user-export/by-token fallback now forwards x-forwarded-for to the internal query call, so the per-IP 30/min limit stops collapsing into one global bucket."
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"version": "0.165.0",
|
|
99
|
+
"type": "breaking",
|
|
100
|
+
"title": "Export download: removed ?token= query param",
|
|
101
|
+
"detail": "GET /user-export/by-token no longer accepts the token as a query parameter. Only POST body (read from URL fragment) is supported now. Old email links with ?token= in the URL will stop working.",
|
|
102
|
+
"migration": "Replace any existing export links that use ?token= in the URL with POST-based links. The token is now only read from the URL fragment (#token), which browsers never send to the server."
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"version": "0.122.0",
|
|
106
|
+
"type": "fix",
|
|
107
|
+
"title": "user-data-rights: export-download-token re-runs rotate the token in place on the same agg…",
|
|
108
|
+
"detail": "user-data-rights: export-download-token re-runs rotate the token in place on the same aggregate (update) instead of creating a second aggregate for the same jobId. A second `created` event without a `deleted` in between made every projection rebuild collide on the `one_per_job` unique index (fw#832). Operator recovery after a lost plain token is now just \"flip the job back to pending\" — never delete the token row read-side. - @cosmicdrift/kumiko-framework@0.122.0 - @cosmicdrift/kumiko-headless@0.122.0 - @cosmicdrift/kumiko-renderer@0.122.0 - @cosmicdrift/kumiko-dispatcher-live@0.122.0 - @cosmicdrift/kumiko-renderer-web@0.122.0"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"version": "0.119.0",
|
|
112
|
+
"type": "improvement",
|
|
113
|
+
"title": "Crypto-shredding phase D: forget wire.",
|
|
114
|
+
"detail": "Crypto-shredding phase D: forget wire. New `crypto-shredding` bundled feature with the `forget-subject` operator command (DPO/SystemAdmin) — erases a user/tenant subject key and appends a `subject-forgotten` audit event. `user-data-rights` forget-cleanup now erases the user's subject key inside the per-user sub-tx (crash-safe, before the status flip). Fixes `list()` returning ciphertext for camelCase encrypted/pii fields and caching plaintext rows."
|
|
115
|
+
}
|
|
116
|
+
]
|