@cosmicdrift/kumiko-samples 0.367.0 → 0.369.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-email/changes.json +7 -0
- package/packages/bundled-features/src/channel-email/email-channel.ts +39 -8
- package/packages/bundled-features/src/channel-email/feature.ts +1 -1
- package/packages/bundled-features/src/channel-email/index.ts +5 -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/web/i18n.ts +1 -2
- 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/changes.json +6 -0
- 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 +2 -2
- 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/index.ts +8 -1
- package/packages/bundled-features/src/delivery/unsubscribe.ts +66 -37
- 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 +66 -46
- package/packages/bundled-features/src/mail-foundation/i18n.ts +8 -0
- package/packages/bundled-features/src/mail-foundation/index.ts +1 -0
- package/packages/bundled-features/src/mail-transport-inmemory/feature.ts +31 -17
- package/packages/bundled-features/src/mail-transport-inmemory/index.ts +6 -1
- package/packages/bundled-features/src/mail-transport-smtp/changes.json +7 -0
- package/packages/bundled-features/src/mail-transport-smtp/config-keys.ts +67 -0
- package/packages/bundled-features/src/mail-transport-smtp/feature.ts +67 -82
- package/packages/bundled-features/src/mail-transport-smtp/i18n.ts +28 -0
- 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/changes.json +6 -0
- package/packages/bundled-features/src/secrets/db/queries/read.ts +1 -1
- package/packages/bundled-features/src/secrets/feature.ts +26 -6
- package/packages/bundled-features/src/secrets/handlers/delete.write.ts +5 -2
- package/packages/bundled-features/src/secrets/handlers/rotate.job.ts +2 -2
- package/packages/bundled-features/src/secrets/handlers/set.write.ts +5 -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/constants.ts +0 -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/send-test.write.ts +4 -2
- 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/changes.json +6 -0
- 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/feature.ts +7 -4
- 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/default-mailers.ts +40 -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/feature-manifest.json +16 -16
- 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
|
@@ -47,9 +47,11 @@ import {
|
|
|
47
47
|
type MailTransportPlugin,
|
|
48
48
|
} from "@cosmicdrift/kumiko-bundled-features/mail-foundation";
|
|
49
49
|
import { requireSecretsContext } from "@cosmicdrift/kumiko-bundled-features/secrets";
|
|
50
|
-
import {
|
|
50
|
+
import { defineFeature } from "@cosmicdrift/kumiko-framework/engine";
|
|
51
51
|
import { UnconfiguredError } from "@cosmicdrift/kumiko-framework/errors";
|
|
52
52
|
import { createFallbackLogger } from "@cosmicdrift/kumiko-framework/logging";
|
|
53
|
+
import { SMTP_CONFIG_KEYS } from "./config-keys.js";
|
|
54
|
+
import { MAIL_TRANSPORT_SMTP_I18N } from "./i18n.js";
|
|
53
55
|
|
|
54
56
|
const FEATURE_NAME = "mail-transport-smtp";
|
|
55
57
|
|
|
@@ -75,89 +77,72 @@ export function setSmtpMailHostLookup(fn: typeof lookup | undefined): void {
|
|
|
75
77
|
// =============================================================================
|
|
76
78
|
// Feature-definition
|
|
77
79
|
// =============================================================================
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
// required: true ↔ the requireNonEmpty calls in buildSmtpTransport — keep in sync.
|
|
109
|
-
const configKeys = r.config({
|
|
110
|
-
keys: {
|
|
111
|
-
host: createTenantConfig("text", {
|
|
112
|
-
required: true,
|
|
113
|
-
default: "",
|
|
114
|
-
write: access.roles("TenantAdmin", "SystemAdmin"),
|
|
115
|
-
read: access.roles("TenantAdmin", "SystemAdmin"),
|
|
116
|
-
}),
|
|
117
|
-
port: createTenantConfig("number", {
|
|
118
|
-
default: 587,
|
|
119
|
-
bounds: { min: 1, max: 65535 },
|
|
120
|
-
write: access.roles("TenantAdmin", "SystemAdmin"),
|
|
121
|
-
}),
|
|
122
|
-
secure: createTenantConfig("boolean", {
|
|
123
|
-
default: false,
|
|
124
|
-
write: access.roles("TenantAdmin", "SystemAdmin"),
|
|
125
|
-
}),
|
|
126
|
-
from: createTenantConfig("text", {
|
|
127
|
-
required: true,
|
|
128
|
-
default: "",
|
|
129
|
-
write: access.roles("TenantAdmin", "SystemAdmin"),
|
|
130
|
-
read: access.roles("TenantAdmin", "SystemAdmin"),
|
|
131
|
-
}),
|
|
132
|
-
authUser: createTenantConfig("text", {
|
|
80
|
+
export function createMailTransportSmtpFeature() {
|
|
81
|
+
return defineFeature(
|
|
82
|
+
FEATURE_NAME,
|
|
83
|
+
(r) => {
|
|
84
|
+
r.describe(
|
|
85
|
+
'Registers itself as the `"smtp"` provider for `mail-foundation` and owns the per-tenant config keys (`host`, `port`, `secure`, `from`, `authUser`) and the encrypted `smtp.password` secret. Tenants set `mail-foundation`\'s `provider` config key to `"smtp"` to activate it; set the SMTP credentials via the admin UI or a seed handler before sending the first mail.',
|
|
86
|
+
);
|
|
87
|
+
r.uiHints({
|
|
88
|
+
displayLabel: "Mail Transport · SMTP",
|
|
89
|
+
category: "notifications",
|
|
90
|
+
recommended: false,
|
|
91
|
+
});
|
|
92
|
+
r.requires({ features: ["config"] });
|
|
93
|
+
r.requires({ features: ["secrets"] });
|
|
94
|
+
r.requires({ features: ["mail-foundation"] });
|
|
95
|
+
r.envSchema(mailTransportSmtpEnvSchema);
|
|
96
|
+
|
|
97
|
+
// Provider-secret. Sensitive: redact-helper for admin-UI display.
|
|
98
|
+
const password = r.secret("smtp.password", {
|
|
99
|
+
label: { en: "SMTP password" },
|
|
100
|
+
hint: {
|
|
101
|
+
en: "Login password at the SMTP server. Brevo/Postmark/SES call it 'API key' or 'SMTP credentials'.",
|
|
102
|
+
},
|
|
103
|
+
redact: (plaintext) => {
|
|
104
|
+
if (plaintext.length < 8) return "•".repeat(plaintext.length);
|
|
105
|
+
return `${plaintext.slice(0, 3)}...${plaintext.slice(-2)}`;
|
|
106
|
+
},
|
|
107
|
+
scope: "tenant",
|
|
108
|
+
// required: true ↔ the missing-secret throw in readPassword — keep in sync.
|
|
133
109
|
required: true,
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const configKeys = r.config({ keys: SMTP_CONFIG_KEYS });
|
|
113
|
+
|
|
114
|
+
r.translations({ keys: MAIL_TRANSPORT_SMTP_I18N });
|
|
115
|
+
|
|
116
|
+
// Plugin: register against mail-foundation's "mailTransport" extension.
|
|
117
|
+
// `entityName` "smtp" is what tenants set in mail-foundation's
|
|
118
|
+
// `provider` config-key to pick this transport.
|
|
119
|
+
const plugin: MailTransportPlugin = {
|
|
120
|
+
build: async (ctx: MailTransportContext, tenantId: string) =>
|
|
121
|
+
buildSmtpTransport(ctx, tenantId), // @wrapper-known semantic-alias
|
|
122
|
+
};
|
|
123
|
+
r.useExtension(MAIL_TRANSPORT_EXTENSION, "smtp", plugin);
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
/** Config-key-handles — typed reads via `ctx.config(...)` in
|
|
127
|
+
* consumer handlers. */
|
|
128
|
+
configKeys,
|
|
129
|
+
/** Secret-handle for the SMTP password. */
|
|
130
|
+
password,
|
|
131
|
+
};
|
|
138
132
|
},
|
|
139
|
-
|
|
133
|
+
{ dedupeOptions: {} },
|
|
134
|
+
);
|
|
135
|
+
}
|
|
140
136
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
// `provider` config-key to pick this transport.
|
|
144
|
-
const plugin: MailTransportPlugin = {
|
|
145
|
-
build: async (ctx: MailTransportContext, tenantId: string) => buildSmtpTransport(ctx, tenantId), // @wrapper-known semantic-alias
|
|
146
|
-
};
|
|
147
|
-
r.useExtension(MAIL_TRANSPORT_EXTENSION, "smtp", plugin);
|
|
137
|
+
// The typed handles below come from one shared instance; each factory call builds its own handle objects.
|
|
138
|
+
const sharedMailTransportSmtpFeature = createMailTransportSmtpFeature();
|
|
148
139
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
* consumer handlers. */
|
|
152
|
-
configKeys,
|
|
153
|
-
/** Secret-handle for the SMTP password. */
|
|
154
|
-
password,
|
|
155
|
-
};
|
|
156
|
-
});
|
|
140
|
+
/** @deprecated Use createMailTransportSmtpFeature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
|
|
141
|
+
export const mailTransportSmtpFeature = sharedMailTransportSmtpFeature;
|
|
157
142
|
|
|
158
143
|
/** Typed handle for the SMTP password — exported so seeds + tests can
|
|
159
144
|
* set it via `secrets:write:set` with the full qualified-name. */
|
|
160
|
-
export const SMTP_PASSWORD =
|
|
145
|
+
export const SMTP_PASSWORD = sharedMailTransportSmtpFeature.exports.password;
|
|
161
146
|
|
|
162
147
|
// =============================================================================
|
|
163
148
|
// Internal: build the EmailTransport from tenant config + secret
|
|
@@ -188,29 +173,29 @@ async function buildSmtpTransport(
|
|
|
188
173
|
|
|
189
174
|
const SMTP_HINT = "Set via tenant-admin UI or seed-handler before sending mail.";
|
|
190
175
|
const host = requireNonEmpty(
|
|
191
|
-
await ctxConfig(
|
|
176
|
+
await ctxConfig(sharedMailTransportSmtpFeature.exports.configKeys.host),
|
|
192
177
|
FEATURE_NAME,
|
|
193
178
|
"host",
|
|
194
179
|
SMTP_HINT,
|
|
195
180
|
);
|
|
196
181
|
const port = requireDefined(
|
|
197
|
-
await ctxConfig(
|
|
182
|
+
await ctxConfig(sharedMailTransportSmtpFeature.exports.configKeys.port),
|
|
198
183
|
FEATURE_NAME,
|
|
199
184
|
"port",
|
|
200
185
|
) as number; // @cast-boundary engine-payload
|
|
201
186
|
const secure = requireDefined(
|
|
202
|
-
await ctxConfig(
|
|
187
|
+
await ctxConfig(sharedMailTransportSmtpFeature.exports.configKeys.secure),
|
|
203
188
|
FEATURE_NAME,
|
|
204
189
|
"secure",
|
|
205
190
|
) as boolean; // @cast-boundary engine-payload
|
|
206
191
|
const from = requireNonEmpty(
|
|
207
|
-
await ctxConfig(
|
|
192
|
+
await ctxConfig(sharedMailTransportSmtpFeature.exports.configKeys.from),
|
|
208
193
|
FEATURE_NAME,
|
|
209
194
|
"from",
|
|
210
195
|
SMTP_HINT,
|
|
211
196
|
);
|
|
212
197
|
const authUser = requireNonEmpty(
|
|
213
|
-
await ctxConfig(
|
|
198
|
+
await ctxConfig(sharedMailTransportSmtpFeature.exports.configKeys.authUser),
|
|
214
199
|
FEATURE_NAME,
|
|
215
200
|
"authUser",
|
|
216
201
|
SMTP_HINT,
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const MAIL_TRANSPORT_SMTP_I18N = {
|
|
2
|
+
// Also the option label of mail-foundation's provider select.
|
|
3
|
+
"mail-transport-smtp.settings": { en: "SMTP server" },
|
|
4
|
+
"mail-transport-smtp.settings.secrets": { en: "SMTP sign-in" },
|
|
5
|
+
"mail-transport-smtp.settings.description": {
|
|
6
|
+
en: "The connection details come from your mail provider, for example Brevo, Postmark, Amazon SES or your own server.",
|
|
7
|
+
},
|
|
8
|
+
"mail-transport-smtp.host": { en: "Server address" },
|
|
9
|
+
"mail-transport-smtp.host.description": {
|
|
10
|
+
en: "Host name of the SMTP server, for example smtp.example.com.",
|
|
11
|
+
},
|
|
12
|
+
"mail-transport-smtp.port": { en: "Port number" },
|
|
13
|
+
"mail-transport-smtp.port.description": {
|
|
14
|
+
en: "Usually 587. Use 465 when your provider asks for SSL/TLS.",
|
|
15
|
+
},
|
|
16
|
+
"mail-transport-smtp.secure": { en: "SSL/TLS from the start" },
|
|
17
|
+
"mail-transport-smtp.secure.description": {
|
|
18
|
+
en: "Turn on for port 465. Leave off for 587, which switches to encryption by itself.",
|
|
19
|
+
},
|
|
20
|
+
"mail-transport-smtp.authUser": { en: "User name" },
|
|
21
|
+
"mail-transport-smtp.authUser.description": {
|
|
22
|
+
en: "Login name at the SMTP server, often an email address.",
|
|
23
|
+
},
|
|
24
|
+
"mail-transport-smtp.from": { en: "Sender address" },
|
|
25
|
+
"mail-transport-smtp.from.description": {
|
|
26
|
+
en: "The address mails are sent from, for example status@example.com. Your provider must allow it.",
|
|
27
|
+
},
|
|
28
|
+
} as const;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { fetchOne } from "@cosmicdrift/kumiko-framework/
|
|
1
|
+
import { fetchOne } from "@cosmicdrift/kumiko-framework/db";
|
|
2
2
|
import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
3
|
import * as z from "zod";
|
|
4
4
|
import { type PageRow, pagesTable } from "../table.js";
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { selectMany } from "@cosmicdrift/kumiko-framework/
|
|
2
|
-
import { castTenantRows } from "@cosmicdrift/kumiko-framework/db";
|
|
1
|
+
import { castTenantRows, selectMany } from "@cosmicdrift/kumiko-framework/db";
|
|
3
2
|
import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
4
3
|
import * as z from "zod";
|
|
5
4
|
import { type PageRow, pagesTable } from "../table.js";
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { fetchOne } from "@cosmicdrift/kumiko-framework/
|
|
2
|
-
import { createEventStoreExecutor } from "@cosmicdrift/kumiko-framework/db";
|
|
1
|
+
import { createEventStoreExecutor, fetchOne } from "@cosmicdrift/kumiko-framework/db";
|
|
3
2
|
import { defineWriteHandler, type TenantId } from "@cosmicdrift/kumiko-framework/engine";
|
|
4
3
|
import * as z from "zod";
|
|
5
4
|
import { requireForTenant } from "../../shared/index.js";
|
|
@@ -2,15 +2,19 @@
|
|
|
2
2
|
// Event-Store-Executor an — gleicher Pfad wie der echte set-Handler, aber
|
|
3
3
|
// ohne Access-Check. Default ifExists="skip".
|
|
4
4
|
|
|
5
|
-
import { fetchOne } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
6
5
|
import {
|
|
7
6
|
createEventStoreExecutor,
|
|
8
7
|
createTenantDb,
|
|
9
8
|
type DbConnection,
|
|
9
|
+
fetchOne,
|
|
10
10
|
} from "@cosmicdrift/kumiko-framework/db";
|
|
11
11
|
import type { SessionUser, TenantId } from "@cosmicdrift/kumiko-framework/engine";
|
|
12
|
-
import {
|
|
13
|
-
|
|
12
|
+
import {
|
|
13
|
+
runEventStoreSeed,
|
|
14
|
+
type SeedIfExists,
|
|
15
|
+
TestUsers,
|
|
16
|
+
} from "@cosmicdrift/kumiko-framework/seeding";
|
|
17
|
+
|
|
14
18
|
import { type PageRow, pageEntity, pagesTable } from "./table.js";
|
|
15
19
|
|
|
16
20
|
const executor = createEventStoreExecutor(pagesTable, pageEntity, { entityName: "page" });
|
|
@@ -33,7 +37,7 @@ export async function seedPage(db: DbConnection, opts: SeedPageOptions): Promise
|
|
|
33
37
|
// der event-store-stream im falschen tenant-bucket → version_conflict
|
|
34
38
|
// bei späteren echten writes). TestUsers.systemAdmin ist testTenantId(1).
|
|
35
39
|
const by = opts.by ?? { ...TestUsers.systemAdmin, tenantId: opts.tenantId };
|
|
36
|
-
const tdb = createTenantDb(db, opts.tenantId, "system");
|
|
40
|
+
const tdb = createTenantDb({ db, tenantId: opts.tenantId, mode: "system" });
|
|
37
41
|
|
|
38
42
|
const existing = await fetchOne<PageRow>(db, pagesTable, {
|
|
39
43
|
tenantId: opts.tenantId,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { extractTableInfo, type WhereObject } from "@cosmicdrift/kumiko-framework/
|
|
1
|
+
import { extractTableInfo, type WhereObject } from "@cosmicdrift/kumiko-framework/db";
|
|
2
2
|
import type { HandlerContext } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
3
|
import * as z from "zod";
|
|
4
4
|
import type { MetricDefinition, MetricFilterResolver } from "./types.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { extractTableInfo, isTimestamptzType } from "@cosmicdrift/kumiko-framework/
|
|
1
|
+
import { extractTableInfo, isTimestamptzType } from "@cosmicdrift/kumiko-framework/db";
|
|
2
2
|
import { METRIC_RANGES } from "./constants.js";
|
|
3
3
|
import { filterValueKindOf, metricFilterEntries, RESERVED_PAYLOAD_KEYS } from "./filters.js";
|
|
4
4
|
import type { MetricDefinition } from "./types.js";
|
|
@@ -63,7 +63,7 @@ function registerNotesHistory(
|
|
|
63
63
|
r.translations({ keys: NOTES_HISTORY_FEATURE_I18N });
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
const defaultNotesHistoryFeature = defineFeature(NOTES_HISTORY_FEATURE_NAME, (r) =>
|
|
67
67
|
registerNotesHistory(r, DEFAULT_NOTES_HISTORY_ACCESS, undefined, undefined),
|
|
68
68
|
);
|
|
69
69
|
|
|
@@ -114,14 +114,14 @@ function resolveAccess(opts: NotesHistoryFeatureOptions): AccessRule {
|
|
|
114
114
|
// rebuild). access/roles/ownership build a fresh feature-definition.
|
|
115
115
|
export function createNotesHistoryFeature(
|
|
116
116
|
opts: NotesHistoryFeatureOptions = {},
|
|
117
|
-
): typeof
|
|
117
|
+
): typeof defaultNotesHistoryFeature {
|
|
118
118
|
if (
|
|
119
119
|
opts.access === undefined &&
|
|
120
120
|
opts.roles === undefined &&
|
|
121
121
|
opts.ownership === undefined &&
|
|
122
122
|
opts.parents === undefined
|
|
123
123
|
) {
|
|
124
|
-
return
|
|
124
|
+
return defaultNotesHistoryFeature;
|
|
125
125
|
}
|
|
126
126
|
assertNoWhereRuleInOwnershipWrite("createNotesHistoryFeature", opts.ownership?.write);
|
|
127
127
|
// A mount that accepts no parents at all can never take a note write —
|
|
@@ -138,3 +138,6 @@ export function createNotesHistoryFeature(
|
|
|
138
138
|
registerNotesHistory(r, resolveAccess(opts), opts.ownership, opts.parents),
|
|
139
139
|
);
|
|
140
140
|
}
|
|
141
|
+
|
|
142
|
+
/** @deprecated Use createNotesHistoryFeature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
|
|
143
|
+
export const notesHistoryFeature = createNotesHistoryFeature();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { fetchOne, runInSavepointIfSupported } from "@cosmicdrift/kumiko-framework/
|
|
1
|
+
import { fetchOne, runInSavepointIfSupported } from "@cosmicdrift/kumiko-framework/db";
|
|
2
2
|
import type { AccessRule, WriteHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
3
|
import { ValidationError, writeFailure } from "@cosmicdrift/kumiko-framework/errors";
|
|
4
4
|
import { decryptStoredPii, denyUnlessJoinRowParentVisible } from "../../shared/index.js";
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
// dependency. Mirrors job-run/delivery-attempt (user-data-rights-defaults):
|
|
5
5
|
// export-only, erasure via crypto-shredding.
|
|
6
6
|
|
|
7
|
-
import { selectMany } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
8
7
|
import { configuredPiiSubjectKms, type SubjectId } from "@cosmicdrift/kumiko-framework/crypto";
|
|
9
8
|
import type { DbRunner, TenantDb } from "@cosmicdrift/kumiko-framework/db";
|
|
9
|
+
import { selectMany } from "@cosmicdrift/kumiko-framework/db";
|
|
10
10
|
import type {
|
|
11
11
|
TenantId,
|
|
12
12
|
UserDataDeleteHook,
|
|
@@ -15,22 +15,31 @@ import {
|
|
|
15
15
|
|
|
16
16
|
export { eraseNoteBodiesReachingSubject } from "./hooks.js";
|
|
17
17
|
|
|
18
|
-
export
|
|
19
|
-
|
|
20
|
-
"
|
|
18
|
+
export function createNotesHistoryUserDataFeature() {
|
|
19
|
+
return defineFeature(
|
|
20
|
+
"notes-history-user-data",
|
|
21
|
+
(r) => {
|
|
22
|
+
r.describe(
|
|
23
|
+
"GDPR (Art. 20 export / Art. 17 erasure) coverage for the `notes-history` feature's `note-entry` and `note-mention` entities. Mounts the export hook so a user's authored notes are included in the user-data export bundle; the note-entry delete hook crypto-shreds the row-subject key of each note that structurally @-mentions the forgotten user (`note-mention`) or hangs on the user as host entity (regardless of the host entity's retention strategy: the note text is free PII, the host's anonymize/blockDelete protects the row, not the content), keeping the append-only history intact for all other notes. The manual `crypto-shredding` forget-subject command reaches the same notes for user and record subjects through the exported `eraseNoteBodiesReachingSubject`, and the export lists them under `note-mention`. `note-mention`'s own hooks are a no-op — it is a plain FK pointer, not separately exportable content. Kept separate from `notes-history` so notes consumers without the user-data-rights pipeline don't pull a hard dependency — requires `user-data-rights`, optionalRequires `notes-history`.",
|
|
24
|
+
);
|
|
25
|
+
// user-data-rights is the hard dependency (EXT_USER_DATA host). notes-history
|
|
26
|
+
// is OPTIONAL: if it's mounted toggleable(default=false), a hard r.requires
|
|
27
|
+
// would throw an "effectively disabled" boot warning even though the
|
|
28
|
+
// note-entry entity exists and the hooks work fine.
|
|
29
|
+
r.requires({ features: ["user-data-rights"] });
|
|
30
|
+
r.optionalRequires("notes-history");
|
|
31
|
+
r.useExtension(EXT_USER_DATA, "note-entry", {
|
|
32
|
+
export: noteEntryExportHook,
|
|
33
|
+
delete: noteEntryDeleteHook,
|
|
34
|
+
});
|
|
35
|
+
r.useExtension(EXT_USER_DATA, "note-mention", {
|
|
36
|
+
export: noteMentionExportHook,
|
|
37
|
+
delete: noteMentionDeleteHook,
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
{ dedupeOptions: {} },
|
|
21
41
|
);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
r.requires({ features: ["user-data-rights"] });
|
|
27
|
-
r.optionalRequires("notes-history");
|
|
28
|
-
r.useExtension(EXT_USER_DATA, "note-entry", {
|
|
29
|
-
export: noteEntryExportHook,
|
|
30
|
-
delete: noteEntryDeleteHook,
|
|
31
|
-
});
|
|
32
|
-
r.useExtension(EXT_USER_DATA, "note-mention", {
|
|
33
|
-
export: noteMentionExportHook,
|
|
34
|
-
delete: noteMentionDeleteHook,
|
|
35
|
-
});
|
|
36
|
-
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** @deprecated Use createNotesHistoryUserDataFeature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
|
|
45
|
+
export const notesHistoryUserDataFeature = createNotesHistoryUserDataFeature();
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.368.0",
|
|
4
|
+
"type": "improvement",
|
|
5
|
+
"title": "The token list screen takes a description and slots via listScreen",
|
|
6
|
+
"detail": "createPersonalAccessTokensFeature({ listScreen: { description, slots } }) sets the i18n description and the slots (for example a header component) of the api-tokens list, so an app can show instructions above the list and use the bundled screen directly instead of embedding it in its own dashboard. Without the option nothing changes. Both bundled token screens are now marked agent: { expose: false }, since the mint screen reveals the token plaintext."
|
|
7
|
+
},
|
|
2
8
|
{
|
|
3
9
|
"version": "0.365.0",
|
|
4
10
|
"type": "fix",
|
|
@@ -4,7 +4,11 @@ import {
|
|
|
4
4
|
} from "@cosmicdrift/kumiko-bundled-features/auth-foundation";
|
|
5
5
|
import { PAT_TOKEN_PREFIX } from "@cosmicdrift/kumiko-framework/api";
|
|
6
6
|
import { deriveEntityTableMeta } from "@cosmicdrift/kumiko-framework/db";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
defineFeature,
|
|
9
|
+
type FeatureDefinition,
|
|
10
|
+
type ProjectionListScreenDefinition,
|
|
11
|
+
} from "@cosmicdrift/kumiko-framework/engine";
|
|
8
12
|
import {
|
|
9
13
|
API_TOKEN_ENTITY_NAME,
|
|
10
14
|
PAT_DEFAULT_RATE_LIMIT,
|
|
@@ -68,6 +72,9 @@ export type PersonalAccessTokensOptions = {
|
|
|
68
72
|
* shown in place of the token screens when the tenant's tier excludes the
|
|
69
73
|
* feature, e.g. an upgrade notice. Default: the standard "unavailable" notice. */
|
|
70
74
|
readonly lockedFallbackScreen?: string;
|
|
75
|
+
/** Description (i18n key) and slots rendered on the token list screen, e.g. an
|
|
76
|
+
* explanatory text or a header component above the list. Default: neither. */
|
|
77
|
+
readonly listScreen?: Pick<ProjectionListScreenDefinition, "description" | "slots">;
|
|
71
78
|
// Opt-in MFA re-auth gate for minting a token — wired via
|
|
72
79
|
// mfaVerifierFromFeature (auth-mfa/feature.ts) at app-composition time. No
|
|
73
80
|
// hard dependency on the optional auth-mfa feature.
|
|
@@ -176,7 +183,15 @@ export function createPersonalAccessTokensFeature(
|
|
|
176
183
|
// places `patListScreen` via r.nav in its logged-in settings area.
|
|
177
184
|
const lockedFallback =
|
|
178
185
|
options.lockedFallbackScreen === undefined ? {} : { fallback: options.lockedFallbackScreen };
|
|
179
|
-
|
|
186
|
+
// Copy the two fields explicitly: a wider object passed as a variable
|
|
187
|
+
// escapes the Pick check and would override agent/access otherwise.
|
|
188
|
+
const { description, slots } = options.listScreen ?? {};
|
|
189
|
+
r.screen({
|
|
190
|
+
...patListScreen,
|
|
191
|
+
...(description === undefined ? {} : { description }),
|
|
192
|
+
...(slots === undefined ? {} : { slots }),
|
|
193
|
+
...lockedFallback,
|
|
194
|
+
});
|
|
180
195
|
r.screen({ ...createPatMintScreen(scopes), ...lockedFallback });
|
|
181
196
|
r.translations({ keys: { ...PAT_FEATURE_I18N, ...patScopeOptionTranslations(scopes) } });
|
|
182
197
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { selectMany } from "@cosmicdrift/kumiko-framework/
|
|
1
|
+
import { selectMany } from "@cosmicdrift/kumiko-framework/db";
|
|
2
2
|
import { definePagedQueryHandler, MAX_LIST_LIMIT } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
3
|
import { isOneOf } from "@cosmicdrift/kumiko-types/type-guards";
|
|
4
4
|
import * as z from "zod";
|
|
@@ -8,7 +8,7 @@ import { apiTokenTable } from "../schema/api-token.js";
|
|
|
8
8
|
|
|
9
9
|
// `sort` arrives raw from the client's query string. selectMany's orderBy has
|
|
10
10
|
// no column-existence check — an unrecognised field just gets snake_cased and
|
|
11
|
-
// quoted as-is (
|
|
11
|
+
// quoted as-is (db/query.ts columnOf) — so this allowlist is what stops a
|
|
12
12
|
// client sorting by tokenHash or any other non-exposed column.
|
|
13
13
|
const SORTABLE_COLUMNS = ["id", "name", "createdAt", "expiresAt", "revokedAt"] as const;
|
|
14
14
|
type SortableColumn = (typeof SORTABLE_COLUMNS)[number];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { updateMany } from "@cosmicdrift/kumiko-framework/
|
|
1
|
+
import { updateMany } from "@cosmicdrift/kumiko-framework/db";
|
|
2
2
|
import { defineWriteHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
3
|
import { UnprocessableError, writeFailure } from "@cosmicdrift/kumiko-framework/errors";
|
|
4
4
|
import { generateId } from "@cosmicdrift/kumiko-framework/utils";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { TokenVerifier } from "@cosmicdrift/kumiko-framework/api";
|
|
2
|
-
import { fetchOne } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
3
2
|
import type { DbConnection } from "@cosmicdrift/kumiko-framework/db";
|
|
3
|
+
import { fetchOne } from "@cosmicdrift/kumiko-framework/db";
|
|
4
4
|
import type { SessionUser, TenantId } from "@cosmicdrift/kumiko-framework/engine";
|
|
5
5
|
import { isExpiredAt } from "./expiry.js";
|
|
6
6
|
import { hashPatToken } from "./hash.js";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import type { DbRunner } from "@cosmicdrift/kumiko-framework/db";
|
|
1
2
|
import {
|
|
2
3
|
runnerCanBeginTransaction,
|
|
3
4
|
transaction,
|
|
4
5
|
updateMany,
|
|
5
|
-
} from "@cosmicdrift/kumiko-framework/
|
|
6
|
-
import type { DbRunner } from "@cosmicdrift/kumiko-framework/db";
|
|
6
|
+
} from "@cosmicdrift/kumiko-framework/db";
|
|
7
7
|
import { SYSTEM_TENANT_ID } from "@cosmicdrift/kumiko-framework/engine";
|
|
8
8
|
import { append } from "@cosmicdrift/kumiko-framework/event-store";
|
|
9
9
|
import { generateId } from "@cosmicdrift/kumiko-framework/utils";
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { fetchOne, selectMany } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
2
1
|
import type { DbConnection } from "@cosmicdrift/kumiko-framework/db";
|
|
2
|
+
import { fetchOne, selectMany } from "@cosmicdrift/kumiko-framework/db";
|
|
3
3
|
import { buildSessionRoles } from "@cosmicdrift/kumiko-framework/engine";
|
|
4
4
|
import { parseRoles } from "@cosmicdrift/kumiko-framework/utils";
|
|
5
|
-
// kumiko-lint-ignore cross-feature-import shared lifecycle-status gate with session auth
|
|
6
|
-
import { isPrincipalBlocked } from "../sessions/index.js";
|
|
7
5
|
import { tenantMembershipsTable } from "../tenant/index.js";
|
|
8
|
-
import { type UserStatus, userTable } from "../user/index.js";
|
|
6
|
+
import { isPrincipalRowBlocked, type UserStatus, userTable } from "../user/index.js";
|
|
9
7
|
|
|
10
8
|
// Live role resolution for a (userId, tenantId), mirroring login.write.ts:
|
|
11
9
|
// global roles (users.roles) ∪ tenant-membership roles (forbidden roles
|
|
@@ -28,10 +26,14 @@ export async function resolvePatRoles(
|
|
|
28
26
|
});
|
|
29
27
|
const membership = memberships[0];
|
|
30
28
|
if (!membership) return null;
|
|
31
|
-
const userRow = await fetchOne<{
|
|
29
|
+
const userRow = await fetchOne<{
|
|
30
|
+
roles: string | null;
|
|
31
|
+
status: UserStatus;
|
|
32
|
+
isDeleted: boolean;
|
|
33
|
+
}>(db, userTable, {
|
|
32
34
|
id: userId,
|
|
33
35
|
});
|
|
34
|
-
if (userRow &&
|
|
36
|
+
if (userRow && isPrincipalRowBlocked(userRow)) return null;
|
|
35
37
|
const globalRoles = parseRoles(userRow?.roles ?? null);
|
|
36
38
|
return buildSessionRoles(globalRoles, parseRoles(membership.roles));
|
|
37
39
|
}
|
|
@@ -35,6 +35,7 @@ const PAT_SCREEN_VISIBLE_WHEN = {
|
|
|
35
35
|
export const patListScreen: ProjectionListScreenDefinition = {
|
|
36
36
|
id: PAT_SCREEN_ID,
|
|
37
37
|
type: "projectionList",
|
|
38
|
+
agent: { expose: false },
|
|
38
39
|
visibleWhen: PAT_SCREEN_VISIBLE_WHEN,
|
|
39
40
|
query: PatQueries.mine,
|
|
40
41
|
// The `mine` handler honours `limit` only (no offset/total), so a pager would
|
|
@@ -118,6 +119,7 @@ export function createPatMintScreen(scopes: PatScopeConfig): SecretMintScreenDef
|
|
|
118
119
|
return {
|
|
119
120
|
id: PAT_MINT_SCREEN_ID,
|
|
120
121
|
type: "secretMint",
|
|
122
|
+
agent: { expose: false },
|
|
121
123
|
visibleWhen: PAT_SCREEN_VISIBLE_WHEN,
|
|
122
124
|
handler: PatHandlers.create,
|
|
123
125
|
fields: {
|
|
@@ -11,21 +11,30 @@
|
|
|
11
11
|
import { defineFeature } from "@cosmicdrift/kumiko-framework/engine";
|
|
12
12
|
import { statusQuery } from "./handlers/status.query.js";
|
|
13
13
|
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
14
|
+
export function createReadinessFeature() {
|
|
15
|
+
return defineFeature(
|
|
16
|
+
"readiness",
|
|
17
|
+
(r) => {
|
|
18
|
+
r.describe(
|
|
19
|
+
"One-call tenant-onboarding probe: `readiness:query:status` rolls up every config key and secret declared `required: true` across all mounted features and reports which still lack a usable value for the calling tenant, plus a single `ready` boolean. Provider-features under an `r.extensionSelector`-declared extension point count only while their provider is the selected one — a tenant on the inmemory mail transport is not blocked by unset SMTP keys. Mount it (together with `config` and `secrets`) when an admin UI needs a settings checklist before the first mail-send or file-write; the per-concern lists stay available via `config:query:readiness` and `secrets:query:list`.",
|
|
20
|
+
);
|
|
21
|
+
r.uiHints({
|
|
22
|
+
displayLabel: "Readiness · Onboarding Probe",
|
|
23
|
+
category: "operations",
|
|
24
|
+
recommended: false,
|
|
25
|
+
});
|
|
26
|
+
r.requires({ features: ["config"] });
|
|
27
|
+
r.requires({ features: ["secrets"] });
|
|
28
|
+
|
|
29
|
+
const queries = {
|
|
30
|
+
status: r.queryHandler(statusQuery),
|
|
31
|
+
};
|
|
25
32
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
33
|
+
return { queries };
|
|
34
|
+
},
|
|
35
|
+
{ dedupeOptions: {} },
|
|
36
|
+
);
|
|
37
|
+
}
|
|
29
38
|
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
/** @deprecated Use createReadinessFeature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
|
|
40
|
+
export const readinessFeature = createReadinessFeature();
|