@cosmicdrift/kumiko-bundled-features 0.362.0 → 0.364.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/dist/admin-shell/feature.d.ts +3 -0
- package/dist/admin-shell/feature.js +6 -1
- package/dist/agent-tools/agent-manifest.js +2 -1
- package/dist/agent-tools/filter-ops.d.ts +1 -1
- package/dist/agent-tools/filter-ops.js +1 -3
- package/dist/agent-tools/tool-dispatch.js +2 -1
- package/dist/audit/handlers/list.query.js +9 -5
- package/dist/auth-email-password/bootstrap.d.ts +8 -5
- package/dist/auth-email-password/bootstrap.js +12 -4
- package/dist/auth-email-password/email-rate-limits.d.ts +4 -0
- package/dist/auth-email-password/email-rate-limits.js +13 -0
- package/dist/auth-email-password/email-templates.d.ts +4 -26
- package/dist/auth-email-password/email-templates.js +9 -101
- package/dist/auth-email-password/feature.js +24 -6
- package/dist/auth-email-password/handlers/change-password.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/change-password.write.js +6 -2
- package/dist/auth-email-password/handlers/confirm-account-unlock.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/invite-accept-with-login.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/invite-accept.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/invite-create.write.d.ts +2 -2
- package/dist/auth-email-password/handlers/invite-create.write.js +4 -4
- package/dist/auth-email-password/handlers/invite-signup-complete.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/login.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/logout.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/logout.write.js +6 -2
- package/dist/auth-email-password/handlers/request-account-unlock.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/request-account-unlock.write.js +2 -4
- package/dist/auth-email-password/handlers/request-email-verification.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/request-email-verification.write.js +2 -4
- package/dist/auth-email-password/handlers/request-password-reset.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/request-password-reset.write.js +2 -4
- package/dist/auth-email-password/handlers/reset-password.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/signup-confirm.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/signup-confirm.write.js +3 -4
- package/dist/auth-email-password/handlers/signup-request.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/signup-request.write.js +2 -1
- package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/token-request-handler.d.ts +2 -3
- package/dist/auth-email-password/handlers/token-request-handler.js +2 -2
- package/dist/auth-email-password/handlers/verify-email.write.d.ts +1 -1
- package/dist/auth-email-password/index.d.ts +2 -2
- package/dist/auth-email-password/index.js +1 -1
- package/dist/auth-email-password/magic-link-mail.d.ts +3 -2
- package/dist/auth-email-password/magic-link-mail.js +19 -14
- package/dist/auth-email-password/mail-notifications.d.ts +32 -0
- package/dist/auth-email-password/mail-notifications.js +116 -0
- package/dist/auth-email-password/signup-activation.d.ts +1 -1
- package/dist/auth-email-password/signup-activation.js +2 -3
- package/dist/auth-email-password/web/auth-gate.js +16 -4
- package/dist/auth-foundation/types.js +2 -8
- package/dist/auth-mfa/feature.js +4 -4
- package/dist/auth-mfa/handlers/disable.write.d.ts +1 -1
- package/dist/auth-mfa/handlers/enable-confirm-preauth.write.d.ts +1 -1
- package/dist/auth-mfa/handlers/enable-confirm.write.d.ts +1 -1
- package/dist/auth-mfa/handlers/enable-start-preauth.write.d.ts +1 -1
- package/dist/auth-mfa/handlers/enable-start.write.d.ts +1 -1
- package/dist/auth-mfa/handlers/regenerate-recovery.write.d.ts +1 -1
- package/dist/auth-mfa/handlers/verify.write.d.ts +1 -1
- package/dist/auth-mfa/hmac-token-codec.js +4 -4
- package/dist/auth-mfa/mfa-challenge-token.js +3 -3
- package/dist/auth-mfa/mfa-preauth-setup-token.js +3 -3
- package/dist/auth-mfa/mfa-setup-token.js +8 -8
- package/dist/billing-foundation/constants.d.ts +3 -3
- package/dist/billing-foundation/constants.js +5 -4
- package/dist/billing-foundation/consumer-protection/confirmation-mail.d.ts +32 -14
- package/dist/billing-foundation/consumer-protection/confirmation-mail.js +74 -32
- package/dist/billing-foundation/consumer-protection/consent-gate.d.ts +3 -0
- package/dist/billing-foundation/consumer-protection/consent-gate.js +21 -2
- package/dist/billing-foundation/consumer-protection/issue-confirmation.js +3 -3
- package/dist/billing-foundation/consumer-protection/mail-notifications.d.ts +8 -0
- package/dist/billing-foundation/consumer-protection/mail-notifications.js +95 -0
- package/dist/billing-foundation/consumer-protection/register-consent.js +2 -0
- package/dist/billing-foundation/consumer-protection/register-termination.js +11 -1
- package/dist/billing-foundation/consumer-protection/termination-mail.d.ts +25 -13
- package/dist/billing-foundation/consumer-protection/termination-mail.js +11 -23
- package/dist/billing-foundation/consumer-protection/termination-notify.js +2 -2
- package/dist/billing-foundation/consumer-protection/termination-pages.js +1 -3
- package/dist/billing-foundation/consumer-protection/termination-receipt-limit.d.ts +6 -0
- package/dist/billing-foundation/consumer-protection/termination-receipt-limit.js +34 -0
- package/dist/billing-foundation/consumer-protection/termination-record.d.ts +2 -0
- package/dist/billing-foundation/consumer-protection/termination-record.js +7 -1
- package/dist/billing-foundation/consumer-protection/termination-request.js +31 -21
- package/dist/billing-foundation/consumer-protection/termination-texts.d.ts +1 -1
- package/dist/billing-foundation/consumer-protection/termination-texts.js +6 -0
- package/dist/billing-foundation/consumer-protection/withdrawal-period.d.ts +10 -0
- package/dist/billing-foundation/consumer-protection/withdrawal-period.js +26 -0
- package/dist/billing-foundation/handlers/create-checkout-session.write.js +11 -5
- package/dist/billing-foundation/handlers/process-event.write.js +12 -8
- package/dist/billing-foundation/handlers/process-payment-event.write.js +1 -1
- package/dist/billing-foundation/i18n.js +3 -0
- package/dist/billing-foundation/subscription-tier-sync.d.ts +7 -1
- package/dist/billing-foundation/subscription-tier-sync.js +16 -9
- package/dist/billing-foundation/types.d.ts +7 -2
- package/dist/cap-counter/calendar-cap-usage-reservation.js +2 -0
- package/dist/cap-counter/enforce-cap.d.ts +18 -1
- package/dist/cap-counter/enforce-cap.js +49 -6
- package/dist/cap-counter/index.d.ts +1 -1
- package/dist/cap-counter/index.js +1 -1
- package/dist/cap-counter/with-cap-enforcement.d.ts +2 -0
- package/dist/cap-overview/handlers/tenant-caps-list.query.js +2 -1
- package/dist/cap-overview/web/cap-usage-cell.js +5 -4
- package/dist/channel-email/email-channel.d.ts +2 -2
- package/dist/channel-email/email-channel.js +101 -26
- package/dist/channel-email/feature.js +3 -3
- package/dist/channel-email/index.d.ts +1 -1
- package/dist/channel-email/index.js +1 -1
- package/dist/channel-email/pii-guard.js +10 -0
- package/dist/channel-email/smtp-transport.js +13 -0
- package/dist/channel-email/types.d.ts +8 -0
- package/dist/channel-in-app/handlers/mark-all-read.write.d.ts +1 -1
- package/dist/channel-in-app/handlers/mark-read.write.d.ts +1 -1
- package/dist/compliance-profiles/handlers/set-profile.write.d.ts +1 -1
- package/dist/config/handlers/reset.write.d.ts +1 -1
- package/dist/config/handlers/set.write.d.ts +1 -1
- package/dist/config/handlers/set.write.js +3 -4
- package/dist/config/resolver.d.ts +1 -0
- package/dist/config/resolver.js +11 -14
- package/dist/config/write-helpers.d.ts +2 -0
- package/dist/config/write-helpers.js +19 -0
- package/dist/crypto-shredding/handlers/forget-subject.write.d.ts +1 -1
- package/dist/crypto-shredding/handlers/forget-subject.write.js +29 -19
- package/dist/custom-fields/handlers/update-tenant-field.write.js +0 -1
- package/dist/custom-fields/lib/value-schema.js +10 -11
- package/dist/custom-fields/wire-user-data-rights.js +7 -6
- package/dist/data-retention/index.d.ts +1 -0
- package/dist/data-retention/index.js +1 -0
- package/dist/data-retention/run-retention-cleanup.js +6 -6
- package/dist/delivery/attachment-ref.d.ts +41 -0
- package/dist/delivery/attachment-ref.js +78 -0
- package/dist/delivery/channel-context.d.ts +8 -4
- package/dist/delivery/channel-context.js +94 -2
- package/dist/delivery/constants.d.ts +1 -0
- package/dist/delivery/constants.js +1 -0
- package/dist/delivery/delivery-service.d.ts +4 -1
- package/dist/delivery/delivery-service.js +38 -32
- package/dist/delivery/feature.js +1 -1
- package/dist/delivery/handlers/resubscribe-address.write.d.ts +1 -1
- package/dist/delivery/handlers/resubscribe-user.write.d.ts +1 -1
- package/dist/delivery/handlers/set-preference.write.d.ts +1 -1
- package/dist/delivery/handlers/unsubscribe-address.write.d.ts +1 -1
- package/dist/delivery/handlers/unsubscribe-user.write.d.ts +1 -1
- package/dist/delivery/index.d.ts +5 -2
- package/dist/delivery/index.js +4 -1
- package/dist/delivery/jobs.js +66 -14
- package/dist/delivery/notify-factory.js +4 -1
- package/dist/delivery/testing.d.ts +4 -1
- package/dist/delivery/types.d.ts +26 -14
- package/dist/delivery/unsubscribe.js +4 -1
- package/dist/derivatives-sharp/render.js +1 -18
- package/dist/document-ingest-foundation/pages.js +4 -4
- package/dist/feature-toggles/handlers/set.write.d.ts +1 -1
- package/dist/feature-toggles/toggle-sync-signal.js +4 -4
- package/dist/file-derivatives/handlers/public-variant.query.js +1 -1
- package/dist/file-foundation/index.d.ts +1 -0
- package/dist/file-foundation/index.js +1 -0
- package/dist/file-foundation/read-file-ref-content.d.ts +27 -0
- package/dist/file-foundation/read-file-ref-content.js +51 -0
- package/dist/files-tenant-data/hooks.js +4 -0
- package/dist/folders/web/folder-manager.js +3 -2
- package/dist/form-draft/db/queries/cleanup.js +4 -4
- package/dist/form-draft/db/queries/draft-count.js +2 -2
- package/dist/form-draft/db/queries/owned-file-refs.js +2 -2
- package/dist/form-draft/handlers/discard.write.d.ts +1 -1
- package/dist/form-draft/handlers/save.write.d.ts +1 -1
- package/dist/form-draft/release-file-refs.js +3 -2
- package/dist/inbound-mail-foundation/handlers/connect-account.write.js +1 -1
- package/dist/inbound-mail-foundation/handlers/ingest-message.write.js +6 -6
- package/dist/inbound-mail-foundation/handlers/scope-visibility.d.ts +1 -1
- package/dist/inbound-mail-foundation/oauth-access-token.js +8 -3
- package/dist/inbound-mail-foundation/oauth-state.js +7 -7
- package/dist/inbound-mail-foundation/types.js +4 -4
- package/dist/inbound-mail-foundation/watch-supervisor.js +24 -13
- package/dist/inbound-provider-imap/imap-client.js +4 -3
- package/dist/jobs/db/queries/stale-run-sweep.d.ts +1 -1
- package/dist/jobs/db/queries/stale-run-sweep.js +12 -5
- package/dist/jobs/feature.js +5 -3
- package/dist/jobs/handlers/list.query.js +3 -1
- package/dist/jobs/handlers/retry.write.d.ts +1 -1
- package/dist/jobs/handlers/stale-run-sweep.job.d.ts +1 -1
- package/dist/jobs/handlers/stale-run-sweep.job.js +2 -2
- package/dist/jobs/handlers/trigger.write.d.ts +1 -1
- package/dist/jobs/job-run-logger.js +32 -10
- package/dist/jobs/tenant-job-run-table.js +3 -2
- package/dist/ledger/entity.js +3 -1
- package/dist/ledger/recurring.js +1 -3
- package/dist/managed-pages/branding.d.ts +2 -0
- package/dist/managed-pages/branding.js +24 -2
- package/dist/managed-pages/feature.js +1 -0
- package/dist/managed-pages/handlers/set.write.d.ts +1 -1
- package/dist/managed-pages/i18n.js +1 -0
- package/dist/managed-pages/screens/branding-screen.js +8 -1
- package/dist/page-render/branding.d.ts +1 -0
- package/dist/page-render/branding.js +1 -0
- package/dist/page-render/markdown.js +1 -1
- package/dist/personal-access-tokens/feature.js +1 -1
- package/dist/personal-access-tokens/handlers/create.write.d.ts +1 -1
- package/dist/personal-access-tokens/handlers/list.query.js +2 -1
- package/dist/personal-access-tokens/handlers/revoke.write.d.ts +1 -1
- package/dist/personal-access-tokens/revoke-for-user.js +2 -1
- package/dist/renderer-foundation/api.d.ts +13 -13
- package/dist/renderer-foundation/api.js +1 -1
- package/dist/renderer-foundation/constants.js +2 -4
- package/dist/renderer-foundation/feature.js +7 -7
- package/dist/renderer-foundation/index.d.ts +2 -1
- package/dist/renderer-foundation/index.js +1 -0
- package/dist/renderer-foundation/types.d.ts +94 -32
- package/dist/renderer-pdf/feature.js +7 -1
- package/dist/renderer-pdf/render-table-pdf.d.ts +27 -33
- package/dist/renderer-pdf/render-table-pdf.js +95 -34
- package/dist/secrets/feature.js +4 -3
- package/dist/secrets/handlers/delete.write.d.ts +1 -1
- package/dist/secrets/handlers/set.write.d.ts +1 -1
- package/dist/secrets/secrets-context.js +15 -3
- package/dist/sessions/db/queries/cleanup.js +2 -2
- package/dist/sessions/feature.js +1 -1
- package/dist/sessions/handlers/list.query.js +2 -1
- package/dist/sessions/handlers/revoke-all-for-user.write.d.ts +1 -1
- package/dist/sessions/handlers/revoke-all-others.write.d.ts +1 -1
- package/dist/sessions/handlers/revoke.write.d.ts +1 -1
- package/dist/shared/attachment-file-name.d.ts +3 -0
- package/dist/shared/attachment-file-name.js +35 -0
- package/dist/shared/chunked-entity-migration.d.ts +1 -0
- package/dist/shared/chunked-entity-migration.js +1 -1
- package/dist/shared/index.d.ts +3 -0
- package/dist/shared/index.js +3 -0
- package/dist/shared/is-tenant-db.js +1 -1
- package/dist/shared/mail-template-body.d.ts +7 -0
- package/dist/shared/mail-template-body.js +27 -0
- package/dist/shared/sharp-input-limits.d.ts +6 -0
- package/dist/shared/sharp-input-limits.js +22 -0
- package/dist/shared/signup-handover.js +2 -2
- package/dist/subscription-stripe/plugin-methods.js +18 -8
- package/dist/subscription-stripe/verify-webhook.d.ts +1 -1
- package/dist/tags/handlers/assign-tag.write.js +3 -1
- package/dist/tags/web/tag-chip.js +2 -0
- package/dist/template-resolver/api.d.ts +30 -2
- package/dist/template-resolver/api.js +42 -6
- package/dist/template-resolver/compile-document-body.d.ts +12 -0
- package/dist/template-resolver/compile-document-body.js +205 -0
- package/dist/template-resolver/constants.d.ts +13 -4
- package/dist/template-resolver/constants.js +32 -10
- package/dist/template-resolver/document-sanitizer.d.ts +32 -0
- package/dist/template-resolver/document-sanitizer.js +201 -0
- package/dist/template-resolver/document-schema.d.ts +21 -0
- package/dist/template-resolver/document-schema.js +316 -0
- package/dist/template-resolver/feature.d.ts +20 -0
- package/dist/template-resolver/feature.js +53 -6
- package/dist/template-resolver/handlers/bundle-import.d.ts +20 -0
- package/dist/template-resolver/handlers/bundle-import.js +147 -0
- package/dist/template-resolver/handlers/collection-set.write.d.ts +1 -1
- package/dist/template-resolver/handlers/collection-set.write.js +25 -2
- package/dist/template-resolver/handlers/copy-locale.write.d.ts +19 -0
- package/dist/template-resolver/handlers/copy-locale.write.js +134 -0
- package/dist/template-resolver/handlers/diff-to-system.query.d.ts +22 -0
- package/dist/template-resolver/handlers/diff-to-system.query.js +30 -0
- package/dist/template-resolver/handlers/discard-draft.write.d.ts +13 -0
- package/dist/template-resolver/handlers/discard-draft.write.js +37 -0
- package/dist/template-resolver/handlers/export-bundle.query.d.ts +35 -0
- package/dist/template-resolver/handlers/export-bundle.query.js +118 -0
- package/dist/template-resolver/handlers/find-by-id.query.d.ts +2 -0
- package/dist/template-resolver/handlers/find-by-id.query.js +9 -6
- package/dist/template-resolver/handlers/import-bundle-system.write.d.ts +39 -0
- package/dist/template-resolver/handlers/import-bundle-system.write.js +36 -0
- package/dist/template-resolver/handlers/import-bundle.write.d.ts +40 -0
- package/dist/template-resolver/handlers/import-bundle.write.js +19 -0
- package/dist/template-resolver/handlers/layout-source.query.d.ts +31 -0
- package/dist/template-resolver/handlers/layout-source.query.js +87 -0
- package/dist/template-resolver/handlers/list.query.d.ts +4 -1
- package/dist/template-resolver/handlers/list.query.js +9 -8
- package/dist/template-resolver/handlers/override-diff.d.ts +20 -0
- package/dist/template-resolver/handlers/override-diff.js +41 -0
- package/dist/template-resolver/handlers/overview.query.d.ts +65 -0
- package/dist/template-resolver/handlers/overview.query.js +205 -0
- package/dist/template-resolver/handlers/preview.query.d.ts +12 -0
- package/dist/template-resolver/handlers/preview.query.js +24 -0
- package/dist/template-resolver/handlers/reset-to-system.write.d.ts +8 -0
- package/dist/template-resolver/handlers/reset-to-system.write.js +50 -0
- package/dist/template-resolver/handlers/resource-link-pdf.write.d.ts +8 -0
- package/dist/template-resolver/handlers/resource-link-pdf.write.js +32 -0
- package/dist/template-resolver/handlers/resource-remove.write.d.ts +9 -0
- package/dist/template-resolver/handlers/resource-remove.write.js +44 -0
- package/dist/template-resolver/handlers/resource-shared.d.ts +9 -0
- package/dist/template-resolver/handlers/resource-shared.js +14 -0
- package/dist/template-resolver/handlers/resource-upload.write.d.ts +13 -0
- package/dist/template-resolver/handlers/resource-upload.write.js +98 -0
- package/dist/template-resolver/handlers/send-test.write.d.ts +13 -0
- package/dist/template-resolver/handlers/send-test.write.js +108 -0
- package/dist/template-resolver/handlers/set.write.d.ts +5 -2
- package/dist/template-resolver/handlers/set.write.js +25 -3
- package/dist/template-resolver/handlers/shared.d.ts +9 -5
- package/dist/template-resolver/handlers/shared.js +6 -2
- package/dist/template-resolver/handlers/template-gates.d.ts +36 -0
- package/dist/template-resolver/handlers/template-gates.js +142 -0
- package/dist/template-resolver/handlers/template-write.d.ts +45 -0
- package/dist/template-resolver/handlers/template-write.js +141 -0
- package/dist/template-resolver/handlers/tenant-overrides.query.d.ts +49 -0
- package/dist/template-resolver/handlers/tenant-overrides.query.js +112 -0
- package/dist/template-resolver/handlers/toggle-status.write.d.ts +27 -2
- package/dist/template-resolver/handlers/toggle-status.write.js +47 -15
- package/dist/template-resolver/handlers/upsert-system.write.d.ts +5 -8
- package/dist/template-resolver/handlers/upsert-system.write.js +14 -59
- package/dist/template-resolver/handlers/upsert-tenant.write.d.ts +5 -8
- package/dist/template-resolver/handlers/upsert-tenant.write.js +11 -62
- package/dist/template-resolver/handlers/usage.query.d.ts +17 -0
- package/dist/template-resolver/handlers/usage.query.js +24 -0
- package/dist/template-resolver/handlers/validate.query.d.ts +74 -0
- package/dist/template-resolver/handlers/validate.query.js +80 -0
- package/dist/template-resolver/index.d.ts +19 -1
- package/dist/template-resolver/index.js +17 -1
- package/dist/template-resolver/layout-appearance.d.ts +10 -0
- package/dist/template-resolver/layout-appearance.js +26 -0
- package/dist/template-resolver/layout-regions.d.ts +23 -0
- package/dist/template-resolver/layout-regions.js +125 -0
- package/dist/template-resolver/linked-resources.d.ts +17 -0
- package/dist/template-resolver/linked-resources.js +75 -0
- package/dist/template-resolver/pdf-constants.d.ts +7 -0
- package/dist/template-resolver/pdf-constants.js +8 -0
- package/dist/template-resolver/preview-display-html.d.ts +7 -0
- package/dist/template-resolver/preview-display-html.js +27 -0
- package/dist/template-resolver/print-document.d.ts +1 -0
- package/dist/template-resolver/print-document.js +55 -0
- package/dist/template-resolver/qualified-names.d.ts +34 -0
- package/dist/template-resolver/qualified-names.js +34 -0
- package/dist/template-resolver/record-mapping.d.ts +2 -0
- package/dist/template-resolver/record-mapping.js +21 -0
- package/dist/template-resolver/resource-image.d.ts +15 -0
- package/dist/template-resolver/resource-image.js +34 -0
- package/dist/template-resolver/seeding.d.ts +14 -1
- package/dist/template-resolver/seeding.js +125 -18
- package/dist/template-resolver/store-template-resource.d.ts +64 -0
- package/dist/template-resolver/store-template-resource.js +264 -0
- package/dist/template-resolver/table.d.ts +150 -8
- package/dist/template-resolver/table.js +20 -2
- package/dist/template-resolver/template-bundle.d.ts +36 -0
- package/dist/template-resolver/template-bundle.js +60 -0
- package/dist/template-resolver/template-diff.d.ts +7 -0
- package/dist/template-resolver/template-diff.js +68 -0
- package/dist/template-resolver/template-draft.d.ts +51 -0
- package/dist/template-resolver/template-draft.js +72 -0
- package/dist/template-resolver/template-meta.d.ts +85 -0
- package/dist/template-resolver/template-meta.js +145 -0
- package/dist/template-resolver/template-preview.d.ts +103 -0
- package/dist/template-resolver/template-preview.js +418 -0
- package/dist/template-resolver/template-resources.d.ts +19 -0
- package/dist/template-resolver/template-resources.js +73 -0
- package/dist/template-resolver/template-usage.d.ts +16 -0
- package/dist/template-resolver/template-usage.js +35 -0
- package/dist/template-resolver/template-validation.d.ts +22 -0
- package/dist/template-resolver/template-validation.js +173 -0
- package/dist/template-resolver/testing.js +5 -5
- package/dist/template-resolver/user-content-table.d.ts +14 -8
- package/dist/template-resolver/web/client-plugin.d.ts +1 -0
- package/dist/template-resolver/web/client-plugin.js +12 -7
- package/dist/template-resolver/web/document-editor-extensions.d.ts +18 -0
- package/dist/template-resolver/web/document-editor-extensions.js +145 -0
- package/dist/template-resolver/web/document-editor.d.ts +4 -0
- package/dist/template-resolver/web/document-editor.js +17 -0
- package/dist/template-resolver/web/document-tiptap-editor.d.ts +3 -0
- package/dist/template-resolver/web/document-tiptap-editor.js +492 -0
- package/dist/template-resolver/web/document-toolbar-blocks.d.ts +41 -0
- package/dist/template-resolver/web/document-toolbar-blocks.js +19 -0
- package/dist/template-resolver/web/editor-handle.d.ts +3 -0
- package/dist/template-resolver/web/editor-handle.js +24 -0
- package/dist/template-resolver/web/i18n.js +91 -0
- package/dist/template-resolver/web/index.d.ts +5 -0
- package/dist/template-resolver/web/index.js +5 -0
- package/dist/template-resolver/web/placeholder-line-editor-lazy.d.ts +4 -0
- package/dist/template-resolver/web/placeholder-line-editor-lazy.js +16 -0
- package/dist/template-resolver/web/placeholder-line-editor.d.ts +17 -0
- package/dist/template-resolver/web/placeholder-line-editor.js +94 -0
- package/dist/template-resolver/web/placeholder-text.d.ts +4 -0
- package/dist/template-resolver/web/placeholder-text.js +34 -0
- package/dist/template-resolver/web/use-stable-by-key.d.ts +1 -0
- package/dist/template-resolver/web/use-stable-by-key.js +13 -0
- package/dist/tenant/handlers/add-member.write.d.ts +1 -1
- package/dist/tenant/handlers/cancel-invitation.write.d.ts +1 -1
- package/dist/tenant/handlers/create.write.d.ts +1 -1
- package/dist/tenant/handlers/remove-member.write.d.ts +1 -1
- package/dist/tenant/handlers/team-list.query.js +3 -2
- package/dist/tenant/handlers/toggle-enabled.write.d.ts +2 -2
- package/dist/tenant/handlers/update-member-roles.write.d.ts +1 -1
- package/dist/tenant/handlers/update.write.d.ts +1 -1
- package/dist/tenant/seeding.js +31 -6
- package/dist/tenant-handover/handlers/claim.write.d.ts +1 -1
- package/dist/tenant-lifecycle/handlers/cancel-destruction.write.d.ts +2 -2
- package/dist/tenant-lifecycle/handlers/cancel-destruction.write.js +2 -1
- package/dist/tenant-lifecycle/handlers/request-destruction.write.d.ts +1 -1
- package/dist/tier-engine/feature.js +9 -3
- package/dist/tier-engine/handlers/set-tenant-tier.write.d.ts +1 -1
- package/dist/user/db/queries/stream-tenant-backfill.js +4 -4
- package/dist/user/handlers/create.write.d.ts +1 -1
- package/dist/user/handlers/detail.query.js +2 -1
- package/dist/user/handlers/update.write.d.ts +1 -1
- package/dist/user/resolve-display-names.js +5 -9
- package/dist/user/seeding.js +20 -1
- package/dist/user-data-rights/db/queries/forget-cleanup.d.ts +2 -2
- package/dist/user-data-rights/email-templates.d.ts +1 -29
- package/dist/user-data-rights/email-templates.js +5 -106
- package/dist/user-data-rights/feature.js +53 -35
- package/dist/user-data-rights/handlers/cancel-deletion.write.d.ts +2 -2
- package/dist/user-data-rights/handlers/cancel-deletion.write.js +2 -1
- package/dist/user-data-rights/handlers/confirm-deletion-by-token.write.d.ts +1 -1
- package/dist/user-data-rights/handlers/lift-restriction.write.d.ts +1 -1
- package/dist/user-data-rights/handlers/request-deletion-by-email.write.d.ts +1 -1
- package/dist/user-data-rights/handlers/request-deletion.write.d.ts +1 -1
- package/dist/user-data-rights/handlers/request-deletion.write.js +5 -7
- package/dist/user-data-rights/handlers/request-export.write.d.ts +1 -1
- package/dist/user-data-rights/handlers/restrict-account.write.d.ts +1 -1
- package/dist/user-data-rights/handlers/run-forget-cleanup.write.d.ts +1 -1
- package/dist/user-data-rights/lib/default-mailers.d.ts +15 -7
- package/dist/user-data-rights/lib/default-mailers.js +100 -48
- package/dist/user-data-rights/lib/update-user-lifecycle.js +1 -1
- package/dist/user-data-rights/mail-notifications.d.ts +13 -0
- package/dist/user-data-rights/mail-notifications.js +118 -0
- package/dist/user-data-rights/web/privacy-center-screen.js +2 -1
- package/dist/user-profile/handlers/change-email.write.d.ts +1 -1
- package/dist/user-profile/web/profile-screen.js +2 -1
- package/dist/waitlist/feature.js +10 -0
- package/dist/waitlist/handlers/invite.write.d.ts +1 -1
- package/dist/waitlist/handlers/reject.write.d.ts +1 -1
- package/dist/waitlist/handlers/submit.write.d.ts +1 -1
- package/dist/waitlist/handlers/submit.write.js +3 -4
- package/dist/waitlist/mail.d.ts +19 -6
- package/dist/waitlist/mail.js +50 -14
- package/dist/waitlist/options.js +1 -1
- package/dist/workflow-runner/event-trigger.js +2 -2
- package/dist/workflow-runner/handlers/resume-run.write.js +7 -2
- package/package.json +37 -17
- package/src/admin-shell/changes.json +6 -0
- package/src/audit/changes.json +6 -0
- package/src/auth-email-password/changes.json +51 -0
- package/src/billing-foundation/changes.json +43 -0
- package/src/cap-counter/changes.json +6 -0
- package/src/channel-email/changes.json +19 -0
- package/src/config/changes.json +6 -0
- package/src/crypto-shredding/changes.json +6 -0
- package/src/custom-fields/changes.json +6 -0
- package/src/data-retention/changes.json +6 -0
- package/src/delivery/changes.json +66 -0
- package/src/file-foundation/changes.json +6 -0
- package/src/files-tenant-data/changes.json +6 -0
- package/src/inbound-mail-foundation/changes.json +6 -0
- package/src/jobs/changes.json +19 -0
- package/src/ledger/changes.json +7 -0
- package/src/managed-pages/changes.json +6 -0
- package/src/renderer-foundation/changes.json +39 -0
- package/src/renderer-pdf/changes.json +12 -0
- package/src/secrets/changes.json +6 -0
- package/src/shared/changes.json +6 -0
- package/src/subscription-stripe/changes.json +6 -0
- package/src/template-resolver/changes.json +186 -0
- package/src/tier-engine/changes.json +6 -0
- package/src/user/changes.json +6 -0
- package/src/user-data-rights/changes.json +13 -0
- package/src/user-profile/changes.json +1 -1
- package/src/waitlist/changes.json +7 -0
- package/src/workflow-runner/changes.json +6 -0
- package/dist/renderer-simple/feature.d.ts +0 -10
- package/dist/renderer-simple/feature.js +0 -42
- package/dist/renderer-simple/index.d.ts +0 -3
- package/dist/renderer-simple/index.js +0 -2
- package/dist/renderer-simple/mail-blocks.d.ts +0 -21
- package/dist/renderer-simple/mail-blocks.js +0 -107
- package/dist/renderer-simple/resolve-variables.d.ts +0 -7
- package/dist/renderer-simple/resolve-variables.js +0 -47
- package/dist/renderer-simple/simple-renderer.d.ts +0 -24
- package/dist/renderer-simple/simple-renderer.js +0 -200
- package/src/renderer-simple/changes.json +0 -27
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
export declare const exportBundleQuery: import("@cosmicdrift/kumiko-types/define-handler").QueryHandlerDefinition<"export-bundle", z.ZodObject<{
|
|
3
|
+
slug: z.ZodString;
|
|
4
|
+
kind: z.ZodEnum<{
|
|
5
|
+
"ai-prompt": "ai-prompt";
|
|
6
|
+
"document-pdf": "document-pdf";
|
|
7
|
+
"image-snapshot": "image-snapshot";
|
|
8
|
+
mail: "mail";
|
|
9
|
+
"mail-layout": "mail-layout";
|
|
10
|
+
"pdf-layout": "pdf-layout";
|
|
11
|
+
}>;
|
|
12
|
+
scope: z.ZodDefault<z.ZodEnum<{
|
|
13
|
+
system: "system";
|
|
14
|
+
tenant: "tenant";
|
|
15
|
+
}>>;
|
|
16
|
+
}, z.core.$strip>, {
|
|
17
|
+
slug: string;
|
|
18
|
+
kind: "ai-prompt" | "document-pdf" | "image-snapshot" | "mail" | "mail-layout" | "pdf-layout";
|
|
19
|
+
contentFormat: string;
|
|
20
|
+
variableSchema: Readonly<Record<string, unknown>>;
|
|
21
|
+
locales: Record<string, {
|
|
22
|
+
body: string;
|
|
23
|
+
meta?: unknown;
|
|
24
|
+
}>;
|
|
25
|
+
resources: Record<string, {
|
|
26
|
+
fileName: string;
|
|
27
|
+
contentType: string;
|
|
28
|
+
base64: string;
|
|
29
|
+
purpose?: "attachment" | undefined;
|
|
30
|
+
}>;
|
|
31
|
+
pdfAttachments: Record<string, {
|
|
32
|
+
templateSlug: string;
|
|
33
|
+
fileName: string;
|
|
34
|
+
}>;
|
|
35
|
+
}, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from "node:util";
|
|
2
|
+
import { selectMany } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
3
|
+
import { defineQueryHandler, SYSTEM_TENANT_ID } from "@cosmicdrift/kumiko-framework/engine";
|
|
4
|
+
import { NotFoundError, ValidationError } from "@cosmicdrift/kumiko-framework/errors";
|
|
5
|
+
import * as z from "zod";
|
|
6
|
+
import { isFileAttachmentEntry, isPdfAttachmentLink, parseLinkedResourceEntries, } from "../linked-resources.js";
|
|
7
|
+
import { TemplateResolverErrors } from "../qualified-names.js";
|
|
8
|
+
import { templateResourcesTable } from "../table.js";
|
|
9
|
+
import { readTemplateResource } from "../template-resources.js";
|
|
10
|
+
import { kindSchema, templateSlugSchema } from "./shared.js";
|
|
11
|
+
import { parseStoredJson, storedRecord } from "./template-gates.js";
|
|
12
|
+
// The files live in the system tenant's key space; readTemplateResource only
|
|
13
|
+
// serves the caller's own tenant, so anyone else would end in a misleading NotFound.
|
|
14
|
+
function assertSystemFilesReadable(scope, entries, callerTenantId) {
|
|
15
|
+
// skip: tenant exports read the caller's own files.
|
|
16
|
+
if (scope === "tenant")
|
|
17
|
+
return;
|
|
18
|
+
// skip: the system tenant reads its own key space.
|
|
19
|
+
if (callerTenantId === SYSTEM_TENANT_ID)
|
|
20
|
+
return;
|
|
21
|
+
const hasFileResources = [...entries].some((entry) => !isPdfAttachmentLink(entry));
|
|
22
|
+
// skip: PDF attachment links carry no file to read.
|
|
23
|
+
if (!hasFileResources)
|
|
24
|
+
return;
|
|
25
|
+
throw new ValidationError({
|
|
26
|
+
fields: [
|
|
27
|
+
{
|
|
28
|
+
path: "scope",
|
|
29
|
+
code: "system_resources_need_system_tenant",
|
|
30
|
+
i18nKey: "templateResolver.errors.template.systemResourcesNeedSystemTenant",
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
// A bundle carries one contentFormat and one variableSchema for all locales; importing it would
|
|
36
|
+
// relabel the rows that differ from the first.
|
|
37
|
+
function assertLocalesShareFormat(rows) {
|
|
38
|
+
const [first, ...rest] = rows;
|
|
39
|
+
// skip: a bundle without rows has nothing to compare
|
|
40
|
+
if (first === undefined)
|
|
41
|
+
return;
|
|
42
|
+
const firstSchema = storedRecord(first.variableSchema);
|
|
43
|
+
const differing = rest.find((row) => row.contentFormat !== first.contentFormat ||
|
|
44
|
+
!isDeepStrictEqual(storedRecord(row.variableSchema), firstSchema));
|
|
45
|
+
// skip: all locales agree
|
|
46
|
+
if (differing === undefined)
|
|
47
|
+
return;
|
|
48
|
+
throw new ValidationError({
|
|
49
|
+
fields: [
|
|
50
|
+
{
|
|
51
|
+
path: "slug",
|
|
52
|
+
code: TemplateResolverErrors.bundleLocalesDiffer,
|
|
53
|
+
i18nKey: "templateResolver.errors.template.bundleLocalesDiffer",
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
export const exportBundleQuery = defineQueryHandler({
|
|
59
|
+
name: "export-bundle",
|
|
60
|
+
schema: z.object({
|
|
61
|
+
slug: templateSlugSchema,
|
|
62
|
+
kind: kindSchema,
|
|
63
|
+
scope: z.enum(["tenant", "system"]).default("tenant"),
|
|
64
|
+
}),
|
|
65
|
+
access: { roles: ["TenantAdmin", "SystemAdmin"] },
|
|
66
|
+
description: "Exports every locale of one template (the caller's own rows, or the active system rows) together with its linked resource files as a self-contained bundle that import-bundle can read back, for example to move a template between tenants or environments.",
|
|
67
|
+
handler: async (query, ctx) => {
|
|
68
|
+
const { slug, kind, scope } = query.payload;
|
|
69
|
+
const found = await selectMany(ctx.db, templateResourcesTable, scope === "system"
|
|
70
|
+
? { tenantId: SYSTEM_TENANT_ID, slug, kind, scope: "system", status: "active" }
|
|
71
|
+
: { tenantId: query.user.tenantId, slug, kind, scope: "tenant" });
|
|
72
|
+
const rows = found
|
|
73
|
+
.filter((row) => row.status !== "archived")
|
|
74
|
+
.sort((a, b) => a.locale.localeCompare(b.locale));
|
|
75
|
+
const first = rows[0];
|
|
76
|
+
if (!first)
|
|
77
|
+
throw new NotFoundError("template-resource", slug);
|
|
78
|
+
assertLocalesShareFormat(rows);
|
|
79
|
+
const locales = {};
|
|
80
|
+
const entryByKey = new Map();
|
|
81
|
+
for (const row of rows) {
|
|
82
|
+
const meta = parseStoredJson(row.meta);
|
|
83
|
+
locales[row.locale] = { body: row.content ?? "", ...(meta === undefined ? {} : { meta }) };
|
|
84
|
+
for (const [key, entry] of Object.entries(parseLinkedResourceEntries(row.linkedResources))) {
|
|
85
|
+
if (!entryByKey.has(key))
|
|
86
|
+
entryByKey.set(key, entry);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
assertSystemFilesReadable(scope, entryByKey.values(), query.user.tenantId);
|
|
90
|
+
const resources = {};
|
|
91
|
+
const pdfAttachments = {};
|
|
92
|
+
for (const [key, entry] of entryByKey) {
|
|
93
|
+
if (isPdfAttachmentLink(entry)) {
|
|
94
|
+
pdfAttachments[key] = { templateSlug: entry.templateSlug, fileName: entry.fileName };
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const attachment = isFileAttachmentEntry(entry);
|
|
98
|
+
const file = await readTemplateResource({ db: ctx.db, files: ctx.files, user: query.user }, attachment ? entry.fileRefId : entry);
|
|
99
|
+
if (!file)
|
|
100
|
+
throw new NotFoundError("template-resource-file", key);
|
|
101
|
+
resources[key] = {
|
|
102
|
+
fileName: attachment ? entry.fileName : file.fileName,
|
|
103
|
+
contentType: file.contentType,
|
|
104
|
+
base64: Buffer.from(file.bytes).toString("base64"),
|
|
105
|
+
...(attachment && { purpose: "attachment" }),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
slug,
|
|
110
|
+
kind,
|
|
111
|
+
contentFormat: first.contentFormat,
|
|
112
|
+
variableSchema: storedRecord(first.variableSchema),
|
|
113
|
+
locales,
|
|
114
|
+
resources,
|
|
115
|
+
pdfAttachments,
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
});
|
|
@@ -12,8 +12,10 @@ export declare const findByIdQuery: import("@cosmicdrift/kumiko-types/define-han
|
|
|
12
12
|
contentFormat: string;
|
|
13
13
|
variableSchema: string | null;
|
|
14
14
|
linkedResources: string | null;
|
|
15
|
+
meta: string | null;
|
|
15
16
|
scope: string;
|
|
16
17
|
parentTemplateId: string | null;
|
|
17
18
|
status: string;
|
|
18
19
|
modifiedAt: Temporal.Instant | null;
|
|
20
|
+
active: import("../template-draft.js").ActiveInfo | null;
|
|
19
21
|
} | null, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
|
|
@@ -2,26 +2,27 @@ import { fetchOne } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
|
2
2
|
import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
3
|
import * as z from "zod";
|
|
4
4
|
import { templateResourcesTable } from "../table.js";
|
|
5
|
+
import { draftViewerTenantId, isHiddenSystemDraft, toWorkingRow } from "../template-draft.js";
|
|
5
6
|
// Admin-Lookup für UI-Edit-Flow. Returnt das raw Template inkl. draft/
|
|
6
7
|
// archived Status. Tenant-Isolation: User sieht nur Templates des
|
|
7
8
|
// eigenen Tenants oder SYSTEM_TENANT (system-defaults sind public-
|
|
8
|
-
// readable).
|
|
9
|
+
// readable); ctx.db is tenant-scoped for every role, so the check below is defense in depth. Anonymous bleibt aus — Public-
|
|
9
10
|
// Read geht über resolveTemplate aus der API, nicht hier.
|
|
10
11
|
export const findByIdQuery = defineQueryHandler({
|
|
11
12
|
name: "find-by-id",
|
|
12
13
|
schema: z.object({ id: z.string().min(1) }),
|
|
13
14
|
access: { roles: ["TenantAdmin", "SystemAdmin", "User"] },
|
|
14
|
-
description: "Reads one template resource by row id with
|
|
15
|
+
description: "Reads the version of one template resource an editor works on, by row id: the open draft if there is one (status draft), else the stored version, with content, variable schema and scope, but only when it belongs to the caller's tenant or is a served system default (a never-served system draft is visible to a SystemAdmin only); `active` is the version number and since-time the resolver serves, null when none is served. Use it to load a template into the admin editor.",
|
|
15
16
|
handler: async (query, ctx) => {
|
|
16
|
-
const
|
|
17
|
+
const stored = await fetchOne(ctx.db, templateResourcesTable, {
|
|
17
18
|
id: query.payload.id,
|
|
18
19
|
});
|
|
19
|
-
if (!
|
|
20
|
+
if (!stored || isHiddenSystemDraft(query.user, stored))
|
|
20
21
|
return null;
|
|
21
|
-
const
|
|
22
|
+
const row = toWorkingRow(stored, draftViewerTenantId(query.user, stored));
|
|
22
23
|
const isOwnTenant = row.tenantId === query.user.tenantId;
|
|
23
24
|
const isSystemTemplate = row.scope === "system";
|
|
24
|
-
if (!
|
|
25
|
+
if (!isOwnTenant && !isSystemTemplate)
|
|
25
26
|
return null;
|
|
26
27
|
return {
|
|
27
28
|
id: String(row.id),
|
|
@@ -34,10 +35,12 @@ export const findByIdQuery = defineQueryHandler({
|
|
|
34
35
|
contentFormat: row.contentFormat,
|
|
35
36
|
variableSchema: row.variableSchema,
|
|
36
37
|
linkedResources: row.linkedResources,
|
|
38
|
+
meta: row.meta,
|
|
37
39
|
scope: row.scope,
|
|
38
40
|
parentTemplateId: row.parentTemplateId,
|
|
39
41
|
status: row.status,
|
|
40
42
|
modifiedAt: row.modifiedAt,
|
|
43
|
+
active: row.active,
|
|
41
44
|
};
|
|
42
45
|
},
|
|
43
46
|
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
export declare const importBundleSystemWrite: import("@cosmicdrift/kumiko-types/define-handler").WriteHandlerDefinition<"import-bundle-system", z.ZodObject<{
|
|
3
|
+
bundle: z.ZodObject<{
|
|
4
|
+
slug: z.ZodString;
|
|
5
|
+
kind: z.ZodEnum<{
|
|
6
|
+
"ai-prompt": "ai-prompt";
|
|
7
|
+
"document-pdf": "document-pdf";
|
|
8
|
+
"image-snapshot": "image-snapshot";
|
|
9
|
+
mail: "mail";
|
|
10
|
+
"mail-layout": "mail-layout";
|
|
11
|
+
"pdf-layout": "pdf-layout";
|
|
12
|
+
}>;
|
|
13
|
+
contentFormat: z.ZodEnum<{
|
|
14
|
+
html: "html";
|
|
15
|
+
markdown: "markdown";
|
|
16
|
+
mjml: "mjml";
|
|
17
|
+
plain: "plain";
|
|
18
|
+
}>;
|
|
19
|
+
variableSchema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
20
|
+
locales: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
21
|
+
body: z.ZodString;
|
|
22
|
+
meta: z.ZodOptional<z.ZodUnknown>;
|
|
23
|
+
}, z.core.$strict>>;
|
|
24
|
+
resources: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
25
|
+
fileName: z.ZodString;
|
|
26
|
+
contentType: z.ZodString;
|
|
27
|
+
base64: z.ZodString;
|
|
28
|
+
purpose: z.ZodOptional<z.ZodEnum<{
|
|
29
|
+
attachment: "attachment";
|
|
30
|
+
}>>;
|
|
31
|
+
}, z.core.$strict>>>;
|
|
32
|
+
pdfAttachments: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
33
|
+
templateSlug: z.ZodString;
|
|
34
|
+
fileName: z.ZodString;
|
|
35
|
+
}, z.core.$strict>>>;
|
|
36
|
+
}, z.core.$strict>;
|
|
37
|
+
}, z.core.$strip>, {
|
|
38
|
+
ids: Record<string, string>;
|
|
39
|
+
}, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { defineWriteHandler, SYSTEM_TENANT_ID } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
|
+
import { ValidationError, writeFailure } from "@cosmicdrift/kumiko-framework/errors";
|
|
3
|
+
import * as z from "zod";
|
|
4
|
+
import { templateBundleSchema } from "../template-bundle.js";
|
|
5
|
+
import { importTemplateBundle } from "./bundle-import.js";
|
|
6
|
+
export const importBundleSystemWrite = defineWriteHandler({
|
|
7
|
+
name: "import-bundle-system",
|
|
8
|
+
schema: z.object({ bundle: templateBundleSchema }),
|
|
9
|
+
access: { roles: ["SystemAdmin"] },
|
|
10
|
+
// A system template change reaches every tenant without an override.
|
|
11
|
+
agent: { risk: "high" },
|
|
12
|
+
description: "Imports a template bundle as system-default templates, active straight away and overwriting existing system rows; SystemAdmin only. Bundles with resource files need a caller in the system tenant, because the files are stored in the caller's file space.",
|
|
13
|
+
handler: (event, ctx) => {
|
|
14
|
+
const { bundle } = event.payload;
|
|
15
|
+
if (Object.keys(bundle.resources).length > 0 && event.user.tenantId !== SYSTEM_TENANT_ID) {
|
|
16
|
+
return Promise.resolve(writeFailure(new ValidationError({
|
|
17
|
+
fields: [
|
|
18
|
+
{
|
|
19
|
+
path: "bundle.resources",
|
|
20
|
+
code: "system_resources_need_system_tenant",
|
|
21
|
+
i18nKey: "templateResolver.errors.template.systemResourcesNeedSystemTenant",
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
})));
|
|
25
|
+
}
|
|
26
|
+
return importTemplateBundle({
|
|
27
|
+
ctx,
|
|
28
|
+
user: event.user,
|
|
29
|
+
tenantId: SYSTEM_TENANT_ID,
|
|
30
|
+
scope: "system",
|
|
31
|
+
status: "active",
|
|
32
|
+
bundle,
|
|
33
|
+
overwrite: true,
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
export declare const importBundleWrite: import("@cosmicdrift/kumiko-types/define-handler").WriteHandlerDefinition<"import-bundle", z.ZodObject<{
|
|
3
|
+
bundle: z.ZodObject<{
|
|
4
|
+
slug: z.ZodString;
|
|
5
|
+
kind: z.ZodEnum<{
|
|
6
|
+
"ai-prompt": "ai-prompt";
|
|
7
|
+
"document-pdf": "document-pdf";
|
|
8
|
+
"image-snapshot": "image-snapshot";
|
|
9
|
+
mail: "mail";
|
|
10
|
+
"mail-layout": "mail-layout";
|
|
11
|
+
"pdf-layout": "pdf-layout";
|
|
12
|
+
}>;
|
|
13
|
+
contentFormat: z.ZodEnum<{
|
|
14
|
+
html: "html";
|
|
15
|
+
markdown: "markdown";
|
|
16
|
+
mjml: "mjml";
|
|
17
|
+
plain: "plain";
|
|
18
|
+
}>;
|
|
19
|
+
variableSchema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
20
|
+
locales: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
21
|
+
body: z.ZodString;
|
|
22
|
+
meta: z.ZodOptional<z.ZodUnknown>;
|
|
23
|
+
}, z.core.$strict>>;
|
|
24
|
+
resources: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
25
|
+
fileName: z.ZodString;
|
|
26
|
+
contentType: z.ZodString;
|
|
27
|
+
base64: z.ZodString;
|
|
28
|
+
purpose: z.ZodOptional<z.ZodEnum<{
|
|
29
|
+
attachment: "attachment";
|
|
30
|
+
}>>;
|
|
31
|
+
}, z.core.$strict>>>;
|
|
32
|
+
pdfAttachments: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
33
|
+
templateSlug: z.ZodString;
|
|
34
|
+
fileName: z.ZodString;
|
|
35
|
+
}, z.core.$strict>>>;
|
|
36
|
+
}, z.core.$strict>;
|
|
37
|
+
overwrite: z.ZodDefault<z.ZodBoolean>;
|
|
38
|
+
}, z.core.$strip>, {
|
|
39
|
+
ids: Record<string, string>;
|
|
40
|
+
}, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap, undefined>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { defineWriteHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
|
+
import * as z from "zod";
|
|
3
|
+
import { templateBundleSchema } from "../template-bundle.js";
|
|
4
|
+
import { importTemplateBundle } from "./bundle-import.js";
|
|
5
|
+
export const importBundleWrite = defineWriteHandler({
|
|
6
|
+
name: "import-bundle",
|
|
7
|
+
schema: z.object({ bundle: templateBundleSchema, overwrite: z.boolean().default(false) }),
|
|
8
|
+
access: { roles: ["TenantAdmin", "SystemAdmin"] },
|
|
9
|
+
description: "Imports a template bundle (all locales plus resource files, as produced by export-bundle) into the caller's tenant as drafts; it refuses a locale that already has an override unless overwrite is set, and publish makes the drafts live.",
|
|
10
|
+
handler: (event, ctx) => importTemplateBundle({
|
|
11
|
+
ctx,
|
|
12
|
+
user: event.user,
|
|
13
|
+
tenantId: event.user.tenantId,
|
|
14
|
+
scope: "tenant",
|
|
15
|
+
status: "draft",
|
|
16
|
+
bundle: event.payload.bundle,
|
|
17
|
+
overwrite: event.payload.overwrite,
|
|
18
|
+
}),
|
|
19
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import { type LayoutRegions } from "../layout-regions.js";
|
|
3
|
+
import { type ActiveInfo } from "../template-draft.js";
|
|
4
|
+
import { type MailLayoutMeta } from "../template-meta.js";
|
|
5
|
+
export type LayoutSourceRow = {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly version: number;
|
|
8
|
+
readonly status: string;
|
|
9
|
+
readonly locale: string;
|
|
10
|
+
readonly active: ActiveInfo | null;
|
|
11
|
+
};
|
|
12
|
+
export type LayoutSourceResponse = {
|
|
13
|
+
readonly tenant: LayoutSourceRow | null;
|
|
14
|
+
readonly system: (LayoutSourceRow & {
|
|
15
|
+
readonly contentFormat: string;
|
|
16
|
+
}) | null;
|
|
17
|
+
readonly regions: LayoutRegions;
|
|
18
|
+
readonly effectiveFormat: "html" | "mjml" | null;
|
|
19
|
+
readonly mjmlSource: string | null;
|
|
20
|
+
/** Appearance of the effective mail layout; invalid stored meta reads as defaults (empty). */
|
|
21
|
+
readonly meta: MailLayoutMeta;
|
|
22
|
+
readonly locale: string;
|
|
23
|
+
};
|
|
24
|
+
export declare const layoutSourceQuery: import("@cosmicdrift/kumiko-types/define-handler").QueryHandlerDefinition<"layout-source", z.ZodObject<{
|
|
25
|
+
kind: z.ZodEnum<{
|
|
26
|
+
"mail-layout": "mail-layout";
|
|
27
|
+
"pdf-layout": "pdf-layout";
|
|
28
|
+
}>;
|
|
29
|
+
slug: z.ZodDefault<z.ZodString>;
|
|
30
|
+
locale: z.ZodOptional<z.ZodString>;
|
|
31
|
+
}, z.core.$strip>, LayoutSourceResponse, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { selectMany } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
2
|
+
import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
|
+
import * as z from "zod";
|
|
4
|
+
import { FALLBACK_LOCALE } from "../constants.js";
|
|
5
|
+
import { readLayoutRegions } from "../layout-regions.js";
|
|
6
|
+
import { templateResourcesTable } from "../table.js";
|
|
7
|
+
import { draftViewerTenantId, isHiddenSystemDraft, toWorkingRow, } from "../template-draft.js";
|
|
8
|
+
import { readMailLayoutMeta } from "../template-meta.js";
|
|
9
|
+
import { localeSchema, templateSlugSchema } from "./shared.js";
|
|
10
|
+
import { parseStoredJson } from "./template-gates.js";
|
|
11
|
+
const EMPTY_REGIONS = { header: "", signature: "", footer: "" };
|
|
12
|
+
function pickByLocale(rows, requested) {
|
|
13
|
+
const live = rows.filter((row) => row.status !== "archived");
|
|
14
|
+
const candidates = live.length > 0 ? live : rows;
|
|
15
|
+
return (candidates.find((row) => row.locale === requested) ??
|
|
16
|
+
candidates.find((row) => row.locale === FALLBACK_LOCALE) ??
|
|
17
|
+
candidates[0] ??
|
|
18
|
+
null);
|
|
19
|
+
}
|
|
20
|
+
function toSourceRow(row) {
|
|
21
|
+
return {
|
|
22
|
+
id: String(row.id),
|
|
23
|
+
version: row.version,
|
|
24
|
+
status: row.status,
|
|
25
|
+
locale: row.locale,
|
|
26
|
+
active: row.active,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function layoutFormat(row) {
|
|
30
|
+
return row.contentFormat === "html" || row.contentFormat === "mjml" ? row.contentFormat : null;
|
|
31
|
+
}
|
|
32
|
+
function pickEditedRows(rows, user, locale) {
|
|
33
|
+
const tenantRow = user.roles.includes("SystemAdmin")
|
|
34
|
+
? null
|
|
35
|
+
: pickByLocale(rows.filter((row) => row.scope === "tenant"), locale);
|
|
36
|
+
const systemRow = pickByLocale(rows.filter((row) => row.scope === "system" && !isHiddenSystemDraft(user, row)), locale);
|
|
37
|
+
return {
|
|
38
|
+
tenantRow: tenantRow && toWorkingRow(tenantRow, user.tenantId),
|
|
39
|
+
// Only a SystemAdmin works on the system draft; a tenant sees the served system version.
|
|
40
|
+
systemRow: systemRow && toWorkingRow(systemRow, draftViewerTenantId(user, systemRow)),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function readEffectiveRegions(effective, effectiveFormat) {
|
|
44
|
+
return effective !== null && effectiveFormat === "html"
|
|
45
|
+
? readLayoutRegions(effective.content ?? "")
|
|
46
|
+
: EMPTY_REGIONS;
|
|
47
|
+
}
|
|
48
|
+
function readMjmlSource(systemRow, isSystemAdmin) {
|
|
49
|
+
const exposesMjml = isSystemAdmin && systemRow !== null && layoutFormat(systemRow) === "mjml";
|
|
50
|
+
return exposesMjml ? (systemRow.content ?? "") : null;
|
|
51
|
+
}
|
|
52
|
+
function buildLayoutSource(input) {
|
|
53
|
+
const { kind, locale, isSystemAdmin, tenantRow, systemRow } = input;
|
|
54
|
+
const effective = tenantRow ?? systemRow;
|
|
55
|
+
const effectiveFormat = effective === null ? null : layoutFormat(effective);
|
|
56
|
+
return {
|
|
57
|
+
tenant: tenantRow === null ? null : toSourceRow(tenantRow),
|
|
58
|
+
system: systemRow === null
|
|
59
|
+
? null
|
|
60
|
+
: { ...toSourceRow(systemRow), contentFormat: systemRow.contentFormat },
|
|
61
|
+
regions: readEffectiveRegions(effective, effectiveFormat),
|
|
62
|
+
effectiveFormat,
|
|
63
|
+
mjmlSource: readMjmlSource(systemRow, isSystemAdmin),
|
|
64
|
+
meta: kind === "mail-layout" ? readMailLayoutMeta(parseStoredJson(effective?.meta ?? null)) : {},
|
|
65
|
+
locale: effective?.locale ?? locale ?? FALLBACK_LOCALE,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export const layoutSourceQuery = defineQueryHandler({
|
|
69
|
+
name: "layout-source",
|
|
70
|
+
schema: z.object({
|
|
71
|
+
kind: z.enum(["mail-layout", "pdf-layout"]),
|
|
72
|
+
slug: templateSlugSchema.default("default"),
|
|
73
|
+
locale: localeSchema.optional(),
|
|
74
|
+
}),
|
|
75
|
+
access: { roles: ["TenantAdmin", "SystemAdmin"] },
|
|
76
|
+
description: "Reads the layout the caller edits: the tenant's own version and the system version of one layout slug (each the open draft if there is one, else the stored version, with `active` naming the served version), the header, signature and footer regions of the effective html version, and the locale a save has to use; a SystemAdmin edits the system version and also receives its mjml source. Use it to load the layout editor.",
|
|
77
|
+
handler: async (query, ctx) => {
|
|
78
|
+
const { kind, slug, locale } = query.payload;
|
|
79
|
+
const isSystemAdmin = query.user.roles.includes("SystemAdmin");
|
|
80
|
+
const rows = await selectMany(ctx.db, templateResourcesTable, {
|
|
81
|
+
kind,
|
|
82
|
+
slug,
|
|
83
|
+
});
|
|
84
|
+
const { tenantRow, systemRow } = pickEditedRows(rows, query.user, locale);
|
|
85
|
+
return buildLayoutSource({ kind, locale, isSystemAdmin, tenantRow, systemRow });
|
|
86
|
+
},
|
|
87
|
+
});
|
|
@@ -4,8 +4,11 @@ export declare const listQuery: import("@cosmicdrift/kumiko-types/define-handler
|
|
|
4
4
|
"ai-prompt": "ai-prompt";
|
|
5
5
|
"document-pdf": "document-pdf";
|
|
6
6
|
"image-snapshot": "image-snapshot";
|
|
7
|
-
|
|
7
|
+
mail: "mail";
|
|
8
|
+
"mail-layout": "mail-layout";
|
|
8
9
|
notification: "notification";
|
|
10
|
+
"pdf-layout": "pdf-layout";
|
|
11
|
+
snippet: "snippet";
|
|
9
12
|
"text-block": "text-block";
|
|
10
13
|
}>>;
|
|
11
14
|
locale: z.ZodOptional<z.ZodString>;
|
|
@@ -3,9 +3,9 @@ import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
|
3
3
|
import * as z from "zod";
|
|
4
4
|
import { TEMPLATE_KINDS, TEMPLATE_STATUSES } from "../constants.js";
|
|
5
5
|
import { templateResourcesTable } from "../table.js";
|
|
6
|
-
|
|
7
|
-
//
|
|
8
|
-
//
|
|
6
|
+
import { isHiddenSystemDraft } from "../template-draft.js";
|
|
7
|
+
// ctx.db is tenant-scoped even for SystemAdmin: every caller sees its own
|
|
8
|
+
// tenant's rows plus the system defaults, never another tenant's rows.
|
|
9
9
|
export const listQuery = defineQueryHandler({
|
|
10
10
|
name: "list",
|
|
11
11
|
schema: z.object({
|
|
@@ -18,10 +18,9 @@ export const listQuery = defineQueryHandler({
|
|
|
18
18
|
description: "Lists template resources of the caller's tenant alongside the system defaults as summaries without content, filterable by kind, locale and status; use it to browse the catalogue, then find-by-id to read one row.",
|
|
19
19
|
handler: async (query, ctx) => {
|
|
20
20
|
const where = {};
|
|
21
|
-
// includeSystem=false narrows to own tenant AT THE DB —
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
// the DB keeps the limit meaningful (no post-filter starvation).
|
|
21
|
+
// includeSystem=false narrows to own tenant AT THE DB — TenantDb permits
|
|
22
|
+
// narrowing within its enforced [own, SYSTEM] scope. Filtering at the DB
|
|
23
|
+
// keeps the limit meaningful (no post-filter starvation).
|
|
25
24
|
if (!query.payload.includeSystem) {
|
|
26
25
|
where["tenantId"] = query.user.tenantId;
|
|
27
26
|
}
|
|
@@ -39,7 +38,9 @@ export const listQuery = defineQueryHandler({
|
|
|
39
38
|
const rows = (await selectMany(ctx.db, templateResourcesTable, where, {
|
|
40
39
|
limit: 500,
|
|
41
40
|
}));
|
|
42
|
-
return rows
|
|
41
|
+
return rows
|
|
42
|
+
.filter((row) => !isHiddenSystemDraft(query.user, row))
|
|
43
|
+
.map((row) => ({
|
|
43
44
|
id: String(row.id),
|
|
44
45
|
tenantId: row.tenantId,
|
|
45
46
|
slug: row.slug,
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { TemplateResourceRow } from "../table.js";
|
|
2
|
+
export declare function buildOverrideDiff(tenantRow: TemplateResourceRow, systemRow: TemplateResourceRow): {
|
|
3
|
+
tenant: {
|
|
4
|
+
templateId: string;
|
|
5
|
+
templateVersion: number;
|
|
6
|
+
contentFormat: string;
|
|
7
|
+
};
|
|
8
|
+
system: {
|
|
9
|
+
templateId: string;
|
|
10
|
+
templateVersion: number;
|
|
11
|
+
contentFormat: string;
|
|
12
|
+
};
|
|
13
|
+
identical: boolean;
|
|
14
|
+
blocks: import("../template-diff.js").TemplateDiffBlock[];
|
|
15
|
+
meta: {
|
|
16
|
+
key: string;
|
|
17
|
+
tenant: unknown;
|
|
18
|
+
system: unknown;
|
|
19
|
+
}[];
|
|
20
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { diffTemplateBlocks, splitTemplateBlocks } from "../template-diff.js";
|
|
2
|
+
import { servedVersionOf } from "../template-draft.js";
|
|
3
|
+
function parseStoredMeta(raw) {
|
|
4
|
+
if (raw === null)
|
|
5
|
+
return {};
|
|
6
|
+
try {
|
|
7
|
+
const parsed = JSON.parse(raw);
|
|
8
|
+
return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
|
|
9
|
+
? Object.fromEntries(Object.entries(parsed))
|
|
10
|
+
: {};
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function diffMeta(system, tenant) {
|
|
17
|
+
const keys = [...new Set([...Object.keys(system), ...Object.keys(tenant)])].sort();
|
|
18
|
+
return keys
|
|
19
|
+
.filter((key) => JSON.stringify(system[key]) !== JSON.stringify(tenant[key]))
|
|
20
|
+
.map((key) => ({ key, tenant: tenant[key], system: system[key] }));
|
|
21
|
+
}
|
|
22
|
+
// Shared by the tenant's own diff and the SystemAdmin's per-tenant diff in the overrides drawer.
|
|
23
|
+
export function buildOverrideDiff(tenantRow, systemRow) {
|
|
24
|
+
const blocks = diffTemplateBlocks(splitTemplateBlocks(systemRow.content ?? "", systemRow.contentFormat), splitTemplateBlocks(tenantRow.content ?? "", tenantRow.contentFormat));
|
|
25
|
+
const meta = diffMeta(parseStoredMeta(systemRow.meta), parseStoredMeta(tenantRow.meta));
|
|
26
|
+
return {
|
|
27
|
+
tenant: {
|
|
28
|
+
templateId: String(tenantRow.id),
|
|
29
|
+
templateVersion: servedVersionOf(tenantRow),
|
|
30
|
+
contentFormat: tenantRow.contentFormat,
|
|
31
|
+
},
|
|
32
|
+
system: {
|
|
33
|
+
templateId: String(systemRow.id),
|
|
34
|
+
templateVersion: servedVersionOf(systemRow),
|
|
35
|
+
contentFormat: systemRow.contentFormat,
|
|
36
|
+
},
|
|
37
|
+
identical: meta.length === 0 && blocks.every((block) => block.change === "same"),
|
|
38
|
+
blocks,
|
|
39
|
+
meta,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import { type TemplateStatus } from "../constants.js";
|
|
3
|
+
import { type TemplateResourceRow } from "../table.js";
|
|
4
|
+
import { type EffectiveMailLayoutSlugs } from "../template-usage.js";
|
|
5
|
+
declare const OVERVIEW_KINDS: readonly ["mail", "document-pdf", "mail-layout", "pdf-layout"];
|
|
6
|
+
type OverviewKind = (typeof OVERVIEW_KINDS)[number];
|
|
7
|
+
export type OverviewOrigin = "tenant" | "system";
|
|
8
|
+
export type OverviewKindGroup = "mail" | "pdf" | "layout";
|
|
9
|
+
export type OverviewUsage = {
|
|
10
|
+
readonly qualifiedName: string;
|
|
11
|
+
readonly feature: string;
|
|
12
|
+
readonly notification: string;
|
|
13
|
+
readonly trigger: string | null;
|
|
14
|
+
};
|
|
15
|
+
export type OverviewRow = {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly slug: string;
|
|
18
|
+
readonly kind: OverviewKind;
|
|
19
|
+
readonly kindGroup: OverviewKindGroup;
|
|
20
|
+
readonly title: string;
|
|
21
|
+
readonly origin: OverviewOrigin;
|
|
22
|
+
readonly locales: readonly string[];
|
|
23
|
+
readonly status: TemplateStatus;
|
|
24
|
+
readonly version: number;
|
|
25
|
+
readonly draftVersion: number | null;
|
|
26
|
+
readonly activeSince: string | null;
|
|
27
|
+
readonly systemVersion: number | null;
|
|
28
|
+
readonly layoutSlug: string | null;
|
|
29
|
+
readonly modifiedAt: string;
|
|
30
|
+
readonly usedBy: readonly OverviewUsage[];
|
|
31
|
+
readonly usedByCount: number;
|
|
32
|
+
};
|
|
33
|
+
export type OverviewResponse = {
|
|
34
|
+
readonly rows: readonly OverviewRow[];
|
|
35
|
+
readonly nextCursor: null;
|
|
36
|
+
readonly total: number;
|
|
37
|
+
};
|
|
38
|
+
export declare function effectiveMailLayoutSlugs(rows: readonly TemplateResourceRow[]): EffectiveMailLayoutSlugs;
|
|
39
|
+
export declare const overviewQuery: import("@cosmicdrift/kumiko-types/define-handler").QueryHandlerDefinition<"overview", z.ZodObject<{
|
|
40
|
+
search: z.ZodOptional<z.ZodString>;
|
|
41
|
+
filters: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
42
|
+
field: z.ZodEnum<{
|
|
43
|
+
kind: "kind";
|
|
44
|
+
kindGroup: "kindGroup";
|
|
45
|
+
origin: "origin";
|
|
46
|
+
status: "status";
|
|
47
|
+
}>;
|
|
48
|
+
op: z.ZodLiteral<"in">;
|
|
49
|
+
value: z.ZodArray<z.ZodString>;
|
|
50
|
+
}, z.core.$strip>>>;
|
|
51
|
+
layoutSlug: z.ZodOptional<z.ZodString>;
|
|
52
|
+
sort: z.ZodOptional<z.ZodString>;
|
|
53
|
+
sortDirection: z.ZodOptional<z.ZodEnum<{
|
|
54
|
+
asc: "asc";
|
|
55
|
+
desc: "desc";
|
|
56
|
+
}>>;
|
|
57
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
58
|
+
offset: z.ZodOptional<z.ZodNumber>;
|
|
59
|
+
totalCount: z.ZodOptional<z.ZodBoolean>;
|
|
60
|
+
}, z.core.$strip>, {
|
|
61
|
+
rows: OverviewRow[];
|
|
62
|
+
nextCursor: null;
|
|
63
|
+
total: number;
|
|
64
|
+
}, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
|
|
65
|
+
export {};
|