@cosmicdrift/kumiko-samples 0.367.0 → 0.368.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/package.json +1 -1
- package/packages/bundled-features/package.json +16 -2
- package/packages/bundled-features/src/audit/handlers/details.query.ts +1 -1
- package/packages/bundled-features/src/audit/handlers/list.query.ts +1 -1
- package/packages/bundled-features/src/audit/run-escape-hatch-retention.ts +5 -5
- package/packages/bundled-features/src/auth-email-password/bootstrap.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +10 -3
- package/packages/bundled-features/src/auth-email-password/handlers/invite-accept.write.ts +10 -3
- package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/invite-signup-complete.write.ts +6 -2
- package/packages/bundled-features/src/auth-email-password/handlers/signup-confirm.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/seeding.ts +2 -2
- package/packages/bundled-features/src/auth-foundation/feature.ts +43 -34
- package/packages/bundled-features/src/auth-foundation/index.ts +1 -0
- package/packages/bundled-features/src/auth-mfa/db/queries.ts +5 -2
- package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/reencrypt.job.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/handlers/status.query.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/mfa-code-verifier.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/mfa-status-checker.ts +1 -1
- package/packages/bundled-features/src/auth-mfa-user-data/index.ts +19 -10
- package/packages/bundled-features/src/billing-foundation/billing-info-query.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/feature.ts +138 -135
- package/packages/bundled-features/src/billing-foundation/handlers/create-portal-session.write.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/projection.ts +3 -2
- package/packages/bundled-features/src/cap-counter/calendar-cap-usage-reservation.ts +52 -1
- package/packages/bundled-features/src/cap-counter/cap-reservation.ts +203 -15
- package/packages/bundled-features/src/cap-counter/changes.json +13 -0
- package/packages/bundled-features/src/cap-counter/feature.ts +84 -73
- package/packages/bundled-features/src/cap-counter/handlers/increment-rolling.write.ts +3 -4
- package/packages/bundled-features/src/cap-counter/index.ts +9 -1
- package/packages/bundled-features/src/cap-counter/tables.ts +10 -3
- package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +1 -2
- package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +6 -2
- package/packages/bundled-features/src/cap-overview/handlers/tenant-options.query.ts +1 -1
- package/packages/bundled-features/src/channel-in-app/handlers/inbox.query.ts +1 -1
- package/packages/bundled-features/src/channel-in-app/handlers/mark-all-read.write.ts +1 -1
- package/packages/bundled-features/src/channel-in-app/handlers/mark-read.write.ts +1 -1
- package/packages/bundled-features/src/channel-in-app/handlers/unread-count.query.ts +1 -1
- package/packages/bundled-features/src/channel-in-app/tables.ts +1 -1
- package/packages/bundled-features/src/compliance-profiles/handlers/for-tenant.query.ts +1 -1
- package/packages/bundled-features/src/compliance-profiles/handlers/needs-profile.query.ts +1 -1
- package/packages/bundled-features/src/compliance-profiles/handlers/set-profile.write.ts +1 -2
- package/packages/bundled-features/src/compliance-profiles/resolve-for-tenant.ts +1 -1
- package/packages/bundled-features/src/compliance-profiles/seeding.ts +8 -4
- package/packages/bundled-features/src/compliance-profiles-ops/index.ts +26 -17
- package/packages/bundled-features/src/config/db/queries/resolver.ts +1 -1
- package/packages/bundled-features/src/config/handlers/reencrypt.job.ts +2 -2
- package/packages/bundled-features/src/config/resolver.ts +1 -1
- package/packages/bundled-features/src/config/write-helpers.ts +1 -1
- package/packages/bundled-features/src/crypto-shredding/changes.json +6 -0
- package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +9 -7
- package/packages/bundled-features/src/custom-fields/db/queries/field-access.ts +1 -1
- package/packages/bundled-features/src/custom-fields/db/queries/projection.ts +1 -1
- package/packages/bundled-features/src/custom-fields/db/queries/quota.ts +1 -1
- package/packages/bundled-features/src/custom-fields/db/queries/retention.ts +6 -2
- package/packages/bundled-features/src/custom-fields/db/queries/user-data-rights.ts +1 -1
- package/packages/bundled-features/src/custom-fields/feature.ts +11 -14
- package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +2 -2
- package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +2 -2
- package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +2 -2
- package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +2 -2
- package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +4 -4
- package/packages/bundled-features/src/data-retention/resolve-for-tenant.ts +1 -1
- package/packages/bundled-features/src/data-retention/run-retention-cleanup.ts +16 -10
- package/packages/bundled-features/src/delivery/address-opt-out.ts +5 -2
- package/packages/bundled-features/src/delivery/attempt-log-retention.ts +1 -1
- package/packages/bundled-features/src/delivery/channel-context.ts +1 -1
- package/packages/bundled-features/src/delivery/db/queries/address-opt-outs.ts +1 -1
- package/packages/bundled-features/src/delivery/db/queries/preferences.ts +1 -1
- package/packages/bundled-features/src/delivery/delivery-service.ts +16 -6
- package/packages/bundled-features/src/delivery/feature.ts +1 -1
- package/packages/bundled-features/src/delivery/handlers/log.query.ts +3 -2
- package/packages/bundled-features/src/delivery/handlers/preferences.query.ts +1 -1
- package/packages/bundled-features/src/delivery/upsert-preference.ts +5 -2
- package/packages/bundled-features/src/derivatives-sharp/feature.ts +21 -12
- package/packages/bundled-features/src/derivatives-sharp/index.ts +1 -1
- package/packages/bundled-features/src/document-ingest-foundation/feature.ts +112 -103
- package/packages/bundled-features/src/document-ingest-foundation/forget-extract-with-file-ref.ts +3 -3
- package/packages/bundled-features/src/document-ingest-foundation/index.ts +4 -1
- package/packages/bundled-features/src/feature-toggles/global-feature-state-table.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/handlers/set.write.ts +3 -5
- package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +1 -1
- package/packages/bundled-features/src/file-derivatives/feature.ts +134 -129
- package/packages/bundled-features/src/file-derivatives/handlers/public-variant-by-file-ref.query.ts +1 -1
- package/packages/bundled-features/src/file-derivatives/handlers/public-variant.query.ts +1 -1
- package/packages/bundled-features/src/file-foundation/feature.ts +38 -29
- package/packages/bundled-features/src/file-foundation/index.ts +1 -0
- package/packages/bundled-features/src/file-foundation/read-file-ref-content.ts +1 -1
- package/packages/bundled-features/src/file-provider-inmemory/feature.ts +32 -21
- package/packages/bundled-features/src/file-provider-inmemory/index.ts +6 -1
- package/packages/bundled-features/src/file-provider-s3/changes.json +10 -1
- package/packages/bundled-features/src/file-provider-s3/env-feature.ts +62 -0
- package/packages/bundled-features/src/file-provider-s3/feature.ts +107 -73
- package/packages/bundled-features/src/file-provider-s3/index.ts +6 -1
- package/packages/bundled-features/src/file-provider-s3/lib/index.ts +3 -0
- package/packages/bundled-features/src/{files-provider-s3 → file-provider-s3/lib}/s3-provider.ts +19 -19
- package/packages/bundled-features/src/file-provider-s3-env/index.ts +7 -2
- package/packages/bundled-features/src/files-provider-s3/index.ts +11 -3
- package/packages/bundled-features/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +1 -1
- package/packages/bundled-features/src/files-tenant-data/hooks.ts +1 -2
- package/packages/bundled-features/src/folders/feature.ts +8 -3
- package/packages/bundled-features/src/folders-user-data/index.ts +27 -18
- package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +1 -1
- package/packages/bundled-features/src/form-draft/db/queries/draft-count.ts +1 -1
- package/packages/bundled-features/src/form-draft/db/queries/owned-file-refs.ts +3 -2
- package/packages/bundled-features/src/form-draft/feature.ts +6 -1
- package/packages/bundled-features/src/form-draft/handlers/cleanup.job.ts +2 -2
- package/packages/bundled-features/src/form-draft/index.ts +1 -1
- package/packages/bundled-features/src/form-draft/lookup.ts +1 -1
- package/packages/bundled-features/src/form-draft-user-data/index.ts +19 -10
- package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +165 -154
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/ingest-message.write.ts +1 -2
- package/packages/bundled-features/src/inbound-mail-foundation/index.ts +1 -1
- package/packages/bundled-features/src/inbound-mail-foundation/oauth-access-token.ts +5 -2
- package/packages/bundled-features/src/inbound-mail-foundation/projection.ts +3 -2
- package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor.ts +1 -1
- package/packages/bundled-features/src/inbound-provider-imap/feature.ts +22 -13
- package/packages/bundled-features/src/inbound-provider-imap/index.ts +6 -1
- package/packages/bundled-features/src/inbound-provider-inmemory/feature.ts +20 -12
- package/packages/bundled-features/src/inbound-provider-inmemory/index.ts +1 -0
- package/packages/bundled-features/src/jobs/db/queries/retention.ts +1 -1
- package/packages/bundled-features/src/jobs/db/queries/stale-run-sweep.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/detail.query.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/list.query.ts +7 -2
- package/packages/bundled-features/src/jobs/handlers/retry.write.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/tenant-failures.query.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/tenant-runs.query.ts +1 -1
- package/packages/bundled-features/src/jobs/job-run-logger.ts +11 -10
- package/packages/bundled-features/src/jobs/tenant-job-failure-table.ts +1 -1
- package/packages/bundled-features/src/jobs/tenant-job-run-table.ts +1 -1
- package/packages/bundled-features/src/ledger/feature.ts +6 -3
- package/packages/bundled-features/src/mail-foundation/feature.ts +57 -46
- package/packages/bundled-features/src/mail-foundation/index.ts +1 -0
- package/packages/bundled-features/src/mail-transport-inmemory/feature.ts +25 -17
- package/packages/bundled-features/src/mail-transport-inmemory/index.ts +6 -1
- package/packages/bundled-features/src/mail-transport-smtp/feature.ts +91 -79
- package/packages/bundled-features/src/mail-transport-smtp/index.ts +1 -0
- package/packages/bundled-features/src/managed-pages/handlers/by-slug.query.ts +1 -1
- package/packages/bundled-features/src/managed-pages/handlers/by-tenant-published.query.ts +1 -2
- package/packages/bundled-features/src/managed-pages/handlers/set.write.ts +1 -2
- package/packages/bundled-features/src/managed-pages/seeding.ts +8 -4
- package/packages/bundled-features/src/metrics/compute.ts +1 -1
- package/packages/bundled-features/src/metrics/filters.ts +1 -1
- package/packages/bundled-features/src/metrics/validate.ts +1 -1
- package/packages/bundled-features/src/notes-history/feature.ts +6 -3
- package/packages/bundled-features/src/notes-history/handlers/add-note.write.ts +1 -1
- package/packages/bundled-features/src/notes-history-user-data/hooks.ts +1 -1
- package/packages/bundled-features/src/notes-history-user-data/index.ts +27 -18
- package/packages/bundled-features/src/personal-access-tokens/changes.json +6 -0
- package/packages/bundled-features/src/personal-access-tokens/feature.ts +17 -2
- package/packages/bundled-features/src/personal-access-tokens/handlers/create.write.ts +1 -1
- package/packages/bundled-features/src/personal-access-tokens/handlers/list.query.ts +2 -2
- package/packages/bundled-features/src/personal-access-tokens/handlers/revoke.write.ts +1 -1
- package/packages/bundled-features/src/personal-access-tokens/resolver.ts +1 -1
- package/packages/bundled-features/src/personal-access-tokens/revoke-for-user.ts +2 -2
- package/packages/bundled-features/src/personal-access-tokens/roles.ts +8 -6
- package/packages/bundled-features/src/personal-access-tokens/screens.ts +2 -0
- package/packages/bundled-features/src/readiness/feature.ts +25 -16
- package/packages/bundled-features/src/readiness/index.ts +1 -1
- package/packages/bundled-features/src/secrets/db/queries/read.ts +1 -1
- package/packages/bundled-features/src/secrets/feature.ts +8 -3
- package/packages/bundled-features/src/secrets/handlers/rotate.job.ts +2 -2
- package/packages/bundled-features/src/secrets/secrets-context.ts +4 -3
- package/packages/bundled-features/src/sessions/db/queries/cleanup.ts +1 -1
- package/packages/bundled-features/src/sessions/handlers/detail.query.ts +1 -1
- package/packages/bundled-features/src/sessions/handlers/list.query.ts +2 -2
- package/packages/bundled-features/src/sessions/handlers/mine.query.ts +1 -1
- package/packages/bundled-features/src/sessions/handlers/revoke-all-for-user.write.ts +1 -1
- package/packages/bundled-features/src/sessions/handlers/revoke-all-others.write.ts +1 -1
- package/packages/bundled-features/src/sessions/handlers/revoke.write.ts +1 -1
- package/packages/bundled-features/src/sessions/session-callbacks.ts +14 -7
- package/packages/bundled-features/src/sessions/testing.ts +1 -1
- package/packages/bundled-features/src/tags/feature.ts +6 -3
- package/packages/bundled-features/src/template-resolver/api.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/bundle-import.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/by-slug.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/by-tenant.query.ts +1 -2
- package/packages/bundled-features/src/template-resolver/handlers/collection-item.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/collection-list.query.ts +1 -2
- package/packages/bundled-features/src/template-resolver/handlers/collection-set.write.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/copy-locale.write.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/diff-to-system.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/export-bundle.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/layout-source.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/overview.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/reset-to-system.write.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/resource-remove.write.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/set.write.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/tenant-overrides.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/toggle-status.write.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/usage.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/validate.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/seeding.ts +3 -3
- package/packages/bundled-features/src/template-resolver/store-template-resource.ts +1 -1
- package/packages/bundled-features/src/template-resolver/template-preview.ts +1 -1
- package/packages/bundled-features/src/template-resolver/template-resources.ts +1 -1
- package/packages/bundled-features/src/template-resolver/testing.ts +1 -1
- package/packages/bundled-features/src/template-resolver-user-data/index.ts +23 -14
- package/packages/bundled-features/src/tenant/handlers/active-tenant-ids.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/add-member.write.ts +1 -2
- package/packages/bundled-features/src/tenant/handlers/cancel-invitation.write.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/invitations.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/me.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/member-directory.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/members.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/memberships.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/remove-member.write.ts +2 -1
- package/packages/bundled-features/src/tenant/handlers/resolve-user-ids.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/team-list.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/tenant-directory.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/update-member-roles.write.ts +1 -2
- package/packages/bundled-features/src/tenant/invited-membership.ts +2 -2
- package/packages/bundled-features/src/tenant/last-tenant-admin.ts +1 -2
- package/packages/bundled-features/src/tenant/seeding.ts +12 -12
- package/packages/bundled-features/src/tenant-lifecycle/handlers/cancel-destruction.write.ts +1 -2
- package/packages/bundled-features/src/tenant-lifecycle/handlers/request-destruction.write.ts +1 -2
- package/packages/bundled-features/src/tenant-lifecycle/lib/revoke-tenant-sessions.ts +1 -1
- package/packages/bundled-features/src/tenant-lifecycle/lifecycle-gate.ts +1 -1
- package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +3 -3
- package/packages/bundled-features/src/tenant-lifecycle/stages.ts +10 -5
- package/packages/bundled-features/src/tenant-lifecycle/testing.ts +3 -3
- package/packages/bundled-features/src/tenant-settings/feature.ts +34 -29
- package/packages/bundled-features/src/tier-engine/feature.ts +426 -428
- package/packages/bundled-features/src/tier-engine/handlers/get-tenant-tier.query.ts +2 -3
- package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +5 -2
- package/packages/bundled-features/src/user/changes.json +6 -0
- package/packages/bundled-features/src/user/db/queries/stream-tenant-backfill.ts +1 -1
- package/packages/bundled-features/src/user/handlers/create.write.ts +1 -2
- package/packages/bundled-features/src/user/handlers/find-for-auth.query.ts +1 -1
- package/packages/bundled-features/src/user/handlers/list.query.ts +1 -1
- package/packages/bundled-features/src/user/handlers/update-roles.ts +2 -1
- package/packages/bundled-features/src/user/index.ts +5 -1
- package/packages/bundled-features/src/user/invited-global-roles.ts +2 -2
- package/packages/bundled-features/src/user/principal-status.ts +13 -3
- package/packages/bundled-features/src/user/resolve-display-names.ts +1 -1
- package/packages/bundled-features/src/user/seeding.ts +5 -5
- package/packages/bundled-features/src/user-data-rights/audit-download.ts +2 -2
- package/packages/bundled-features/src/user-data-rights/db/queries/export-jobs.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/db/queries/forget-cleanup.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/handlers/download-by-job.query.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/handlers/download-by-token.query.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/handlers/export-status.query.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/handlers/list-download-attempts.query.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/handlers/my-audit-log.query.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/handlers/request-export.write.ts +1 -2
- package/packages/bundled-features/src/user-data-rights/handlers/run-forget-cleanup.write.ts +3 -3
- package/packages/bundled-features/src/user-data-rights/lib/deny-if-target-outside-admin-tenant.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/lib/update-user-lifecycle.ts +7 -2
- package/packages/bundled-features/src/user-data-rights/run-export-jobs.ts +7 -3
- package/packages/bundled-features/src/user-data-rights/run-forget-cleanup.ts +11 -5
- package/packages/bundled-features/src/user-data-rights/run-user-export.ts +10 -5
- package/packages/bundled-features/src/waitlist/handlers/invite.write.ts +1 -2
- package/packages/bundled-features/src/waitlist/handlers/reject.write.ts +1 -1
- package/packages/bundled-features/src/waitlist/lib.ts +5 -2
- package/packages/bundled-features/src/workflow-runner/event-subscriber.ts +1 -1
- package/packages/bundled-features/src/workflow-runner/feature.ts +58 -47
- package/packages/bundled-features/src/workflow-runner/handlers/resume-run.write.ts +1 -1
- package/packages/bundled-features/src/workflow-runner/index.ts +1 -1
- package/packages/bundled-features/src/workflow-runner/pending-projection.ts +1 -1
- package/samples/apps/admin-console/src/run-config.ts +2 -2
- package/samples/apps/cap-billing-demo/package.json +3 -0
- package/samples/apps/cap-billing-demo/src/feature.ts +2 -2
- package/samples/apps/cap-billing-demo/src/run-config.ts +8 -8
- package/samples/apps/marketing-demo/src/app/seed.ts +1 -1
- package/samples/apps/marketing-demo/src/db/queries/seed-counts.ts +1 -1
- package/samples/apps/showcase/package.json +3 -0
- package/samples/apps/showcase/src/app/seed-items.ts +1 -1
- package/samples/apps/styleguide/src/app/seed.ts +2 -2
- package/samples/apps/styleguide/src/features/ai-settings/seed.ts +2 -2
- package/samples/apps/ui-walkthrough/scripts/emit-e2e-data.ts +1 -1
- package/samples/apps/ui-walkthrough/src/app/auth-constants.ts +1 -1
- package/samples/apps/ui-walkthrough/src/app/seed-rental.ts +2 -2
- package/samples/apps/ui-walkthrough/src/app/seed-vehicles.ts +1 -1
- package/samples/apps/ui-walkthrough/src/app/seed.ts +1 -1
- package/samples/apps/ui-walkthrough/src/db/queries/row-counts.ts +1 -1
- package/samples/apps/ui-walkthrough/src/db/queries/task-counts.ts +1 -1
- package/samples/apps/use-all-bundled/package.json +3 -0
- package/samples/apps/use-all-bundled/scripts/check-coverage.ts +2 -2
- package/samples/apps/use-all-bundled/src/app/auth-constants.ts +1 -1
- package/samples/apps/use-all-bundled/src/app/cap-overview-caps.ts +2 -2
- package/samples/apps/use-all-bundled/src/app/dev-app-options.ts +1 -1
- package/samples/apps/use-all-bundled/src/app/seed-documents.ts +1 -1
- package/samples/apps/use-all-bundled/src/app/seed.ts +11 -5
- package/samples/apps/use-all-bundled/src/run-config.ts +55 -56
- package/samples/apps/user-data-rights-demo/README.md +2 -2
- package/samples/apps/user-data-rights-demo/package.json +3 -0
- package/samples/apps/user-data-rights-demo/src/run-config.ts +7 -7
- package/samples/apps/workspaces/package.json +3 -0
- package/samples/recipes/access-control/package.json +3 -0
- package/samples/recipes/anonymous-access/package.json +3 -0
- package/samples/recipes/anonymous-access-multitenant/package.json +3 -0
- package/samples/recipes/apex-landing/package.json +1 -0
- package/samples/recipes/apex-surface-auth/package.json +3 -0
- package/samples/recipes/apex-surface-auth/src/feature.ts +2 -2
- package/samples/recipes/api-worker-split/package.json +3 -0
- package/samples/recipes/api-worker-split/src/feature.ts +1 -2
- package/samples/recipes/auth-claims/package.json +3 -0
- package/samples/recipes/auth-foundation-providers/src/feature.ts +1 -1
- package/samples/recipes/auth-mfa/package.json +3 -0
- package/samples/recipes/basic-entity/package.json +3 -0
- package/samples/recipes/chat-channels/package.json +3 -0
- package/samples/recipes/compliance-profiles-demo/package.json +3 -0
- package/samples/recipes/cross-feature-events/package.json +3 -1
- package/samples/recipes/cross-feature-events/src/feature.ts +1 -1
- package/samples/recipes/crypto-shredding-hr/package.json +3 -0
- package/samples/recipes/currencies-global/package.json +3 -0
- package/samples/recipes/currencies-per-tenant/package.json +3 -0
- package/samples/recipes/custom-fields-basic/package.json +3 -0
- package/samples/recipes/custom-handlers/package.json +3 -0
- package/samples/recipes/dashboard-stats/package.json +3 -0
- package/samples/recipes/delivery-notifications/package.json +3 -0
- package/samples/recipes/e2e-generator/package.json +3 -0
- package/samples/recipes/embedded/package.json +3 -0
- package/samples/recipes/embedded-entity-form/package.json +1 -0
- package/samples/recipes/encrypted-tenant-config/README.md +1 -1
- package/samples/recipes/encrypted-tenant-config/package.json +3 -0
- package/samples/recipes/error-contract/package.json +3 -0
- package/samples/recipes/event-sourcing/package.json +3 -1
- package/samples/recipes/event-sourcing/src/feature.ts +16 -20
- package/samples/recipes/event-sourcing/tsconfig.json +2 -6
- package/samples/recipes/feature-toggles/package.json +3 -0
- package/samples/recipes/field-access/package.json +3 -0
- package/samples/recipes/files-post-processing/package.json +1 -0
- package/samples/recipes/golden-path/README.md +30 -0
- package/samples/recipes/golden-path/package.json +11 -0
- package/samples/recipes/golden-path/src/feature.ts +70 -0
- package/samples/recipes/idempotency/package.json +3 -0
- package/samples/recipes/inbound-mail-triage/package.json +3 -0
- package/samples/recipes/lane-routing/package.json +3 -0
- package/samples/recipes/ledger-banking/package.json +3 -0
- package/samples/recipes/ledger-invoicing/package.json +3 -0
- package/samples/recipes/legal-pages/package.json +3 -0
- package/samples/recipes/lifecycle-hooks/package.json +3 -0
- package/samples/recipes/managed-config/package.json +3 -0
- package/samples/recipes/managed-pages/package.json +3 -0
- package/samples/recipes/notes-history-basic/package.json +3 -0
- package/samples/recipes/ownership/package.json +3 -0
- package/samples/recipes/pdf-audit-export/package.json +1 -0
- package/samples/recipes/pipeline-basics/package.json +3 -0
- package/samples/recipes/public-share-token/package.json +3 -0
- package/samples/recipes/public-share-token/src/feature.ts +1 -1
- package/samples/recipes/rate-limiting/package.json +3 -0
- package/samples/recipes/realtime-sse/package.json +3 -0
- package/samples/recipes/record-detail-layout/package.json +1 -0
- package/samples/recipes/reference-data/package.json +3 -0
- package/samples/recipes/relations/package.json +3 -0
- package/samples/recipes/screens-nav/package.json +3 -0
- package/samples/recipes/search/package.json +3 -0
- package/samples/recipes/secrets-demo/package.json +3 -0
- package/samples/recipes/security-baseline/src/feature.ts +2 -2
- package/samples/recipes/session-revocation/README.md +1 -1
- package/samples/recipes/session-revocation/package.json +3 -0
- package/samples/recipes/session-revocation/src/feature.ts +1 -1
- package/samples/recipes/state-machine/package.json +3 -1
- package/samples/recipes/state-machine/src/entities/invoice.ts +2 -2
- package/samples/recipes/state-machine/src/events.ts +19 -0
- package/samples/recipes/state-machine/src/feature.ts +25 -30
- package/samples/recipes/state-machine/src/handlers/_helpers.ts +13 -14
- package/samples/recipes/state-machine/src/handlers/create.ts +1 -1
- package/samples/recipes/state-machine/src/handlers/transitions.ts +129 -122
- package/samples/recipes/state-machine/src/reducer.ts +1 -1
- package/samples/recipes/state-machine/tsconfig.json +2 -6
- package/samples/recipes/tags-basic/package.json +3 -0
- package/samples/recipes/tenant-isolation/package.json +3 -0
- package/samples/recipes/tenant-settings/package.json +3 -0
- package/samples/recipes/tier-admin/package.json +3 -0
- package/samples/recipes/timezones/package.json +3 -0
- package/samples/recipes/tsconfig.base.json +1 -1
- package/samples/recipes/user-data-rights/package.json +3 -0
- package/samples/recipes/user-data-rights/src/feature.ts +6 -2
- package/samples/recipes/user-profile/package.json +3 -0
- package/samples/recipes/user-profile/src/feature.ts +2 -2
- package/samples/recipes/webhook-step/package.json +3 -0
- package/samples/recipes/wizard-form/package.json +1 -0
- package/samples/recipes/workflow-engine/package.json +3 -0
- package/samples/recipes/workflow-engine/src/db/queries/suspended-runs.ts +5 -2
- package/samples/recipes/writeform-section/package.json +1 -0
- package/packages/bundled-features/src/file-provider-s3-env/feature.ts +0 -58
- /package/packages/bundled-features/src/{files-provider-s3 → file-provider-s3/lib}/env-helper.ts +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
export { workflowRunAggregateId } from "./aggregate-id.js";
|
|
4
4
|
export { registerEventTrigger } from "./event-trigger.js";
|
|
5
|
-
export { workflowRunnerFeature } from "./feature.js";
|
|
5
|
+
export { createWorkflowRunnerFeature, workflowRunnerFeature } from "./feature.js";
|
|
6
6
|
export {
|
|
7
7
|
startAndRunWorkflow,
|
|
8
8
|
type WorkflowRunCompletedPayload,
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
// this table and dispatches the actual resume. This projection only writes
|
|
13
13
|
// the rows.
|
|
14
14
|
|
|
15
|
-
import { deleteMany, fetchOne, upsertOnConflict } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
16
15
|
import type { DbRunner } from "@cosmicdrift/kumiko-framework/db";
|
|
16
|
+
import { deleteMany, fetchOne, upsertOnConflict } from "@cosmicdrift/kumiko-framework/db";
|
|
17
17
|
import type {
|
|
18
18
|
FeatureRegistrar,
|
|
19
19
|
MultiStreamProjectionDefinition,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
tenantJobFailuresMetric,
|
|
15
15
|
} from "@cosmicdrift/kumiko-bundled-features/metrics";
|
|
16
16
|
import { createSecretsFeature } from "@cosmicdrift/kumiko-bundled-features/secrets";
|
|
17
|
-
import {
|
|
17
|
+
import { createTierEngineFeature } from "@cosmicdrift/kumiko-bundled-features/tier-engine";
|
|
18
18
|
import { defineFeature } from "@cosmicdrift/kumiko-framework/engine";
|
|
19
19
|
import { localeDe } from "@cosmicdrift/kumiko-locale-de";
|
|
20
20
|
|
|
@@ -50,7 +50,7 @@ export const APP_FEATURES = [
|
|
|
50
50
|
createAuditFeature(),
|
|
51
51
|
createDeliveryFeature(),
|
|
52
52
|
createJobsFeature(),
|
|
53
|
-
|
|
53
|
+
createTierEngineFeature(),
|
|
54
54
|
createMetricsFeature({ metrics: CONSOLE_METRICS }),
|
|
55
55
|
createSystemMetricsFeature({ metrics: CONSOLE_METRICS }),
|
|
56
56
|
createAdminShellFeature({ metrics: CONSOLE_METRICS }),
|
|
@@ -38,8 +38,8 @@ import {
|
|
|
38
38
|
} from "@cosmicdrift/kumiko-bundled-features/cap-counter";
|
|
39
39
|
import type { EmailMessage } from "@cosmicdrift/kumiko-bundled-features/channel-email";
|
|
40
40
|
import {
|
|
41
|
+
createMailFoundationFeature,
|
|
41
42
|
createTransportForTenant,
|
|
42
|
-
mailFoundationFeature,
|
|
43
43
|
} from "@cosmicdrift/kumiko-bundled-features/mail-foundation";
|
|
44
44
|
import {
|
|
45
45
|
access,
|
|
@@ -185,7 +185,7 @@ export const newsletterFeature = defineFeature(FEATURE_NAME, (r) => {
|
|
|
185
185
|
// klarer für boot-Validator-Errors).
|
|
186
186
|
r.requires({ features: ["config"] });
|
|
187
187
|
r.requires({ features: ["cap-counter"] });
|
|
188
|
-
r.requires({ features: [
|
|
188
|
+
r.requires({ features: [createMailFoundationFeature().name] });
|
|
189
189
|
r.requires({ features: [BILLING_FOUNDATION_FEATURE] });
|
|
190
190
|
|
|
191
191
|
// Tier-config-key. Tenant-Admin setzt's; default "free".
|
|
@@ -18,11 +18,11 @@
|
|
|
18
18
|
// der eigenen run-config.
|
|
19
19
|
// - newsletter — die Demo-Domain mit cap-aware send
|
|
20
20
|
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
21
|
+
import { createBillingFoundationFeature } from "@cosmicdrift/kumiko-bundled-features/billing-foundation";
|
|
22
|
+
import { createCapCounterFeature } from "@cosmicdrift/kumiko-bundled-features/cap-counter";
|
|
23
23
|
import { createComplianceProfilesFeature } from "@cosmicdrift/kumiko-bundled-features/compliance-profiles";
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
24
|
+
import { createMailFoundationFeature } from "@cosmicdrift/kumiko-bundled-features/mail-foundation";
|
|
25
|
+
import { createMailTransportInMemoryFeature } from "@cosmicdrift/kumiko-bundled-features/mail-transport-inmemory";
|
|
26
26
|
import { createSecretsFeature } from "@cosmicdrift/kumiko-bundled-features/secrets";
|
|
27
27
|
import { createTenantLifecycleFeature } from "@cosmicdrift/kumiko-bundled-features/tenant-lifecycle";
|
|
28
28
|
import { localeDe } from "@cosmicdrift/kumiko-locale-de";
|
|
@@ -39,12 +39,12 @@ import { newsletterFeature } from "./feature";
|
|
|
39
39
|
export const APP_FEATURES = [
|
|
40
40
|
localeDe(),
|
|
41
41
|
createSecretsFeature(),
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
createCapCounterFeature(),
|
|
43
|
+
createMailFoundationFeature(),
|
|
44
|
+
createMailTransportInMemoryFeature(),
|
|
45
45
|
createComplianceProfilesFeature(),
|
|
46
46
|
createTenantLifecycleFeature(),
|
|
47
|
-
|
|
47
|
+
createBillingFoundationFeature(),
|
|
48
48
|
newsletterFeature,
|
|
49
49
|
] as const;
|
|
50
50
|
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// nur Logik: Random-Generator, Datums-Helper, der eigentliche Seed.
|
|
10
10
|
|
|
11
11
|
import type { SeedFn } from "@cosmicdrift/kumiko-dev-server";
|
|
12
|
-
import { TestUsers } from "@cosmicdrift/kumiko-framework/
|
|
12
|
+
import { TestUsers } from "@cosmicdrift/kumiko-framework/seeding";
|
|
13
13
|
import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
|
|
14
14
|
import { countAssetsForTenant, countTicketsForTenant } from "../db/queries/seed-counts";
|
|
15
15
|
import { ASSET_STATUSES } from "../features/assets/schema";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { asRawClient } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
2
1
|
import type { DbRunner } from "@cosmicdrift/kumiko-framework/db";
|
|
2
|
+
import { asRawClient } from "@cosmicdrift/kumiko-framework/db";
|
|
3
3
|
|
|
4
4
|
export async function countAssetsForTenant(db: DbRunner, tenantId: string): Promise<number> {
|
|
5
5
|
const rows = await asRawClient(db).unsafe<{ count: number }>(
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// bei jedem Restart neu geseeded sonst.
|
|
10
10
|
|
|
11
11
|
import type { SeedFn } from "@cosmicdrift/kumiko-dev-server";
|
|
12
|
-
import { TestUsers } from "@cosmicdrift/kumiko-framework/
|
|
12
|
+
import { TestUsers } from "@cosmicdrift/kumiko-framework/seeding";
|
|
13
13
|
|
|
14
14
|
const STATUSES = ["draft", "active", "blocked", "done"] as const;
|
|
15
15
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { SeedFn } from "@cosmicdrift/kumiko-dev-server";
|
|
2
2
|
import { createTenantDb } from "@cosmicdrift/kumiko-framework/db";
|
|
3
3
|
import { createEntityExecutor } from "@cosmicdrift/kumiko-framework/engine";
|
|
4
|
-
import { TestUsers } from "@cosmicdrift/kumiko-framework/
|
|
4
|
+
import { TestUsers } from "@cosmicdrift/kumiko-framework/seeding";
|
|
5
5
|
|
|
6
6
|
import { demoEntity } from "../features/demo/feature";
|
|
7
7
|
|
|
@@ -26,7 +26,7 @@ export const seedStyleguideItems: SeedFn = async (stack) => {
|
|
|
26
26
|
// Calling the executor directly is the framework's documented "seed
|
|
27
27
|
// pattern" for a caller-chosen aggregate id (event-store-executor-write.ts).
|
|
28
28
|
const { executor } = createEntityExecutor("item", demoEntity);
|
|
29
|
-
const tenantDb = createTenantDb(stack.db, TestUsers.admin.tenantId);
|
|
29
|
+
const tenantDb = createTenantDb({ db: stack.db, tenantId: TestUsers.admin.tenantId });
|
|
30
30
|
|
|
31
31
|
for (let i = 0; i < 8; i++) {
|
|
32
32
|
const payload = {
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { SeedFn } from "@cosmicdrift/kumiko-dev-server";
|
|
2
2
|
import { createTenantDb } from "@cosmicdrift/kumiko-framework/db";
|
|
3
3
|
import { createEntityExecutor } from "@cosmicdrift/kumiko-framework/engine";
|
|
4
|
-
import { TestUsers } from "@cosmicdrift/kumiko-framework/
|
|
4
|
+
import { TestUsers } from "@cosmicdrift/kumiko-framework/seeding";
|
|
5
5
|
|
|
6
6
|
import { ANTHROPIC_CONNECTION_ID, OPENROUTER_CONNECTION_ID } from "./catalog";
|
|
7
7
|
import { connectionEntity } from "./feature";
|
|
8
8
|
|
|
9
9
|
export const seedAiConnections: SeedFn = async (stack) => {
|
|
10
10
|
const { executor } = createEntityExecutor("connection", connectionEntity);
|
|
11
|
-
const tenantDb = createTenantDb(stack.db, TestUsers.admin.tenantId);
|
|
11
|
+
const tenantDb = createTenantDb({ db: stack.db, tenantId: TestUsers.admin.tenantId });
|
|
12
12
|
const connections = [
|
|
13
13
|
{
|
|
14
14
|
id: ANTHROPIC_CONNECTION_ID,
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
8
8
|
import { dirname, resolve } from "node:path";
|
|
9
9
|
import { createRegistry } from "@cosmicdrift/kumiko-framework/engine";
|
|
10
|
-
import { generateE2ESpec } from "@cosmicdrift/kumiko-
|
|
10
|
+
import { generateE2ESpec } from "@cosmicdrift/kumiko-testing/helpers/e2e-generator";
|
|
11
11
|
import { taskFeature } from "../src/features/tasks";
|
|
12
12
|
|
|
13
13
|
const outPath = resolve(import.meta.dir, "..", "e2e", ".e2e-data.json");
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// `e2e/_helpers/login.ts` gelesen.
|
|
4
4
|
//
|
|
5
5
|
// Warum getrennt: e2e-Specs laufen im Playwright-Worker, der nichts aus
|
|
6
|
-
// `@cosmicdrift/kumiko-
|
|
6
|
+
// `@cosmicdrift/kumiko-testing/helpers` (zieht `vitest`) oder
|
|
7
7
|
// `@cosmicdrift/kumiko-bundled-features/.../testing` (zieht das ebenfalls) ertragen
|
|
8
8
|
// kann — Vitest's expect redefined Object.prototype-Symbole und kollidiert
|
|
9
9
|
// mit Playwrights expect. Diese Datei bleibt importchain-leer und ist die
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import type { SeedFn } from "@cosmicdrift/kumiko-dev-server";
|
|
5
5
|
import { createTenantDb } from "@cosmicdrift/kumiko-framework/db";
|
|
6
|
-
import { TestUsers } from "@cosmicdrift/kumiko-framework/
|
|
6
|
+
import { TestUsers } from "@cosmicdrift/kumiko-framework/seeding";
|
|
7
7
|
import { countRowsForTenant } from "../db/queries/row-counts";
|
|
8
8
|
import { leaseExecutor, partyExecutor, positionExecutor } from "../features/rental/lease-support";
|
|
9
9
|
|
|
@@ -214,7 +214,7 @@ function generatedLease(index: number): BoardLease & { readonly terminated: bool
|
|
|
214
214
|
export const seedRental: SeedFn = async (stack) => {
|
|
215
215
|
const { tenantId } = TestUsers.admin;
|
|
216
216
|
if ((await countRowsForTenant(stack.db, "read_ui_walkthrough_leases", tenantId)) > 0) return;
|
|
217
|
-
const db = createTenantDb(stack.db, tenantId);
|
|
217
|
+
const db = createTenantDb({ db: stack.db, tenantId });
|
|
218
218
|
|
|
219
219
|
const createLease = async (lease: BoardLease, terminated: boolean, id?: string) => {
|
|
220
220
|
const result = await leaseExecutor.create(
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SeedFn } from "@cosmicdrift/kumiko-dev-server";
|
|
2
|
-
import { TestUsers } from "@cosmicdrift/kumiko-framework/
|
|
2
|
+
import { TestUsers } from "@cosmicdrift/kumiko-framework/seeding";
|
|
3
3
|
import { countRowsForTenant } from "../db/queries/row-counts";
|
|
4
4
|
|
|
5
5
|
const OCTAVIA_DESCRIPTION = [
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// tenant already has tasks (persistent KUMIKO_DEV_DB_NAME survives reboots).
|
|
6
6
|
|
|
7
7
|
import type { SeedFn } from "@cosmicdrift/kumiko-dev-server";
|
|
8
|
-
import { TestUsers } from "@cosmicdrift/kumiko-framework/
|
|
8
|
+
import { TestUsers } from "@cosmicdrift/kumiko-framework/seeding";
|
|
9
9
|
import { countTasksForTenant } from "../db/queries/task-counts";
|
|
10
10
|
|
|
11
11
|
const DEMO_TASKS = [
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { asRawClient } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
2
1
|
import type { DbRunner } from "@cosmicdrift/kumiko-framework/db";
|
|
2
|
+
import { asRawClient } from "@cosmicdrift/kumiko-framework/db";
|
|
3
3
|
|
|
4
4
|
type CountedTable = "read_ui_walkthrough_leases" | "read_ui_walkthrough_vehicles";
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { asRawClient } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
2
1
|
import type { DbRunner } from "@cosmicdrift/kumiko-framework/db";
|
|
2
|
+
import { asRawClient } from "@cosmicdrift/kumiko-framework/db";
|
|
3
3
|
|
|
4
4
|
export async function countTasksForTenant(db: DbRunner, tenantId: string): Promise<number> {
|
|
5
5
|
const rows = await asRawClient(db).unsafe<{ count: number }>(
|
|
@@ -23,10 +23,10 @@ const FRAMEWORK_ROOT = resolve(ROOT, "..", "..", "..");
|
|
|
23
23
|
// Held-back exports: existieren in bundled-features, sind aber nicht
|
|
24
24
|
// als runtime-feature in use-all-bundled mountbar.
|
|
25
25
|
//
|
|
26
|
-
// Nur Utilities ohne defineFeature (foundation-shared
|
|
26
|
+
// Nur Utilities ohne defineFeature (foundation-shared sowie files-provider-s3, der deprecated Alias von file-provider-s3/lib, sind pure helpers)
|
|
27
27
|
// und scaffold-only Features. Gemountete Features gehören nicht hierher.
|
|
28
28
|
const EXPECTED_HELD_BACK = new Set([
|
|
29
|
-
"files-provider-s3", //
|
|
29
|
+
"files-provider-s3", // deprecated alias of file-provider-s3/lib (createS3Provider helpers), kein defineFeature
|
|
30
30
|
"foundation-shared", // utilities (requireDefined/requireNonEmpty), kein feature
|
|
31
31
|
"page-render", // shared HTML render/cache helpers (legal/managed-pages), kein defineFeature
|
|
32
32
|
"presets", // feature-bundle helpers (dsgvoSelfServiceFeatures, securityBaselineFeatures), kein defineFeature
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Reine Konstanten — kein Framework-Import, damit der E2E-Login-Helper
|
|
2
2
|
// (Playwright-Worker) sie lesen kann, ohne die vitest-Importchain aus
|
|
3
|
-
// `@cosmicdrift/kumiko-
|
|
3
|
+
// `@cosmicdrift/kumiko-testing/helpers` mitzuziehen (kollidiert mit
|
|
4
4
|
// Playwrights expect über Object.prototype-Symbole).
|
|
5
5
|
|
|
6
6
|
export const ADMIN_EMAIL = "admin@kumiko.dev";
|
|
@@ -2,8 +2,8 @@ import type { CapSpec } from "@cosmicdrift/kumiko-bundled-features/cap-overview"
|
|
|
2
2
|
import { noteEntryTable } from "@cosmicdrift/kumiko-bundled-features/notes-history";
|
|
3
3
|
import { tagEntity } from "@cosmicdrift/kumiko-bundled-features/tags";
|
|
4
4
|
import { tenantMembershipsTable } from "@cosmicdrift/kumiko-bundled-features/tenant";
|
|
5
|
-
|
|
6
|
-
import { buildEntityTable } from "@cosmicdrift/kumiko-framework/db";
|
|
5
|
+
|
|
6
|
+
import { buildEntityTable, selectMany } from "@cosmicdrift/kumiko-framework/db";
|
|
7
7
|
import type { TenantId } from "@cosmicdrift/kumiko-framework/engine";
|
|
8
8
|
|
|
9
9
|
const tagTable = buildEntityTable("tag", tagEntity);
|
|
@@ -19,7 +19,7 @@ import { notesFeature } from "./notes-feature";
|
|
|
19
19
|
import { appScreensFeature } from "./screens-feature";
|
|
20
20
|
import { seedScreenshotData } from "./seed";
|
|
21
21
|
|
|
22
|
-
// tier-admin rendert mit dem bare
|
|
22
|
+
// tier-admin rendert mit dem bare createTierEngineFeature() (aus APP_FEATURES) den
|
|
23
23
|
// ehrlichen Empty-State ("no TierMap configured"). Eine konfigurierte tierMap
|
|
24
24
|
// würde den Resolver auf jedem Write aktivieren (inkl. Login) und braucht
|
|
25
25
|
// per-Tenant Tier-Assignments — disproportional für einen Preview-Screenshot.
|
|
@@ -9,7 +9,7 @@ import { TemplateResolverHandlers } from "@cosmicdrift/kumiko-bundled-features/t
|
|
|
9
9
|
import { seedSystemTemplate } from "@cosmicdrift/kumiko-bundled-features/template-resolver/seeding";
|
|
10
10
|
import type { SeedFn } from "@cosmicdrift/kumiko-dev-server";
|
|
11
11
|
import type { SessionUser, TenantId } from "@cosmicdrift/kumiko-framework/engine";
|
|
12
|
-
import { TestUsers } from "@cosmicdrift/kumiko-framework/
|
|
12
|
+
import { TestUsers } from "@cosmicdrift/kumiko-framework/seeding";
|
|
13
13
|
import { BETA_TENANT_ID, DEV_TENANT_ID, INVOICE_TEMPLATE_SLUG } from "./auth-constants";
|
|
14
14
|
|
|
15
15
|
type Stack = Parameters<SeedFn>[0];
|
|
@@ -24,16 +24,22 @@ import {
|
|
|
24
24
|
} from "@cosmicdrift/kumiko-bundled-features/tier-engine";
|
|
25
25
|
import { userTable } from "@cosmicdrift/kumiko-bundled-features/user";
|
|
26
26
|
import type { SeedFn } from "@cosmicdrift/kumiko-dev-server";
|
|
27
|
-
|
|
28
|
-
import {
|
|
27
|
+
|
|
28
|
+
import {
|
|
29
|
+
createTenantDb,
|
|
30
|
+
type DbConnection,
|
|
31
|
+
fetchOne,
|
|
32
|
+
insertOne,
|
|
33
|
+
} from "@cosmicdrift/kumiko-framework/db";
|
|
29
34
|
import {
|
|
30
35
|
createEntityExecutor,
|
|
31
36
|
type SessionUser,
|
|
32
37
|
SYSTEM_TENANT_ID,
|
|
33
38
|
type TenantId,
|
|
34
39
|
} from "@cosmicdrift/kumiko-framework/engine";
|
|
35
|
-
import { TestUsers
|
|
40
|
+
import { TestUsers } from "@cosmicdrift/kumiko-framework/seeding";
|
|
36
41
|
import { generateId } from "@cosmicdrift/kumiko-framework/utils";
|
|
42
|
+
import { unsafeCreateEntityTable } from "@cosmicdrift/kumiko-testing/stack";
|
|
37
43
|
import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
|
|
38
44
|
import { ADMIN_EMAIL, BETA_TENANT_ID, DEMO_NOTE_ID, DEV_TENANT_ID } from "./auth-constants";
|
|
39
45
|
import { noteEntity } from "./notes-feature";
|
|
@@ -80,7 +86,7 @@ async function seedTierAssignment(
|
|
|
80
86
|
adminUserId: string,
|
|
81
87
|
): Promise<void> {
|
|
82
88
|
const by: SessionUser = { ...TestUsers.systemAdmin, tenantId, id: adminUserId };
|
|
83
|
-
const tdb = createTenantDb(db, tenantId, "system");
|
|
89
|
+
const tdb = createTenantDb({ db, tenantId, mode: "system" });
|
|
84
90
|
const result = await tierAssignmentExecutor.create(
|
|
85
91
|
{ id: tierAssignmentAggregateId(tenantId), tier, source: "manual", tenantId },
|
|
86
92
|
by,
|
|
@@ -104,7 +110,7 @@ async function seedTagsAndNotes(
|
|
|
104
110
|
adminUserId: string,
|
|
105
111
|
): Promise<void> {
|
|
106
112
|
const by: SessionUser = { ...TestUsers.systemAdmin, tenantId, id: adminUserId };
|
|
107
|
-
const tdb = createTenantDb(db, tenantId, "system");
|
|
113
|
+
const tdb = createTenantDb({ db, tenantId, mode: "system" });
|
|
108
114
|
|
|
109
115
|
const created = async (
|
|
110
116
|
label: string,
|
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
|
|
17
17
|
import { createAdminShellFeature } from "@cosmicdrift/kumiko-bundled-features/admin-shell";
|
|
18
18
|
import { createAgentToolsFeature } from "@cosmicdrift/kumiko-bundled-features/agent-tools";
|
|
19
|
-
import {
|
|
19
|
+
import { createAuthFoundationFeature } from "@cosmicdrift/kumiko-bundled-features/auth-foundation";
|
|
20
20
|
import { createAuthMfaFeature } from "@cosmicdrift/kumiko-bundled-features/auth-mfa";
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
21
|
+
import { createAuthMfaUserDataFeature } from "@cosmicdrift/kumiko-bundled-features/auth-mfa-user-data";
|
|
22
|
+
import { createBillingFoundationFeature } from "@cosmicdrift/kumiko-bundled-features/billing-foundation";
|
|
23
|
+
import { createCapCounterFeature } from "@cosmicdrift/kumiko-bundled-features/cap-counter";
|
|
24
24
|
import { createCapOverviewFeature } from "@cosmicdrift/kumiko-bundled-features/cap-overview";
|
|
25
25
|
import { createChannelDiscordFeature } from "@cosmicdrift/kumiko-bundled-features/channel-discord";
|
|
26
26
|
import {
|
|
@@ -36,33 +36,32 @@ import { createChannelSlackFeature } from "@cosmicdrift/kumiko-bundled-features/
|
|
|
36
36
|
import { createChannelTeamsFeature } from "@cosmicdrift/kumiko-bundled-features/channel-teams";
|
|
37
37
|
import { createChannelTelegramFeature } from "@cosmicdrift/kumiko-bundled-features/channel-telegram";
|
|
38
38
|
import { createComplianceProfilesFeature } from "@cosmicdrift/kumiko-bundled-features/compliance-profiles";
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
39
|
+
import { createComplianceProfilesOpsFeature } from "@cosmicdrift/kumiko-bundled-features/compliance-profiles-ops";
|
|
40
|
+
import { createCustomFieldsFeature } from "@cosmicdrift/kumiko-bundled-features/custom-fields";
|
|
41
41
|
import { createDataRetentionFeature } from "@cosmicdrift/kumiko-bundled-features/data-retention";
|
|
42
42
|
import { createDeliveryFeature } from "@cosmicdrift/kumiko-bundled-features/delivery";
|
|
43
|
-
import {
|
|
44
|
-
import {
|
|
43
|
+
import { createDerivativesSharpFeature } from "@cosmicdrift/kumiko-bundled-features/derivatives-sharp";
|
|
44
|
+
import { createDocumentIngestFoundationFeature } from "@cosmicdrift/kumiko-bundled-features/document-ingest-foundation";
|
|
45
45
|
import { createFeatureTogglesFeature } from "@cosmicdrift/kumiko-bundled-features/feature-toggles";
|
|
46
46
|
import { createFileDerivativesFeature } from "@cosmicdrift/kumiko-bundled-features/file-derivatives";
|
|
47
|
-
import {
|
|
48
|
-
import {
|
|
49
|
-
import {
|
|
50
|
-
import { fileProviderS3EnvFeature } from "@cosmicdrift/kumiko-bundled-features/file-provider-s3-env";
|
|
47
|
+
import { createFileFoundationFeature } from "@cosmicdrift/kumiko-bundled-features/file-foundation";
|
|
48
|
+
import { createFileProviderInMemoryFeature } from "@cosmicdrift/kumiko-bundled-features/file-provider-inmemory";
|
|
49
|
+
import { createFileProviderS3Feature } from "@cosmicdrift/kumiko-bundled-features/file-provider-s3";
|
|
51
50
|
import { createFilesFeature } from "@cosmicdrift/kumiko-bundled-features/files";
|
|
52
51
|
import { createFilesTenantDataFeature } from "@cosmicdrift/kumiko-bundled-features/files-tenant-data";
|
|
53
|
-
import {
|
|
54
|
-
import {
|
|
55
|
-
import {
|
|
56
|
-
import {
|
|
57
|
-
import {
|
|
58
|
-
import {
|
|
59
|
-
import {
|
|
52
|
+
import { createFoldersFeature } from "@cosmicdrift/kumiko-bundled-features/folders";
|
|
53
|
+
import { createFoldersUserDataFeature } from "@cosmicdrift/kumiko-bundled-features/folders-user-data";
|
|
54
|
+
import { createFormDraftFeature } from "@cosmicdrift/kumiko-bundled-features/form-draft";
|
|
55
|
+
import { createFormDraftUserDataFeature } from "@cosmicdrift/kumiko-bundled-features/form-draft-user-data";
|
|
56
|
+
import { createInboundMailFoundationFeature } from "@cosmicdrift/kumiko-bundled-features/inbound-mail-foundation";
|
|
57
|
+
import { createInboundProviderImapFeature } from "@cosmicdrift/kumiko-bundled-features/inbound-provider-imap";
|
|
58
|
+
import { createInboundProviderInMemoryFeature } from "@cosmicdrift/kumiko-bundled-features/inbound-provider-inmemory";
|
|
60
59
|
import { createJobsFeature } from "@cosmicdrift/kumiko-bundled-features/jobs";
|
|
61
|
-
import {
|
|
60
|
+
import { createLedgerFeature } from "@cosmicdrift/kumiko-bundled-features/ledger";
|
|
62
61
|
import { createLegalPagesFeature } from "@cosmicdrift/kumiko-bundled-features/legal-pages";
|
|
63
|
-
import {
|
|
64
|
-
import {
|
|
65
|
-
import {
|
|
62
|
+
import { createMailFoundationFeature } from "@cosmicdrift/kumiko-bundled-features/mail-foundation";
|
|
63
|
+
import { createMailTransportInMemoryFeature } from "@cosmicdrift/kumiko-bundled-features/mail-transport-inmemory";
|
|
64
|
+
import { createMailTransportSmtpFeature } from "@cosmicdrift/kumiko-bundled-features/mail-transport-smtp";
|
|
66
65
|
import { createManagedPagesFeature } from "@cosmicdrift/kumiko-bundled-features/managed-pages";
|
|
67
66
|
import {
|
|
68
67
|
createMetricsFeature,
|
|
@@ -70,10 +69,10 @@ import {
|
|
|
70
69
|
DEFAULT_METRICS,
|
|
71
70
|
} from "@cosmicdrift/kumiko-bundled-features/metrics";
|
|
72
71
|
import { createNotesHistoryFeature } from "@cosmicdrift/kumiko-bundled-features/notes-history";
|
|
73
|
-
import {
|
|
72
|
+
import { createNotesHistoryUserDataFeature } from "@cosmicdrift/kumiko-bundled-features/notes-history-user-data";
|
|
74
73
|
import { createPersonalAccessTokensFeature } from "@cosmicdrift/kumiko-bundled-features/personal-access-tokens";
|
|
75
74
|
import { securityBaselineFeatures } from "@cosmicdrift/kumiko-bundled-features/presets";
|
|
76
|
-
import {
|
|
75
|
+
import { createReadinessFeature } from "@cosmicdrift/kumiko-bundled-features/readiness";
|
|
77
76
|
import { createRendererFoundationFeature } from "@cosmicdrift/kumiko-bundled-features/renderer-foundation";
|
|
78
77
|
import { createRendererPdfFeature } from "@cosmicdrift/kumiko-bundled-features/renderer-pdf";
|
|
79
78
|
import { createSecretsFeature } from "@cosmicdrift/kumiko-bundled-features/secrets";
|
|
@@ -83,16 +82,16 @@ import { createSubscriptionMollieFeature } from "@cosmicdrift/kumiko-bundled-fea
|
|
|
83
82
|
import { createSubscriptionStripeFeature } from "@cosmicdrift/kumiko-bundled-features/subscription-stripe";
|
|
84
83
|
import { createTagsFeature } from "@cosmicdrift/kumiko-bundled-features/tags";
|
|
85
84
|
import { createTemplateResolverFeature } from "@cosmicdrift/kumiko-bundled-features/template-resolver";
|
|
86
|
-
import {
|
|
85
|
+
import { createTemplateResolverUserDataFeature } from "@cosmicdrift/kumiko-bundled-features/template-resolver-user-data";
|
|
87
86
|
import { createTenantHandoverFeature } from "@cosmicdrift/kumiko-bundled-features/tenant-handover";
|
|
88
87
|
import { createTenantLifecycleFeature } from "@cosmicdrift/kumiko-bundled-features/tenant-lifecycle";
|
|
89
88
|
import { createTenantSettingsFeature } from "@cosmicdrift/kumiko-bundled-features/tenant-settings";
|
|
90
|
-
import {
|
|
89
|
+
import { createTierEngineFeature } from "@cosmicdrift/kumiko-bundled-features/tier-engine";
|
|
91
90
|
import { createUserDataRightsFeature } from "@cosmicdrift/kumiko-bundled-features/user-data-rights";
|
|
92
91
|
import { createUserDataRightsDefaultsFeature } from "@cosmicdrift/kumiko-bundled-features/user-data-rights-defaults";
|
|
93
92
|
import { createUserProfileFeature } from "@cosmicdrift/kumiko-bundled-features/user-profile";
|
|
94
93
|
import { createWaitlistFeature } from "@cosmicdrift/kumiko-bundled-features/waitlist";
|
|
95
|
-
import {
|
|
94
|
+
import { createWorkflowRunnerFeature } from "@cosmicdrift/kumiko-bundled-features/workflow-runner";
|
|
96
95
|
import { createDocumentDesignerFeature } from "@cosmicdrift/kumiko-document-designer";
|
|
97
96
|
import type { TenantId } from "@cosmicdrift/kumiko-framework/engine";
|
|
98
97
|
import { localeDe } from "@cosmicdrift/kumiko-locale-de";
|
|
@@ -139,7 +138,7 @@ export const APP_FEATURES = [
|
|
|
139
138
|
// Owns the `tokenVerifier` extension-point personal-access-tokens
|
|
140
139
|
// registers against below — required whenever a bearer-auth provider is
|
|
141
140
|
// mounted (kumiko-framework#1369).
|
|
142
|
-
|
|
141
|
+
createAuthFoundationFeature(),
|
|
143
142
|
// Per-domain scopes (like cashcolt's credit/bauspar/miete): the token picks
|
|
144
143
|
// WHICH API × the permission LEVEL (read vs read+write). Each domain declares
|
|
145
144
|
// its read + write QN globs.
|
|
@@ -159,7 +158,7 @@ export const APP_FEATURES = [
|
|
|
159
158
|
ledger: { label: "Ledger", read: ["ledger:query:*"], write: ["ledger:write:*"] },
|
|
160
159
|
},
|
|
161
160
|
}),
|
|
162
|
-
|
|
161
|
+
createReadinessFeature(),
|
|
163
162
|
|
|
164
163
|
// delivery + channels
|
|
165
164
|
createDeliveryFeature(),
|
|
@@ -180,20 +179,20 @@ export const APP_FEATURES = [
|
|
|
180
179
|
createChannelTelegramFeature(),
|
|
181
180
|
|
|
182
181
|
// mail (foundation before transport)
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
182
|
+
createMailFoundationFeature(),
|
|
183
|
+
createMailTransportInMemoryFeature(),
|
|
184
|
+
createMailTransportSmtpFeature(),
|
|
186
185
|
|
|
187
186
|
// inbound mail (foundation before providers)
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
187
|
+
createInboundMailFoundationFeature(),
|
|
188
|
+
createInboundProviderInMemoryFeature(),
|
|
189
|
+
createInboundProviderImapFeature(),
|
|
191
190
|
|
|
192
191
|
// files (foundation before provider)
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
192
|
+
createFileFoundationFeature(),
|
|
193
|
+
createFileProviderInMemoryFeature(),
|
|
194
|
+
createFileProviderS3Feature(),
|
|
195
|
+
createFileProviderS3Feature({ fromEnv: true }),
|
|
197
196
|
createFilesFeature(),
|
|
198
197
|
// resolveApexTenant is what registers the `public-variant` query and the
|
|
199
198
|
// anonymous /media route — the option-less export leaves both out and hides
|
|
@@ -204,10 +203,10 @@ export const APP_FEATURES = [
|
|
|
204
203
|
// a single-tenant smoke sample and a cross-tenant leak in a real app, where
|
|
205
204
|
// the host is the ONLY thing that may decide which tenant's bytes go out.
|
|
206
205
|
createFileDerivativesFeature({ resolveApexTenant: () => DEV_TENANT_ID as TenantId }),
|
|
207
|
-
|
|
206
|
+
createDerivativesSharpFeature(),
|
|
208
207
|
|
|
209
208
|
// billing + providers
|
|
210
|
-
|
|
209
|
+
createBillingFoundationFeature(),
|
|
211
210
|
createSubscriptionStripeFeature({
|
|
212
211
|
apiKey: "sk_test_smoke",
|
|
213
212
|
webhookSecret: "whsec_smoke",
|
|
@@ -228,8 +227,8 @@ export const APP_FEATURES = [
|
|
|
228
227
|
}),
|
|
229
228
|
|
|
230
229
|
// tiering + caps
|
|
231
|
-
|
|
232
|
-
|
|
230
|
+
createTierEngineFeature(),
|
|
231
|
+
createCapCounterFeature(),
|
|
233
232
|
// cap-overview: read-only tier/usage visibility. Caps are example
|
|
234
233
|
// entities this sample already mounts (notes-history, tags,
|
|
235
234
|
// tenant-membership) — see cap-overview-caps.ts. Requires tenant
|
|
@@ -263,11 +262,11 @@ export const APP_FEATURES = [
|
|
|
263
262
|
// workflow-runner: no entities/MSPs/handlers of its own — reserves the
|
|
264
263
|
// manifest slot and provides startAndRunWorkflow/registerEventTrigger for
|
|
265
264
|
// consumer features to wire up defineWorkflow-based workflows.
|
|
266
|
-
|
|
265
|
+
createWorkflowRunnerFeature(),
|
|
267
266
|
|
|
268
267
|
// compliance / DSGVO
|
|
269
268
|
createComplianceProfilesFeature(),
|
|
270
|
-
|
|
269
|
+
createComplianceProfilesOpsFeature(),
|
|
271
270
|
createTenantLifecycleFeature(),
|
|
272
271
|
// tenant-handover: try-before-signup ownership handover (kumiko-
|
|
273
272
|
// framework#3035). No entities/mount-options of its own — it reads
|
|
@@ -327,7 +326,7 @@ export const APP_FEATURES = [
|
|
|
327
326
|
// user-content-entry rows the `signatures` collection writes. Mandatory
|
|
328
327
|
// whenever a user-owned collection is mounted — the boot guard refuses the
|
|
329
328
|
// subject-carrying entity without it.
|
|
330
|
-
|
|
329
|
+
createTemplateResolverUserDataFeature(),
|
|
331
330
|
// collection-labels: the app-side nav labels for the two collections above.
|
|
332
331
|
collectionLabelsFeature,
|
|
333
332
|
createRendererFoundationFeature(),
|
|
@@ -366,7 +365,7 @@ export const APP_FEATURES = [
|
|
|
366
365
|
createAdminShellFeature({ includeCapOverview: true, includeDocumentDesigner: true }),
|
|
367
366
|
|
|
368
367
|
// app-author-grade
|
|
369
|
-
|
|
368
|
+
createCustomFieldsFeature(),
|
|
370
369
|
// The default tag roles are TenantAdmin/TenantMember; this app's operator is a
|
|
371
370
|
// global SystemAdmin (see server.ts admin), so add SystemAdmin or every tag
|
|
372
371
|
// query/screen is access_denied — exactly what the constants doc warns about.
|
|
@@ -377,30 +376,30 @@ export const APP_FEATURES = [
|
|
|
377
376
|
// notes-history-user-data: GDPR export/erase coverage for note-entry.
|
|
378
377
|
// Depends (optionally) on notes-history + (hard) on user-data-rights —
|
|
379
378
|
// both mounted here.
|
|
380
|
-
|
|
381
|
-
|
|
379
|
+
createNotesHistoryUserDataFeature(),
|
|
380
|
+
createFormDraftFeature(),
|
|
382
381
|
// form-draft-user-data: GDPR export/erase coverage for the form-draft
|
|
383
382
|
// entity. Depends (optionally) on form-draft + (hard) on
|
|
384
383
|
// user-data-rights — both mounted here.
|
|
385
|
-
|
|
386
|
-
|
|
384
|
+
createFormDraftUserDataFeature(),
|
|
385
|
+
createFoldersFeature(),
|
|
387
386
|
// folders-user-data: GDPR hooks for folder entities. Depends (optionally)
|
|
388
387
|
// on folders + (hard) on user-data-rights — both mounted above.
|
|
389
|
-
|
|
388
|
+
createFoldersUserDataFeature(),
|
|
390
389
|
// auth-mfa-user-data: GDPR hooks for the user-mfa entity. Depends
|
|
391
390
|
// (optionally) on auth-mfa + (hard) on user-data-rights — both mounted
|
|
392
391
|
// above.
|
|
393
|
-
|
|
392
|
+
createAuthMfaUserDataFeature(),
|
|
394
393
|
// files-tenant-data: tenant-destroy row purge + storage-prefix binary wipe
|
|
395
394
|
// for fileRef, plus the orphaned-derivative backfill/GC job (#2474).
|
|
396
395
|
// Depends (optionally) on files + (hard) on tenant-lifecycle — both
|
|
397
396
|
// mounted above.
|
|
398
397
|
createFilesTenantDataFeature(),
|
|
399
398
|
// ledger: double-entry bookkeeping primitive (account + immutable transaction).
|
|
400
|
-
|
|
399
|
+
createLedgerFeature(),
|
|
401
400
|
// document-ingest-foundation: Phase-1 skeleton — documentExtract entity +
|
|
402
401
|
// ocrLanguage/maxPagesPerFile config, no handlers yet (kumiko-framework#1497).
|
|
403
|
-
|
|
402
|
+
createDocumentIngestFoundationFeature(),
|
|
404
403
|
createAgentToolsFeature(),
|
|
405
404
|
] as const;
|
|
406
405
|
|
|
@@ -109,8 +109,8 @@ then 500s). For a real deploy, swap to the persistent provider in
|
|
|
109
109
|
`src/run-config.ts`:
|
|
110
110
|
|
|
111
111
|
```ts illustration
|
|
112
|
-
// import {
|
|
113
|
-
// APP_FEATURES:
|
|
112
|
+
// import { createFileProviderS3Feature } from "@cosmicdrift/kumiko-bundled-features/file-provider-s3";
|
|
113
|
+
// APP_FEATURES: createFileProviderInMemoryFeature() -> createFileProviderS3Feature({ fromEnv: true })
|
|
114
114
|
```
|
|
115
115
|
|
|
116
116
|
Then set `S3_BUCKET` / `S3_REGION` / `S3_ACCESS_KEY` / `S3_SECRET_KEY` (plus
|