@cosmicdrift/kumiko-samples 0.386.0 → 0.388.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -57
- package/README.md +1 -1
- package/package.json +2 -2
- package/packages/bundled-features/package.json +9 -2
- package/packages/bundled-features/src/agent-tools/changes.json +6 -0
- package/packages/bundled-features/src/agent-tools/tool-catalog.ts +1 -1
- package/packages/bundled-features/src/agent-tools/tool-dispatch.ts +9 -9
- package/packages/bundled-features/src/audit/changes.json +12 -0
- package/packages/bundled-features/src/audit/handlers/audit-events.ts +1 -1
- package/packages/bundled-features/src/audit/screens.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/auth-user-row.ts +10 -10
- package/packages/bundled-features/src/auth-email-password/feature.ts +6 -6
- package/packages/bundled-features/src/auth-email-password/handlers/change-password.write.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/handlers/confirm-token-flow.ts +5 -5
- package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/invite-accept.write.ts +18 -18
- package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +12 -12
- package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/invite-signup-complete.write.ts +24 -26
- package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/self-registration-status.query.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/signup-confirm.write.ts +34 -37
- package/packages/bundled-features/src/auth-email-password/handlers/signup-request.write.ts +6 -7
- package/packages/bundled-features/src/auth-email-password/handlers/switch-tenant-mfa-gate.write.ts +1 -5
- package/packages/bundled-features/src/auth-email-password/index.ts +5 -5
- package/packages/bundled-features/src/auth-email-password/lockout-store.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/seeding.ts +63 -66
- package/packages/bundled-features/src/auth-email-password/signup-token-store.ts +8 -8
- package/packages/bundled-features/src/auth-email-password/testing.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +57 -57
- package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +14 -14
- package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +15 -16
- package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +11 -12
- package/packages/bundled-features/src/auth-email-password/web/confirm-account-unlock-screen.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/constants.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +14 -14
- package/packages/bundled-features/src/auth-email-password/web/forgot-password-screen.tsx +11 -11
- package/packages/bundled-features/src/auth-email-password/web/index.ts +5 -5
- package/packages/bundled-features/src/auth-email-password/web/invite-accept-screen.tsx +17 -17
- package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +3 -4
- package/packages/bundled-features/src/auth-email-password/web/reset-password-screen.tsx +16 -17
- package/packages/bundled-features/src/auth-email-password/web/session.tsx +34 -34
- package/packages/bundled-features/src/auth-email-password/web/signup-complete-screen.tsx +3 -3
- package/packages/bundled-features/src/auth-email-password/web/signup-screen.tsx +14 -14
- package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +26 -27
- package/packages/bundled-features/src/auth-email-password/web/use-shell-user.ts +12 -13
- package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +17 -18
- package/packages/bundled-features/src/auth-email-password/web/verify-email-screen.tsx +11 -12
- package/packages/bundled-features/src/auth-foundation/boot-checks.ts +4 -4
- package/packages/bundled-features/src/auth-foundation/resolve-anonymous-access.ts +4 -4
- package/packages/bundled-features/src/auth-foundation/types.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/changes.json +6 -0
- package/packages/bundled-features/src/auth-mfa/feature-exports.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/feature.ts +6 -0
- package/packages/bundled-features/src/auth-mfa/handlers/disable.write.ts +3 -3
- package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +4 -4
- package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm.write.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/reencrypt.job.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/regenerate-recovery.write.ts +5 -5
- package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/token-secrets.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/web/client-plugin.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/web/i18n.ts +9 -4
- package/packages/bundled-features/src/auth-mfa/web/index.ts +4 -4
- package/packages/bundled-features/src/auth-mfa/web/mfa-client.ts +17 -16
- package/packages/bundled-features/src/auth-mfa/web/mfa-code-or-recovery-field.tsx +68 -0
- package/packages/bundled-features/src/auth-mfa/web/mfa-disable-dialog.tsx +23 -13
- package/packages/bundled-features/src/auth-mfa/web/mfa-regenerate-recovery-dialog.tsx +23 -13
- package/packages/bundled-features/src/auth-mfa/web/mfa-setup-preauth-screen.tsx +15 -6
- package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +71 -24
- package/packages/bundled-features/src/billing-foundation/aggregate-id.ts +10 -11
- package/packages/bundled-features/src/billing-foundation/changes.json +55 -0
- package/packages/bundled-features/src/billing-foundation/checkout-core.ts +32 -42
- package/packages/bundled-features/src/billing-foundation/consumer-protection/confirmation-mail.ts +8 -2
- package/packages/bundled-features/src/billing-foundation/consumer-protection/consent-gate.ts +2 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/issue-confirmation.ts +14 -3
- package/packages/bundled-features/src/billing-foundation/consumer-protection/mail-notifications.ts +3 -4
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-receipt-limit.ts +12 -6
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-record.ts +35 -19
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-request.ts +12 -8
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-revoke.ts +14 -8
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-texts.ts +5 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/withdrawal-period.ts +8 -10
- package/packages/bundled-features/src/billing-foundation/entities.ts +27 -27
- package/packages/bundled-features/src/billing-foundation/events.ts +23 -21
- package/packages/bundled-features/src/billing-foundation/feature.ts +45 -44
- package/packages/bundled-features/src/billing-foundation/get-subscription-for-tenant.ts +3 -5
- package/packages/bundled-features/src/billing-foundation/handlers/billing-plans.query.ts +71 -6
- package/packages/bundled-features/src/billing-foundation/handlers/create-checkout-session.write.ts +19 -17
- package/packages/bundled-features/src/billing-foundation/handlers/create-portal-session.write.ts +11 -12
- package/packages/bundled-features/src/billing-foundation/handlers/list-subscriptions.query.ts +4 -4
- package/packages/bundled-features/src/billing-foundation/handlers/plan-switch-preview.query.ts +65 -0
- package/packages/bundled-features/src/billing-foundation/handlers/process-event.write.ts +29 -22
- package/packages/bundled-features/src/billing-foundation/handlers/start-plan-checkout.write.ts +44 -8
- package/packages/bundled-features/src/billing-foundation/handlers/switch-plan.write.ts +72 -82
- package/packages/bundled-features/src/billing-foundation/handlers/sync-subscription.write.ts +14 -1
- package/packages/bundled-features/src/billing-foundation/i18n.ts +22 -0
- package/packages/bundled-features/src/billing-foundation/index.ts +2 -0
- package/packages/bundled-features/src/billing-foundation/plan-catalog.ts +62 -27
- package/packages/bundled-features/src/billing-foundation/plan-switch.ts +84 -0
- package/packages/bundled-features/src/billing-foundation/projection.ts +38 -37
- package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +3 -3
- package/packages/bundled-features/src/billing-foundation/tenant-destroy-hook.ts +7 -8
- package/packages/bundled-features/src/billing-foundation/types.ts +144 -66
- package/packages/bundled-features/src/billing-foundation/validate-options.ts +19 -0
- package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +123 -51
- package/packages/bundled-features/src/billing-foundation/web/checkout-consent-dialog.tsx +89 -42
- package/packages/bundled-features/src/billing-foundation/web/constants.ts +4 -0
- package/packages/bundled-features/src/billing-foundation/web/plan-price.ts +55 -0
- package/packages/bundled-features/src/billing-foundation/web/plan-switch-confirm-dialog.tsx +224 -0
- package/packages/bundled-features/src/billing-foundation/webhook-handler.ts +1 -1
- package/packages/bundled-features/src/cap-counter/aggregate-id.ts +8 -9
- package/packages/bundled-features/src/cap-counter/cap-reservation.ts +5 -1
- package/packages/bundled-features/src/cap-counter/changes.json +18 -0
- package/packages/bundled-features/src/cap-counter/constants.ts +11 -12
- package/packages/bundled-features/src/cap-counter/enforce-cap.ts +66 -68
- package/packages/bundled-features/src/cap-counter/entity.ts +29 -29
- package/packages/bundled-features/src/cap-counter/feature.ts +34 -35
- package/packages/bundled-features/src/cap-counter/handlers/increment-rolling.write.ts +31 -31
- package/packages/bundled-features/src/cap-counter/handlers/mark-soft-warned.write.ts +4 -5
- package/packages/bundled-features/src/cap-counter/stock-cap-guard.ts +9 -2
- package/packages/bundled-features/src/cap-counter/with-cap-enforcement.ts +3 -5
- package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +1 -3
- package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +1 -1
- package/packages/bundled-features/src/channel-email/changes.json +6 -0
- package/packages/bundled-features/src/channel-email/feature.ts +1 -1
- package/packages/bundled-features/src/channel-email/smtp-transport.ts +34 -31
- package/packages/bundled-features/src/channel-in-app/handlers/unread-count.query.ts +3 -4
- package/packages/bundled-features/src/compliance-profiles/feature.ts +15 -16
- package/packages/bundled-features/src/compliance-profiles/handlers/for-tenant.query.ts +3 -6
- package/packages/bundled-features/src/compliance-profiles/handlers/list-profiles.query.ts +5 -5
- package/packages/bundled-features/src/compliance-profiles/handlers/needs-profile.query.ts +4 -4
- package/packages/bundled-features/src/compliance-profiles/handlers/set-profile.write.ts +13 -14
- package/packages/bundled-features/src/compliance-profiles/handlers/sub-processors.query.ts +9 -11
- package/packages/bundled-features/src/compliance-profiles/resolve-for-tenant.ts +7 -7
- package/packages/bundled-features/src/compliance-profiles/schema/profile-selection.ts +18 -23
- package/packages/bundled-features/src/compliance-profiles/seeding.ts +14 -15
- package/packages/bundled-features/src/compliance-profiles-ops/handlers/tenants-missing-profile.query.ts +3 -3
- package/packages/bundled-features/src/compliance-profiles-ops/index.ts +2 -2
- package/packages/bundled-features/src/config/changes.json +12 -0
- package/packages/bundled-features/src/config/handlers/cascade.query.ts +4 -2
- package/packages/bundled-features/src/config/handlers/readiness.query.ts +7 -7
- package/packages/bundled-features/src/config/handlers/reencrypt.job.ts +4 -5
- package/packages/bundled-features/src/config/handlers/set.write.ts +4 -4
- package/packages/bundled-features/src/config/handlers/values.query.ts +4 -2
- package/packages/bundled-features/src/config/resolver.ts +4 -4
- package/packages/bundled-features/src/config/table.ts +10 -10
- package/packages/bundled-features/src/config/write-helpers.ts +28 -9
- package/packages/bundled-features/src/crypto-shredding/changes.json +6 -0
- package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +23 -21
- package/packages/bundled-features/src/custom-fields/aggregate-id.ts +16 -17
- package/packages/bundled-features/src/custom-fields/entity.ts +49 -47
- package/packages/bundled-features/src/custom-fields/events.ts +7 -8
- package/packages/bundled-features/src/custom-fields/feature.ts +70 -72
- package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +9 -8
- package/packages/bundled-features/src/custom-fields/handlers/define-tenant-field.write.ts +28 -26
- package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +6 -7
- package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +12 -13
- package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +25 -28
- package/packages/bundled-features/src/custom-fields/handlers/update-tenant-field.write.ts +6 -6
- package/packages/bundled-features/src/custom-fields/lib/field-access.ts +2 -2
- package/packages/bundled-features/src/custom-fields/lib/parse-serialized-field.ts +1 -1
- package/packages/bundled-features/src/custom-fields/lib/quota.ts +1 -1
- package/packages/bundled-features/src/custom-fields/lib/value-schema.ts +10 -12
- package/packages/bundled-features/src/custom-fields/run-retention.ts +3 -3
- package/packages/bundled-features/src/custom-fields/schemas.ts +14 -14
- package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +2 -5
- package/packages/bundled-features/src/custom-fields/web/constants.ts +2 -2
- package/packages/bundled-features/src/custom-fields/web/custom-fields-form-section.tsx +26 -26
- package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +65 -67
- package/packages/bundled-features/src/custom-fields/wire-user-data-rights.ts +3 -3
- package/packages/bundled-features/src/data-retention/_internal/parse-override.ts +2 -3
- package/packages/bundled-features/src/data-retention/feature.ts +11 -18
- package/packages/bundled-features/src/data-retention/handlers/policy-for.query.ts +6 -6
- package/packages/bundled-features/src/data-retention/keep-for.ts +17 -17
- package/packages/bundled-features/src/data-retention/override-schema.ts +13 -15
- package/packages/bundled-features/src/data-retention/presets.ts +18 -23
- package/packages/bundled-features/src/data-retention/resolve-for-tenant.ts +1 -1
- package/packages/bundled-features/src/data-retention/resolve-tenant-preset.ts +17 -16
- package/packages/bundled-features/src/data-retention/resolver.ts +33 -32
- package/packages/bundled-features/src/data-retention/run-retention-cleanup.ts +71 -58
- package/packages/bundled-features/src/data-retention/schema/tenant-retention-override.ts +13 -11
- package/packages/bundled-features/src/delivery/changes.json +30 -0
- package/packages/bundled-features/src/delivery/channel-context.ts +9 -3
- package/packages/bundled-features/src/delivery/db/queries/preferences.ts +2 -2
- package/packages/bundled-features/src/delivery/delivery-service.ts +35 -5
- package/packages/bundled-features/src/delivery/feature.ts +3 -3
- package/packages/bundled-features/src/delivery/handlers/log.query.ts +1 -1
- package/packages/bundled-features/src/delivery/handlers/preferences.query.ts +20 -1
- package/packages/bundled-features/src/delivery/handlers/unsubscribe-page-chrome.query.ts +1 -1
- package/packages/bundled-features/src/delivery/tables.ts +9 -8
- package/packages/bundled-features/src/delivery/unsubscribe-link.ts +3 -1
- package/packages/bundled-features/src/delivery/unsubscribe-page-strings.ts +1 -0
- package/packages/bundled-features/src/delivery/unsubscribe-page.ts +6 -0
- package/packages/bundled-features/src/delivery/unsubscribe.ts +40 -19
- package/packages/bundled-features/src/delivery/upsert-preference.ts +3 -4
- package/packages/bundled-features/src/document-ingest-foundation/entity.ts +5 -5
- package/packages/bundled-features/src/document-ingest-foundation/events.ts +2 -2
- package/packages/bundled-features/src/document-ingest-foundation/feature.ts +2 -2
- package/packages/bundled-features/src/document-ingest-foundation/pages.ts +1 -1
- package/packages/bundled-features/src/document-ingest-foundation/tenant-destroy-hook.ts +4 -4
- package/packages/bundled-features/src/feature-toggles/compose-tier-resolver.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/feature.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/global-feature-state-table.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/handlers/registered.query.ts +5 -5
- package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/toggle-sync-signal.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/web/constants.ts +1 -1
- package/packages/bundled-features/src/file-derivatives/feature.ts +2 -2
- package/packages/bundled-features/src/file-derivatives/handlers/public-variant.query.ts +1 -1
- package/packages/bundled-features/src/file-derivatives/presets.ts +1 -1
- package/packages/bundled-features/src/file-foundation/feature.ts +6 -6
- package/packages/bundled-features/src/file-foundation/index.ts +1 -0
- package/packages/bundled-features/src/file-foundation/read-file-ref-content.ts +7 -1
- package/packages/bundled-features/src/file-provider-inmemory/feature.ts +16 -16
- package/packages/bundled-features/src/file-provider-s3/env-named-feature.ts +0 -2
- package/packages/bundled-features/src/file-provider-s3/feature.ts +16 -16
- package/packages/bundled-features/src/file-provider-s3/lib/s3-provider.ts +6 -6
- package/packages/bundled-features/src/files/README.md +1 -1
- package/packages/bundled-features/src/files/feature.ts +6 -6
- package/packages/bundled-features/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +5 -5
- package/packages/bundled-features/src/files-tenant-data/hooks.ts +24 -26
- package/packages/bundled-features/src/files-tenant-data/index.ts +1 -1
- package/packages/bundled-features/src/folders/feature.ts +1 -1
- package/packages/bundled-features/src/folders/web/folder-manager.tsx +2 -2
- package/packages/bundled-features/src/folders/web/tree.ts +5 -5
- package/packages/bundled-features/src/form-draft/changes.json +6 -0
- package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +3 -3
- package/packages/bundled-features/src/form-draft/db/queries/owned-file-refs.ts +1 -1
- package/packages/bundled-features/src/form-draft/decrypt-draft.ts +4 -1
- package/packages/bundled-features/src/form-draft/entity.ts +3 -3
- package/packages/bundled-features/src/form-draft/feature.ts +4 -5
- package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +1 -1
- package/packages/bundled-features/src/form-draft/release-file-refs.ts +6 -6
- package/packages/bundled-features/src/form-draft/schemas.ts +3 -3
- package/packages/bundled-features/src/form-draft/web/constants.ts +0 -2
- package/packages/bundled-features/src/host-routing/README.md +1 -1
- package/packages/bundled-features/src/host-routing/changes.json +6 -0
- package/packages/bundled-features/src/host-routing/dispatch.ts +16 -17
- package/packages/bundled-features/src/host-routing/options.ts +2 -1
- package/packages/bundled-features/src/inbound-mail-foundation/aggregate-id.ts +19 -19
- package/packages/bundled-features/src/inbound-mail-foundation/changes.json +18 -0
- package/packages/bundled-features/src/inbound-mail-foundation/connect-routes.ts +4 -3
- package/packages/bundled-features/src/inbound-mail-foundation/constants.ts +30 -33
- package/packages/bundled-features/src/inbound-mail-foundation/entities.ts +47 -48
- package/packages/bundled-features/src/inbound-mail-foundation/events.ts +54 -50
- package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +39 -39
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/account-state.ts +8 -8
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/connect-account.write.ts +25 -26
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/disconnect-account.write.ts +7 -7
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/ingest-message.write.ts +50 -51
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-accounts.query.ts +8 -8
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-messages.query.ts +10 -10
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/scope-visibility.ts +3 -4
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/update-account.write.ts +27 -15
- package/packages/bundled-features/src/inbound-mail-foundation/i18n.ts +0 -1
- package/packages/bundled-features/src/inbound-mail-foundation/oauth-state.ts +16 -15
- package/packages/bundled-features/src/inbound-mail-foundation/projection.ts +31 -29
- package/packages/bundled-features/src/inbound-mail-foundation/provider-factory.ts +9 -9
- package/packages/bundled-features/src/inbound-mail-foundation/retention-sweep.ts +45 -41
- package/packages/bundled-features/src/inbound-mail-foundation/screens.ts +0 -3
- package/packages/bundled-features/src/inbound-mail-foundation/tenant-destroy-hook.ts +14 -16
- package/packages/bundled-features/src/inbound-mail-foundation/types.ts +70 -70
- package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor.ts +101 -84
- package/packages/bundled-features/src/inbound-provider-imap/credential-document.ts +13 -13
- package/packages/bundled-features/src/inbound-provider-imap/feature.ts +42 -40
- package/packages/bundled-features/src/inbound-provider-imap/imap-client.ts +20 -19
- package/packages/bundled-features/src/inbound-provider-inmemory/feature.ts +21 -21
- package/packages/bundled-features/src/jobs/changes.json +13 -0
- package/packages/bundled-features/src/jobs/db/queries/retention.ts +2 -2
- package/packages/bundled-features/src/jobs/db/queries/stale-run-sweep.ts +3 -3
- package/packages/bundled-features/src/jobs/events.ts +1 -1
- package/packages/bundled-features/src/jobs/feature.ts +20 -11
- package/packages/bundled-features/src/jobs/handlers/detail.query.ts +4 -4
- package/packages/bundled-features/src/jobs/handlers/list.query.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/projection-rebuild.job.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/reindex-entity.job.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/retry.write.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/tenant-failures.query.ts +45 -40
- package/packages/bundled-features/src/jobs/handlers/tenant-runs.query.ts +63 -59
- package/packages/bundled-features/src/jobs/job-instant.ts +1 -1
- package/packages/bundled-features/src/jobs/job-run-logger.ts +19 -19
- package/packages/bundled-features/src/jobs/job-run-table.ts +3 -3
- package/packages/bundled-features/src/jobs/screens.ts +1 -1
- package/packages/bundled-features/src/jobs/tenant-job-failure-table.ts +1 -1
- package/packages/bundled-features/src/jobs/tenant-job-run-table.ts +1 -1
- package/packages/bundled-features/src/ledger/entity.ts +5 -5
- package/packages/bundled-features/src/ledger/feature.ts +3 -3
- package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +3 -3
- package/packages/bundled-features/src/ledger/recurring.ts +12 -12
- package/packages/bundled-features/src/ledger/schemas.ts +1 -1
- package/packages/bundled-features/src/ledger/web/constants.ts +2 -2
- package/packages/bundled-features/src/ledger/web/index.ts +7 -7
- package/packages/bundled-features/src/legal-pages/README.md +1 -1
- package/packages/bundled-features/src/legal-pages/feature.ts +40 -41
- package/packages/bundled-features/src/legal-pages/markdown.ts +3 -3
- package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +23 -24
- package/packages/bundled-features/src/legal-pages/web/index.ts +0 -2
- package/packages/bundled-features/src/mail-foundation/changes.json +6 -0
- package/packages/bundled-features/src/mail-foundation/feature.ts +31 -30
- package/packages/bundled-features/src/mail-transport-inmemory/feature.ts +27 -28
- package/packages/bundled-features/src/mail-transport-smtp/feature.ts +20 -20
- package/packages/bundled-features/src/managed-pages/branding.ts +6 -6
- package/packages/bundled-features/src/managed-pages/feature.ts +62 -62
- package/packages/bundled-features/src/managed-pages/handlers/by-slug.query.ts +5 -6
- package/packages/bundled-features/src/managed-pages/handlers/by-tenant-published.query.ts +8 -8
- package/packages/bundled-features/src/managed-pages/handlers/set.write.ts +5 -7
- package/packages/bundled-features/src/managed-pages/screens/page-screens.ts +11 -11
- package/packages/bundled-features/src/managed-pages/seeding.ts +8 -8
- package/packages/bundled-features/src/managed-pages/table.ts +16 -15
- package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +6 -6
- package/packages/bundled-features/src/managed-pages/web/i18n.ts +1 -1
- package/packages/bundled-features/src/notes-history/entity.ts +4 -4
- package/packages/bundled-features/src/notes-history/feature.ts +2 -2
- package/packages/bundled-features/src/notes-history-user-data/hooks.ts +1 -1
- package/packages/bundled-features/src/page-render/layout.ts +9 -9
- package/packages/bundled-features/src/page-render/markdown.ts +11 -11
- package/packages/bundled-features/src/page-render/security-headers.ts +7 -6
- package/packages/bundled-features/src/personal-access-tokens/feature.ts +9 -6
- package/packages/bundled-features/src/personal-access-tokens/roles.ts +2 -2
- package/packages/bundled-features/src/readiness/handlers/status.query.ts +3 -3
- package/packages/bundled-features/src/renderer-foundation/api.ts +12 -13
- package/packages/bundled-features/src/renderer-foundation/constants.ts +2 -2
- package/packages/bundled-features/src/renderer-foundation/feature.ts +7 -7
- package/packages/bundled-features/src/renderer-foundation/types.ts +11 -12
- package/packages/bundled-features/src/renderer-pdf/changes.json +6 -0
- package/packages/bundled-features/src/renderer-pdf/render-table-pdf.ts +27 -10
- package/packages/bundled-features/src/secrets/feature.ts +9 -9
- package/packages/bundled-features/src/secrets/web/constants.ts +2 -2
- package/packages/bundled-features/src/seo/feature.ts +3 -3
- package/packages/bundled-features/src/sessions/constants.ts +1 -1
- package/packages/bundled-features/src/sessions/feature.ts +16 -11
- package/packages/bundled-features/src/sessions/handlers/revoke-all-for-user.write.ts +2 -2
- package/packages/bundled-features/src/sessions/handlers/revoke-all-others.write.ts +2 -2
- package/packages/bundled-features/src/sessions/handlers/revoke.write.ts +1 -1
- package/packages/bundled-features/src/sessions/schema/user-session.ts +4 -4
- package/packages/bundled-features/src/sessions/screens.ts +2 -2
- package/packages/bundled-features/src/sessions/session-callbacks.ts +2 -2
- package/packages/bundled-features/src/sessions/session-revoked-event.ts +2 -2
- package/packages/bundled-features/src/shared/assert-no-where-rule-in-ownership-write.ts +1 -1
- package/packages/bundled-features/src/shared/decrypt-stored-pii.ts +11 -1
- package/packages/bundled-features/src/shared/encrypt-for-direct-write.ts +1 -1
- package/packages/bundled-features/src/shared/index.ts +1 -1
- package/packages/bundled-features/src/shared/mail-template-body.ts +10 -3
- package/packages/bundled-features/src/shared/map-with-concurrency.ts +5 -4
- package/packages/bundled-features/src/shared/parent-visibility.ts +2 -2
- package/packages/bundled-features/src/shared/password-hashing.ts +1 -1
- package/packages/bundled-features/src/shared/signup-handover.ts +1 -2
- package/packages/bundled-features/src/shared/single-use-token-store.ts +1 -1
- package/packages/bundled-features/src/step-dispatcher/changes.json +6 -0
- package/packages/bundled-features/src/step-dispatcher/feature.ts +1 -0
- package/packages/bundled-features/src/subscription-dodo/changes.json +14 -0
- package/packages/bundled-features/src/subscription-dodo/client.ts +45 -0
- package/packages/bundled-features/src/subscription-dodo/constants.ts +24 -0
- package/packages/bundled-features/src/subscription-dodo/feature.ts +207 -0
- package/packages/bundled-features/src/subscription-dodo/index.ts +16 -0
- package/packages/bundled-features/src/subscription-dodo/plugin-methods.ts +345 -0
- package/packages/bundled-features/src/subscription-dodo/runtime.ts +126 -0
- package/packages/bundled-features/src/subscription-dodo/verify-webhook.ts +262 -0
- package/packages/bundled-features/src/subscription-mollie/constants.ts +15 -17
- package/packages/bundled-features/src/subscription-mollie/feature.ts +41 -42
- package/packages/bundled-features/src/subscription-mollie/index.ts +3 -3
- package/packages/bundled-features/src/subscription-mollie/plugin-methods.ts +17 -16
- package/packages/bundled-features/src/subscription-mollie/verify-webhook.ts +34 -34
- package/packages/bundled-features/src/subscription-stripe/changes.json +12 -0
- package/packages/bundled-features/src/subscription-stripe/constants.ts +4 -6
- package/packages/bundled-features/src/subscription-stripe/feature.ts +45 -43
- package/packages/bundled-features/src/subscription-stripe/index.ts +6 -6
- package/packages/bundled-features/src/subscription-stripe/plugin-methods.ts +22 -27
- package/packages/bundled-features/src/subscription-stripe/runtime.ts +9 -8
- package/packages/bundled-features/src/subscription-stripe/verify-webhook.ts +62 -64
- package/packages/bundled-features/src/tags/feature.ts +3 -3
- package/packages/bundled-features/src/tags/screens.ts +1 -1
- package/packages/bundled-features/src/template-resolver/api.ts +41 -14
- package/packages/bundled-features/src/template-resolver/changes.json +48 -0
- package/packages/bundled-features/src/template-resolver/compile-document-body.ts +1 -0
- package/packages/bundled-features/src/template-resolver/feature.ts +2 -2
- package/packages/bundled-features/src/template-resolver/handlers/bundle-import.ts +3 -2
- package/packages/bundled-features/src/template-resolver/handlers/copy-locale.write.ts +27 -5
- package/packages/bundled-features/src/template-resolver/handlers/diff-to-system.query.ts +3 -2
- package/packages/bundled-features/src/template-resolver/handlers/document-base.ts +3 -2
- package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +8 -7
- package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +19 -20
- package/packages/bundled-features/src/template-resolver/handlers/overview.query.ts +15 -5
- package/packages/bundled-features/src/template-resolver/handlers/shared.ts +2 -2
- package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +3 -3
- package/packages/bundled-features/src/template-resolver/handlers/tenant-override-counts.query.ts +9 -5
- package/packages/bundled-features/src/template-resolver/handlers/tenant-override-selection.ts +8 -6
- package/packages/bundled-features/src/template-resolver/handlers/tenant-overrides.query.ts +44 -5
- package/packages/bundled-features/src/template-resolver/handlers/upsert-system.write.ts +3 -4
- package/packages/bundled-features/src/template-resolver/handlers/upsert-tenant.write.ts +4 -5
- package/packages/bundled-features/src/template-resolver/handlers/usage.query.ts +37 -26
- package/packages/bundled-features/src/template-resolver/handlers/validate.query.ts +7 -2
- package/packages/bundled-features/src/template-resolver/seeding.ts +36 -18
- package/packages/bundled-features/src/template-resolver/store-template-resource.ts +22 -4
- package/packages/bundled-features/src/template-resolver/table.ts +13 -14
- package/packages/bundled-features/src/template-resolver/template-delivery-policy.ts +0 -11
- package/packages/bundled-features/src/template-resolver/template-meta.ts +12 -4
- package/packages/bundled-features/src/template-resolver/template-preview.ts +11 -3
- package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +2 -2
- package/packages/bundled-features/src/template-resolver/web/constants.ts +7 -5
- package/packages/bundled-features/src/template-resolver/web/index.ts +7 -0
- package/packages/bundled-features/src/template-resolver/web/mail-layout-constants.ts +8 -0
- package/packages/bundled-features/src/tenant/changes.json +6 -0
- package/packages/bundled-features/src/tenant/feature.ts +7 -7
- package/packages/bundled-features/src/tenant/handlers/member-directory.query.ts +10 -4
- package/packages/bundled-features/src/tenant/handlers/members.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/memberships.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/team-list.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/tenant-directory.query.ts +8 -5
- package/packages/bundled-features/src/tenant/invitation-table.ts +37 -40
- package/packages/bundled-features/src/tenant/membership-table.ts +3 -3
- package/packages/bundled-features/src/tenant/schema/tenant.ts +7 -9
- package/packages/bundled-features/src/tenant/screens.ts +1 -1
- package/packages/bundled-features/src/tenant/seeding.ts +19 -18
- package/packages/bundled-features/src/tenant/testing.ts +5 -6
- package/packages/bundled-features/src/tenant/web/constants.ts +2 -2
- package/packages/bundled-features/src/tenant-handover/events.ts +5 -7
- package/packages/bundled-features/src/tenant-handover/feature.ts +1 -1
- package/packages/bundled-features/src/tenant-handover/grant.ts +1 -1
- package/packages/bundled-features/src/tenant-handover/handlers/claim.write.ts +1 -1
- package/packages/bundled-features/src/tenant-handover/move-entity-graph.ts +8 -9
- package/packages/bundled-features/src/tenant-handover/signup-handover-provider.ts +1 -2
- package/packages/bundled-features/src/tenant-handover/transfer-graph.ts +4 -5
- package/packages/bundled-features/src/tenant-lifecycle/boot-checks.ts +1 -1
- package/packages/bundled-features/src/tenant-lifecycle/changes.json +6 -0
- package/packages/bundled-features/src/tenant-lifecycle/constants.ts +5 -0
- package/packages/bundled-features/src/tenant-lifecycle/feature.ts +1 -1
- package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +7 -3
- package/packages/bundled-features/src/tenant-lifecycle/stages.ts +1 -1
- package/packages/bundled-features/src/tenant-settings/constants.ts +1 -1
- package/packages/bundled-features/src/tenant-settings/tenant-defaults.ts +12 -5
- package/packages/bundled-features/src/tier-engine/aggregate-id.ts +15 -16
- package/packages/bundled-features/src/tier-engine/changes.json +6 -0
- package/packages/bundled-features/src/tier-engine/compose-app.ts +14 -14
- package/packages/bundled-features/src/tier-engine/entity.ts +18 -19
- package/packages/bundled-features/src/tier-engine/feature.ts +88 -87
- package/packages/bundled-features/src/tier-engine/handlers/active-tier.query.ts +6 -7
- package/packages/bundled-features/src/tier-engine/handlers/get-tenant-tier.query.ts +4 -4
- package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +12 -9
- package/packages/bundled-features/src/tier-engine/tier-resolver.ts +2 -2
- package/packages/bundled-features/src/tier-engine/trial.ts +13 -13
- package/packages/bundled-features/src/tier-engine/web/constants.ts +3 -3
- package/packages/bundled-features/src/tier-engine/web/index.ts +4 -4
- package/packages/bundled-features/src/user/db/queries/stream-tenant-backfill.ts +8 -8
- package/packages/bundled-features/src/user/handlers/create.write.ts +4 -4
- package/packages/bundled-features/src/user/schema/user.ts +45 -44
- package/packages/bundled-features/src/user/seeding.ts +40 -40
- package/packages/bundled-features/src/user/testing.ts +3 -3
- package/packages/bundled-features/src/user-data-rights/audit-download.ts +27 -28
- package/packages/bundled-features/src/user-data-rights/boot-checks.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/deletion-token.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/feature.ts +112 -113
- package/packages/bundled-features/src/user-data-rights/handlers/cancel-deletion.write.ts +9 -9
- package/packages/bundled-features/src/user-data-rights/handlers/confirm-deletion-by-token.write.ts +8 -8
- package/packages/bundled-features/src/user-data-rights/handlers/download-by-job.query.ts +29 -30
- package/packages/bundled-features/src/user-data-rights/handlers/download-by-token.query.ts +40 -42
- package/packages/bundled-features/src/user-data-rights/handlers/export-status.query.ts +8 -9
- package/packages/bundled-features/src/user-data-rights/handlers/lift-restriction.write.ts +7 -8
- package/packages/bundled-features/src/user-data-rights/handlers/list-download-attempts.query.ts +2 -2
- package/packages/bundled-features/src/user-data-rights/handlers/my-audit-log.query.ts +4 -4
- package/packages/bundled-features/src/user-data-rights/handlers/request-deletion-by-email.write.ts +30 -29
- package/packages/bundled-features/src/user-data-rights/handlers/request-deletion.write.ts +15 -18
- package/packages/bundled-features/src/user-data-rights/handlers/request-export.write.ts +42 -41
- package/packages/bundled-features/src/user-data-rights/handlers/restrict-account.write.ts +22 -19
- package/packages/bundled-features/src/user-data-rights/handlers/run-forget-cleanup.write.ts +8 -8
- package/packages/bundled-features/src/user-data-rights/index.ts +8 -10
- package/packages/bundled-features/src/user-data-rights/lib/default-mailers.ts +3 -3
- package/packages/bundled-features/src/user-data-rights/lib/update-user-lifecycle.ts +24 -27
- package/packages/bundled-features/src/user-data-rights/run-export-jobs.ts +169 -280
- package/packages/bundled-features/src/user-data-rights/run-forget-cleanup.ts +87 -108
- package/packages/bundled-features/src/user-data-rights/run-user-export.ts +67 -69
- package/packages/bundled-features/src/user-data-rights/schema/download-attempt.ts +11 -11
- package/packages/bundled-features/src/user-data-rights/schema/download-token.ts +37 -41
- package/packages/bundled-features/src/user-data-rights/schema/export-job.ts +65 -67
- package/packages/bundled-features/src/user-data-rights/token-helpers.ts +21 -25
- package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +6 -6
- package/packages/bundled-features/src/user-data-rights/web/confirm-deletion-screen.tsx +6 -5
- package/packages/bundled-features/src/user-data-rights/web/constants.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/web/index.ts +5 -5
- package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +14 -13
- package/packages/bundled-features/src/user-data-rights/web/public-deletion-gate.tsx +13 -12
- package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +6 -6
- package/packages/bundled-features/src/user-data-rights/zip-path.ts +41 -40
- package/packages/bundled-features/src/user-data-rights-defaults/feature.ts +15 -15
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.ts +3 -5
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +45 -51
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/job-run.userdata-hook.ts +2 -2
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/notification-preference.userdata-hook.ts +1 -1
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/user-session.userdata-hook.ts +3 -3
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/user.userdata-hook.ts +32 -31
- package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +13 -13
- package/packages/bundled-features/src/user-profile/index.ts +3 -3
- package/packages/bundled-features/src/user-profile/web/client-plugin.ts +1 -1
- package/packages/bundled-features/src/user-profile/web/constants.ts +1 -1
- package/packages/bundled-features/src/user-profile/web/profile-screen.tsx +1 -1
- package/packages/bundled-features/src/waitlist/changes.json +18 -0
- package/packages/bundled-features/src/waitlist/handlers/export-purge.write.ts +2 -1
- package/packages/bundled-features/src/waitlist/handlers/submit.write.ts +5 -5
- package/packages/bundled-features/src/waitlist/import.ts +5 -0
- package/packages/bundled-features/src/waitlist/legacy-migrate.ts +22 -3
- package/packages/bundled-features/src/waitlist/link-on-signup.ts +20 -10
- package/packages/bundled-features/src/waitlist/options.ts +3 -0
- package/packages/bundled-features/src/workflow-runner/aggregate-id.ts +1 -1
- package/packages/bundled-features/src/workflow-runner/event-subscriber.ts +4 -5
- package/packages/bundled-features/src/workflow-runner/event-trigger.ts +4 -15
- package/packages/bundled-features/src/workflow-runner/feature.ts +2 -2
- package/packages/bundled-features/src/workflow-runner/handlers/resume-run.write.ts +4 -4
- package/packages/bundled-features/src/workflow-runner/pending-projection.ts +6 -7
- package/packages/bundled-features/src/workflow-runner/runner.ts +6 -6
- package/packages/bundled-features/src/workflow-runner/tables.ts +6 -6
- package/packages/bundled-features/src/workflow-runner/workflow-registry.ts +1 -1
- package/samples/apps/styleguide/src/features/widgets/i18n.ts +11 -0
- package/samples/apps/styleguide/src/features/widgets/web/Widgets.tsx +24 -0
- package/samples/apps/use-all-bundled/e2e-billing-gallery/gallery-constants.ts +5 -0
- package/samples/apps/use-all-bundled/e2e-billing-gallery/gallery-features.ts +90 -15
- package/samples/apps/use-all-bundled/e2e-billing-gallery/server.ts +16 -6
- package/samples/apps/use-all-bundled/feature-manifest.json +120 -3
- package/samples/apps/use-all-bundled/src/run-config.ts +9 -3
- package/samples/recipes/auth-mfa/README.md +5 -0
- package/samples/recipes/auth-mfa/package.json +5 -2
- package/samples/recipes/auth-mfa/src/web/confirmation-code-step.tsx +49 -0
- package/samples/recipes/auth-mfa/tsconfig.json +8 -0
- package/samples/recipes/env-composition/README.md +3 -1
- package/samples/recipes/env-composition/src/env.ts +2 -0
- package/samples/recipes/legal-pages/README.md +1 -1
- package/samples/recipes/rate-limiting/README.md +18 -0
- package/samples/recipes/rate-limiting/src/feature.ts +12 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/stored-user-email.ts +0 -12
|
@@ -41,9 +41,9 @@ import { tenantJobRunsTable } from "./tenant-job-run-table.ts";
|
|
|
41
41
|
// every connection in the pool.
|
|
42
42
|
const KMS_POOL_CONCURRENCY = 4;
|
|
43
43
|
|
|
44
|
-
// Direct-write job-run log
|
|
44
|
+
// Direct-write job-run log: onJobStart/-Complete/-Failed write
|
|
45
45
|
// straight into jobRunsTable / jobRunLogsTable instead of appending to the
|
|
46
|
-
// event store and replaying through inline projections.
|
|
46
|
+
// event store and replaying through inline projections. Before this change every run
|
|
47
47
|
// left two permanent `kumiko_events` rows that nothing else ever replayed
|
|
48
48
|
// or MSP-subscribed to — in two production apps that was ~99% of all
|
|
49
49
|
// events. Same tables, same shape, no event stream in between.
|
|
@@ -76,7 +76,7 @@ const DEFAULT_CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
|
|
|
76
76
|
|
|
77
77
|
// Run rows hang on SYSTEM_TENANT_ID and a null trigger is a cron/system run;
|
|
78
78
|
// job-run-table.ts declares whenAbsent: "tenant" for exactly that case, so the
|
|
79
|
-
// logger must resolve the same subject the entity chain would
|
|
79
|
+
// logger must resolve the same subject the entity chain would.
|
|
80
80
|
function jobRunSubject(triggeredById: string | null): SubjectId {
|
|
81
81
|
return triggeredById === null
|
|
82
82
|
? { kind: "tenant", tenantId: SYSTEM_TENANT_ID }
|
|
@@ -112,12 +112,12 @@ async function encryptOrSentinel(
|
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
// Same per-subject encryption as encryptStartedPayload, applied to each
|
|
115
|
-
// batched log line's `message`
|
|
115
|
+
// batched log line's `message` before insertMany into
|
|
116
116
|
// jobRunLogsTable — that table is unmanaged/direct-write, so there is no
|
|
117
117
|
// event-piiFields catalog to lean on here either. "message" is the AAD
|
|
118
118
|
// field name and must match the field passed to decryptStoredPii on read
|
|
119
119
|
// (detail.query.ts) or decrypt fails loud. Same skip rule as the payload:
|
|
120
|
-
// absent KMS (rollout mode) stays plaintext. Bounded concurrency
|
|
120
|
+
// absent KMS (rollout mode) stays plaintext. Bounded concurrency —
|
|
121
121
|
// unbounded Promise.all would fire one getOrCreateDek per log line at once
|
|
122
122
|
// against the KMS adapter's pool.
|
|
123
123
|
async function encryptLogMessages<T extends { readonly message: string }>(
|
|
@@ -133,7 +133,7 @@ async function encryptLogMessages<T extends { readonly message: string }>(
|
|
|
133
133
|
}));
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
// Mirrors encryptFailureError for the failure-path `error` column
|
|
136
|
+
// Mirrors encryptFailureError for the failure-path `error` column:
|
|
137
137
|
// stored alongside logs[].message under the same triggering user's DEK, so
|
|
138
138
|
// a log/error pair from the same failed run decrypt together or erase
|
|
139
139
|
// together. Exported so stale-run-sweep.ts's crash-recovery write (a
|
|
@@ -149,12 +149,12 @@ export async function encryptFailureError(
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
// The run-started payload can carry arbitrary user data; triggeredById
|
|
152
|
-
// names its owning user. No event-PII catalog involved (
|
|
153
|
-
// jobRun r.defineEvent registrations, so there is nothing to
|
|
154
|
-
// the subject is known statically, so we encrypt directly. A null subject
|
|
152
|
+
// names its owning user. No event-PII catalog involved (the
|
|
153
|
+
// jobRun r.defineEvent registrations were removed, so there is nothing to
|
|
154
|
+
// catalog) — the subject is known statically, so we encrypt directly. A null subject
|
|
155
155
|
// (system cron runs, recipient-less triggers) encrypts under the system
|
|
156
156
|
// tenant key. Absent KMS adapter stays plaintext (rollout mode, unchanged).
|
|
157
|
-
// A key already erased by the time the trigger lands
|
|
157
|
+
// A key already erased by the time the trigger lands must not fail
|
|
158
158
|
// the whole run-start write — sentinel like the log/error paths.
|
|
159
159
|
async function encryptStartedPayload(
|
|
160
160
|
payload: string | null,
|
|
@@ -173,13 +173,12 @@ const TENANT_JOB_FAILURE_LOCK_NAMESPACE = 0x746a666c;
|
|
|
173
173
|
const TENANT_JOB_RUN_LOCK_NAMESPACE = 0x746a726c;
|
|
174
174
|
const TENANT_RUN_CONFLICT_KEYS = ["tenantId", "jobName", "bullJobId"] as const;
|
|
175
175
|
|
|
176
|
-
//
|
|
176
|
+
// Which row the tenant-visible failure record lives in: one per
|
|
177
177
|
// (tenant, job, subject), so the next outcome of the same work replaces or
|
|
178
178
|
// clears it. `subject` is null for a job that declares no subjectFields.
|
|
179
179
|
// Null target = nothing to write or clear: the job did not opt in, the run
|
|
180
180
|
// was tenant-less (cron resolves to SYSTEM_TENANT_ID, where no tenant-scoped
|
|
181
|
-
// query could ever read the row), or the caller
|
|
182
|
-
// no outcome at all.
|
|
181
|
+
// query could ever read the row), or the caller passes no outcome at all.
|
|
183
182
|
function tenantJobFailureTarget(
|
|
184
183
|
jobName: string,
|
|
185
184
|
outcome: JobOutcomeMeta | undefined,
|
|
@@ -229,7 +228,7 @@ async function clearTenantJobFailure(
|
|
|
229
228
|
await deleteMany(db, tenantJobFailuresTable, where);
|
|
230
229
|
}
|
|
231
230
|
|
|
232
|
-
//
|
|
231
|
+
// Tenant-visible run state. One row per BullMQ job in
|
|
233
232
|
// store_tenant_job_runs, addressed by (tenant, job name, bullJobId): BullMQ
|
|
234
233
|
// ids are only unique per queue (api and worker lane both count from 1) and
|
|
235
234
|
// restart after a Redis reset, so the id alone must never pick a row. The
|
|
@@ -263,15 +262,16 @@ async function recordTenantRunQueued(
|
|
|
263
262
|
const now = Temporal.Now.instant();
|
|
264
263
|
await transaction(db, async (tx) => {
|
|
265
264
|
// A finished row under the same id is left over from before a Redis reset
|
|
266
|
-
// (ids restart at 1), not this job. Only rows
|
|
267
|
-
//
|
|
268
|
-
// and
|
|
265
|
+
// (ids restart at 1), not this job. Only rows queued before this BullMQ job
|
|
266
|
+
// was created qualify: a fast worker can finish before the hook runs (no
|
|
267
|
+
// queuedAt), and a deduplicated add of an already finished job re-announces
|
|
268
|
+
// it with a creation time older than its own row. Both rows must stay.
|
|
269
269
|
await deleteMany(tx, tenantJobRunsTable, {
|
|
270
270
|
tenantId: key.tenantId,
|
|
271
271
|
jobName,
|
|
272
272
|
bullJobId,
|
|
273
273
|
status: { in: ["completed", "failed"] },
|
|
274
|
-
queuedAt: {
|
|
274
|
+
queuedAt: { lt: Temporal.Instant.fromEpochMilliseconds(meta.jobCreatedAtMs) },
|
|
275
275
|
});
|
|
276
276
|
// DO NOTHING: a fast worker can report the start before this enqueue hook
|
|
277
277
|
// returns, and a repeated jobId (debounce, fan-out dedup) is the same job.
|
|
@@ -445,7 +445,7 @@ export function createJobRunLogger(opts: JobRunLoggerOptions): JobRunLoggerCallb
|
|
|
445
445
|
// Bounded cache (LRU-ish with TTL) — worker-crash between start and
|
|
446
446
|
// complete would otherwise leak entries. DB-lookup recovers evicted
|
|
447
447
|
// entries via bull_job_id on jobRunsTable.
|
|
448
|
-
// triggeredById rides along with runId
|
|
448
|
+
// triggeredById rides along with runId — resolved once at start
|
|
449
449
|
// (or on cache-miss DB fallback) so onJobComplete/-Failed know the log
|
|
450
450
|
// subject without an extra always-on DB round trip.
|
|
451
451
|
type CacheEntry = {
|
|
@@ -18,10 +18,10 @@ import {
|
|
|
18
18
|
export type JobRunStatus = "queued" | "running" | "completed" | "failed";
|
|
19
19
|
export type JobLogLevel = "info" | "warn" | "error";
|
|
20
20
|
|
|
21
|
-
// jobRun is a system-scoped direct-write store
|
|
21
|
+
// jobRun is a system-scoped direct-write store: every job execution
|
|
22
22
|
// writes straight into jobRunsTable / jobRunLogsTable from the BullMQ
|
|
23
23
|
// callbacks (onJobStart / -Complete / -Failed, see job-run-logger.ts) —
|
|
24
|
-
// no event-store detour.
|
|
24
|
+
// no event-store detour. Previously this was an events-only aggregate
|
|
25
25
|
// replayed through two inline projections; that generated two permanent
|
|
26
26
|
// `kumiko_events` rows per run for data that is itself already the
|
|
27
27
|
// system of record (no other consumer replays or MSP-subscribes to it).
|
|
@@ -38,7 +38,7 @@ export type JobLogLevel = "info" | "warn" | "error";
|
|
|
38
38
|
// app boundary (same pattern as template-resolver kind/scope).
|
|
39
39
|
// `table: "store_job_runs"` (not `read_*`) because this is no longer a
|
|
40
40
|
// rebuildable projection — `defineUnmanagedTable`/`deriveEntityTableMeta`
|
|
41
|
-
// reject the `read_` prefix for `source: "unmanaged"
|
|
41
|
+
// reject the `read_` prefix for `source: "unmanaged"`.
|
|
42
42
|
export const jobRunEntity = createEntity({
|
|
43
43
|
table: "store_job_runs",
|
|
44
44
|
fields: {
|
|
@@ -111,7 +111,7 @@ export const jobRunDetailScreen: ProjectionDetailScreenDefinition = {
|
|
|
111
111
|
"error",
|
|
112
112
|
],
|
|
113
113
|
},
|
|
114
|
-
// No section `title` here (
|
|
114
|
+
// No section `title` here (label-dedup fix): the section
|
|
115
115
|
// holds exactly one field, so a title would repeat the field's own
|
|
116
116
|
// label (rendered by RenderField as the Field's heading) verbatim.
|
|
117
117
|
{
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
uuid,
|
|
12
12
|
} from "@cosmicdrift/kumiko-framework/db";
|
|
13
13
|
|
|
14
|
-
// The tenant's own view of a failed job
|
|
14
|
+
// The tenant's own view of a failed job. Direct-write store like
|
|
15
15
|
// store_job_runs: job-run-logger.ts writes it from the BullMQ callbacks,
|
|
16
16
|
// outside any dispatcher transaction.
|
|
17
17
|
//
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
|
|
14
14
|
export type TenantJobRunStatus = "queued" | "running" | "completed" | "failed";
|
|
15
15
|
|
|
16
|
-
// The tenant's own view of a job's run state
|
|
16
|
+
// The tenant's own view of a job's run state. Direct-write store
|
|
17
17
|
// like store_job_runs, written by job-run-logger.ts from the runner callbacks.
|
|
18
18
|
//
|
|
19
19
|
// store_job_runs cannot serve the tenant: it anchors every run on the system
|
|
@@ -13,7 +13,7 @@ import { ACCOUNT_TYPES, SCHEDULE_INTERVALS, TRANSACTION_STATUS } from "./web/con
|
|
|
13
13
|
// detail via the standard handlers); the framework projects `read_ledger_accounts`
|
|
14
14
|
// from its CRUD events. `parentId` null → root account; otherwise the chart-of-
|
|
15
15
|
// accounts tree. `type` drives how the report layer interprets a balance. No
|
|
16
|
-
// money column — balances are DERIVED from postings
|
|
16
|
+
// money column — balances are DERIVED from postings, never stored.
|
|
17
17
|
// tenantId is a base column set by the framework → each tenant has its own books.
|
|
18
18
|
export const accountEntity = createEntity({
|
|
19
19
|
table: "read_ledger_accounts",
|
|
@@ -49,13 +49,13 @@ export const accountEntity = createEntity({
|
|
|
49
49
|
// transaction — a journal entry. The balanced posting lines live embedded as
|
|
50
50
|
// `lines` (embedded list: { accountId, amount }[], Σ amount = 0), so an entry is atomic:
|
|
51
51
|
// the Σ=0 invariant holds within a single command, no cross-row write. The
|
|
52
|
-
// framework projects `read_ledger_transactions`;
|
|
53
|
-
// `read_ledger_postings` projection (one row per line)
|
|
52
|
+
// framework projects `read_ledger_transactions`; a flat
|
|
53
|
+
// `read_ledger_postings` projection (one row per line) supports per-account/period
|
|
54
54
|
// report queries.
|
|
55
55
|
//
|
|
56
56
|
// IMMUTABLE: the feature registers NO update/delete handler for transaction. A
|
|
57
|
-
// posted entry is a fact; corrections are reverse-transaction
|
|
58
|
-
// `status` carries draft|posted
|
|
57
|
+
// posted entry is a fact; corrections are reverse-transaction entries.
|
|
58
|
+
// `status` carries draft|posted.
|
|
59
59
|
export const transactionEntity = createEntity({
|
|
60
60
|
table: "read_ledger_transactions",
|
|
61
61
|
description:
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
// corrections are reverse-transaction (Storno) entries.
|
|
8
8
|
//
|
|
9
9
|
// Everything financial — banking, accounting, rent cashflow, credits, invoices —
|
|
10
|
-
// is accounts + balanced transactions on top. Balances and reports (
|
|
11
|
-
//
|
|
10
|
+
// is accounts + balanced transactions on top. Balances and reports (balance
|
|
11
|
+
// sheet, P&L, cashflow) are pure queries over the postings, never stored state.
|
|
12
12
|
//
|
|
13
13
|
// Spec: kumiko-platform/docs/plans/ledger-feature.md
|
|
14
14
|
|
|
@@ -60,7 +60,7 @@ function registerLedger(
|
|
|
60
60
|
|
|
61
61
|
// Chart of accounts — plain CRUD, no custom logic. No delete in v1: removing an
|
|
62
62
|
// account that has postings would orphan them; a posting-aware guard lands with
|
|
63
|
-
// the postings projection
|
|
63
|
+
// the postings projection.
|
|
64
64
|
r.writeHandler(
|
|
65
65
|
defineEntityCreateHandler("account", accountEntity, {
|
|
66
66
|
access,
|
|
@@ -27,11 +27,11 @@ const CONFIRM_PERIOD_LOCK_NAMESPACE = 0x6c637370;
|
|
|
27
27
|
// balanced transaction (debit +amount / credit −amount), tagged with
|
|
28
28
|
// scheduleReference(scheduleId, period) so the host can merge Soll vs. Ist.
|
|
29
29
|
//
|
|
30
|
-
// Idempotent
|
|
30
|
+
// Idempotent and reversal-aware: if an ACTIVE (non-reversed) booking for this
|
|
31
31
|
// reference already exists, it's a no-op; a booking that was reversed (Storno)
|
|
32
32
|
// leaves the period re-confirmable. Referential integrity (both accounts must
|
|
33
|
-
// exist) mirrors create-transaction
|
|
34
|
-
// generic CRUD create
|
|
33
|
+
// exist) mirrors create-transaction because a schedule could name a bogus
|
|
34
|
+
// account that the generic CRUD create does not check.
|
|
35
35
|
export function createConfirmSchedulePeriodHandler(
|
|
36
36
|
access: AccessRule = DEFAULT_LEDGER_ACCESS,
|
|
37
37
|
): WriteHandlerDef {
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
// Recurring schedules on top of the ledger primitive. A `schedule` is a standing
|
|
2
|
-
// booking template ("
|
|
3
|
-
//
|
|
2
|
+
// booking template ("Rent from 1/1/2026, €500/month") used without booking every
|
|
3
|
+
// month up front:
|
|
4
4
|
//
|
|
5
|
-
// • projectSchedule() — the
|
|
6
|
-
// no transactions
|
|
7
|
-
// • mergeScheduleActuals() —
|
|
8
|
-
//
|
|
9
|
-
// month is posted | open | forecast.
|
|
5
|
+
// • projectSchedule() — the forecast: a pure projection over a window with
|
|
6
|
+
// no transactions required (chart, "does it pay for itself?").
|
|
7
|
+
// • mergeScheduleActuals() — forecast vs. actual: the projection left-joined
|
|
8
|
+
// against posted confirmations (by `reference`), so
|
|
9
|
+
// each month is posted | open | forecast.
|
|
10
10
|
//
|
|
11
|
-
// confirm-schedule-period
|
|
11
|
+
// The confirm-schedule-period handler turns one projected month into one balanced
|
|
12
12
|
// transaction tagged with `scheduleReference(id, period)`. Both functions here are
|
|
13
|
-
// pure
|
|
14
|
-
//
|
|
13
|
+
// pure—no DB or Date API (windows/asOf are supplied as parameters)—so the forecast
|
|
14
|
+
// remains deterministic and the no-date-api guard stays green.
|
|
15
15
|
|
|
16
16
|
import type { Posting } from "./schemas.ts";
|
|
17
17
|
import type { ScheduleInterval } from "./web/constants.ts";
|
|
@@ -109,8 +109,8 @@ export function projectSchedule(
|
|
|
109
109
|
return periods;
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
//
|
|
113
|
-
// AND has not been reversed
|
|
112
|
+
// Planned vs. actual. A month is `posted` when a confirmation for its reference exists
|
|
113
|
+
// AND has not been reversed; a reversed confirmation drops the month back
|
|
114
114
|
// to `open` so it can be re-confirmed. Past/current unbooked months are `open`,
|
|
115
115
|
// future ones `forecast` (asOf is the boundary — month-granular).
|
|
116
116
|
export function mergeScheduleActuals(
|
|
@@ -24,7 +24,7 @@ export const createTransactionPayloadSchema = z
|
|
|
24
24
|
description: z.string().min(1).max(200),
|
|
25
25
|
reference: z.string().max(120).optional(),
|
|
26
26
|
// Defaults to "posted" in the handler. draft lifecycle (editable) lands with
|
|
27
|
-
// the
|
|
27
|
+
// the debit/recurring work — only ever creates posted entries.
|
|
28
28
|
status: z.enum(TRANSACTION_STATUS).optional(),
|
|
29
29
|
lines: z.array(postingSchema).min(2),
|
|
30
30
|
// Business-object reference (e.g. a lease contract) this entry is about.
|
|
@@ -30,7 +30,7 @@ export const LedgerQueries = {
|
|
|
30
30
|
transactionDetail: "ledger:query:transaction:detail",
|
|
31
31
|
scheduleList: "ledger:query:schedule:list",
|
|
32
32
|
scheduleDetail: "ledger:query:schedule:detail",
|
|
33
|
-
// Reports — pure aggregations over the posted entries
|
|
33
|
+
// Reports — pure aggregations over the posted entries.
|
|
34
34
|
reportBalances: "ledger:query:report:balances",
|
|
35
35
|
reportIncomeStatement: "ledger:query:report:income-statement",
|
|
36
36
|
reportBalanceSheet: "ledger:query:report:balance-sheet",
|
|
@@ -38,7 +38,7 @@ export const LedgerQueries = {
|
|
|
38
38
|
|
|
39
39
|
// Account types double-entry needs to interpret a balance: asset/expense are
|
|
40
40
|
// debit-normal, liability/equity/income are credit-normal. The report layer
|
|
41
|
-
//
|
|
41
|
+
// flips signs by type; the primitive only stores them.
|
|
42
42
|
export const ACCOUNT_TYPES = ["asset", "liability", "equity", "income", "expense"] as const;
|
|
43
43
|
export type AccountType = (typeof ACCOUNT_TYPES)[number];
|
|
44
44
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
// Client-safe ledger surface: QN constants,
|
|
2
|
-
// (projection + Soll/Ist merge), and
|
|
3
|
-
// pre-validation before dispatch
|
|
4
|
-
//
|
|
5
|
-
// browser bundle
|
|
6
|
-
//
|
|
7
|
-
//
|
|
1
|
+
// Client-safe ledger surface: QN constants, pure recurring helpers
|
|
2
|
+
// (projection + Soll/Ist merge), and Zod payload schemas for client-side
|
|
3
|
+
// pre-validation before dispatch. The full `../ledger` entry also re-exports
|
|
4
|
+
// the feature/handlers/executor, which pull postgres-js; importing it in a
|
|
5
|
+
// browser bundle fails on Node builtins. Client screens import dispatch QNs and
|
|
6
|
+
// pure forecast/merge helpers from this module, then dispatch via the renderer's
|
|
7
|
+
// useDispatcher.
|
|
8
8
|
|
|
9
9
|
export {
|
|
10
10
|
type LedgerTxRow,
|
|
@@ -35,7 +35,7 @@ runProdApp({
|
|
|
35
35
|
// decoupling — legal-pages imports no code from template-resolver,
|
|
36
36
|
// only uses the API via ctx)
|
|
37
37
|
anonymousAccess: { defaultTenantId: SYSTEM_TENANT_ID },
|
|
38
|
-
extraContext: ({ db }) => ({
|
|
38
|
+
extraContext: ({ db, registry }) => ({
|
|
39
39
|
templateResolver: createTemplateResolverApi(db, registry),
|
|
40
40
|
}),
|
|
41
41
|
});
|
|
@@ -24,13 +24,12 @@ import {
|
|
|
24
24
|
|
|
25
25
|
export { type LegalPagesBootCheckCtx, runLegalPagesBootCheck } from "./lib/boot-check.ts";
|
|
26
26
|
|
|
27
|
-
// QN
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
// wie bei jedem API-Endpunkt.
|
|
27
|
+
// QN constant as the documented public contract of the template-resolver
|
|
28
|
+
// feature. A magic string is intentional instead of a code import: cross-feature
|
|
29
|
+
// calls use only the stable public API (handler name + payload shape), not
|
|
30
|
+
// internal module references. If template-resolver's handler name changes, it is
|
|
31
|
+
// a semver-major change and must be synchronized in both features—the same risk
|
|
32
|
+
// as with any API endpoint.
|
|
34
33
|
const TEXT_BLOCK_BY_SLUG_QN = "template-resolver:query:by-slug";
|
|
35
34
|
|
|
36
35
|
// Return shape of bySlugQuery (template-resolver/handlers/by-slug.query.ts).
|
|
@@ -53,25 +52,25 @@ const PUBLIC_PAGE_CACHE = { kind: "revalidate", maxAgeSeconds: 60 } as const;
|
|
|
53
52
|
// additional pages (e.g. terms/AGB).
|
|
54
53
|
//
|
|
55
54
|
// Cross-Feature-Decoupling:
|
|
56
|
-
// • Routes
|
|
57
|
-
// `template-resolver:query:by-slug
|
|
58
|
-
// •
|
|
59
|
-
//
|
|
60
|
-
// •
|
|
61
|
-
//
|
|
55
|
+
// • Routes use app.fetch to "/api/query" with the QN string
|
|
56
|
+
// `template-resolver:query:by-slug`—no code import from template-resolver
|
|
57
|
+
// • The boot check uses ctx.templateResolver (via extraContext), symmetrically
|
|
58
|
+
// with the config/tenant pattern
|
|
59
|
+
// • The single type import (TemplateResolverApi) remains; type-only imports do
|
|
60
|
+
// not violate cross-feature coupling
|
|
62
61
|
//
|
|
63
|
-
//
|
|
64
|
-
// • App
|
|
65
|
-
//
|
|
66
|
-
// • anonymousAccess: { defaultTenantId: SYSTEM_TENANT_ID }
|
|
67
|
-
//
|
|
62
|
+
// Production requirements:
|
|
63
|
+
// • App bootstrap must set extraContext: { templateResolver: createTemplateResolverApi(db,
|
|
64
|
+
// registry) } —otherwise the boot check throws at startup
|
|
65
|
+
// • anonymousAccess: { defaultTenantId: SYSTEM_TENANT_ID }—otherwise
|
|
66
|
+
// the routes respond with 503
|
|
68
67
|
export type LegalPagesWrapLayout = PublicPageWrapLayout;
|
|
69
68
|
|
|
70
69
|
export type LegalPagesOptions = {
|
|
71
|
-
/** Custom
|
|
72
|
-
* HTML
|
|
73
|
-
*
|
|
74
|
-
*
|
|
70
|
+
/** Custom layout wrapper for the /legal/* routes. Default: minimal
|
|
71
|
+
* HTML skeleton from markdown.ts (`wrapInLayout`). Apps that want to place
|
|
72
|
+
* their own marketing layout (header/footer/theme) around the legal body
|
|
73
|
+
* can provide their render function here. */
|
|
75
74
|
readonly wrapLayout?: LegalPagesWrapLayout;
|
|
76
75
|
/** Public HTML routes to register. Default: LEGAL_ROUTES (DACH: DE+EN
|
|
77
76
|
* imprint/privacy). Non-DACH apps (other default language, additional
|
|
@@ -140,18 +139,18 @@ export function createLegalPagesFeature(opts: LegalPagesOptions = {}): FeatureDe
|
|
|
140
139
|
// Public pages backed by a DB query: bound the per-IP read rate.
|
|
141
140
|
rateLimit: { per: "ip+handler", limit: 60, windowSeconds: 60 },
|
|
142
141
|
handler: async (c, { systemQuery }) => {
|
|
143
|
-
//
|
|
144
|
-
//
|
|
145
|
-
// legal-pages
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
//
|
|
142
|
+
// Architecture: 1 app = X tenants = 1 imprint. Regardless of which
|
|
143
|
+
// subdomain the visitor uses (apex, admin.*, tenant-x.*),
|
|
144
|
+
// legal-pages ALWAYS serves the SYSTEM_TENANT texts. systemQuery
|
|
145
|
+
// enforces SYSTEM_TENANT_ID in-process (no X-Tenant-Header trick
|
|
146
|
+
// through app.fetch—the host-based anonymousAccess resolver would
|
|
147
|
+
// see that as a client override and correctly reject it with
|
|
148
|
+
// resolverTrust: "authoritative").
|
|
150
149
|
let data: TextBlockQueryResult;
|
|
151
150
|
try {
|
|
152
151
|
// @cast-boundary engine-payload — dispatcher.query returnt
|
|
153
|
-
// unknown;
|
|
154
|
-
// (
|
|
152
|
+
// unknown; the shape is trusted because of bySlugQuery's handler return type
|
|
153
|
+
// (see template-resolver/handlers/by-slug.query.ts).
|
|
155
154
|
data = (await systemQuery(
|
|
156
155
|
TEXT_BLOCK_BY_SLUG_QN,
|
|
157
156
|
{ slug: route.slug, locale: route.lang },
|
|
@@ -178,8 +177,8 @@ export function createLegalPagesFeature(opts: LegalPagesOptions = {}): FeatureDe
|
|
|
178
177
|
String(data.modifiedAt ?? ""),
|
|
179
178
|
]);
|
|
180
179
|
const extra = { "content-type": "text/html; charset=utf-8" };
|
|
181
|
-
// 304 (
|
|
182
|
-
//
|
|
180
|
+
// Both 304 (unchanged revision) and HEAD skip Markdown rendering—the body
|
|
181
|
+
// would be discarded anyway.
|
|
183
182
|
if (
|
|
184
183
|
etagMatches(c.req.raw.headers.get("if-none-match"), etag) ||
|
|
185
184
|
c.req.method === "HEAD"
|
|
@@ -228,21 +227,21 @@ export function createLegalPagesFeature(opts: LegalPagesOptions = {}): FeatureDe
|
|
|
228
227
|
});
|
|
229
228
|
}
|
|
230
229
|
|
|
231
|
-
// Boot
|
|
232
|
-
//
|
|
233
|
-
//
|
|
230
|
+
// Boot check via ctx.templateResolver (extraContext pattern, symmetrical
|
|
231
|
+
// with requireConfigResolver in config). App bootstrap must wire
|
|
232
|
+
// templateResolver; the helper gives a clear wiring hint if it is missing.
|
|
234
233
|
//
|
|
235
|
-
//
|
|
236
|
-
//
|
|
237
|
-
// Pattern: thin job
|
|
238
|
-
//
|
|
234
|
+
// The body is extracted as the named function (`runLegalPagesBootCheck`) so
|
|
235
|
+
// the logic can be unit-tested directly instead of only indirectly through
|
|
236
|
+
// routes. Pattern: a thin job shell calls a testable function, avoiding
|
|
237
|
+
// coupling tests to the JobRunner.
|
|
239
238
|
r.job(
|
|
240
239
|
"legal-pages-boot-check",
|
|
241
240
|
{
|
|
242
241
|
trigger: { manual: true },
|
|
243
242
|
// bootGate, not runOnBoot: only an inline gate can actually abort the
|
|
244
243
|
// boot. runOnBoot merely enqueues, so a missing imprint would fail a
|
|
245
|
-
// queue job while the pod goes ready anyway
|
|
244
|
+
// queue job while the pod goes ready anyway.
|
|
246
245
|
bootGate: true,
|
|
247
246
|
runIn: "api",
|
|
248
247
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
// Re-export
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// Re-export from the shared page-rendering core (managed pages use
|
|
2
|
+
// the same hardened renderer and default layout). Keep these names stable
|
|
3
|
+
// for legal-pages' public API (index.ts exports renderMarkdownToHtml and
|
|
4
4
|
// wrapInLayout).
|
|
5
5
|
|
|
6
6
|
export { wrapInLayout } from "../page-render/layout.ts";
|
|
@@ -1,26 +1,25 @@
|
|
|
1
|
-
// Client
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
1
|
+
// Client feature factory for the legal-pages visual tree. Provides static
|
|
2
|
+
// tree nodes for the DACH compliance blocks (imprint, privacy in de/en).
|
|
3
|
+
// Each node links to text-content's edit action — pure cross-feature
|
|
4
|
+
// linking, with no own state or fetch required.
|
|
5
5
|
//
|
|
6
|
-
// **Static
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
6
|
+
// **Static instead of fetch**: legal-pages knows out of the box which blocks
|
|
7
|
+
// exist (LEGAL_REQUIRED_BLOCKS + LEGAL_OPTIONAL_BLOCKS from constants).
|
|
8
|
+
// Unlike text-content's provider (which fetches all tenant slugs), this list
|
|
9
|
+
// is known at build time — no /api/query round trip is needed.
|
|
10
10
|
//
|
|
11
|
-
// **Content
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
// fehlende Pflicht-Blocks.
|
|
11
|
+
// **Content state unknown**: no state marker is set; all nodes appear
|
|
12
|
+
// "filled" (default). A by-slug query could determine whether a block
|
|
13
|
+
// actually has a body and mark it as "stub" when empty (a provider-author hint
|
|
14
|
+
// that the block exists but must be filled). Currently, legal-pages's boot
|
|
15
|
+
// check is the primary guard for missing required blocks.
|
|
17
16
|
|
|
18
17
|
import type { TreeChildrenSubscribe, TreeNode } from "@cosmicdrift/kumiko-framework/engine";
|
|
19
18
|
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
20
19
|
import { LEGAL_OPTIONAL_BLOCKS, LEGAL_REQUIRED_BLOCKS } from "./constants.ts";
|
|
21
20
|
|
|
22
21
|
const treeProvider: TreeChildrenSubscribe = () => (emit) => {
|
|
23
|
-
//
|
|
22
|
+
// Slug-first nesting:
|
|
24
23
|
// 📁 Legal
|
|
25
24
|
// 📁 imprint
|
|
26
25
|
// de
|
|
@@ -29,10 +28,10 @@ const treeProvider: TreeChildrenSubscribe = () => (emit) => {
|
|
|
29
28
|
// de
|
|
30
29
|
// en
|
|
31
30
|
//
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
// Sub-
|
|
35
|
-
//
|
|
31
|
+
// The slug is the translation anchor — users maintain the DE+EN versions
|
|
32
|
+
// of the same content together instead of grouping them by language.
|
|
33
|
+
// Sub-items are language-only leaves; label = language, and target points
|
|
34
|
+
// to template-resolver:edit with slug+locale.
|
|
36
35
|
|
|
37
36
|
// Group all blocks by slug, collect set of langs per slug.
|
|
38
37
|
const bySlug = new Map<string, string[]>();
|
|
@@ -62,15 +61,15 @@ const treeProvider: TreeChildrenSubscribe = () => (emit) => {
|
|
|
62
61
|
});
|
|
63
62
|
}
|
|
64
63
|
|
|
65
|
-
//
|
|
66
|
-
//
|
|
64
|
+
// The app-side r.nav node IS the "Legal" container → the provider
|
|
65
|
+
// emits the slug folders directly beneath it.
|
|
67
66
|
emit(slugFolders);
|
|
68
67
|
return () => {};
|
|
69
68
|
};
|
|
70
69
|
|
|
71
|
-
// `navId` = QN
|
|
72
|
-
//
|
|
73
|
-
//
|
|
70
|
+
// `navId` = the QN of the r.nav({ provider: true }) node registered by the app.
|
|
71
|
+
// Static (no fetch, no entities) → no SSE refresh is needed. Without navId:
|
|
72
|
+
// no sidebar node (server-only consumers expose nothing).
|
|
74
73
|
export function legalPagesClient(opts?: { readonly navId?: string }): ClientFeatureDefinition {
|
|
75
74
|
const navId = opts?.navId;
|
|
76
75
|
return {
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.388.0",
|
|
4
|
+
"type": "fix",
|
|
5
|
+
"title": "Tenant mail transport falls back to the app transport without tenant config",
|
|
6
|
+
"detail": "tenantMailTransport returns null when the channel context carries no tenant config, instead of throwing on every send, so the channel uses the app transport as documented."
|
|
7
|
+
},
|
|
2
8
|
{
|
|
3
9
|
"version": "0.378.0",
|
|
4
10
|
"type": "improvement",
|