@wildo-ai/saas-models 1.1.4 → 1.1.6
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/esm/__tests__/setup.d.ts.map +1 -1
- package/dist/esm/_inspect.d.ts.map +1 -1
- package/dist/esm/applications/application-metadata.shared.resources-config.schemas.d.ts +1 -1
- package/dist/esm/applications/application-metadata.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/applications/application-subject.shared.schemas.d.ts.map +1 -1
- package/dist/esm/applications/application-versions.shared.resources-config.schemas.d.ts +1 -1
- package/dist/esm/applications/application-versions.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/applications/application-versions.shared.resources-config.schemas.js +4 -3
- package/dist/esm/applications/application-versions.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/applications/applications-context.schemas.d.ts +412 -20
- package/dist/esm/applications/applications-context.schemas.d.ts.map +1 -1
- package/dist/esm/applications/applications.shared.resources-config.schemas.d.ts +1 -0
- package/dist/esm/applications/applications.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/applications/applications.shared.resources-config.schemas.js +4 -3
- package/dist/esm/applications/applications.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/applications/applications.shared.schemas.d.ts +10 -7
- package/dist/esm/applications/applications.shared.schemas.d.ts.map +1 -1
- package/dist/esm/applications/applications.shared.schemas.js +46 -9
- package/dist/esm/applications/applications.shared.schemas.js.map +1 -1
- package/dist/esm/billing/billing-account.shared.resources-config.schemas.d.ts +11 -3
- package/dist/esm/billing/billing-account.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/billing-account.shared.resources-config.schemas.js +50 -17
- package/dist/esm/billing/billing-account.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/billing-account.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/billing-account.shared.schemas.js +2 -2
- package/dist/esm/billing/billing-account.shared.schemas.js.map +1 -1
- package/dist/esm/billing/billing-configuration.shared.schemas.d.ts +25 -0
- package/dist/esm/billing/billing-configuration.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/billing-configuration.shared.schemas.js +19 -0
- package/dist/esm/billing/billing-configuration.shared.schemas.js.map +1 -1
- package/dist/esm/billing/billing-enums.shared.schemas.d.ts +114 -10
- package/dist/esm/billing/billing-enums.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/billing-enums.shared.schemas.js +121 -9
- package/dist/esm/billing/billing-enums.shared.schemas.js.map +1 -1
- package/dist/esm/billing/billing-types.shared.schemas.d.ts +61 -15
- package/dist/esm/billing/billing-types.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/billing-types.shared.schemas.js +54 -26
- package/dist/esm/billing/billing-types.shared.schemas.js.map +1 -1
- package/dist/esm/billing/credit-pool.shared.resources-config.schemas.d.ts +2 -0
- package/dist/esm/billing/credit-pool.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/credit-pool.shared.resources-config.schemas.js +18 -7
- package/dist/esm/billing/credit-pool.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/credit-pool.shared.schemas.d.ts +2 -0
- package/dist/esm/billing/credit-pool.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/credit-pool.shared.schemas.js +7 -1
- package/dist/esm/billing/credit-pool.shared.schemas.js.map +1 -1
- package/dist/esm/billing/invoice-ref.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/invoice-ref.shared.resources-config.schemas.js +6 -6
- package/dist/esm/billing/invoice-ref.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/invoice-ref.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/invoice-ref.shared.schemas.js +1 -1
- package/dist/esm/billing/invoice-ref.shared.schemas.js.map +1 -1
- package/dist/esm/billing/price.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/price.shared.resources-config.schemas.js +32 -2
- package/dist/esm/billing/price.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/price.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/price.shared.schemas.js +5 -3
- package/dist/esm/billing/price.shared.schemas.js.map +1 -1
- package/dist/esm/billing/product-behavior-policy.shared.schemas.d.ts +11 -1
- package/dist/esm/billing/product-behavior-policy.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/product-behavior-policy.shared.schemas.js +39 -23
- package/dist/esm/billing/product-behavior-policy.shared.schemas.js.map +1 -1
- package/dist/esm/billing/product-definition.shared.schemas.d.ts +30 -2
- package/dist/esm/billing/product-definition.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/product-definition.shared.schemas.js +35 -0
- package/dist/esm/billing/product-definition.shared.schemas.js.map +1 -1
- package/dist/esm/billing/product.shared.resources-config.schemas.d.ts +6 -3
- package/dist/esm/billing/product.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/product.shared.resources-config.schemas.js +32 -2
- package/dist/esm/billing/product.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/product.shared.schemas.d.ts +8 -3
- package/dist/esm/billing/product.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/product.shared.schemas.js +25 -7
- package/dist/esm/billing/product.shared.schemas.js.map +1 -1
- package/dist/esm/billing/promotions.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/promotions.shared.resources-config.schemas.js +41 -11
- package/dist/esm/billing/promotions.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/promotions.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/public-pricing-catalog.shared.atoms.d.ts +135 -0
- package/dist/esm/billing/public-pricing-catalog.shared.atoms.d.ts.map +1 -0
- package/dist/esm/billing/public-pricing-catalog.shared.atoms.js +112 -0
- package/dist/esm/billing/public-pricing-catalog.shared.atoms.js.map +1 -0
- package/dist/esm/billing/public-pricing-catalog.shared.d.ts +30 -0
- package/dist/esm/billing/public-pricing-catalog.shared.d.ts.map +1 -0
- package/dist/esm/billing/public-pricing-catalog.shared.js +53 -0
- package/dist/esm/billing/public-pricing-catalog.shared.js.map +1 -0
- package/dist/esm/billing/referral-reward.shared.schemas.d.ts +51 -0
- package/dist/esm/billing/referral-reward.shared.schemas.d.ts.map +1 -0
- package/dist/esm/billing/referral-reward.shared.schemas.js +92 -0
- package/dist/esm/billing/referral-reward.shared.schemas.js.map +1 -0
- package/dist/esm/billing/referral.shared.resources-config.schemas.d.ts +54 -33
- package/dist/esm/billing/referral.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/referral.shared.resources-config.schemas.js +76 -2
- package/dist/esm/billing/referral.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/referral.shared.schemas.d.ts +23 -37
- package/dist/esm/billing/referral.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/referral.shared.schemas.js +27 -44
- package/dist/esm/billing/referral.shared.schemas.js.map +1 -1
- package/dist/esm/billing/subscription.shared.resources-config.schemas.d.ts +32 -2
- package/dist/esm/billing/subscription.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/subscription.shared.resources-config.schemas.js +95 -16
- package/dist/esm/billing/subscription.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/subscription.shared.schemas.d.ts +81 -5
- package/dist/esm/billing/subscription.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/subscription.shared.schemas.js +88 -25
- package/dist/esm/billing/subscription.shared.schemas.js.map +1 -1
- package/dist/esm/billing/usage-flush-evidence.shared.schemas.d.ts +49 -0
- package/dist/esm/billing/usage-flush-evidence.shared.schemas.d.ts.map +1 -0
- package/dist/esm/billing/usage-flush-evidence.shared.schemas.js +48 -0
- package/dist/esm/billing/usage-flush-evidence.shared.schemas.js.map +1 -0
- package/dist/esm/billing/usage-record.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/usage-record.shared.schemas.d.ts +1 -0
- package/dist/esm/billing/usage-record.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/usage-record.shared.schemas.js +8 -5
- package/dist/esm/billing/usage-record.shared.schemas.js.map +1 -1
- package/dist/esm/charts/aggregation-query.shared.schemas.d.ts.map +1 -1
- package/dist/esm/charts/chart-definition-builder.shared.d.ts.map +1 -1
- package/dist/esm/companion/provider-discovery.shared.schemas.d.ts +150 -3
- package/dist/esm/companion/provider-discovery.shared.schemas.d.ts.map +1 -1
- package/dist/esm/companion/provider-discovery.shared.schemas.js +84 -1
- package/dist/esm/companion/provider-discovery.shared.schemas.js.map +1 -1
- package/dist/esm/companion/shared-library-companion.shared.definitions.d.ts.map +1 -1
- package/dist/esm/companion-exports.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/application-audit-logs.shared.resources-config.schemas.d.ts +28 -4
- package/dist/esm/compliance/audit-trails/application-audit-logs.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/application-audit-logs.shared.resources-config.schemas.js +25 -7
- package/dist/esm/compliance/audit-trails/application-audit-logs.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/compliance/audit-trails/audit-actor.shared.schemas.d.ts +70 -0
- package/dist/esm/compliance/audit-trails/audit-actor.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/audit-actor.shared.schemas.js +87 -0
- package/dist/esm/compliance/audit-trails/audit-actor.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/audit-trails/audit-export-projection.shared.schemas.d.ts +484 -0
- package/dist/esm/compliance/audit-trails/audit-export-projection.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/audit-trails/audit-export-projection.shared.schemas.js +857 -0
- package/dist/esm/compliance/audit-trails/audit-export-projection.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/audit-trails/audit-log-sink.shared.schemas.d.ts +7 -0
- package/dist/esm/compliance/audit-trails/audit-log-sink.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/audit-log-sink.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/audit-trails/audit-logs.shared.resources-config.schemas.d.ts +30 -4
- package/dist/esm/compliance/audit-trails/audit-logs.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/audit-logs.shared.resources-config.schemas.js +29 -8
- package/dist/esm/compliance/audit-trails/audit-logs.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/compliance/audit-trails/audit-trail-config.shared.schemas.d.ts +37 -6
- package/dist/esm/compliance/audit-trails/audit-trail-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/audit-trail-config.shared.schemas.js +53 -9
- package/dist/esm/compliance/audit-trails/audit-trail-config.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/audit-trails/auditable-events.shared.schema.d.ts +2432 -162
- package/dist/esm/compliance/audit-trails/auditable-events.shared.schema.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/auditable-events.shared.schema.js +2545 -124
- package/dist/esm/compliance/audit-trails/auditable-events.shared.schema.js.map +1 -1
- package/dist/esm/compliance/audit-trails/security-audit-event-envelope.shared.schema.d.ts +10 -0
- package/dist/esm/compliance/audit-trails/security-audit-event-envelope.shared.schema.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/security-audit-event-envelope.shared.schema.js +177 -7
- package/dist/esm/compliance/audit-trails/security-audit-event-envelope.shared.schema.js.map +1 -1
- package/dist/esm/compliance/documents/governed-document-interactions.shared.schemas.d.ts +463 -0
- package/dist/esm/compliance/documents/governed-document-interactions.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/documents/governed-document-interactions.shared.schemas.js +526 -0
- package/dist/esm/compliance/documents/governed-document-interactions.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/documents/governed-documents.shared.schemas.d.ts +539 -15
- package/dist/esm/compliance/documents/governed-documents.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/documents/governed-documents.shared.schemas.js +402 -14
- package/dist/esm/compliance/documents/governed-documents.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.resources-config.schemas.d.ts +18 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.resources-config.schemas.js +89 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.schemas.d.ts +47 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.schemas.js +73 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/ai-use-posture.shared.schemas.d.ts +23 -0
- package/dist/esm/compliance/privacy/ai-use-posture.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/ai-use-posture.shared.schemas.js +41 -1
- package/dist/esm/compliance/privacy/ai-use-posture.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/capability-consent-purposes.shared.utils.d.ts +33 -0
- package/dist/esm/compliance/privacy/capability-consent-purposes.shared.utils.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/capability-consent-purposes.shared.utils.js +30 -0
- package/dist/esm/compliance/privacy/capability-consent-purposes.shared.utils.js.map +1 -0
- package/dist/esm/compliance/privacy/client-storage.shared.schemas.d.ts +6 -5
- package/dist/esm/compliance/privacy/client-storage.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/client-storage.shared.schemas.js +15 -5
- package/dist/esm/compliance/privacy/client-storage.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/consent-gate-vocabulary.shared.schemas.d.ts +127 -0
- package/dist/esm/compliance/privacy/consent-gate-vocabulary.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/consent-gate-vocabulary.shared.schemas.js +94 -0
- package/dist/esm/compliance/privacy/consent-gate-vocabulary.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/consent-purposes.shared.d.ts +125 -0
- package/dist/esm/compliance/privacy/consent-purposes.shared.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/consent-purposes.shared.js +136 -0
- package/dist/esm/compliance/privacy/consent-purposes.shared.js.map +1 -0
- package/dist/esm/compliance/privacy/data-retention.shared.schemas.d.ts +0 -8
- package/dist/esm/compliance/privacy/data-retention.shared.schemas.d.ts.map +0 -1
- package/dist/esm/compliance/privacy/data-retention.shared.schemas.js.map +0 -1
- package/dist/esm/compliance/privacy/data-subject-rights.shared.schemas.d.ts +100 -0
- package/dist/esm/compliance/privacy/data-subject-rights.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/data-subject-rights.shared.schemas.js +146 -0
- package/dist/esm/compliance/privacy/data-subject-rights.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/impersonalization-scrub.shared.utils.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/impersonalization.shared.schemas.d.ts +38 -0
- package/dist/esm/compliance/privacy/impersonalization.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/impersonalization.shared.schemas.js +39 -0
- package/dist/esm/compliance/privacy/impersonalization.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/legal-hold-subject-attribution.shared.utils.d.ts +35 -0
- package/dist/esm/compliance/privacy/legal-hold-subject-attribution.shared.utils.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/legal-hold-subject-attribution.shared.utils.js +82 -0
- package/dist/esm/compliance/privacy/legal-hold-subject-attribution.shared.utils.js.map +1 -0
- package/dist/esm/compliance/privacy/legal-holds.shared.resources-config.schemas.d.ts +37 -0
- package/dist/esm/compliance/privacy/legal-holds.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/legal-holds.shared.resources-config.schemas.js +223 -0
- package/dist/esm/compliance/privacy/legal-holds.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/legal-holds.shared.schemas.d.ts +222 -0
- package/dist/esm/compliance/privacy/legal-holds.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/legal-holds.shared.schemas.js +331 -0
- package/dist/esm/compliance/privacy/legal-holds.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/operating-jurisdictions.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/operating-jurisdictions.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/operator-compliance-identity.shared.schemas.d.ts +105 -28
- package/dist/esm/compliance/privacy/operator-compliance-identity.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/operator-compliance-identity.shared.schemas.js +107 -26
- package/dist/esm/compliance/privacy/operator-compliance-identity.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/personal-data-category.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/personal-data-declaration.shared.utils.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/privacy.shared.schemas.d.ts +9 -17
- package/dist/esm/compliance/privacy/privacy.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/privacy.shared.schemas.js +74 -31
- package/dist/esm/compliance/privacy/privacy.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/provider-capability-disclosure.shared.schemas.d.ts +52 -0
- package/dist/esm/compliance/privacy/provider-capability-disclosure.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/provider-capability-disclosure.shared.schemas.js +116 -0
- package/dist/esm/compliance/privacy/provider-capability-disclosure.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/purpose-ref.shared.schemas.d.ts +11 -0
- package/dist/esm/compliance/privacy/purpose-ref.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/purpose-ref.shared.schemas.js +11 -0
- package/dist/esm/compliance/privacy/purpose-ref.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/redaction.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/redaction.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/retention-binding.shared.utils.d.ts +93 -0
- package/dist/esm/compliance/privacy/retention-binding.shared.utils.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/retention-binding.shared.utils.js +149 -0
- package/dist/esm/compliance/privacy/retention-binding.shared.utils.js.map +1 -0
- package/dist/esm/compliance/privacy/retention-enforcement-records.shared.resources-config.schemas.d.ts +43 -0
- package/dist/esm/compliance/privacy/retention-enforcement-records.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/retention-enforcement-records.shared.resources-config.schemas.js +106 -0
- package/dist/esm/compliance/privacy/retention-enforcement-records.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/retention-enforcement-records.shared.schemas.d.ts +209 -0
- package/dist/esm/compliance/privacy/retention-enforcement-records.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/retention-enforcement-records.shared.schemas.js +226 -0
- package/dist/esm/compliance/privacy/retention-enforcement-records.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/retention-schedule.shared.schemas.d.ts +129 -5
- package/dist/esm/compliance/privacy/retention-schedule.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/retention-schedule.shared.schemas.js +128 -4
- package/dist/esm/compliance/privacy/retention-schedule.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/retention-scope-deleted.shared.utils.d.ts +53 -0
- package/dist/esm/compliance/privacy/retention-scope-deleted.shared.utils.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/retention-scope-deleted.shared.utils.js +74 -0
- package/dist/esm/compliance/privacy/retention-scope-deleted.shared.utils.js.map +1 -0
- package/dist/esm/compliance/privacy/subject-data-recipients.shared.schemas.d.ts +311 -0
- package/dist/esm/compliance/privacy/subject-data-recipients.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/subject-data-recipients.shared.schemas.js +355 -0
- package/dist/esm/compliance/privacy/subject-data-recipients.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/subject-erasure-lane-evidence.shared.schemas.d.ts +47 -0
- package/dist/esm/compliance/privacy/subject-erasure-lane-evidence.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/subject-erasure-lane-evidence.shared.schemas.js +98 -0
- package/dist/esm/compliance/privacy/subject-erasure-lane-evidence.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/subject-erasure.shared.schemas.d.ts +507 -35
- package/dist/esm/compliance/privacy/subject-erasure.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/subject-erasure.shared.schemas.js +513 -17
- package/dist/esm/compliance/privacy/subject-erasure.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/subject-export-render.shared.utils.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/subject-export-render.shared.utils.js +26 -0
- package/dist/esm/compliance/privacy/subject-export-render.shared.utils.js.map +1 -1
- package/dist/esm/compliance/privacy/subject-export.shared.schemas.d.ts +9 -0
- package/dist/esm/compliance/privacy/subject-export.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/subject-export.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/review-cadence.shared.schemas.d.ts +56 -0
- package/dist/esm/compliance/review-cadence.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/review-cadence.shared.schemas.js +71 -0
- package/dist/esm/compliance/review-cadence.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/risk-posture.shared.schemas.d.ts +161 -0
- package/dist/esm/compliance/risk-posture.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/risk-posture.shared.schemas.js +166 -0
- package/dist/esm/compliance/risk-posture.shared.schemas.js.map +1 -0
- package/dist/esm/config/analytics-value-moments.shared.schemas.d.ts +4 -3
- package/dist/esm/config/analytics-value-moments.shared.schemas.d.ts.map +1 -1
- package/dist/esm/config/analytics-value-moments.shared.schemas.js +4 -3
- package/dist/esm/config/analytics-value-moments.shared.schemas.js.map +1 -1
- package/dist/esm/config/app-configuration-shared.shared.schemas.d.ts +331 -10
- package/dist/esm/config/app-configuration-shared.shared.schemas.d.ts.map +1 -1
- package/dist/esm/config/app-configuration-shared.shared.schemas.js +289 -9
- package/dist/esm/config/app-configuration-shared.shared.schemas.js.map +1 -1
- package/dist/esm/config/auth-config-resolution.shared.utils.d.ts +75 -3
- package/dist/esm/config/auth-config-resolution.shared.utils.d.ts.map +1 -1
- package/dist/esm/config/auth-config-resolution.shared.utils.js +93 -4
- package/dist/esm/config/auth-config-resolution.shared.utils.js.map +1 -1
- package/dist/esm/config/brand-assets.shared.schemas.d.ts +5 -4
- package/dist/esm/config/brand-assets.shared.schemas.d.ts.map +1 -1
- package/dist/esm/config/brand-assets.shared.schemas.js +14 -4
- package/dist/esm/config/brand-assets.shared.schemas.js.map +1 -1
- package/dist/esm/config/entity-identity-config.shared.schemas.d.ts +532 -19
- package/dist/esm/config/entity-identity-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/config/entity-identity-config.shared.schemas.js +628 -28
- package/dist/esm/config/entity-identity-config.shared.schemas.js.map +1 -1
- package/dist/esm/config/frontend/chart-definition.shared.schemas.d.ts +32 -32
- package/dist/esm/config/frontend/chart-definition.shared.schemas.d.ts.map +1 -1
- package/dist/esm/config/frontend/chart-registration-alignment.shared.d.ts.map +1 -1
- package/dist/esm/config/frontend/chart-registration-alignment.shared.js.map +1 -1
- package/dist/esm/config/frontend/navigation.shared.schemas.d.ts +180 -77
- package/dist/esm/config/frontend/navigation.shared.schemas.d.ts.map +1 -1
- package/dist/esm/config/frontend/navigation.shared.schemas.js +354 -104
- package/dist/esm/config/frontend/navigation.shared.schemas.js.map +1 -1
- package/dist/esm/config/frontend/onboarding.shared.schemas.d.ts +90 -133
- package/dist/esm/config/frontend/onboarding.shared.schemas.d.ts.map +1 -1
- package/dist/esm/config/frontend/onboarding.shared.schemas.js +148 -100
- package/dist/esm/config/frontend/onboarding.shared.schemas.js.map +1 -1
- package/dist/esm/config/registration-acquisition-policy.shared.utils.d.ts.map +1 -1
- package/dist/esm/config-authoring.entry.d.ts.map +1 -1
- package/dist/esm/crdt/crdt-merge.shared.utils.d.ts.map +1 -1
- package/dist/esm/data-seeding/data-seeding-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/errors/caught-error-description.shared.utils.d.ts +69 -0
- package/dist/esm/errors/caught-error-description.shared.utils.d.ts.map +1 -0
- package/dist/esm/errors/caught-error-description.shared.utils.js +77 -0
- package/dist/esm/errors/caught-error-description.shared.utils.js.map +1 -0
- package/dist/esm/errors/errors.custom-message-ref.shared.definitions.d.ts +212 -42
- package/dist/esm/errors/errors.custom-message-ref.shared.definitions.d.ts.map +1 -1
- package/dist/esm/errors/errors.custom-message-ref.shared.definitions.js +214 -41
- package/dist/esm/errors/errors.custom-message-ref.shared.definitions.js.map +1 -1
- package/dist/esm/errors/errors.shared.definitions.d.ts.map +1 -1
- package/dist/esm/errors/errors.shared.definitions.js +1 -1
- package/dist/esm/errors/errors.shared.definitions.js.map +1 -1
- package/dist/esm/errors/errors.shared.schemas.d.ts +49 -41
- package/dist/esm/errors/errors.shared.schemas.d.ts.map +1 -1
- package/dist/esm/errors/errors.shared.schemas.js +52 -62
- package/dist/esm/errors/errors.shared.schemas.js.map +1 -1
- package/dist/esm/errors/errors.shared.utils.d.ts.map +1 -1
- package/dist/esm/errors/thrown-value-description.shared.utils.d.ts +26 -0
- package/dist/esm/errors/thrown-value-description.shared.utils.d.ts.map +1 -0
- package/dist/esm/errors/thrown-value-description.shared.utils.js +66 -0
- package/dist/esm/errors/thrown-value-description.shared.utils.js.map +1 -0
- package/dist/esm/external-data/external-data-pipeline-description.shared.d.ts +70 -0
- package/dist/esm/external-data/external-data-pipeline-description.shared.d.ts.map +1 -0
- package/dist/esm/external-data/external-data-pipeline-description.shared.js +92 -0
- package/dist/esm/external-data/external-data-pipeline-description.shared.js.map +1 -0
- package/dist/esm/external-data/external-data-pipeline-pass-mode.shared.d.ts +154 -0
- package/dist/esm/external-data/external-data-pipeline-pass-mode.shared.d.ts.map +1 -0
- package/dist/esm/external-data/external-data-pipeline-pass-mode.shared.js +161 -0
- package/dist/esm/external-data/external-data-pipeline-pass-mode.shared.js.map +1 -0
- package/dist/esm/external-data/external-data-pipeline.shared.schemas.d.ts +1118 -95
- package/dist/esm/external-data/external-data-pipeline.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-pipeline.shared.schemas.js +1166 -24
- package/dist/esm/external-data/external-data-pipeline.shared.schemas.js.map +1 -1
- package/dist/esm/external-data/external-data-provenance.shared.d.ts +71 -0
- package/dist/esm/external-data/external-data-provenance.shared.d.ts.map +1 -0
- package/dist/esm/external-data/external-data-provenance.shared.js +88 -0
- package/dist/esm/external-data/external-data-provenance.shared.js.map +1 -0
- package/dist/esm/external-data.exports.d.ts +6 -0
- package/dist/esm/external-data.exports.d.ts.map +1 -1
- package/dist/esm/external-data.exports.js +12 -0
- package/dist/esm/external-data.exports.js.map +1 -1
- package/dist/esm/external-providers/compose-provider-registry.shared.d.ts.map +1 -1
- package/dist/esm/external-providers/engine-capabilities.shared.schemas.d.ts +28 -14
- package/dist/esm/external-providers/engine-capabilities.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/engine-capabilities.shared.schemas.js +33 -16
- package/dist/esm/external-providers/engine-capabilities.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/engine-capability-resolution-mode.shared.d.ts +5 -3
- package/dist/esm/external-providers/engine-capability-resolution-mode.shared.d.ts.map +1 -1
- package/dist/esm/external-providers/engine-capability-resolution-mode.shared.js +8 -3
- package/dist/esm/external-providers/engine-capability-resolution-mode.shared.js.map +1 -1
- package/dist/esm/external-providers/engine-capability-surface.shared.d.ts +77 -0
- package/dist/esm/external-providers/engine-capability-surface.shared.d.ts.map +1 -0
- package/dist/esm/external-providers/engine-capability-surface.shared.js +175 -0
- package/dist/esm/external-providers/engine-capability-surface.shared.js.map +1 -0
- package/dist/esm/external-providers/external-providers.shared.schemas.d.ts +2 -0
- package/dist/esm/external-providers/external-providers.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/external-providers.shared.schemas.js +21 -0
- package/dist/esm/external-providers/external-providers.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/frontend-bootstrap.shared.schemas.d.ts +281 -10
- package/dist/esm/external-providers/frontend-bootstrap.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/frontend-capability-public-config.shared.schemas.d.ts +115 -0
- package/dist/esm/external-providers/frontend-capability-public-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/frontend-capability-public-config.shared.schemas.js +149 -0
- package/dist/esm/external-providers/frontend-capability-public-config.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/frontend-capability-runtime.shared.types.d.ts +45 -0
- package/dist/esm/external-providers/frontend-capability-runtime.shared.types.d.ts.map +1 -1
- package/dist/esm/external-providers/frontend-capability-runtime.shared.types.js +14 -0
- package/dist/esm/external-providers/frontend-capability-runtime.shared.types.js.map +1 -1
- package/dist/esm/external-providers/frontend-provider-entry.shared.schemas.d.ts +242 -7
- package/dist/esm/external-providers/frontend-provider-entry.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/frontend-provider-entry.shared.schemas.js +127 -3
- package/dist/esm/external-providers/frontend-provider-entry.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/frontend-provider-public-config.shared.d.ts +187 -36
- package/dist/esm/external-providers/frontend-provider-public-config.shared.d.ts.map +1 -1
- package/dist/esm/external-providers/frontend-provider-public-config.shared.js +261 -47
- package/dist/esm/external-providers/frontend-provider-public-config.shared.js.map +1 -1
- package/dist/esm/external-providers/model-cost-accounting-config.shared.schemas.d.ts +53 -0
- package/dist/esm/external-providers/model-cost-accounting-config.shared.schemas.d.ts.map +1 -0
- package/dist/esm/external-providers/model-cost-accounting-config.shared.schemas.js +41 -0
- package/dist/esm/external-providers/model-cost-accounting-config.shared.schemas.js.map +1 -0
- package/dist/esm/external-providers/provider-address-lookup-contract.shared.types.d.ts +150 -0
- package/dist/esm/external-providers/provider-address-lookup-contract.shared.types.d.ts.map +1 -0
- package/dist/esm/external-providers/provider-address-lookup-contract.shared.types.js +22 -0
- package/dist/esm/external-providers/provider-address-lookup-contract.shared.types.js.map +1 -0
- package/dist/esm/external-providers/provider-augmentation-opt-ins.shared.schemas.d.ts +42 -0
- package/dist/esm/external-providers/provider-augmentation-opt-ins.shared.schemas.d.ts.map +1 -0
- package/dist/esm/external-providers/provider-augmentation-opt-ins.shared.schemas.js +49 -0
- package/dist/esm/external-providers/provider-augmentation-opt-ins.shared.schemas.js.map +1 -0
- package/dist/esm/external-providers/provider-authentication-assurance.shared.schemas.d.ts +30 -0
- package/dist/esm/external-providers/provider-authentication-assurance.shared.schemas.d.ts.map +1 -0
- package/dist/esm/external-providers/provider-authentication-assurance.shared.schemas.js +32 -0
- package/dist/esm/external-providers/provider-authentication-assurance.shared.schemas.js.map +1 -0
- package/dist/esm/external-providers/provider-browser-operations.shared.schemas.d.ts +139 -0
- package/dist/esm/external-providers/provider-browser-operations.shared.schemas.d.ts.map +1 -0
- package/dist/esm/external-providers/provider-browser-operations.shared.schemas.js +141 -0
- package/dist/esm/external-providers/provider-browser-operations.shared.schemas.js.map +1 -0
- package/dist/esm/external-providers/provider-capability.shared.schemas.d.ts +48 -13
- package/dist/esm/external-providers/provider-capability.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/provider-capability.shared.schemas.js +44 -10
- package/dist/esm/external-providers/provider-capability.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/provider-compliance-profile.shared.schemas.d.ts +341 -4
- package/dist/esm/external-providers/provider-compliance-profile.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/provider-compliance-profile.shared.schemas.js +270 -20
- package/dist/esm/external-providers/provider-compliance-profile.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/provider-frontend-component-contract.shared.types.d.ts +6 -2
- package/dist/esm/external-providers/provider-frontend-component-contract.shared.types.d.ts.map +1 -1
- package/dist/esm/external-providers/provider-frontend-component-contract.shared.types.js +6 -2
- package/dist/esm/external-providers/provider-frontend-component-contract.shared.types.js.map +1 -1
- package/dist/esm/external-providers/provider-frontend-surface.shared.schemas.d.ts +181 -6
- package/dist/esm/external-providers/provider-frontend-surface.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/provider-frontend-surface.shared.schemas.js +132 -5
- package/dist/esm/external-providers/provider-frontend-surface.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/provider-metadata.shared.schemas.d.ts +5 -2
- package/dist/esm/external-providers/provider-metadata.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/provider-metadata.shared.schemas.js +5 -2
- package/dist/esm/external-providers/provider-metadata.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/provider-package-allow-list.shared.schemas.d.ts +42 -0
- package/dist/esm/external-providers/provider-package-allow-list.shared.schemas.d.ts.map +1 -0
- package/dist/esm/external-providers/provider-package-allow-list.shared.schemas.js +57 -0
- package/dist/esm/external-providers/provider-package-allow-list.shared.schemas.js.map +1 -0
- package/dist/esm/external-providers/provider-protocol.shared.schemas.d.ts +6 -0
- package/dist/esm/external-providers/provider-protocol.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/provider-protocol.shared.schemas.js +6 -0
- package/dist/esm/external-providers/provider-protocol.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/provider-scope-reauthorization.shared.schemas.d.ts +58 -0
- package/dist/esm/external-providers/provider-scope-reauthorization.shared.schemas.d.ts.map +1 -0
- package/dist/esm/external-providers/provider-scope-reauthorization.shared.schemas.js +35 -0
- package/dist/esm/external-providers/provider-scope-reauthorization.shared.schemas.js.map +1 -0
- package/dist/esm/external-providers/provider-shared-connections.shared.schemas.d.ts +115 -0
- package/dist/esm/external-providers/provider-shared-connections.shared.schemas.d.ts.map +1 -0
- package/dist/esm/external-providers/provider-shared-connections.shared.schemas.js +137 -0
- package/dist/esm/external-providers/provider-shared-connections.shared.schemas.js.map +1 -0
- package/dist/esm/external-providers/provider-tier-rule.shared.utils.d.ts.map +1 -1
- package/dist/esm/external-providers/provider-tier-rule.shared.utils.js.map +1 -1
- package/dist/esm/external-providers/provider-usage-cost.shared.d.ts +73 -0
- package/dist/esm/external-providers/provider-usage-cost.shared.d.ts.map +1 -0
- package/dist/esm/external-providers/provider-usage-cost.shared.js +171 -0
- package/dist/esm/external-providers/provider-usage-cost.shared.js.map +1 -0
- package/dist/esm/external-providers/provider-usage-pricing.example.d.ts +12 -0
- package/dist/esm/external-providers/provider-usage-pricing.example.d.ts.map +1 -0
- package/dist/esm/external-providers/provider-usage-pricing.example.js +40 -0
- package/dist/esm/external-providers/provider-usage-pricing.example.js.map +1 -0
- package/dist/esm/external-providers/provider-usage-pricing.shared.schemas.d.ts +68 -32
- package/dist/esm/external-providers/provider-usage-pricing.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/provider-usage-pricing.shared.schemas.js +63 -52
- package/dist/esm/external-providers/provider-usage-pricing.shared.schemas.js.map +1 -1
- package/dist/esm/features/application-features.shared.resources-config.schemas.d.ts +7 -5
- package/dist/esm/features/application-features.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/features/application-features.shared.resources-config.schemas.js +43 -8
- package/dist/esm/features/application-features.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/features/connected-feature.example.d.ts +64 -0
- package/dist/esm/features/connected-feature.example.d.ts.map +1 -0
- package/dist/esm/features/connected-feature.example.js +87 -0
- package/dist/esm/features/connected-feature.example.js.map +1 -0
- package/dist/esm/features/core-feature-definitions.shared.d.ts.map +1 -1
- package/dist/esm/features/core-feature-definitions.shared.js +2 -1
- package/dist/esm/features/core-feature-definitions.shared.js.map +1 -1
- package/dist/esm/features/feature-builders.shared.d.ts.map +1 -1
- package/dist/esm/features/feature-builders.shared.js.map +1 -1
- package/dist/esm/features/feature-definition.shared.schemas.d.ts +2 -11
- package/dist/esm/features/feature-definition.shared.schemas.d.ts.map +1 -1
- package/dist/esm/features/feature-definition.shared.schemas.js +0 -12
- package/dist/esm/features/feature-definition.shared.schemas.js.map +1 -1
- package/dist/esm/features/feature-registry.shared.d.ts.map +1 -1
- package/dist/esm/features/feature-resolution.shared.schemas.d.ts.map +1 -1
- package/dist/esm/features/scope-features.shared.schemas.d.ts +74 -7
- package/dist/esm/features/scope-features.shared.schemas.d.ts.map +1 -1
- package/dist/esm/features/scope-features.shared.schemas.js +64 -5
- package/dist/esm/features/scope-features.shared.schemas.js.map +1 -1
- package/dist/esm/features/user-features.shared.resources-config.schemas.d.ts +6 -6
- package/dist/esm/features/user-features.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/features/user-features.shared.resources-config.schemas.js +34 -52
- package/dist/esm/features/user-features.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/files/file-remote-reference-link.shared.schemas.d.ts.map +1 -1
- package/dist/esm/files/file-remote-reference-link.shared.schemas.js.map +1 -1
- package/dist/esm/files/file-upload-grant.shared.schemas.d.ts.map +1 -1
- package/dist/esm/files/file-upload-grant.shared.schemas.js.map +1 -1
- package/dist/esm/files/files.shared.resources-config.schemas.d.ts +3 -3
- package/dist/esm/files/files.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/files/files.shared.resources-config.schemas.js +3 -3
- package/dist/esm/files/files.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/files/files.shared.schemas.d.ts.map +1 -1
- package/dist/esm/files/files.shared.schemas.js.map +1 -1
- package/dist/esm/files/files.shared.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a-push-delivery-log.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a-push-delivery-log.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a-token-budget-state.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a-token-budget-state.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/actors.shared.schemas.d.ts +279 -140
- package/dist/esm/flows-actors/actors.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/actors.shared.schemas.js +130 -2
- package/dist/esm/flows-actors/actors.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/agent-traceability.shared.schemas.d.ts +22 -0
- package/dist/esm/flows-actors/agent-traceability.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/agent-traceability.shared.schemas.js +7 -0
- package/dist/esm/flows-actors/agent-traceability.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/agent-work-decisions.shared.resources-config.schemas.d.ts +68 -0
- package/dist/esm/flows-actors/agent-work-decisions.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/agent-work-decisions.shared.resources-config.schemas.js +276 -0
- package/dist/esm/flows-actors/agent-work-decisions.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/flows-actors/agent-work-decisions.shared.schemas.d.ts +468 -0
- package/dist/esm/flows-actors/agent-work-decisions.shared.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/agent-work-decisions.shared.schemas.js +472 -0
- package/dist/esm/flows-actors/agent-work-decisions.shared.schemas.js.map +1 -0
- package/dist/esm/flows-actors/agents.shared.schemas.d.ts +3 -3
- package/dist/esm/flows-actors/agents.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/agents.shared.schemas.js +11 -5
- package/dist/esm/flows-actors/agents.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/autonomous-agents.shared.schemas.d.ts +118 -0
- package/dist/esm/flows-actors/autonomous-agents.shared.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/autonomous-agents.shared.schemas.js +144 -0
- package/dist/esm/flows-actors/autonomous-agents.shared.schemas.js.map +1 -0
- package/dist/esm/flows-actors/deliberation.shared.schemas.d.ts +13 -0
- package/dist/esm/flows-actors/deliberation.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/deliberation.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/execution-plan-readiness.shared.utils.d.ts +45 -0
- package/dist/esm/flows-actors/execution-plan-readiness.shared.utils.d.ts.map +1 -0
- package/dist/esm/flows-actors/execution-plan-readiness.shared.utils.js +51 -0
- package/dist/esm/flows-actors/execution-plan-readiness.shared.utils.js.map +1 -0
- package/dist/esm/flows-actors/flows-actors-execution.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors-execution.shared.schemas.d.ts +173 -8
- package/dist/esm/flows-actors/flows-actors-execution.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors-execution.shared.schemas.js +269 -13
- package/dist/esm/flows-actors/flows-actors-execution.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/flows-actors-task.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors-task.shared.schemas.d.ts +2 -2
- package/dist/esm/flows-actors/flows-actors-task.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors.commons.shared.schemas.d.ts +51 -8
- package/dist/esm/flows-actors/flows-actors.commons.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors.commons.shared.schemas.js +51 -11
- package/dist/esm/flows-actors/flows-actors.commons.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/flows-actors.configuration.shared.schemas.d.ts +0 -200
- package/dist/esm/flows-actors/flows-actors.configuration.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors.configuration.shared.schemas.js +25 -54
- package/dist/esm/flows-actors/flows-actors.configuration.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/flows-actors.frontend.shared.schemas.d.ts +45 -9
- package/dist/esm/flows-actors/flows-actors.frontend.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors.frontend.shared.schemas.js +31 -6
- package/dist/esm/flows-actors/flows-actors.frontend.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/flows-actors.io.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors.io.shared.schemas.js +30 -30
- package/dist/esm/flows-actors/flows-actors.io.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/flows-actors.system.shared.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors.system.shared.schemas.d.ts +16 -74
- package/dist/esm/flows-actors/flows-actors.system.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors.system.shared.schemas.js +1 -2
- package/dist/esm/flows-actors/flows-actors.system.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/flows.shared.schemas.d.ts +15 -1
- package/dist/esm/flows-actors/flows.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/human-decision.shared.schemas.d.ts +627 -0
- package/dist/esm/flows-actors/human-decision.shared.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/human-decision.shared.schemas.js +754 -0
- package/dist/esm/flows-actors/human-decision.shared.schemas.js.map +1 -0
- package/dist/esm/flows-actors/mcp-servers.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/mcp-servers.shared.schemas.js +4 -2
- package/dist/esm/flows-actors/mcp-servers.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/model-call-attributions.shared.resources-config.schemas.d.ts +46 -0
- package/dist/esm/flows-actors/model-call-attributions.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/model-call-attributions.shared.resources-config.schemas.js +65 -0
- package/dist/esm/flows-actors/model-call-attributions.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/flows-actors/model-call-attributions.shared.schemas.d.ts +120 -0
- package/dist/esm/flows-actors/model-call-attributions.shared.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/model-call-attributions.shared.schemas.js +165 -0
- package/dist/esm/flows-actors/model-call-attributions.shared.schemas.js.map +1 -0
- package/dist/esm/flows-actors/model-cost-period-aggregates.shared.resources-config.schemas.d.ts +45 -0
- package/dist/esm/flows-actors/model-cost-period-aggregates.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/model-cost-period-aggregates.shared.resources-config.schemas.js +127 -0
- package/dist/esm/flows-actors/model-cost-period-aggregates.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/flows-actors/model-cost-period-aggregates.shared.schemas.d.ts +83 -0
- package/dist/esm/flows-actors/model-cost-period-aggregates.shared.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/model-cost-period-aggregates.shared.schemas.js +97 -0
- package/dist/esm/flows-actors/model-cost-period-aggregates.shared.schemas.js.map +1 -0
- package/dist/esm/flows-actors/model-cost-summary.shared.schemas.d.ts +136 -0
- package/dist/esm/flows-actors/model-cost-summary.shared.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/model-cost-summary.shared.schemas.js +90 -0
- package/dist/esm/flows-actors/model-cost-summary.shared.schemas.js.map +1 -0
- package/dist/esm/flows-actors/prompt-ir.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/provider-call-records.shared.resources-config.schemas.d.ts +28 -0
- package/dist/esm/flows-actors/provider-call-records.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/provider-call-records.shared.resources-config.schemas.js +95 -0
- package/dist/esm/flows-actors/provider-call-records.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/flows-actors/provider-call-records.shared.schemas.d.ts +121 -0
- package/dist/esm/flows-actors/provider-call-records.shared.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/provider-call-records.shared.schemas.js +194 -0
- package/dist/esm/flows-actors/provider-call-records.shared.schemas.js.map +1 -0
- package/dist/esm/flows-actors/review-deadlines.shared.schemas.d.ts +268 -0
- package/dist/esm/flows-actors/review-deadlines.shared.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/review-deadlines.shared.schemas.js +576 -0
- package/dist/esm/flows-actors/review-deadlines.shared.schemas.js.map +1 -0
- package/dist/esm/flows-actors/tasks.actors.shared.schemas.d.ts +88 -81
- package/dist/esm/flows-actors/tasks.actors.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/tasks.actors.shared.schemas.js +75 -38
- package/dist/esm/flows-actors/tasks.actors.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/work-attribution.shared.schemas.d.ts +129 -0
- package/dist/esm/flows-actors/work-attribution.shared.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/work-attribution.shared.schemas.js +141 -0
- package/dist/esm/flows-actors/work-attribution.shared.schemas.js.map +1 -0
- package/dist/esm/frontend-definitions/frontend-notification-custom-message-ref.definitions.d.ts +22 -1
- package/dist/esm/frontend-definitions/frontend-notification-custom-message-ref.definitions.d.ts.map +1 -1
- package/dist/esm/frontend-definitions/frontend-notification-custom-message-ref.definitions.js +23 -0
- package/dist/esm/frontend-definitions/frontend-notification-custom-message-ref.definitions.js.map +1 -1
- package/dist/esm/frontend-definitions/settings-destination-ref.definitions.d.ts +167 -1
- package/dist/esm/frontend-definitions/settings-destination-ref.definitions.d.ts.map +1 -1
- package/dist/esm/frontend-definitions/settings-destination-ref.definitions.js +178 -0
- package/dist/esm/frontend-definitions/settings-destination-ref.definitions.js.map +1 -1
- package/dist/esm/guidance/guidance-flow.shared.schemas.d.ts +106 -24
- package/dist/esm/guidance/guidance-flow.shared.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/guidance-flow.shared.schemas.js +152 -14
- package/dist/esm/guidance/guidance-flow.shared.schemas.js.map +1 -1
- package/dist/esm/guidance/guidance-state.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/guidance-state.shared.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/guidance-state.shared.schemas.js +11 -10
- package/dist/esm/guidance/guidance-state.shared.schemas.js.map +1 -1
- package/dist/esm/guidance/guidance-state.shared.utils.d.ts.map +1 -1
- package/dist/esm/guidance/guidance-state.shared.utils.js.map +1 -1
- package/dist/esm/guidance/lifecycle-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/lifecycle-state.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/lifecycle-state.shared.schemas.d.ts +0 -6
- package/dist/esm/guidance/lifecycle-state.shared.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/lifecycle-state.shared.schemas.js +6 -25
- package/dist/esm/guidance/lifecycle-state.shared.schemas.js.map +1 -1
- package/dist/esm/guidance/milestone-builders.shared.d.ts +4 -2
- package/dist/esm/guidance/milestone-builders.shared.d.ts.map +1 -1
- package/dist/esm/guidance/milestone-builders.shared.js +4 -2
- package/dist/esm/guidance/milestone-builders.shared.js.map +1 -1
- package/dist/esm/guidance/milestone-definition.shared.schemas.d.ts +66 -4
- package/dist/esm/guidance/milestone-definition.shared.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/milestone-definition.shared.schemas.js +50 -0
- package/dist/esm/guidance/milestone-definition.shared.schemas.js.map +1 -1
- package/dist/esm/guidance/progression-presentation.shared.schemas.d.ts +71 -0
- package/dist/esm/guidance/progression-presentation.shared.schemas.d.ts.map +1 -0
- package/dist/esm/guidance/progression-presentation.shared.schemas.js +72 -0
- package/dist/esm/guidance/progression-presentation.shared.schemas.js.map +1 -0
- package/dist/esm/guidance/progression-state.shared.resources-config.schemas.d.ts +2 -0
- package/dist/esm/guidance/progression-state.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/progression-state.shared.schemas.d.ts +4 -0
- package/dist/esm/guidance/progression-state.shared.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/progression-state.shared.schemas.js +12 -6
- package/dist/esm/guidance/progression-state.shared.schemas.js.map +1 -1
- package/dist/esm/http-api-binding/http-api-binding-id.shared.utils.d.ts.map +1 -1
- package/dist/esm/http-api-binding/http-api-binding-id.shared.utils.js +2 -1
- package/dist/esm/http-api-binding/http-api-binding-id.shared.utils.js.map +1 -1
- package/dist/esm/http-api-binding/http-api-binding.shared.schemas.d.ts +730 -441
- package/dist/esm/http-api-binding/http-api-binding.shared.schemas.d.ts.map +1 -1
- package/dist/esm/http-api-binding/http-api-binding.shared.schemas.js +747 -233
- package/dist/esm/http-api-binding/http-api-binding.shared.schemas.js.map +1 -1
- package/dist/esm/http-api-binding/http-api-erasure-stance.shared.d.ts +62 -0
- package/dist/esm/http-api-binding/http-api-erasure-stance.shared.d.ts.map +1 -0
- package/dist/esm/http-api-binding/http-api-erasure-stance.shared.js +66 -0
- package/dist/esm/http-api-binding/http-api-erasure-stance.shared.js.map +1 -0
- package/dist/esm/http-api-binding/http-api-rest-write-operations.shared.schemas.d.ts +133 -0
- package/dist/esm/http-api-binding/http-api-rest-write-operations.shared.schemas.d.ts.map +1 -0
- package/dist/esm/http-api-binding/http-api-rest-write-operations.shared.schemas.js +191 -0
- package/dist/esm/http-api-binding/http-api-rest-write-operations.shared.schemas.js.map +1 -0
- package/dist/esm/http-api-binding/http-api-transport-dialect.shared.d.ts +138 -0
- package/dist/esm/http-api-binding/http-api-transport-dialect.shared.d.ts.map +1 -0
- package/dist/esm/http-api-binding/http-api-transport-dialect.shared.js +139 -0
- package/dist/esm/http-api-binding/http-api-transport-dialect.shared.js.map +1 -0
- package/dist/esm/http-api-binding/read-through-engine-anchors.shared.d.ts +38 -0
- package/dist/esm/http-api-binding/read-through-engine-anchors.shared.d.ts.map +1 -0
- package/dist/esm/http-api-binding/read-through-engine-anchors.shared.js +42 -0
- package/dist/esm/http-api-binding/read-through-engine-anchors.shared.js.map +1 -0
- package/dist/esm/i18n/application-config-vocabulary.shared.d.ts +36 -0
- package/dist/esm/i18n/application-config-vocabulary.shared.d.ts.map +1 -0
- package/dist/esm/i18n/application-config-vocabulary.shared.js +39 -0
- package/dist/esm/i18n/application-config-vocabulary.shared.js.map +1 -0
- package/dist/esm/i18n/engine-open-vocabulary-values.shared.d.ts +11 -0
- package/dist/esm/i18n/engine-open-vocabulary-values.shared.d.ts.map +1 -0
- package/dist/esm/i18n/engine-open-vocabulary-values.shared.js +14 -0
- package/dist/esm/i18n/engine-open-vocabulary-values.shared.js.map +1 -0
- package/dist/esm/i18n/engine-open-vocabulary.shared.d.ts +20 -0
- package/dist/esm/i18n/engine-open-vocabulary.shared.d.ts.map +1 -0
- package/dist/esm/i18n/engine-open-vocabulary.shared.js +21 -0
- package/dist/esm/i18n/engine-open-vocabulary.shared.js.map +1 -0
- package/dist/esm/i18n/labelling.dto.shared.schemas.d.ts.map +1 -1
- package/dist/esm/inbound/conversation-threads.shared.resources-config.schemas.d.ts +94 -0
- package/dist/esm/inbound/conversation-threads.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/inbound/conversation-threads.shared.resources-config.schemas.js +206 -0
- package/dist/esm/inbound/conversation-threads.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/inbound/conversation-threads.shared.schemas.d.ts +169 -0
- package/dist/esm/inbound/conversation-threads.shared.schemas.d.ts.map +1 -0
- package/dist/esm/inbound/conversation-threads.shared.schemas.js +231 -0
- package/dist/esm/inbound/conversation-threads.shared.schemas.js.map +1 -0
- package/dist/esm/inbound/inbound-channels.shared.schemas.d.ts +195 -0
- package/dist/esm/inbound/inbound-channels.shared.schemas.d.ts.map +1 -0
- package/dist/esm/inbound/inbound-channels.shared.schemas.js +244 -0
- package/dist/esm/inbound/inbound-channels.shared.schemas.js.map +1 -0
- package/dist/esm/inbound/inbound-delivery.shared.resources-config.schemas.d.ts +36 -0
- package/dist/esm/inbound/inbound-delivery.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/inbound/inbound-delivery.shared.resources-config.schemas.js +169 -0
- package/dist/esm/inbound/inbound-delivery.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/inbound/inbound-delivery.shared.schemas.d.ts +404 -0
- package/dist/esm/inbound/inbound-delivery.shared.schemas.d.ts.map +1 -0
- package/dist/esm/inbound/inbound-delivery.shared.schemas.js +449 -0
- package/dist/esm/inbound/inbound-delivery.shared.schemas.js.map +1 -0
- package/dist/esm/inbound/inbound-endpoint-env.shared.d.ts +46 -0
- package/dist/esm/inbound/inbound-endpoint-env.shared.d.ts.map +1 -0
- package/dist/esm/inbound/inbound-endpoint-env.shared.js +57 -0
- package/dist/esm/inbound/inbound-endpoint-env.shared.js.map +1 -0
- package/dist/esm/index.d.ts +99 -5
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +138 -17
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/meta-workflows/actions.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/meta-workflows/actions.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/meta-workflows/catalog.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/meta-workflows/catalog.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/meta-workflows/coding-tasks.meta-workflows.shared.schemas.d.ts +130 -0
- package/dist/esm/meta-workflows/coding-tasks.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/meta-workflows/coding-tasks.meta-workflows.shared.schemas.js +104 -0
- package/dist/esm/meta-workflows/coding-tasks.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/meta-workflows/context-selection.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/meta-workflows/context-selection.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/decisions.meta-workflows.shared.schemas.d.ts +92 -0
- package/dist/esm/meta-workflows/decisions.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/decisions.meta-workflows.shared.schemas.js +76 -0
- package/dist/esm/meta-workflows/decisions.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/meta-workflows/orchestration.meta-workflows.shared.schemas.d.ts +638 -0
- package/dist/esm/meta-workflows/orchestration.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/meta-workflows/orchestration.meta-workflows.shared.schemas.js +759 -0
- package/dist/esm/meta-workflows/orchestration.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/portable-primitives.meta-workflows.shared.schemas.d.ts +15 -8
- package/dist/esm/meta-workflows/portable-primitives.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/portable-primitives.meta-workflows.shared.schemas.js +15 -8
- package/dist/esm/meta-workflows/portable-primitives.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/meta-workflows.exports.d.ts +21 -26
- package/dist/esm/meta-workflows.exports.d.ts.map +1 -1
- package/dist/esm/meta-workflows.exports.js +21 -26
- package/dist/esm/meta-workflows.exports.js.map +1 -1
- package/dist/esm/monitoring/monitoring.shared.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/email/email-context.shared.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/email/email-submission.shared.enums.d.ts +16 -0
- package/dist/esm/notifications/email/email-submission.shared.enums.d.ts.map +1 -0
- package/dist/esm/notifications/email/email-submission.shared.enums.js +17 -0
- package/dist/esm/notifications/email/email-submission.shared.enums.js.map +1 -0
- package/dist/esm/notifications/email/email-template-registry.shared.schemas.d.ts +43 -1
- package/dist/esm/notifications/email/email-template-registry.shared.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/email/email-template-registry.shared.schemas.js +85 -3
- package/dist/esm/notifications/email/email-template-registry.shared.schemas.js.map +1 -1
- package/dist/esm/notifications/email/email-template.shared.enums.d.ts.map +1 -1
- package/dist/esm/notifications/email/email-template.shared.enums.js.map +1 -1
- package/dist/esm/notifications/inbound-email/inbound-email.shared.resources-config.schemas.d.ts +131 -0
- package/dist/esm/notifications/inbound-email/inbound-email.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/notifications/inbound-email/inbound-email.shared.resources-config.schemas.js +258 -0
- package/dist/esm/notifications/inbound-email/inbound-email.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/notifications/inbound-email/inbound-email.shared.schemas.d.ts +448 -0
- package/dist/esm/notifications/inbound-email/inbound-email.shared.schemas.d.ts.map +1 -0
- package/dist/esm/notifications/inbound-email/inbound-email.shared.schemas.js +530 -0
- package/dist/esm/notifications/inbound-email/inbound-email.shared.schemas.js.map +1 -0
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-contract.shared.d.ts.map +1 -1
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.resources-config.schemas.js +8 -4
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.schemas.d.ts +2 -1
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.schemas.js +3 -2
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.schemas.js.map +1 -1
- package/dist/esm/notifications/m2m/webhook-config.shared.resources-config.schemas.d.ts +16 -1
- package/dist/esm/notifications/m2m/webhook-config.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/m2m/webhook-config.shared.resources-config.schemas.js +86 -15
- package/dist/esm/notifications/m2m/webhook-config.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/notifications/m2m/webhook-config.shared.schemas.d.ts +19 -12
- package/dist/esm/notifications/m2m/webhook-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/m2m/webhook-config.shared.schemas.js +77 -12
- package/dist/esm/notifications/m2m/webhook-config.shared.schemas.js.map +1 -1
- package/dist/esm/notifications/notification-badges.core.definitions.d.ts.map +1 -1
- package/dist/esm/notifications/notification-badges.core.definitions.js.map +1 -1
- package/dist/esm/notifications/notification-badges.schemas.d.ts +35 -3
- package/dist/esm/notifications/notification-badges.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/notification-badges.schemas.js +43 -3
- package/dist/esm/notifications/notification-badges.schemas.js.map +1 -1
- package/dist/esm/notifications/notification-badges.shared.resources-config.schemas.d.ts +1 -1
- package/dist/esm/notifications/notification-badges.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/notification-badges.shared.resources-config.schemas.js +12 -33
- package/dist/esm/notifications/notification-badges.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/notifications/notifications.shared.schemas.d.ts +85 -407
- package/dist/esm/notifications/notifications.shared.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/notifications.shared.schemas.js +130 -66
- package/dist/esm/notifications/notifications.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/application-owner-organization.shared.schemas.d.ts +145 -0
- package/dist/esm/organizations/application-owner-organization.shared.schemas.d.ts.map +1 -0
- package/dist/esm/organizations/application-owner-organization.shared.schemas.js +146 -0
- package/dist/esm/organizations/application-owner-organization.shared.schemas.js.map +1 -0
- package/dist/esm/organizations/organization-features.shared.resources-config.schemas.d.ts +7 -5
- package/dist/esm/organizations/organization-features.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-features.shared.resources-config.schemas.js +32 -9
- package/dist/esm/organizations/organization-features.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-members.shared.resources-config.schemas.d.ts +4 -1
- package/dist/esm/organizations/organization-members.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-members.shared.resources-config.schemas.js +78 -28
- package/dist/esm/organizations/organization-members.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-members.shared.schemas.d.ts +4 -1
- package/dist/esm/organizations/organization-members.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-members.shared.schemas.js +39 -1
- package/dist/esm/organizations/organization-members.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-notifications.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-notifications.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-notifications.shared.schemas.js +9 -9
- package/dist/esm/organizations/organization-notifications.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-preferences.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-preferences.shared.schemas.d.ts +2 -1
- package/dist/esm/organizations/organization-preferences.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-preferences.shared.schemas.js +7 -4
- package/dist/esm/organizations/organization-preferences.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-profile.shared.resources-config.schemas.d.ts +0 -1
- package/dist/esm/organizations/organization-profile.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-profile.shared.schemas.d.ts +8 -6
- package/dist/esm/organizations/organization-profile.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-profile.shared.schemas.js +19 -12
- package/dist/esm/organizations/organization-profile.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-unit-inheritance.shared.d.ts.map +1 -1
- package/dist/esm/organizations/organization-unit-members.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-unit-members.shared.resources-config.schemas.js +1 -1
- package/dist/esm/organizations/organization-unit-members.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-unit-members.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-unit-members.shared.schemas.js +2 -1
- package/dist/esm/organizations/organization-unit-members.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-unit-narrowing-decision.shared.d.ts +63 -1
- package/dist/esm/organizations/organization-unit-narrowing-decision.shared.d.ts.map +1 -1
- package/dist/esm/organizations/organization-unit-narrowing-decision.shared.js +106 -5
- package/dist/esm/organizations/organization-unit-narrowing-decision.shared.js.map +1 -1
- package/dist/esm/organizations/organization-unit-narrowing.example.d.ts.map +1 -1
- package/dist/esm/organizations/organization-unit-narrowing.shared.d.ts +29 -2
- package/dist/esm/organizations/organization-unit-narrowing.shared.d.ts.map +1 -1
- package/dist/esm/organizations/organization-unit-narrowing.shared.js +36 -0
- package/dist/esm/organizations/organization-unit-narrowing.shared.js.map +1 -1
- package/dist/esm/organizations/organization-units.shared.resources-config.schemas.d.ts +2 -0
- package/dist/esm/organizations/organization-units.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-units.shared.resources-config.schemas.js +10 -2
- package/dist/esm/organizations/organization-units.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-units.shared.schemas.d.ts +17 -5
- package/dist/esm/organizations/organization-units.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-units.shared.schemas.js +65 -5
- package/dist/esm/organizations/organization-units.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/organizations.shared.resources-config.schemas.d.ts +53 -7
- package/dist/esm/organizations/organizations.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organizations.shared.resources-config.schemas.js +162 -14
- package/dist/esm/organizations/organizations.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/organizations/organizations.shared.schemas.d.ts +23 -83
- package/dist/esm/organizations/organizations.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organizations.shared.schemas.js +87 -19
- package/dist/esm/organizations/organizations.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/service-provider-activity-feed.shared.resources-config.schemas.d.ts +58 -0
- package/dist/esm/organizations/service-provider-activity-feed.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/organizations/service-provider-activity-feed.shared.resources-config.schemas.js +188 -0
- package/dist/esm/organizations/service-provider-activity-feed.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/organizations/service-provider-activity-feed.shared.schemas.d.ts +122 -0
- package/dist/esm/organizations/service-provider-activity-feed.shared.schemas.d.ts.map +1 -0
- package/dist/esm/organizations/service-provider-activity-feed.shared.schemas.js +136 -0
- package/dist/esm/organizations/service-provider-activity-feed.shared.schemas.js.map +1 -0
- package/dist/esm/organizations/service-provider-capability-grants.shared.resources-config.schemas.d.ts +36 -0
- package/dist/esm/organizations/service-provider-capability-grants.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/organizations/service-provider-capability-grants.shared.resources-config.schemas.js +155 -0
- package/dist/esm/organizations/service-provider-capability-grants.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/organizations/service-provider-capability-grants.shared.schemas.d.ts +229 -0
- package/dist/esm/organizations/service-provider-capability-grants.shared.schemas.d.ts.map +1 -0
- package/dist/esm/organizations/service-provider-capability-grants.shared.schemas.js +290 -0
- package/dist/esm/organizations/service-provider-capability-grants.shared.schemas.js.map +1 -0
- package/dist/esm/organizations/service-provider-client-controls.shared.schemas.d.ts +48 -0
- package/dist/esm/organizations/service-provider-client-controls.shared.schemas.d.ts.map +1 -0
- package/dist/esm/organizations/service-provider-client-controls.shared.schemas.js +50 -0
- package/dist/esm/organizations/service-provider-client-controls.shared.schemas.js.map +1 -0
- package/dist/esm/organizations/service-provider-relationships.shared.resources-config.schemas.d.ts +97 -0
- package/dist/esm/organizations/service-provider-relationships.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/organizations/service-provider-relationships.shared.resources-config.schemas.js +572 -0
- package/dist/esm/organizations/service-provider-relationships.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/organizations/service-provider-relationships.shared.schemas.d.ts +590 -0
- package/dist/esm/organizations/service-provider-relationships.shared.schemas.d.ts.map +1 -0
- package/dist/esm/organizations/service-provider-relationships.shared.schemas.js +869 -0
- package/dist/esm/organizations/service-provider-relationships.shared.schemas.js.map +1 -0
- package/dist/esm/organizations/tenant-teardown-config.shared.schemas.d.ts +36 -6
- package/dist/esm/organizations/tenant-teardown-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/tenant-teardown-config.shared.schemas.js +57 -16
- package/dist/esm/organizations/tenant-teardown-config.shared.schemas.js.map +1 -1
- package/dist/esm/provider-registration-runtime.exports.d.ts +1 -1
- package/dist/esm/provider-registration-runtime.exports.d.ts.map +1 -1
- package/dist/esm/provider-registration-runtime.exports.js +1 -1
- package/dist/esm/provider-registration-runtime.exports.js.map +1 -1
- package/dist/esm/public-runtime/index.d.ts +65 -17
- package/dist/esm/public-runtime/index.d.ts.map +1 -1
- package/dist/esm/public-runtime/index.js +65 -17
- package/dist/esm/public-runtime/index.js.map +1 -1
- package/dist/esm/queue/jobs.shared.resources-config.schemas.d.ts +7 -8
- package/dist/esm/queue/jobs.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/queue/jobs.shared.resources-config.schemas.js +30 -6
- package/dist/esm/queue/jobs.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/queue/jobs.shared.schemas.d.ts +416 -2
- package/dist/esm/queue/jobs.shared.schemas.d.ts.map +1 -1
- package/dist/esm/queue/jobs.shared.schemas.js +327 -11
- package/dist/esm/queue/jobs.shared.schemas.js.map +1 -1
- package/dist/esm/queue/jobs.shared.utils.d.ts +6 -4
- package/dist/esm/queue/jobs.shared.utils.d.ts.map +1 -1
- package/dist/esm/queue/jobs.shared.utils.js +5 -4
- package/dist/esm/queue/jobs.shared.utils.js.map +1 -1
- package/dist/esm/queue/queues.shared.schemas.d.ts +20 -8
- package/dist/esm/queue/queues.shared.schemas.d.ts.map +1 -1
- package/dist/esm/queue/queues.shared.schemas.js +23 -18
- package/dist/esm/queue/queues.shared.schemas.js.map +1 -1
- package/dist/esm/queue/queues.shared.utils.d.ts +4 -2
- package/dist/esm/queue/queues.shared.utils.d.ts.map +1 -1
- package/dist/esm/queue/queues.shared.utils.js +4 -2
- package/dist/esm/queue/queues.shared.utils.js.map +1 -1
- package/dist/esm/rag/rag-retrieval-health.shared.d.ts +27 -0
- package/dist/esm/rag/rag-retrieval-health.shared.d.ts.map +1 -0
- package/dist/esm/rag/rag-retrieval-health.shared.js +29 -0
- package/dist/esm/rag/rag-retrieval-health.shared.js.map +1 -0
- package/dist/esm/requests/header-keys.shared.d.ts +12 -0
- package/dist/esm/requests/header-keys.shared.d.ts.map +1 -1
- package/dist/esm/requests/header-keys.shared.js +14 -0
- package/dist/esm/requests/header-keys.shared.js.map +1 -1
- package/dist/esm/requests/idempotency-key.shared.d.ts +76 -0
- package/dist/esm/requests/idempotency-key.shared.d.ts.map +1 -0
- package/dist/esm/requests/idempotency-key.shared.js +112 -0
- package/dist/esm/requests/idempotency-key.shared.js.map +1 -0
- package/dist/esm/requests/manual-controllers-routes-documentation.d.ts.map +1 -1
- package/dist/esm/requests/manual-controllers-routes-documentation.js +365 -25
- package/dist/esm/requests/manual-controllers-routes-documentation.js.map +1 -1
- package/dist/esm/requests/manual-controllers-routes-urls.d.ts +138 -23
- package/dist/esm/requests/manual-controllers-routes-urls.d.ts.map +1 -1
- package/dist/esm/requests/manual-controllers-routes-urls.js +166 -0
- package/dist/esm/requests/manual-controllers-routes-urls.js.map +1 -1
- package/dist/esm/requests/rate-limits.shared.schemas.d.ts.map +1 -1
- package/dist/esm/requests/rate-limits.shared.schemas.js.map +1 -1
- package/dist/esm/requests/websocket.shared.schemas.d.ts +267 -26
- package/dist/esm/requests/websocket.shared.schemas.d.ts.map +1 -1
- package/dist/esm/requests/websocket.shared.schemas.js +310 -23
- package/dist/esm/requests/websocket.shared.schemas.js.map +1 -1
- package/dist/esm/resources/child-operations.shared.schemas.d.ts +56 -5
- package/dist/esm/resources/child-operations.shared.schemas.d.ts.map +1 -1
- package/dist/esm/resources/child-operations.shared.schemas.js +97 -5
- package/dist/esm/resources/child-operations.shared.schemas.js.map +1 -1
- package/dist/esm/resources/context-policy.shared.schemas.d.ts +20 -0
- package/dist/esm/resources/context-policy.shared.schemas.d.ts.map +1 -1
- package/dist/esm/resources/context-policy.shared.schemas.js +3 -0
- package/dist/esm/resources/context-policy.shared.schemas.js.map +1 -1
- package/dist/esm/resources/embedded-resource-mark.shared.utils.d.ts +21 -0
- package/dist/esm/resources/embedded-resource-mark.shared.utils.d.ts.map +1 -0
- package/dist/esm/resources/embedded-resource-mark.shared.utils.js +22 -0
- package/dist/esm/resources/embedded-resource-mark.shared.utils.js.map +1 -0
- package/dist/esm/resources/relationship-display.shared.schemas.d.ts.map +1 -1
- package/dist/esm/resources/resources-config.shared.factory.d.ts.map +1 -1
- package/dist/esm/resources/resources-config.shared.factory.js +1296 -47
- package/dist/esm/resources/resources-config.shared.factory.js.map +1 -1
- package/dist/esm/resources/resources-config.shared.schemas.d.ts +866 -92
- package/dist/esm/resources/resources-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/resources/resources-config.shared.schemas.js +460 -33
- package/dist/esm/resources/resources-config.shared.schemas.js.map +1 -1
- package/dist/esm/resources/resources-registry.shared.core.definitions.d.ts.map +1 -1
- package/dist/esm/resources/resources-registry.shared.core.definitions.js +730 -81
- package/dist/esm/resources/resources-registry.shared.core.definitions.js.map +1 -1
- package/dist/esm/resources/resources-relationships.shared.factory.d.ts.map +1 -1
- package/dist/esm/resources/resources-relationships.shared.factory.js.map +1 -1
- package/dist/esm/resources/resources-serialization.shared.schemas.d.ts.map +1 -1
- package/dist/esm/resources/resources.shared.core.definitions.d.ts +64 -0
- package/dist/esm/resources/resources.shared.core.definitions.d.ts.map +1 -1
- package/dist/esm/resources/resources.shared.core.definitions.js +120 -0
- package/dist/esm/resources/resources.shared.core.definitions.js.map +1 -1
- package/dist/esm/resources/resources.shared.schemas.d.ts +258 -27
- package/dist/esm/resources/resources.shared.schemas.d.ts.map +1 -1
- package/dist/esm/resources/resources.shared.schemas.js +233 -29
- package/dist/esm/resources/resources.shared.schemas.js.map +1 -1
- package/dist/esm/resources/resources.shared.utils.d.ts +18 -9
- package/dist/esm/resources/resources.shared.utils.d.ts.map +1 -1
- package/dist/esm/resources/resources.shared.utils.js +54 -14
- package/dist/esm/resources/resources.shared.utils.js.map +1 -1
- package/dist/esm/resources/utils/collection-export.shared.utils.d.ts +2 -2
- package/dist/esm/resources/utils/collection-export.shared.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/collection-export.shared.utils.js +4 -2
- package/dist/esm/resources/utils/collection-export.shared.utils.js.map +1 -1
- package/dist/esm/resources/utils/composition-cascade-deletability.validation.d.ts +44 -12
- package/dist/esm/resources/utils/composition-cascade-deletability.validation.d.ts.map +1 -1
- package/dist/esm/resources/utils/composition-cascade-deletability.validation.js +46 -23
- package/dist/esm/resources/utils/composition-cascade-deletability.validation.js.map +1 -1
- package/dist/esm/resources/utils/composition-seedability.validation.d.ts.map +1 -1
- package/dist/esm/resources/utils/context-addressed-composition-singleton.shared.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/dependent-lifecycle-classification.validation.d.ts +61 -0
- package/dist/esm/resources/utils/dependent-lifecycle-classification.validation.d.ts.map +1 -0
- package/dist/esm/resources/utils/dependent-lifecycle-classification.validation.js +79 -0
- package/dist/esm/resources/utils/dependent-lifecycle-classification.validation.js.map +1 -0
- package/dist/esm/resources/utils/duplicate-relationship-registration.validation.d.ts.map +1 -1
- package/dist/esm/resources/utils/field-value-disclosure.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/field-value-disclosure.utils.js.map +1 -1
- package/dist/esm/resources/utils/http-api-write-declaration.shared.utils.d.ts +103 -0
- package/dist/esm/resources/utils/http-api-write-declaration.shared.utils.d.ts.map +1 -0
- package/dist/esm/resources/utils/http-api-write-declaration.shared.utils.js +275 -0
- package/dist/esm/resources/utils/http-api-write-declaration.shared.utils.js.map +1 -0
- package/dist/esm/resources/utils/initiator-stamped-field-satisfiability.validation.d.ts +60 -0
- package/dist/esm/resources/utils/initiator-stamped-field-satisfiability.validation.d.ts.map +1 -0
- package/dist/esm/resources/utils/initiator-stamped-field-satisfiability.validation.js +80 -0
- package/dist/esm/resources/utils/initiator-stamped-field-satisfiability.validation.js.map +1 -0
- package/dist/esm/resources/utils/no-subject-data-stance-coherence.shared.utils.d.ts +51 -0
- package/dist/esm/resources/utils/no-subject-data-stance-coherence.shared.utils.d.ts.map +1 -0
- package/dist/esm/resources/utils/no-subject-data-stance-coherence.shared.utils.js +28 -0
- package/dist/esm/resources/utils/no-subject-data-stance-coherence.shared.utils.js.map +1 -0
- package/dist/esm/resources/utils/persistence-adapter-discrimination.shared.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/populated-file-fields.shared.utils.d.ts +21 -0
- package/dist/esm/resources/utils/populated-file-fields.shared.utils.d.ts.map +1 -0
- package/dist/esm/resources/utils/populated-file-fields.shared.utils.js +170 -0
- package/dist/esm/resources/utils/populated-file-fields.shared.utils.js.map +1 -0
- package/dist/esm/resources/utils/repository-dto-builder.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/request-schema-field-carriage.shared.utils.d.ts +2 -0
- package/dist/esm/resources/utils/request-schema-field-carriage.shared.utils.d.ts.map +1 -0
- package/dist/esm/resources/utils/request-schema-field-carriage.shared.utils.js +33 -0
- package/dist/esm/resources/utils/request-schema-field-carriage.shared.utils.js.map +1 -0
- package/dist/esm/resources/utils/required-fk-fillability.validation.d.ts.map +1 -1
- package/dist/esm/resources/utils/resource-operation-type-guards.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resource-polymorphism.factory.d.ts +15 -0
- package/dist/esm/resources/utils/resource-polymorphism.factory.d.ts.map +1 -1
- package/dist/esm/resources/utils/resource-polymorphism.factory.js +6 -1
- package/dist/esm/resources/utils/resource-polymorphism.factory.js.map +1 -1
- package/dist/esm/resources/utils/resource-polymorphism.relationships.d.ts.map +1 -1
- package/dist/esm/resources/utils/resource-polymorphism.schemas.d.ts.map +1 -1
- package/dist/esm/resources/utils/resource-polymorphism.schemas.js +30 -4
- package/dist/esm/resources/utils/resource-polymorphism.schemas.js.map +1 -1
- package/dist/esm/resources/utils/resource-polymorphism.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resource-subtree.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resources-config-context-needs.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resources-config-naming.utils.d.ts +15 -0
- package/dist/esm/resources/utils/resources-config-naming.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resources-config-naming.utils.js +56 -11
- package/dist/esm/resources/utils/resources-config-naming.utils.js.map +1 -1
- package/dist/esm/resources/utils/resources-config-operations.dtos-builder.utils.d.ts +97 -1
- package/dist/esm/resources/utils/resources-config-operations.dtos-builder.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resources-config-operations.dtos-builder.utils.js +402 -60
- package/dist/esm/resources/utils/resources-config-operations.dtos-builder.utils.js.map +1 -1
- package/dist/esm/resources/utils/resources-config-operations.path.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resources-config-operations.urls-builder.utils.d.ts +34 -0
- package/dist/esm/resources/utils/resources-config-operations.urls-builder.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resources-config-operations.urls-builder.utils.js +45 -1
- package/dist/esm/resources/utils/resources-config-operations.urls-builder.utils.js.map +1 -1
- package/dist/esm/resources/utils/resources-config-operations.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resources-serialization.utils.d.ts +19 -2
- package/dist/esm/resources/utils/resources-serialization.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resources-serialization.utils.js +4 -0
- package/dist/esm/resources/utils/resources-serialization.utils.js.map +1 -1
- package/dist/esm/resources/utils/resources-summary.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resources-summary.utils.js.map +1 -1
- package/dist/esm/resources/utils/schema-family-builder.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/schema-type-inference.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/schema-type-utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/schema-variant-resolver.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/shared-persistence-collection.utils.d.ts +29 -0
- package/dist/esm/resources/utils/shared-persistence-collection.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/shared-persistence-collection.utils.js +45 -9
- package/dist/esm/resources/utils/shared-persistence-collection.utils.js.map +1 -1
- package/dist/esm/resources/utils/templatable-file-fields.shared.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/templatable-file-fields.shared.utils.js +49 -11
- package/dist/esm/resources/utils/templatable-file-fields.shared.utils.js.map +1 -1
- package/dist/esm/resources/work-unit.shared.schemas.d.ts +20 -0
- package/dist/esm/resources/work-unit.shared.schemas.d.ts.map +1 -0
- package/dist/esm/resources/work-unit.shared.schemas.js +19 -0
- package/dist/esm/resources/work-unit.shared.schemas.js.map +1 -0
- package/dist/esm/runtime/domain-module.shared.definitions.d.ts.map +1 -1
- package/dist/esm/runtime/domain-module.shared.definitions.js.map +1 -1
- package/dist/esm/runtime/execution-context.shared.schemas.d.ts +48 -1
- package/dist/esm/runtime/execution-context.shared.schemas.d.ts.map +1 -1
- package/dist/esm/runtime/execution-context.shared.schemas.js +101 -9
- package/dist/esm/runtime/execution-context.shared.schemas.js.map +1 -1
- package/dist/esm/security/api-keys/api-keys-application.shared.resources-config.schemas.d.ts +1 -0
- package/dist/esm/security/api-keys/api-keys-application.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/api-keys/api-keys-application.shared.resources-config.schemas.js +41 -21
- package/dist/esm/security/api-keys/api-keys-application.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/api-keys/api-keys-organization.shared.resources-config.schemas.d.ts +1 -0
- package/dist/esm/security/api-keys/api-keys-organization.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/api-keys/api-keys-organization.shared.resources-config.schemas.js +65 -49
- package/dist/esm/security/api-keys/api-keys-organization.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/api-keys/api-keys.shared.schemas.d.ts +26 -0
- package/dist/esm/security/api-keys/api-keys.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/api-keys/api-keys.shared.schemas.js +39 -5
- package/dist/esm/security/api-keys/api-keys.shared.schemas.js.map +1 -1
- package/dist/esm/security/authentications/anonymous-session/anonymous-session.shared.contract.d.ts.map +1 -1
- package/dist/esm/security/authentications/authentication.shared.dto.schemas.d.ts +133 -19
- package/dist/esm/security/authentications/authentication.shared.dto.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/authentication.shared.dto.schemas.js +166 -6
- package/dist/esm/security/authentications/authentication.shared.dto.schemas.js.map +1 -1
- package/dist/esm/security/authentications/authentication.shared.schemas.d.ts +324 -9
- package/dist/esm/security/authentications/authentication.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/authentication.shared.schemas.js +411 -8
- package/dist/esm/security/authentications/authentication.shared.schemas.js.map +1 -1
- package/dist/esm/security/authentications/authentication.shared.utils.d.ts +87 -4
- package/dist/esm/security/authentications/authentication.shared.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/authentication.shared.utils.js +95 -6
- package/dist/esm/security/authentications/authentication.shared.utils.js.map +1 -1
- package/dist/esm/security/authentications/consumable-token.shared.schemas.d.ts +23 -1
- package/dist/esm/security/authentications/consumable-token.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/consumable-token.shared.schemas.js +23 -1
- package/dist/esm/security/authentications/consumable-token.shared.schemas.js.map +1 -1
- package/dist/esm/security/authentications/cross-frontend-handoff.shared.dto.schemas.d.ts +7 -1
- package/dist/esm/security/authentications/cross-frontend-handoff.shared.dto.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/cross-frontend-handoff.shared.dto.schemas.js +7 -1
- package/dist/esm/security/authentications/cross-frontend-handoff.shared.dto.schemas.js.map +1 -1
- package/dist/esm/security/authentications/password-blocklist.shared.utils.d.ts +74 -0
- package/dist/esm/security/authentications/password-blocklist.shared.utils.d.ts.map +1 -0
- package/dist/esm/security/authentications/password-blocklist.shared.utils.js +122 -0
- package/dist/esm/security/authentications/password-blocklist.shared.utils.js.map +1 -0
- package/dist/esm/security/authentications/password-reset.shared.dto.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/registration.shared.dto.schemas.d.ts +88 -2
- package/dist/esm/security/authentications/registration.shared.dto.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/registration.shared.dto.schemas.js +149 -2
- package/dist/esm/security/authentications/registration.shared.dto.schemas.js.map +1 -1
- package/dist/esm/security/authentications/scim/scim-organization-unit-mapping.shared.d.ts +57 -11
- package/dist/esm/security/authentications/scim/scim-organization-unit-mapping.shared.d.ts.map +1 -1
- package/dist/esm/security/authentications/scim/scim-organization-unit-mapping.shared.js +46 -13
- package/dist/esm/security/authentications/scim/scim-organization-unit-mapping.shared.js.map +1 -1
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.resources-config.schemas.d.ts +11 -0
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.resources-config.schemas.js +34 -10
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.schemas.d.ts +16 -2
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.schemas.js +36 -6
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.schemas.js.map +1 -1
- package/dist/esm/security/authentications/scim/scim-tokens.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/scim/scim-tokens.shared.resources-config.schemas.js +18 -12
- package/dist/esm/security/authentications/scim/scim-tokens.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authentications/scim/scim-tokens.shared.schemas.d.ts +2 -0
- package/dist/esm/security/authentications/scim/scim-tokens.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/scim/scim-tokens.shared.schemas.js +9 -0
- package/dist/esm/security/authentications/scim/scim-tokens.shared.schemas.js.map +1 -1
- package/dist/esm/security/authentications/service-provider-client-authentication.shared.schemas.d.ts +169 -0
- package/dist/esm/security/authentications/service-provider-client-authentication.shared.schemas.d.ts.map +1 -0
- package/dist/esm/security/authentications/service-provider-client-authentication.shared.schemas.js +162 -0
- package/dist/esm/security/authentications/service-provider-client-authentication.shared.schemas.js.map +1 -0
- package/dist/esm/security/authentications/siem/siem-delivery-dlq.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/siem/siem-delivery-dlq.shared.resources-config.schemas.js +14 -9
- package/dist/esm/security/authentications/siem/siem-delivery-dlq.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authentications/siem/siem-delivery-dlq.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.resources-config.schemas.d.ts +27 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.resources-config.schemas.js +109 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.schemas.d.ts +66 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.schemas.d.ts.map +1 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.schemas.js +107 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.schemas.js.map +1 -0
- package/dist/esm/security/authentications/siem/siem-delivery-reliability-contract.shared.d.ts.map +1 -1
- package/dist/esm/security/authentications/siem/siem-delivery-reliability-contract.shared.js.map +1 -1
- package/dist/esm/security/authentications/siem/siem-export-config.shared.resources-config.schemas.d.ts +19 -0
- package/dist/esm/security/authentications/siem/siem-export-config.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/siem/siem-export-config.shared.resources-config.schemas.js +50 -13
- package/dist/esm/security/authentications/siem/siem-export-config.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authentications/siem/siem-export-config.shared.schemas.d.ts +18 -6
- package/dist/esm/security/authentications/siem/siem-export-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/siem/siem-export-config.shared.schemas.js +139 -10
- package/dist/esm/security/authentications/siem/siem-export-config.shared.schemas.js.map +1 -1
- package/dist/esm/security/authentications/sso/sso-config.shared.resources-config.schemas.d.ts +26 -0
- package/dist/esm/security/authentications/sso/sso-config.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/sso/sso-config.shared.resources-config.schemas.js +63 -33
- package/dist/esm/security/authentications/sso/sso-config.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authentications/sso/sso-config.shared.schemas.d.ts +0 -40
- package/dist/esm/security/authentications/sso/sso-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/sso/sso-config.shared.schemas.js +127 -50
- package/dist/esm/security/authentications/sso/sso-config.shared.schemas.js.map +1 -1
- package/dist/esm/security/authentications/sso/sso-connection.shared.resources-config.schemas.d.ts +26 -7
- package/dist/esm/security/authentications/sso/sso-connection.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/sso/sso-connection.shared.resources-config.schemas.js +98 -38
- package/dist/esm/security/authentications/sso/sso-connection.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authentications/sso/sso-connection.shared.schemas.d.ts +6 -26
- package/dist/esm/security/authentications/sso/sso-connection.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/sso/sso-connection.shared.schemas.js +153 -70
- package/dist/esm/security/authentications/sso/sso-connection.shared.schemas.js.map +1 -1
- package/dist/esm/security/authorizations/administrative-continuity.shared.schemas.d.ts +13 -5
- package/dist/esm/security/authorizations/administrative-continuity.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authorizations/administrative-continuity.shared.schemas.js +12 -4
- package/dist/esm/security/authorizations/administrative-continuity.shared.schemas.js.map +1 -1
- package/dist/esm/security/authorizations/application-access-grants.shared.resources-config.schemas.d.ts +4 -0
- package/dist/esm/security/authorizations/application-access-grants.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authorizations/application-access-grants.shared.resources-config.schemas.js +9 -1
- package/dist/esm/security/authorizations/application-access-grants.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authorizations/application-access-grants.shared.schemas.d.ts +44 -0
- package/dist/esm/security/authorizations/application-access-grants.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authorizations/application-access-grants.shared.schemas.js +52 -0
- package/dist/esm/security/authorizations/application-access-grants.shared.schemas.js.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grants.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grants.shared.resources-config.schemas.js +7 -7
- package/dist/esm/security/authorizations/platform-access-grants.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grants.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grants.shared.schemas.js.map +1 -1
- package/dist/esm/security/authorizations/roles.shared.defaults.d.ts.map +1 -1
- package/dist/esm/security/authorizations/roles.shared.defaults.js +62 -0
- package/dist/esm/security/authorizations/roles.shared.defaults.js.map +1 -1
- package/dist/esm/security/authorizations/roles.shared.schemas.d.ts +91 -1
- package/dist/esm/security/authorizations/roles.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authorizations/roles.shared.schemas.js +109 -0
- package/dist/esm/security/authorizations/roles.shared.schemas.js.map +1 -1
- package/dist/esm/security/authorizations/roles.shared.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/roles.shared.utils.js +2 -0
- package/dist/esm/security/authorizations/roles.shared.utils.js.map +1 -1
- package/dist/esm/security/connected-accounts/provider-connection-listing.shared.schemas.d.ts +86 -0
- package/dist/esm/security/connected-accounts/provider-connection-listing.shared.schemas.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/provider-connection-listing.shared.schemas.js +40 -0
- package/dist/esm/security/connected-accounts/provider-connection-listing.shared.schemas.js.map +1 -0
- package/dist/esm/security/connected-accounts/provider-credentials-organization.shared.resources-config.schemas.d.ts +6 -2
- package/dist/esm/security/connected-accounts/provider-credentials-organization.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/connected-accounts/provider-credentials-organization.shared.resources-config.schemas.js +2 -1
- package/dist/esm/security/connected-accounts/provider-credentials-organization.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/connected-accounts/provider-credentials-user.shared.resources-config.schemas.d.ts +7 -3
- package/dist/esm/security/connected-accounts/provider-credentials-user.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/connected-accounts/provider-credentials-user.shared.resources-config.schemas.js +15 -43
- package/dist/esm/security/connected-accounts/provider-credentials-user.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/connected-accounts/provider-credentials.shared.schemas.d.ts +242 -23
- package/dist/esm/security/connected-accounts/provider-credentials.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/connected-accounts/provider-credentials.shared.schemas.js +310 -62
- package/dist/esm/security/connected-accounts/provider-credentials.shared.schemas.js.map +1 -1
- package/dist/esm/security/credential-rotation-grace.shared.utils.d.ts +69 -0
- package/dist/esm/security/credential-rotation-grace.shared.utils.d.ts.map +1 -0
- package/dist/esm/security/credential-rotation-grace.shared.utils.js +77 -0
- package/dist/esm/security/credential-rotation-grace.shared.utils.js.map +1 -0
- package/dist/esm/security/oauth-clients/oauth-clients-application.shared.resources-config.schemas.d.ts +6 -3
- package/dist/esm/security/oauth-clients/oauth-clients-application.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients-application.shared.resources-config.schemas.js +102 -12
- package/dist/esm/security/oauth-clients/oauth-clients-application.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients-organization.shared.resources-config.schemas.d.ts +8 -3
- package/dist/esm/security/oauth-clients/oauth-clients-organization.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients-organization.shared.resources-config.schemas.js +194 -17
- package/dist/esm/security/oauth-clients/oauth-clients-organization.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients.shared.schemas.d.ts +1 -0
- package/dist/esm/security/oauth-clients/oauth-clients.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients.shared.schemas.js +25 -4
- package/dist/esm/security/oauth-clients/oauth-clients.shared.schemas.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-consent-grants.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-consent-grants.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-consent-grants.shared.schemas.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-resource-server.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/outbound-target-control.shared.schemas.d.ts +73 -0
- package/dist/esm/security/outbound-target-control.shared.schemas.d.ts.map +1 -0
- package/dist/esm/security/outbound-target-control.shared.schemas.js +75 -0
- package/dist/esm/security/outbound-target-control.shared.schemas.js.map +1 -0
- package/dist/esm/security/submission-challenge/submission-challenge.shared.d.ts +143 -0
- package/dist/esm/security/submission-challenge/submission-challenge.shared.d.ts.map +1 -0
- package/dist/esm/security/submission-challenge/submission-challenge.shared.js +123 -0
- package/dist/esm/security/submission-challenge/submission-challenge.shared.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-actions.shared.schemas.d.ts +384 -0
- package/dist/esm/systems-of-record/system-of-record-actions.shared.schemas.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-actions.shared.schemas.js +327 -0
- package/dist/esm/systems-of-record/system-of-record-actions.shared.schemas.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-credential-kind.shared.d.ts +159 -0
- package/dist/esm/systems-of-record/system-of-record-credential-kind.shared.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-credential-kind.shared.js +164 -0
- package/dist/esm/systems-of-record/system-of-record-credential-kind.shared.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-declaration.shared.schemas.d.ts +322 -0
- package/dist/esm/systems-of-record/system-of-record-declaration.shared.schemas.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-declaration.shared.schemas.js +229 -0
- package/dist/esm/systems-of-record/system-of-record-declaration.shared.schemas.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-env.shared.d.ts +79 -0
- package/dist/esm/systems-of-record/system-of-record-env.shared.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-env.shared.js +116 -0
- package/dist/esm/systems-of-record/system-of-record-env.shared.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-error-codes.shared.d.ts +403 -0
- package/dist/esm/systems-of-record/system-of-record-error-codes.shared.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-error-codes.shared.js +430 -0
- package/dist/esm/systems-of-record/system-of-record-error-codes.shared.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-facet.shared.schemas.d.ts +788 -0
- package/dist/esm/systems-of-record/system-of-record-facet.shared.schemas.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-facet.shared.schemas.js +985 -0
- package/dist/esm/systems-of-record/system-of-record-facet.shared.schemas.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.resources-config.schemas.d.ts +31 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.resources-config.schemas.js +233 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.schemas.d.ts +127 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.schemas.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.schemas.js +204 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.schemas.js.map +1 -0
- package/dist/esm/testing/resource-config-builders.d.ts.map +1 -1
- package/dist/esm/testing/resource-config-builders.js +10 -4
- package/dist/esm/testing/resource-config-builders.js.map +1 -1
- package/dist/esm/testing.d.ts.map +1 -1
- package/dist/esm/users/anonymous-user-marketing-metadata.shared.schemas.d.ts +2 -1
- package/dist/esm/users/anonymous-user-marketing-metadata.shared.schemas.d.ts.map +1 -1
- package/dist/esm/users/anonymous-user-marketing-metadata.shared.schemas.js +2 -1
- package/dist/esm/users/anonymous-user-marketing-metadata.shared.schemas.js.map +1 -1
- package/dist/esm/users/anonymous-users.shared.resources-config.schemas.d.ts +141 -24
- package/dist/esm/users/anonymous-users.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/anonymous-users.shared.resources-config.schemas.js +264 -0
- package/dist/esm/users/anonymous-users.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/anonymous-users.shared.schema.d.ts +5 -3
- package/dist/esm/users/anonymous-users.shared.schema.d.ts.map +1 -1
- package/dist/esm/users/anonymous-users.shared.schema.js +18 -1
- package/dist/esm/users/anonymous-users.shared.schema.js.map +1 -1
- package/dist/esm/users/inbound-contacts.shared.resources-config.schemas.d.ts +2 -1
- package/dist/esm/users/inbound-contacts.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/inbound-contacts.shared.resources-config.schemas.js +29 -0
- package/dist/esm/users/inbound-contacts.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/inbound-contacts.shared.schemas.d.ts +2 -1
- package/dist/esm/users/inbound-contacts.shared.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-consent-decision.shared.utils.d.ts +127 -0
- package/dist/esm/users/user-consent-decision.shared.utils.d.ts.map +1 -0
- package/dist/esm/users/user-consent-decision.shared.utils.js +189 -0
- package/dist/esm/users/user-consent-decision.shared.utils.js.map +1 -0
- package/dist/esm/users/user-credentials.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-credentials.shared.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-identity-links.shared.resources-config.schemas.d.ts +1 -0
- package/dist/esm/users/user-identity-links.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-identity-links.shared.schemas.d.ts +1 -0
- package/dist/esm/users/user-identity-links.shared.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-identity-links.shared.schemas.js +30 -0
- package/dist/esm/users/user-identity-links.shared.schemas.js.map +1 -1
- package/dist/esm/users/user-preferences-reset.shared.utils.d.ts +6 -6
- package/dist/esm/users/user-preferences-reset.shared.utils.d.ts.map +1 -1
- package/dist/esm/users/user-preferences-reset.shared.utils.js +8 -8
- package/dist/esm/users/user-preferences-reset.shared.utils.js.map +1 -1
- package/dist/esm/users/user-preferences.shared.resources-config.schemas.d.ts +71 -29
- package/dist/esm/users/user-preferences.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-preferences.shared.resources-config.schemas.js +99 -0
- package/dist/esm/users/user-preferences.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/user-profiles.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-profiles.shared.resources-config.schemas.js +25 -9
- package/dist/esm/users/user-profiles.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/user-self-preferences.shared.resources-config.schemas.d.ts +4 -7
- package/dist/esm/users/user-self-preferences.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-self-preferences.shared.resources-config.schemas.js +12 -1
- package/dist/esm/users/user-self-preferences.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/user-self-profiles.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-self.shared.resources-config.schemas.d.ts +1 -0
- package/dist/esm/users/user-self.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-self.shared.resources-config.schemas.js +3 -3
- package/dist/esm/users/user-self.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/users.shared.resources-config.schemas.d.ts +1 -0
- package/dist/esm/users/users.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/users.shared.resources-config.schemas.js +84 -22
- package/dist/esm/users/users.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/users.shared.schemas.d.ts +23 -18
- package/dist/esm/users/users.shared.schemas.d.ts.map +1 -1
- package/dist/esm/users/users.shared.schemas.js +117 -27
- package/dist/esm/users/users.shared.schemas.js.map +1 -1
- package/package.json +14 -35
- package/dist/esm/compliance/privacy/data-retention.shared.schemas.js +0 -7
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint-agent-personas.shared.enums.d.ts +0 -19
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint-agent-personas.shared.enums.d.ts.map +0 -1
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint-agent-personas.shared.enums.js +0 -35
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint-agent-personas.shared.enums.js.map +0 -1
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint.shared.schemas.d.ts +0 -213
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint.shared.schemas.js +0 -287
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/apps-blueprint/artifacts.apps-blueprint.shared.schemas.d.ts +0 -236
- package/dist/esm/flows-actors/apps-blueprint/artifacts.apps-blueprint.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/apps-blueprint/artifacts.apps-blueprint.shared.schemas.js +0 -212
- package/dist/esm/flows-actors/apps-blueprint/artifacts.apps-blueprint.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/actions.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/actions.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/budget-authority.meta-workflows.shared.schemas.d.ts +0 -17
- package/dist/esm/flows-actors/meta-workflows/budget-authority.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/budget-authority.meta-workflows.shared.schemas.js +0 -31
- package/dist/esm/flows-actors/meta-workflows/budget-authority.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/catalog.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/catalog.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/context-selection.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/context-selection.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/continuity-identifiers.meta-workflows.shared.schemas.d.ts +0 -28
- package/dist/esm/flows-actors/meta-workflows/continuity-identifiers.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/continuity-identifiers.meta-workflows.shared.schemas.js +0 -28
- package/dist/esm/flows-actors/meta-workflows/continuity-identifiers.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/decisions.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/decisions.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/execution-binding-common.meta-workflows.shared.schemas.d.ts +0 -100
- package/dist/esm/flows-actors/meta-workflows/execution-binding-common.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/execution-binding-common.meta-workflows.shared.schemas.js +0 -232
- package/dist/esm/flows-actors/meta-workflows/execution-binding-common.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/execution-binding-vocabularies.meta-workflows.shared.schemas.d.ts +0 -29
- package/dist/esm/flows-actors/meta-workflows/execution-binding-vocabularies.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/execution-binding-vocabularies.meta-workflows.shared.schemas.js +0 -58
- package/dist/esm/flows-actors/meta-workflows/execution-binding-vocabularies.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/portable-primitives.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/portable-primitives.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/task-continuity-binding.actors.shared.schemas.d.ts +0 -81
- package/dist/esm/flows-actors/task-continuity-binding.actors.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/task-continuity-binding.actors.shared.schemas.js +0 -82
- package/dist/esm/flows-actors/task-continuity-binding.actors.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/utils/flow-actors.context-builder.apps-context.shared.utils.d.ts +0 -2
- package/dist/esm/flows-actors/utils/flow-actors.context-builder.apps-context.shared.utils.d.ts.map +0 -1
- package/dist/esm/flows-actors/utils/flow-actors.context-builder.apps-context.shared.utils.js +0 -1
- package/dist/esm/flows-actors/utils/flow-actors.context-builder.apps-context.shared.utils.js.map +0 -1
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- /package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/actions.meta-workflows.shared.schemas.d.ts +0 -0
- /package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/actions.meta-workflows.shared.schemas.js +0 -0
- /package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/catalog.meta-workflows.shared.schemas.d.ts +0 -0
- /package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/catalog.meta-workflows.shared.schemas.js +0 -0
- /package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/context-selection.meta-workflows.shared.schemas.d.ts +0 -0
- /package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/context-selection.meta-workflows.shared.schemas.js +0 -0
|
@@ -1,14 +1,19 @@
|
|
|
1
|
+
import { ResourceConfiguration_QueueConfigSchema } from '../queue/queues.shared.schemas.js';
|
|
2
|
+
import { markEmbeddedResourceSchema } from './embedded-resource-mark.shared.utils.js';
|
|
3
|
+
import { normalizeScheduledRecoveryPolicy } from '../queue/jobs.shared.schemas.js';
|
|
1
4
|
/**
|
|
2
5
|
* Operations Shared Schemas
|
|
3
6
|
*
|
|
4
7
|
* Reusable operation schemas for bulk actions and common operations
|
|
5
8
|
*/
|
|
6
|
-
import { ExpiresInDurationSchema, getImpersonalizeMaskValue, getImpersonalizeTreatment, getZodObjectShape, getZodType, isBackendOnlyField, isDiscriminatorField, isExcludedFromCreate, isExcludedFromUpdate, isBusinessKeyField, isZodObject, isSummaryField, isTemplatableFileField, isUniqueField,
|
|
9
|
+
import { ExpiresInDurationSchema, getImpersonalizeMaskValue, getImpersonalizeTreatment, getZodObjectShape, getZodType, isBackendOnlyField, isDiscriminatorField, isExcludedFromCreate, isExcludedFromUpdate, isBusinessKeyField, isZodObject, isSummaryField, isTemplatableFileField, isUniqueField, getUniqueFieldParams, isVirtualField, toPatchOptionalField, z_file, mainSchemaFieldIsClearable, unwrapSchema, getDataCategories, markPatchRequestDtoObject, isDBIndexed, } from '@wildo-ai/zod-decorators';
|
|
7
10
|
import { z } from 'zod';
|
|
8
11
|
import { ErrorType } from '../errors/errors.shared.schemas.js';
|
|
9
|
-
import { ErasureRetentionMode, ResourceDataSubjectKind, RetentionStatus, RetentionStatusSchema } from '../compliance/privacy/impersonalization.shared.schemas.js';
|
|
12
|
+
import { ErasureRetentionMode, ResourceDataSubjectKind, RetentionStatus, RetentionStatusSchema, StatutoryRetentionGround } from '../compliance/privacy/impersonalization.shared.schemas.js';
|
|
10
13
|
import { buildImpersonalizeScrubPatch, collectDeclaredPersonalDataFields, IMPERSONALIZE_MASK_CONSTANT, isImpersonalizeNeverScrubFloorField, resolveImpersonalizeMaskValue, resolveImpersonalizeResetValue, } from '../compliance/privacy/impersonalization-scrub.shared.utils.js';
|
|
11
14
|
import { RedactionType } from '../compliance/privacy/redaction.shared.schemas.js';
|
|
15
|
+
import { DataRetentionClass, RETENTION_STARTED_AT_FIELD_NAME, ResourceRetentionBindingSchema, RetentionStartPoint, } from '../compliance/privacy/retention-schedule.shared.schemas.js';
|
|
16
|
+
import { collectRowTtlPolicies, resolveRetentionStartFieldName } from '../compliance/privacy/retention-binding.shared.utils.js';
|
|
12
17
|
import { unknownPersonalDataCategories } from '../compliance/privacy/personal-data-category.shared.schemas.js';
|
|
13
18
|
/*
|
|
14
19
|
* entrypoint-closure-waiver: this root-reachable module imports the external-data AUTHORING
|
|
@@ -27,12 +32,19 @@ import { unknownPersonalDataCategories } from '../compliance/privacy/personal-da
|
|
|
27
32
|
* only when TypeScript must INVENT a specifier for an INFERRED type. Re-run the probe if a
|
|
28
33
|
* root-exported contract here ever starts inferring one.
|
|
29
34
|
*/
|
|
30
|
-
import { HttpApiResourceBindingSchema,
|
|
31
|
-
import {
|
|
35
|
+
import { HttpApiResourceBindingSchema, assertHttpApiBindingDialectCoherence } from '../http-api-binding/http-api-binding.shared.schemas.js';
|
|
36
|
+
import { assertHttpApiWriteDeclarationCoherence, collectHttpApiWriteOperationFacts, resolveHttpApiWriteIdempotencyKeyRequirement, resolveHttpApiWriteVerb, } from './utils/http-api-write-declaration.shared.utils.js';
|
|
37
|
+
import { describeNoSubjectDataStanceContradiction, personalFieldsContradictingNoSubjectDataStance } from './utils/no-subject-data-stance-coherence.shared.utils.js';
|
|
38
|
+
import { HTTP_API_ENGINE_INJECTED_FIELDS, HTTP_API_TENANT_ANCHOR_FIELD, READ_THROUGH_ORGANIZATION_UNIT_FIELD_NAME, } from '../http-api-binding/read-through-engine-anchors.shared.js';
|
|
39
|
+
import { HttpApiTransportDialect } from '../http-api-binding/http-api-transport-dialect.shared.js';
|
|
40
|
+
import { ExternalDataConditionalOutcomeKind, ExternalDataDestinationPopulation, ExternalDataFieldCoercion, ExternalDataFieldOwner, ExternalDataMappingEntryKind, ExternalDataOrphanPolicy, ExternalDataPipelineDeclarationSchema, ExternalDataPipelineDirection, ExternalDataUnmappedValuePolicy, assertExternalDataPipelineDeclarationCoherence, resolveExternalDataFieldOwner, resolveExternalDataRemoteReferenceValueShape, } from '../external-data/external-data-pipeline.shared.schemas.js';
|
|
41
|
+
import { CoreM2MNotificationChannel, CoreUserNotificationChannel, CoreUserNotificationTarget, M2MNotificationDefinitionSchema, UserNotificationDefinitionSchema, } from '../notifications/notifications.shared.schemas.js';
|
|
32
42
|
import { HttpMethod } from '../requests/http-requests.shared.js';
|
|
43
|
+
import { isSubmissionChallengeActionName } from '../security/submission-challenge/submission-challenge.shared.js';
|
|
33
44
|
import { ConsumableToken_ConsumptionMode, TokenAuthenticationPolicy } from '../security/authentications/consumable-token.shared.schemas.js';
|
|
34
|
-
import { OPERATION_VARIANT_KEY,
|
|
45
|
+
import { OPERATION_VARIANT_KEY, wrapRequestDtoAsBulk, resolveBulkOperationMaxSelection, Resources_Filter_BaseSchema, Resources_Filter_DateRangeSchema, Resources_Filter_NumberRangeSchema, isResourcesFilterNumberRangeSchema, createPaginationRequestSchema, DEFAULT_LIST_PAGE_CEILING, DEFAULT_SEARCH_PAGE_CEILING, createPaginationResponseMetadataSchema, ResourceGeneratedOperationKind, ResourceSystemAccessMode, PersistenceAdapter, isPersistenceAdapter, SortOrder, ResourceCollectionExportFormat, ResourceCollectionExportRowScope, ResourceCollectionExportResponseSchema, getResourcesFilterPresenceTarget, } from './resources-config.shared.schemas.js';
|
|
35
46
|
import { CoreResourceOperation, CoreResourceType, coreResourceShared_FieldIdentifier } from './resources.shared.core.definitions.js';
|
|
47
|
+
import { requestSchemaCarriesField } from './utils/request-schema-field-carriage.shared.utils.js';
|
|
36
48
|
import { PRIMARY_SCOPE_FIELD_IDENTIFIERS, PRIMARY_SCOPE_TO_CORE_RESOURCE_TYPE, FIELD_IDENTIFIER_TO_PRIMARY_SCOPE, RelationshipNature, ResourceOperationRiskLevel, ResourceOperationVariantType, ResourceOperation_ServiceRuntimeMode, ResourceParentResourceRequirement, ResourcePrimaryScope, ResourceRelationshipBulkAction, ResourceRelationshipBulkActionResultSchema, ResourceRelationshipBulkClearOperationRequestSchema, ResourceRelationshipBulkCreateOperationRequestSchema, ResourceRelationshipBulkLinkOperationRequestSchema, ResourceRelationshipBulkReplaceOperationRequestSchema, ResourceRelationshipBulkSetOperationRequestSchema, ResourceRelationshipBulkUnlinkOperationRequestSchema, ResourceRelationshipAccessScopeStrategy, ResourceRelationshipCardinality, ResourceTranspositionPolicy } from './resources.shared.schemas.js';
|
|
37
49
|
import { createResourcesRelationship } from './resources-relationships.shared.factory.js';
|
|
38
50
|
import { Resources_SharedUtils } from './resources.shared.utils.js';
|
|
@@ -41,6 +53,7 @@ import { ResourcesSummaryUtils } from './utils/resources-summary.utils.js';
|
|
|
41
53
|
import { collectTemplatableFileFieldPaths, stripTemplatableFileFieldsRecursively } from './utils/templatable-file-fields.shared.utils.js';
|
|
42
54
|
import { selectByPersistenceAdapter } from './utils/persistence-adapter-discrimination.shared.utils.js';
|
|
43
55
|
import { isServiceResolvableDefaultOperation, SERVICE_RESOLVABLE_OPERATION_VARIANT_TYPES, URL_BEARING_OPERATION_VARIANT_TYPES, } from './utils/resource-operation-type-guards.utils.js';
|
|
56
|
+
import { describeCaughtError } from '../errors/caught-error-description.shared.utils.js';
|
|
44
57
|
// --------------------------------
|
|
45
58
|
// Error Helpers
|
|
46
59
|
// --------------------------------
|
|
@@ -95,6 +108,94 @@ function createConfigurationError(message) {
|
|
|
95
108
|
error.type = ErrorType.CONFIGURATION;
|
|
96
109
|
return error;
|
|
97
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Whether a dotted path names a field of the resource, descending through nested objects.
|
|
113
|
+
*
|
|
114
|
+
* Dotted because the PostgreSQL filter sanitizer admits a `field.sub` path under a planned JSONB root,
|
|
115
|
+
* so a filter or sort key may legitimately address a nested field. Each segment is unwrapped
|
|
116
|
+
* (optional, default, nullable) before its shape is read.
|
|
117
|
+
*/
|
|
118
|
+
function schemaHasFieldPath(shape, path) {
|
|
119
|
+
let current = shape;
|
|
120
|
+
for (const segment of path.split('.')) {
|
|
121
|
+
const field = current?.[segment];
|
|
122
|
+
if (!field)
|
|
123
|
+
return false;
|
|
124
|
+
const unwrapped = (unwrapSchema(field) ?? field);
|
|
125
|
+
current = isZodObject(unwrapped) ? getZodObjectShape(unwrapped) : undefined;
|
|
126
|
+
}
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Refuse a collection operation whose `filterFields`, `sortFields` or own-field `searchableFields` name
|
|
131
|
+
* something the resource does not have (#1806, #1952).
|
|
132
|
+
*
|
|
133
|
+
* Both lists are passed to the repository VERBATIM — the filter allow-list and the sort allow-list are
|
|
134
|
+
* the declared names, nothing else — so a name that is not a field compiles into a condition on a
|
|
135
|
+
* column that does not exist. On MongoDB that matches nothing and answers an empty page; on PostgreSQL
|
|
136
|
+
* a filter fails on a missing column and a sort is silently dropped. Either way the caller gets a wrong
|
|
137
|
+
* answer with no error saying the filter is unsupported, and the published API reference advertises a
|
|
138
|
+
* query parameter that cannot work. Four such names had shipped when this was written: `role` on the
|
|
139
|
+
* organization-member searches (the field is `roles`), `joinedAt` there and on the user searches (no
|
|
140
|
+
* such field), and `hasExpiration` on six credential searches (a question about `expiresAt`, which
|
|
141
|
+
* nothing translated).
|
|
142
|
+
*
|
|
143
|
+
* A filter key is admitted when it names a field, or when it is a presence filter
|
|
144
|
+
* (`createResourcesFilterPresenceSchema`) whose TARGET names one — that is the one declared
|
|
145
|
+
* translation there is. A function-valued entry — the old "filter-ref transformer" slot — is refused:
|
|
146
|
+
* nothing ever applied it, so its key reached the database untranslated, which is this defect again.
|
|
147
|
+
*
|
|
148
|
+
* `searchableFields` joined the check with #1952: an own-field name reaches the repository verbatim like the
|
|
149
|
+
* other two, and `ORGANIZATIONS`' SEARCH had shipped `email`, a field an organization does not have — every
|
|
150
|
+
* organization search then failed on PostgreSQL (`column "email" does not exist`) while MongoDB quietly
|
|
151
|
+
* matched nothing. A RELATIONAL entry is checked for its `localField`, the half that lives on this resource;
|
|
152
|
+
* its `relatedJoinField` and `fields` belong to the related resource, which is not known here, and a related
|
|
153
|
+
* resource that cannot be resolved already contributes nothing at query time (the fail-safe documented on
|
|
154
|
+
* `SearchableRelationDescriptor`). `_id` is refused as a searchable field even though it is a field: search is a
|
|
155
|
+
* substring match, and MongoDB stores `_id` as an ObjectId and refuses a regex on it, so the search would answer
|
|
156
|
+
* 500 there. A row is found by id through a READ or an `_id` filter.
|
|
157
|
+
*
|
|
158
|
+
* Checked against the EFFECTIVE schema, after the framework injects its own fields, because those are
|
|
159
|
+
* the fields a row actually carries.
|
|
160
|
+
*/
|
|
161
|
+
function assertCollectionFieldsNameResourceFields(params) {
|
|
162
|
+
const { resourceIdentifier, operationLabel, schemaShape, filterFields, sortFields, searchableFields } = params;
|
|
163
|
+
for (const [key, declaration] of Object.entries(filterFields ?? {})) {
|
|
164
|
+
if (typeof declaration === 'function') {
|
|
165
|
+
throw createConfigurationError(`Resource "${resourceIdentifier}" ${operationLabel}: filter "${key}" is a function. Filter-ref transformers are not supported — nothing applies them, so the key would reach the database untranslated. `
|
|
166
|
+
+ 'Declare the field\'s Zod type, or `createResourcesFilterPresenceSchema(<field>)` for a "has <field>" filter.');
|
|
167
|
+
}
|
|
168
|
+
const presenceTarget = getResourcesFilterPresenceTarget(declaration);
|
|
169
|
+
if (presenceTarget !== undefined) {
|
|
170
|
+
if (!schemaHasFieldPath(schemaShape, presenceTarget)) {
|
|
171
|
+
throw createConfigurationError(`Resource "${resourceIdentifier}" ${operationLabel}: presence filter "${key}" asks about "${presenceTarget}", which is not a field of the resource.`);
|
|
172
|
+
}
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (!schemaHasFieldPath(schemaShape, key)) {
|
|
176
|
+
throw createConfigurationError(`Resource "${resourceIdentifier}" ${operationLabel}: filter "${key}" is not a field of the resource, so it would match nothing. `
|
|
177
|
+
+ 'Name a field, or declare `createResourcesFilterPresenceSchema(<field>)` for a "has <field>" filter.');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
for (const field of sortFields ?? []) {
|
|
181
|
+
if (!schemaHasFieldPath(schemaShape, field)) {
|
|
182
|
+
throw createConfigurationError(`Resource "${resourceIdentifier}" ${operationLabel}: sort field "${field}" is not a field of the resource, so sorting by it would be ignored.`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
for (const entry of searchableFields ?? []) {
|
|
186
|
+
const ownField = typeof entry === 'string' ? entry : undefined;
|
|
187
|
+
const localField = entry && typeof entry === 'object' ? entry.localField : undefined;
|
|
188
|
+
if (ownField === '_id') {
|
|
189
|
+
throw createConfigurationError(`Resource "${resourceIdentifier}" ${operationLabel}: "_id" cannot be a searchable field. Search is a substring match, and MongoDB refuses a regex on an ObjectId; find a row by id with a READ or an \`_id\` filter.`);
|
|
190
|
+
}
|
|
191
|
+
if (ownField !== undefined && !schemaHasFieldPath(schemaShape, ownField)) {
|
|
192
|
+
throw createConfigurationError(`Resource "${resourceIdentifier}" ${operationLabel}: searchable field "${ownField}" is not a field of the resource, so a search on it fails on PostgreSQL and matches nothing on MongoDB.`);
|
|
193
|
+
}
|
|
194
|
+
if (typeof localField === 'string' && !schemaHasFieldPath(schemaShape, localField)) {
|
|
195
|
+
throw createConfigurationError(`Resource "${resourceIdentifier}" ${operationLabel}: relational searchable entry joins on "${localField}", which is not a field of the resource.`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
98
199
|
/**
|
|
99
200
|
* Creates a validation error with ErrorType.VALIDATION
|
|
100
201
|
* Used for runtime data validation errors
|
|
@@ -113,6 +214,30 @@ function createValidationError(message) {
|
|
|
113
214
|
function isUrlisableOperationVariantType(variantType) {
|
|
114
215
|
return URL_BEARING_OPERATION_VARIANT_TYPES.includes(variantType);
|
|
115
216
|
}
|
|
217
|
+
/**
|
|
218
|
+
* Refuse a `submissionChallenge` declaration the runtime could never honour (#1985).
|
|
219
|
+
*
|
|
220
|
+
* - On a variant that receives no HTTP request (INTERNAL_CALL, a cron or batch job, REPOSITORY_ONLY), no caller can send
|
|
221
|
+
* the `x-submission-challenge-response` header, and such a variant is reached by the server rather than by a visitor.
|
|
222
|
+
* The declaration would say "protected" while refusing every unauthenticated execution.
|
|
223
|
+
* - An action outside the captcha vendor's grammar would be minted by no vendor, so every token for it would be refused
|
|
224
|
+
* and only the proof of work could answer: a protection that silently loses half of itself.
|
|
225
|
+
*
|
|
226
|
+
* Thrown while the resource configuration is BUILT, so the application cannot start with either shape. The INLINE
|
|
227
|
+
* requirement is checked at application start instead, because the runtime mode can be set after this factory runs.
|
|
228
|
+
*/
|
|
229
|
+
function assertSubmissionChallengeDeclaration(operation, variantType, declaration) {
|
|
230
|
+
if (declaration === undefined)
|
|
231
|
+
return;
|
|
232
|
+
if (!isUrlisableOperationVariantType(variantType)) {
|
|
233
|
+
throw createConfigurationError(`Operation '${operation}' declares a submission challenge on a '${variantType}' variant. Only a variant reached by an `
|
|
234
|
+
+ 'HTTP request can receive the challenge answer; declare it on the API_CALL variant a visitor calls.');
|
|
235
|
+
}
|
|
236
|
+
if (!isSubmissionChallengeActionName(declaration.action)) {
|
|
237
|
+
throw createConfigurationError(`Operation '${operation}' declares the submission-challenge action '${String(declaration.action)}'. An action is 1 to 100 `
|
|
238
|
+
+ 'letters, digits, underscores or slashes, the only names a captcha vendor mints tokens for.');
|
|
239
|
+
}
|
|
240
|
+
}
|
|
116
241
|
/**
|
|
117
242
|
* The operations a `retentionPolicy` resource must expose to the SERVICE dispatch
|
|
118
243
|
* layer, with the retention primitive that needs each one.
|
|
@@ -275,7 +400,7 @@ export function reconcileGeneratedRelationshipBulkOperations(resourceConfigurati
|
|
|
275
400
|
}
|
|
276
401
|
}
|
|
277
402
|
/**
|
|
278
|
-
* Derive the
|
|
403
|
+
* Derive the file-export companion of every LIST/SEARCH operation that declared
|
|
279
404
|
* `collectionExport`.
|
|
280
405
|
*
|
|
281
406
|
* ## Why derived rather than authored
|
|
@@ -324,9 +449,27 @@ function createGeneratedCollectionExportOperations(params) {
|
|
|
324
449
|
if (!exportConfig.rowScopes || exportConfig.rowScopes.length === 0) {
|
|
325
450
|
throw createConfigurationError(`[${params.resourceIdentifier}] operation "${sourceOperationIdentifier}" declares collectionExport with no rowScopes; declare at least one, or omit collectionExport entirely`);
|
|
326
451
|
}
|
|
452
|
+
// A PDF is rendered by a template, so declaring the format without naming one leaves the export
|
|
453
|
+
// nothing to render with; naming one without the format is a declaration nothing reads (#1645).
|
|
454
|
+
const offersPdf = exportConfig.formats.includes(ResourceCollectionExportFormat.PDF);
|
|
455
|
+
if (offersPdf && !exportConfig.pdfTemplateId?.trim()) {
|
|
456
|
+
throw createConfigurationError(`[${params.resourceIdentifier}] operation "${sourceOperationIdentifier}" offers the PDF collection-export format but names no pdfTemplateId; a PDF export is rendered by a template`);
|
|
457
|
+
}
|
|
458
|
+
if (!offersPdf && exportConfig.pdfTemplateId !== undefined) {
|
|
459
|
+
throw createConfigurationError(`[${params.resourceIdentifier}] operation "${sourceOperationIdentifier}" names collectionExport.pdfTemplateId but does not offer the PDF format; add ResourceCollectionExportFormat.PDF or remove the template id`);
|
|
460
|
+
}
|
|
327
461
|
if (exportConfig.maximumExportedRows !== undefined && exportConfig.maximumExportedRows <= 0) {
|
|
328
462
|
throw createConfigurationError(`[${params.resourceIdentifier}] operation "${sourceOperationIdentifier}" declares a non-positive collectionExport.maximumExportedRows; omit it for no ceiling`);
|
|
329
463
|
}
|
|
464
|
+
// A PDF cannot stream: the template lays out every row at once, in memory, before a byte is sent. So a
|
|
465
|
+
// whole-set PDF must declare how many rows it will hold — an unbounded one is an allocation any
|
|
466
|
+
// caller with the listing's roles can make as large as the table (#1645). CSV and JSON stream and
|
|
467
|
+
// keep their optional ceiling.
|
|
468
|
+
if (offersPdf
|
|
469
|
+
&& exportConfig.rowScopes.includes(ResourceCollectionExportRowScope.FULL_RESULT_SET)
|
|
470
|
+
&& exportConfig.maximumExportedRows === undefined) {
|
|
471
|
+
throw createConfigurationError(`[${params.resourceIdentifier}] operation "${sourceOperationIdentifier}" offers a whole-set PDF export without collectionExport.maximumExportedRows; a PDF is built in memory from every row, so it must declare its ceiling`);
|
|
472
|
+
}
|
|
330
473
|
const operationIdentifier = Resources_SharedUtils.buildGeneratedCollectionExportOperationIdentifier(sourceOperationIdentifier);
|
|
331
474
|
if (knownOperationIdentifiers.has(operationIdentifier)) {
|
|
332
475
|
throw createConfigurationError(`[${params.resourceIdentifier}] generated collection export operation "${operationIdentifier}" collides with an existing operation identifier`);
|
|
@@ -462,8 +605,19 @@ function createGeneratedFileRegenerateOperations(params) {
|
|
|
462
605
|
}
|
|
463
606
|
const knownOperationIdentifiers = new Set(params.operations.map((operation) => String(operation.operationIdentifier)));
|
|
464
607
|
const responseDto = z.object({
|
|
465
|
-
|
|
466
|
-
|
|
608
|
+
/*
|
|
609
|
+
* A FILE value, marked as one (`z_file()`), not the bare `SingleFileValueSchema` shape. The shape alone is a plain
|
|
610
|
+
* `{ fileId, updatedAt }` object, so every label walk read it as a nested object of two fields: the application
|
|
611
|
+
* labelling planner planned `fields.file.fileId` and `fields.file.updatedAt` for every resource carrying a generated
|
|
612
|
+
* PDF, words no screen reads (#1959). Marked, it classifies as `FieldSchemaType.FILE` like the field it was
|
|
613
|
+
* regenerated from, and is labelled — and displayed — as one file. Generated files are PDFs (`generation` pins that
|
|
614
|
+
* mime type on the source field), so the response says the same; the `generation` block itself names one template
|
|
615
|
+
* and cannot describe a DTO shared by every generated field of the resource.
|
|
616
|
+
*/
|
|
617
|
+
file: z_file({ allowedMimeTypes: 'PDF' }).describe('The newly generated file.'),
|
|
618
|
+
// The record is this resource's own, so its fields are described by its specification (#1625).
|
|
619
|
+
resource: markEmbeddedResourceSchema(generatedFileDiscoverySchema, String(params.resourceIdentifier))
|
|
620
|
+
.describe('The record after the regenerated file was stored on it.'),
|
|
467
621
|
});
|
|
468
622
|
return generatedFields.map(({ fieldName }) => {
|
|
469
623
|
const operationIdentifier = Resources_SharedUtils.buildGeneratedFileRegenerateOperationIdentifier(fieldName);
|
|
@@ -565,6 +719,41 @@ function validateTokenGenerationConfig(config, resourceIdentifier, operationIden
|
|
|
565
719
|
`consumeAt only applies to one-off session tokens.`);
|
|
566
720
|
}
|
|
567
721
|
}
|
|
722
|
+
/**
|
|
723
|
+
* Validates tokenAuthentication configuration at build time.
|
|
724
|
+
*
|
|
725
|
+
* **The only thing this refuses is an EMPTY `types` array, and that is the whole point.**
|
|
726
|
+
* `types: []` is well-typed, reads as "no restriction needed", and used to fail OPEN: the runtime
|
|
727
|
+
* collapsed an empty list to `undefined` and `ConsumableTokenBackendService.validateToken` treats
|
|
728
|
+
* `undefined` as "the caller does its own binding check", so the operation accepted EVERY consumable
|
|
729
|
+
* token type in the system — a password-reset link, an email-verification link, an OAuth state token
|
|
730
|
+
* — with that token's `roles` flowing into the execution context. That is the confused-deputy shape:
|
|
731
|
+
* one token namespace, several verifiers, and an audience check that was optional at the verifier.
|
|
732
|
+
*
|
|
733
|
+
* Refusing here rather than at the verifier is deliberate. A runtime refusal turns an authoring
|
|
734
|
+
* mistake into a request-time failure on a path nobody may exercise before production; a build-time
|
|
735
|
+
* refusal makes the shape unrepresentable, because a resource config is constructed at module load
|
|
736
|
+
* and an application carrying one cannot boot. `validateToken` ALSO refuses an empty array now, as
|
|
737
|
+
* the chokepoint backstop for a config that never passed through this factory — see issue #313.
|
|
738
|
+
*
|
|
739
|
+
* An operation that genuinely wants no type constraint has no expression here and must not get one:
|
|
740
|
+
* the correct authoring is to name every type the operation accepts. A verifier that owns its own
|
|
741
|
+
* binding check (the file-share download, `validateFileToken`) calls `validateToken` directly and
|
|
742
|
+
* never declares `tokenAuthentication` at all.
|
|
743
|
+
*/
|
|
744
|
+
function validateTokenAuthenticationConfig(config, resourceIdentifier, operationIdentifier) {
|
|
745
|
+
const prefix = `[${resourceIdentifier}.${operationIdentifier}] tokenAuthentication`;
|
|
746
|
+
if (!config.types || config.types.length === 0) {
|
|
747
|
+
throw createConfigurationError(`${prefix}: types must be a non-empty array of the consumable token types this operation accepts. ` +
|
|
748
|
+
`An empty list is not "no restriction" — it would accept EVERY consumable token type in the ` +
|
|
749
|
+
`system (password-reset, email-verification, OAuth state, …) as authentication for this ` +
|
|
750
|
+
`operation, with that token's roles. Name the types explicitly.`);
|
|
751
|
+
}
|
|
752
|
+
if (!config.policy) {
|
|
753
|
+
throw createConfigurationError(`${prefix}: policy is required (ALTERNATIVE — the token replaces JWT auth; or ADDITIVE — the ` +
|
|
754
|
+
`token is required on top of it).`);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
568
757
|
/**
|
|
569
758
|
* Validates tokenRevocation configuration at build time.
|
|
570
759
|
*/
|
|
@@ -741,7 +930,8 @@ function buildUpdateRequestDto(mainSchema, customExclusions) {
|
|
|
741
930
|
// back over the stored value (see `toPatchOptionalField`).
|
|
742
931
|
updateShape[fieldName] = toPatchOptionalField(stripTemplatableFileFieldsRecursively(fieldSchema));
|
|
743
932
|
}
|
|
744
|
-
|
|
933
|
+
// PATCH write rule: absent key untouched, null clears — the fact a form reads to clear a field (#989).
|
|
934
|
+
return stripTemplatableFileFieldsRecursively(markPatchRequestDtoObject(z.object(updateShape)));
|
|
745
935
|
}
|
|
746
936
|
catch {
|
|
747
937
|
// If schema is not an object, return as-is
|
|
@@ -1221,16 +1411,53 @@ function processUserNotifications(userNotifications, resourceIdentifier, operati
|
|
|
1221
1411
|
identifierParts.push(notification.level);
|
|
1222
1412
|
}
|
|
1223
1413
|
const autoGeneratedIdentifier = identifierParts.join("_");
|
|
1224
|
-
|
|
1414
|
+
const processed = {
|
|
1225
1415
|
...notification,
|
|
1226
1416
|
identifier: autoGeneratedIdentifier,
|
|
1227
1417
|
primaryScope: resourcePrimaryScope
|
|
1228
1418
|
};
|
|
1419
|
+
assertUserNotificationDeclarationIsDeliverable(processed, resourceIdentifier, operationIdentifier);
|
|
1420
|
+
return processed;
|
|
1229
1421
|
});
|
|
1230
1422
|
}
|
|
1423
|
+
/**
|
|
1424
|
+
* Refuse a declared user notification the dispatcher could never deliver (#1874).
|
|
1425
|
+
*
|
|
1426
|
+
* `UserNotificationDefinitionSchema` states what is deliverable — a channel the dispatcher has an arm for, and a
|
|
1427
|
+
* `userRoles` filter only on a target that reads it (#495) — but no build step ever parsed a declaration against it,
|
|
1428
|
+
* so both rules held only in the type system and a test. A notification on an unknown channel (`'slack'`) was
|
|
1429
|
+
* accepted and every dispatch sent nothing, visible only at debug level. Parsing here makes the same rule hold for
|
|
1430
|
+
* every configuration, typed or not, at the moment it is built — the way the factory already refuses a filter,
|
|
1431
|
+
* sort or search field that names nothing.
|
|
1432
|
+
*/
|
|
1433
|
+
function assertUserNotificationDeclarationIsDeliverable(notification, resourceIdentifier, operationIdentifier) {
|
|
1434
|
+
const parsed = UserNotificationDefinitionSchema.safeParse(notification);
|
|
1435
|
+
if (parsed.success)
|
|
1436
|
+
return;
|
|
1437
|
+
const declared = notification;
|
|
1438
|
+
const problems = parsed.error.issues.map((issue) => `${issue.path.join('.') || '(notification)'}: ${issue.message}`).join('; ');
|
|
1439
|
+
// A channel or target outside its vocabulary fails every member of the channel union, and Zod reports that as one
|
|
1440
|
+
// path-less "Invalid input" — so those two are named from the value itself, with the members that would be valid.
|
|
1441
|
+
const channelIsKnown = Object.values(CoreUserNotificationChannel).includes(declared.channel);
|
|
1442
|
+
const targetIsKnown = Object.values(CoreUserNotificationTarget).includes(declared.target);
|
|
1443
|
+
const reason = !channelIsKnown
|
|
1444
|
+
? `no delivery exists for channel '${String(declared.channel)}'. A channel must be one of ${quoteMembers(CoreUserNotificationChannel)}`
|
|
1445
|
+
: !targetIsKnown
|
|
1446
|
+
? `'${String(declared.target)}' is not a notification target. A target must be one of ${quoteMembers(CoreUserNotificationTarget)}`
|
|
1447
|
+
: problems;
|
|
1448
|
+
throw createConfigurationError(`Operation '${resourceIdentifier}_${operationIdentifier}' declares a user notification (target '${String(declared.target)}', channel '${String(declared.channel)}') that cannot be delivered: ${reason}.`);
|
|
1449
|
+
}
|
|
1450
|
+
/** `'a', 'b', 'c'` — the members of a closed vocabulary, as a refusal names them. */
|
|
1451
|
+
function quoteMembers(vocabulary) {
|
|
1452
|
+
return Object.values(vocabulary).map((member) => `'${member}'`).join(', ');
|
|
1453
|
+
}
|
|
1231
1454
|
/**
|
|
1232
1455
|
* Processes M2M notifications by auto-generating identifiers
|
|
1233
1456
|
* Format: ${resourceIdentifier}_${operationIdentifier}_${channel}
|
|
1457
|
+
*
|
|
1458
|
+
* Each declaration is parsed against `M2MNotificationDefinitionSchema` and an undeliverable channel is refused
|
|
1459
|
+
* here, when the configuration is built. It used to be accepted and to throw "not implemented" at dispatch — after
|
|
1460
|
+
* the write, where the throw also skipped every later M2M notification of the same operation.
|
|
1234
1461
|
*/
|
|
1235
1462
|
function processM2MNotifications(m2mNotifications, resourceIdentifier, operationIdentifier) {
|
|
1236
1463
|
return m2mNotifications.map(notification => {
|
|
@@ -1240,10 +1467,17 @@ function processM2MNotifications(m2mNotifications, resourceIdentifier, operation
|
|
|
1240
1467
|
operationIdentifier,
|
|
1241
1468
|
notification.channel
|
|
1242
1469
|
].join("_");
|
|
1243
|
-
|
|
1470
|
+
const processed = {
|
|
1244
1471
|
...notification,
|
|
1245
1472
|
identifier: autoGeneratedIdentifier
|
|
1246
1473
|
};
|
|
1474
|
+
const parsed = M2MNotificationDefinitionSchema.safeParse(processed);
|
|
1475
|
+
if (!parsed.success) {
|
|
1476
|
+
throw createConfigurationError(`Operation '${resourceIdentifier}_${operationIdentifier}' declares an M2M notification on channel '${String(notification.channel)}' that cannot be delivered: `
|
|
1477
|
+
+ `${parsed.error.issues.map((issue) => `${issue.path.join('.') || '(notification)'}: ${issue.message}`).join('; ')}. `
|
|
1478
|
+
+ `A channel must be one of ${quoteMembers(CoreM2MNotificationChannel)}.`);
|
|
1479
|
+
}
|
|
1480
|
+
return processed;
|
|
1247
1481
|
});
|
|
1248
1482
|
}
|
|
1249
1483
|
// --------------------------------
|
|
@@ -1376,6 +1610,13 @@ export function createResourceSearchQueryRequestSchema(params) {
|
|
|
1376
1610
|
if (schema instanceof z.ZodDate) {
|
|
1377
1611
|
processedFields[key] = Resources_Filter_DateRangeSchema.optional();
|
|
1378
1612
|
}
|
|
1613
|
+
else if (isResourcesFilterNumberRangeSchema(schema)) {
|
|
1614
|
+
// Already the range vocabulary — the author wrote it, which is the opt-in. Named here
|
|
1615
|
+
// rather than left to the fallback below so the numeric range is a VISIBLE branch beside
|
|
1616
|
+
// the date one; the two are the framework's only structured filter shapes and a reader
|
|
1617
|
+
// looking for "which filters are ranges" must find both in one place.
|
|
1618
|
+
processedFields[key] = Resources_Filter_NumberRangeSchema.optional();
|
|
1619
|
+
}
|
|
1379
1620
|
else if (schema instanceof z.ZodString) {
|
|
1380
1621
|
processedFields[key] = schema.optional();
|
|
1381
1622
|
}
|
|
@@ -1537,7 +1778,15 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
1537
1778
|
create: ResourceSystemAccessMode.FORBIDDEN,
|
|
1538
1779
|
update: ResourceSystemAccessMode.FORBIDDEN,
|
|
1539
1780
|
updateMany: ResourceSystemAccessMode.FORBIDDEN,
|
|
1540
|
-
}, isAnonymizable = false,
|
|
1781
|
+
}, isAnonymizable = false,
|
|
1782
|
+
// Carried through UNCHANGED and with no default. Absent means "this resource is not the erasure
|
|
1783
|
+
// lane", which is true of almost every resource — a default here would make every resource claim
|
|
1784
|
+
// to be one. The bindings are validated at boot, not here: this factory has the declaration but
|
|
1785
|
+
// not the registry, and a name resolves against the resource's own schema and operations.
|
|
1786
|
+
subjectErasureLane, transpositionPolicy, retentionPolicy, dataSubjectPolicy, retentionBinding: authoredRetentionBinding, portabilityPolicy,
|
|
1787
|
+
// #1598: `true` makes every row of this resource a CASE a model call can be attributed to. No default
|
|
1788
|
+
// beyond `false`: a case is a product decision, and an unset flag means the resource is not one.
|
|
1789
|
+
workUnit = false, persistenceAdapter, persistenceAdapterIsolation, httpApiBinding, introspectionBinding, coreOperations, customOperation, operationsConfiguration, } = params;
|
|
1541
1790
|
/**
|
|
1542
1791
|
* HTTP_API ↔ binding coherence — enforced at AUTHORING, both directions, because each half
|
|
1543
1792
|
* alone is a contradiction the backend could only discover later and worse:
|
|
@@ -1598,7 +1847,7 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
1598
1847
|
assertHttpApiBindingDialectCoherence(bindingParse.data);
|
|
1599
1848
|
}
|
|
1600
1849
|
catch (error) {
|
|
1601
|
-
throw createConfigurationError(`[${resourceIdentifier}] invalid httpApiBinding declaration: ${
|
|
1850
|
+
throw createConfigurationError(`[${resourceIdentifier}] invalid httpApiBinding declaration: ${describeCaughtError(error)}`);
|
|
1602
1851
|
}
|
|
1603
1852
|
return bindingParse.data;
|
|
1604
1853
|
})();
|
|
@@ -1644,9 +1893,15 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
1644
1893
|
assertHttpApiBindingDialectCoherence(declaration.binding);
|
|
1645
1894
|
}
|
|
1646
1895
|
catch (error) {
|
|
1647
|
-
refuse(
|
|
1896
|
+
refuse(describeCaughtError(error));
|
|
1648
1897
|
}
|
|
1898
|
+
// #1679 / #1690 — whether the binding may open writes is the declaration's own coherence (an INBOUND pipeline
|
|
1899
|
+
// refuses them, an OUTBOUND one requires them), checked above by `assertExternalDataPipelineDeclarationCoherence`.
|
|
1649
1900
|
const shape = getZodObjectShape(mainSchema);
|
|
1901
|
+
if (declaration.direction === ExternalDataPipelineDirection.OUTBOUND) {
|
|
1902
|
+
validateExternalDataOutboundDeclarationAgainstSchema(declaration, shape, params.externalDataPipeline, refuse);
|
|
1903
|
+
return declaration;
|
|
1904
|
+
}
|
|
1650
1905
|
const requireMappedTarget = (fieldName, context) => {
|
|
1651
1906
|
const fieldSchema = shape[fieldName];
|
|
1652
1907
|
if (!fieldSchema)
|
|
@@ -1678,9 +1933,66 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
1678
1933
|
if (!isUniqueField(keyFieldSchema)) {
|
|
1679
1934
|
refuse(`remoteKeyLocalField: '${declaration.remoteKeyLocalField}' must ALSO be declared .isUnique(). The schema planner derives a UNIQUE constraint from .isUnique() and NOT from .isBusinessKey(), so without it the store would accept two rows for one remote row whenever two runs overlap — the merge would be enforced only by this engine's read-then-write, never by the database.`);
|
|
1680
1935
|
}
|
|
1936
|
+
/*
|
|
1937
|
+
* The two PARTITION stamps (#1058 E4), when the source instance is partitioned.
|
|
1938
|
+
*
|
|
1939
|
+
* Validated through `requireMappedTarget` like every other engine-written target, so both
|
|
1940
|
+
* inherit the `.excludeFromCreate()/.excludeFromUpdate()` requirement — these decide who may see
|
|
1941
|
+
* a row and whether an orphan pass deletes it, and a caller that could write either could move
|
|
1942
|
+
* its own rows into another subsidiary's confinement or out of the orphan comparison entirely.
|
|
1943
|
+
*
|
|
1944
|
+
* Both must ACCEPT ABSENCE, and that is the one rule the sibling `remoteKeyLocalField` does not
|
|
1945
|
+
* share. A row whose partition field is unset is SHARED (E2) — it belongs to every caller and to
|
|
1946
|
+
* no unit — so both stamps land `null` on it. A required target would reject exactly the rows
|
|
1947
|
+
* the decision says everyone may see, and it would reject them at LOAD time, per row, with a
|
|
1948
|
+
* reason about a field the author never wrote a value for.
|
|
1949
|
+
*/
|
|
1950
|
+
for (const [label, partitionField] of [
|
|
1951
|
+
['partitionUnitLocalField', declaration.partitionUnitLocalField],
|
|
1952
|
+
['partitionKeyLocalField', declaration.partitionKeyLocalField],
|
|
1953
|
+
]) {
|
|
1954
|
+
if (partitionField === undefined)
|
|
1955
|
+
continue;
|
|
1956
|
+
const partitionSchema = requireMappedTarget(partitionField, label);
|
|
1957
|
+
if (!(unwrapSchema(partitionSchema) instanceof z.ZodString)) {
|
|
1958
|
+
refuse(`${label}: '${partitionField}' must be a STRING field — it stores ${label === 'partitionUnitLocalField' ? 'an ORGANIZATION_UNITS id' : "the remote partition key in the canonical text an assignment row holds"}.`);
|
|
1959
|
+
}
|
|
1960
|
+
if (unwrapSchema(partitionSchema) === partitionSchema) {
|
|
1961
|
+
refuse(`${label}: '${partitionField}' must be optional or nullable. A row whose remote partition field is unset is SHARED — it belongs to every caller and to no unit — and this stamp lands null on it, so a required target rejects exactly the rows every caller is entitled to see.`);
|
|
1962
|
+
}
|
|
1963
|
+
}
|
|
1964
|
+
/*
|
|
1965
|
+
* #1723 — a BIDIRECTIONAL pipeline's fields each have an OWNER, and the ownership rules follow it: a REMOTE field is
|
|
1966
|
+
* the system of record's (excluded from caller writes, exactly as on an INBOUND pipeline); a LOCAL or BOTH field is
|
|
1967
|
+
* the application's too, so callers must be able to write it — excluding it from both create and update would make
|
|
1968
|
+
* the pipeline send a value nobody decided, the OUTBOUND rule.
|
|
1969
|
+
*/
|
|
1970
|
+
const requireSentTarget = (fieldName, context) => {
|
|
1971
|
+
const fieldSchema = shape[fieldName];
|
|
1972
|
+
if (!fieldSchema)
|
|
1973
|
+
refuse(`${context}: local field '${fieldName}' does not exist on mainSchema.`);
|
|
1974
|
+
if (isExcludedFromCreate(fieldSchema) && isExcludedFromUpdate(fieldSchema)) {
|
|
1975
|
+
refuse(`${context}: '${fieldName}' is sent to the system of record (owner LOCAL or BOTH) and is declared .excludeFromCreate() and `
|
|
1976
|
+
+ '.excludeFromUpdate(), so no caller can ever set it and the pipeline would send a value nobody decided. Let callers write it, or declare it owner: REMOTE.');
|
|
1977
|
+
}
|
|
1978
|
+
return fieldSchema;
|
|
1979
|
+
};
|
|
1980
|
+
if (declaration.direction === ExternalDataPipelineDirection.BIDIRECTIONAL) {
|
|
1981
|
+
// Rows born locally have no remote key until their create is sent, and "no key" must stay out of the unique index
|
|
1982
|
+
// on every store: absent, never null (MongoDB indexes an explicit null) — the OUTBOUND rule (#2039 review).
|
|
1983
|
+
if (keyFieldSchema.safeParse(null).success) {
|
|
1984
|
+
refuse(`remoteKeyLocalField: '${declaration.remoteKeyLocalField}' accepts null. Declare it .optional(), not .nullable(): its unique index ignores a row with no key only while "no key" is ABSENT.`);
|
|
1985
|
+
}
|
|
1986
|
+
if (declaration.population === ExternalDataDestinationPopulation.OPEN && unwrapSchema(keyFieldSchema) === keyFieldSchema) {
|
|
1987
|
+
refuse(`remoteKeyLocalField: '${declaration.remoteKeyLocalField}' must be optional — population OPEN lets rows be born here, and such a row has no remote key until its create is sent.`);
|
|
1988
|
+
}
|
|
1989
|
+
}
|
|
1681
1990
|
for (const entry of declaration.mapping) {
|
|
1682
|
-
const
|
|
1683
|
-
|
|
1991
|
+
const owner = resolveExternalDataFieldOwner(entry);
|
|
1992
|
+
const targetSchema = owner === ExternalDataFieldOwner.REMOTE
|
|
1993
|
+
? requireMappedTarget(entry.localField, `mapping('${entry.localField}')`)
|
|
1994
|
+
: requireSentTarget(entry.localField, `mapping('${entry.localField}')`);
|
|
1995
|
+
if (entry.kind === ExternalDataMappingEntryKind.REMOTE_FIELD && owner !== ExternalDataFieldOwner.LOCAL) {
|
|
1684
1996
|
if (!entry.required && unwrapSchema(targetSchema) === targetSchema) {
|
|
1685
1997
|
refuse(`mapping('${entry.localField}'): a non-required remote field can be ABSENT on a row, and absence lands as null — the target must be optional/nullable/defaulted, or declare required: true (absent rows are then rejected and reported per row).`);
|
|
1686
1998
|
}
|
|
@@ -1699,6 +2011,31 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
1699
2011
|
entry.coercion = ExternalDataFieldCoercion.ODOO_FALSE_AS_NULL;
|
|
1700
2012
|
}
|
|
1701
2013
|
}
|
|
2014
|
+
/*
|
|
2015
|
+
* #1684 — a REMOTE_REFERENCE writes a LOCAL foreign key, resolved after the load.
|
|
2016
|
+
*
|
|
2017
|
+
* STRING, because the value is a local row id (a pipeline target) or a synthesized key (a virtual
|
|
2018
|
+
* target), and both are strings. ABSENCE-CAPABLE, because an empty remote reference and an unresolved
|
|
2019
|
+
* one both leave it empty — a required target would make every row whose parent is not loaded yet
|
|
2020
|
+
* unwritable. The relationship half (the field IS a declared foreign key to the target) is checked
|
|
2021
|
+
* below, once relationships are compiled; whether the target is a pipeline destination or a virtual
|
|
2022
|
+
* resource on the same system of record needs the TARGET's configuration, which only the resources
|
|
2023
|
+
* registry holds, so it is refused at startup.
|
|
2024
|
+
*
|
|
2025
|
+
* The value shape defaults from the dialect HERE, like the Odoo false→null coercion above: this is the
|
|
2026
|
+
* one place both the dialect and the author's silence are known, and the runtime reads only the
|
|
2027
|
+
* resolved value.
|
|
2028
|
+
*/
|
|
2029
|
+
if (entry.kind === ExternalDataMappingEntryKind.REMOTE_REFERENCE) {
|
|
2030
|
+
if (!(unwrapSchema(targetSchema) instanceof z.ZodString)) {
|
|
2031
|
+
refuse(`mapping('${entry.localField}'): a REMOTE_REFERENCE writes a local foreign key, so its target must be a STRING field.`);
|
|
2032
|
+
}
|
|
2033
|
+
if (unwrapSchema(targetSchema) === targetSchema) {
|
|
2034
|
+
refuse(`mapping('${entry.localField}'): a REMOTE_REFERENCE leaves its foreign key EMPTY while the reference is empty or its target is not loaded yet, so the field must be optional or nullable.`);
|
|
2035
|
+
}
|
|
2036
|
+
entry.valueShape = resolveExternalDataRemoteReferenceValueShape(entry, declaration.binding.dialect);
|
|
2037
|
+
}
|
|
2038
|
+
validateExternalDataExpressionAgainstTarget(entry, targetSchema, declaration.binding.dialect, refuse);
|
|
1702
2039
|
}
|
|
1703
2040
|
if (declaration.population === ExternalDataDestinationPopulation.CLOSED) {
|
|
1704
2041
|
// Enumerate by the operation's EFFECTIVE semantics, never by its identifier: a CORE operation
|
|
@@ -1826,6 +2163,262 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
1826
2163
|
`(DERIVE RESOURCE PRIMARY SCOPE) for the full rationale.`);
|
|
1827
2164
|
}
|
|
1828
2165
|
// ========================================
|
|
2166
|
+
// HTTP_API × PRIMARY SCOPE — a system of record's rows belong to the OWNER organization
|
|
2167
|
+
// ========================================
|
|
2168
|
+
//
|
|
2169
|
+
// Rows read out of a system of record are STAMPED with the organization that owns the application
|
|
2170
|
+
// (#1055 §6), and the engine's per-row gate reads that stamp. Three things have to be true of the
|
|
2171
|
+
// resource for the stamp to mean anything, and all three are checkable HERE.
|
|
2172
|
+
//
|
|
2173
|
+
// ## Why here, and not at registration — R13 was measured and is wrong on this half
|
|
2174
|
+
//
|
|
2175
|
+
// #1055's review pass says "the resource factory never sees relationships", so the anchor check
|
|
2176
|
+
// must move to boot registration. It does see them: `resourceRelationships` is a parameter of this
|
|
2177
|
+
// function (a resource config is a FUNCTION of the registry's relationship list — see any
|
|
2178
|
+
// `*.resources-config.ts`), and `primaryScopeRelationship` is resolved from it thirty lines up.
|
|
2179
|
+
//
|
|
2180
|
+
// So the split the plan prescribed buys nothing and costs the author their error at the moment they
|
|
2181
|
+
// write the file. What genuinely CANNOT be checked here is the INSTANCE — whether `system` names a
|
|
2182
|
+
// declared one and whether the dialects agree — because the saas configuration is not in scope in
|
|
2183
|
+
// an application's `shared-lib`. That half stays at registration, which is the first place both the
|
|
2184
|
+
// binding and the declaration are visible.
|
|
2185
|
+
if (resolvedHttpApiBinding !== undefined) {
|
|
2186
|
+
if (resourcePrimaryScope !== ResourcePrimaryScope.ORGANIZATIONS) {
|
|
2187
|
+
throw createConfigurationError(`[${resourceIdentifier}] an http-api resource must be ORGANIZATIONS-scoped, and this one resolves to `
|
|
2188
|
+
+ `'${resourcePrimaryScope}'. Its rows are stamped with the organization that owns the application, and the `
|
|
2189
|
+
+ `per-row tenant gate reads that stamp — an APPLICATION- or USER_SELF-scoped resource has no organization in `
|
|
2190
|
+
+ `its execution context to compare it against, so every read would be decided by a field nothing could match.`);
|
|
2191
|
+
}
|
|
2192
|
+
/*
|
|
2193
|
+
* The anchor must be REQUIRES_CONTEXT, and it must name no foreign key.
|
|
2194
|
+
*
|
|
2195
|
+
* STANDALONE is the one that was MEASURED to fail rather than reasoned about: it answered
|
|
2196
|
+
* 403 `parent_scope_denied` to an ORG_OWNER, because `initiatorIds.organizationId` is filled only
|
|
2197
|
+
* from URL parameters and a standalone resource is not routed under its scope parent.
|
|
2198
|
+
*
|
|
2199
|
+
* A `foreignKeyField` would be a field the projection can never fill: a remote row carries no
|
|
2200
|
+
* Wildo organization id, which is the entire reason the stamp exists. Naming one would make every
|
|
2201
|
+
* row look as though it declared a tenant it does not have.
|
|
2202
|
+
*/
|
|
2203
|
+
if (primaryScopeRelationship !== undefined) {
|
|
2204
|
+
if (primaryScopeRelationship.accessScopeStrategy !== ResourceRelationshipAccessScopeStrategy.REQUIRES_CONTEXT) {
|
|
2205
|
+
throw createConfigurationError(`[${resourceIdentifier}] an http-api resource's primary-scope relationship must be REQUIRES_CONTEXT, and this `
|
|
2206
|
+
+ `one is '${String(primaryScopeRelationship.accessScopeStrategy)}'. A STANDALONE anchor is not routed under its `
|
|
2207
|
+
+ `organization, so the execution context carries no organization id and an ORG_OWNER is answered `
|
|
2208
|
+
+ `403 parent_scope_denied — measured, not inferred.`);
|
|
2209
|
+
}
|
|
2210
|
+
if (primaryScopeRelationship.foreignKeyField !== undefined) {
|
|
2211
|
+
throw createConfigurationError(`[${resourceIdentifier}] an http-api resource's primary-scope relationship declares `
|
|
2212
|
+
+ `foreignKeyField '${String(primaryScopeRelationship.foreignKeyField)}', which the projection can never fill — `
|
|
2213
|
+
+ `a remote row carries no Wildo organization id. The tenant anchor is STAMPED onto the projected row from the `
|
|
2214
|
+
+ `application's owner organization; remove the foreign key.`);
|
|
2215
|
+
}
|
|
2216
|
+
}
|
|
2217
|
+
}
|
|
2218
|
+
// ========================================
|
|
2219
|
+
// HTTP_API × WRITES — what a writable read-through resource must declare (#1679)
|
|
2220
|
+
// ========================================
|
|
2221
|
+
//
|
|
2222
|
+
// Everything decidable from this one file: the verbs the binding opens against the operations that
|
|
2223
|
+
// perform them, no bulk write, INLINE only, no `Idempotency-Key: accepted`. (The erasure-stance rule
|
|
2224
|
+
// that used to sit here is the #2010 check just above, which covers reads as well.) The rules and their reasons live on
|
|
2225
|
+
// `assertHttpApiWriteDeclarationCoherence`. What needs the saas configuration (the instance's
|
|
2226
|
+
// partition field) or the engine's dialect registry (whether the dialect can write at all) is
|
|
2227
|
+
// checked at boot registration instead.
|
|
2228
|
+
if (resolvedHttpApiBinding !== undefined) {
|
|
2229
|
+
// #2010: a read-through resource's fields ARE the remote row's, so personal-data categories on them contradict a
|
|
2230
|
+
// NO_SUBJECT_DATA stance whether or not the binding writes. The rule and its remedy live on the util.
|
|
2231
|
+
const personalFields = personalFieldsContradictingNoSubjectDataStance({ stance: resolvedHttpApiBinding.erasure.stance, mainSchema });
|
|
2232
|
+
if (personalFields.length > 0) {
|
|
2233
|
+
throw createConfigurationError(`[${resourceIdentifier}] invalid httpApiBinding erasure stance: ${describeNoSubjectDataStanceContradiction({ system: resolvedHttpApiBinding.system, personalFields })}`);
|
|
2234
|
+
}
|
|
2235
|
+
try {
|
|
2236
|
+
assertHttpApiWriteDeclarationCoherence({
|
|
2237
|
+
binding: resolvedHttpApiBinding,
|
|
2238
|
+
operations: collectHttpApiWriteOperationFacts(coreOperations, operationsConfiguration),
|
|
2239
|
+
mainSchema,
|
|
2240
|
+
});
|
|
2241
|
+
}
|
|
2242
|
+
catch (error) {
|
|
2243
|
+
throw createConfigurationError(`[${resourceIdentifier}] invalid httpApiBinding write declaration: ${describeCaughtError(error)}`);
|
|
2244
|
+
}
|
|
2245
|
+
}
|
|
2246
|
+
// ========================================
|
|
2247
|
+
// EXTERNAL-DATA PIPELINE × PRIMARY SCOPE — the destination is ORGANIZATIONS-owned, and the ENGINE
|
|
2248
|
+
// supplies the tenant
|
|
2249
|
+
// ========================================
|
|
2250
|
+
//
|
|
2251
|
+
// Since #868 a pipeline load STAMPS every entry with the organization that owns the application
|
|
2252
|
+
// (#1054), under the destination's own declared foreign key. So the question this rule asks has
|
|
2253
|
+
// inverted: it used to demand that the AUTHOR supply the tenant, and now it demands that the author
|
|
2254
|
+
// leave room for the ENGINE to.
|
|
2255
|
+
//
|
|
2256
|
+
// ## What the previous rule was, and why it could not stay
|
|
2257
|
+
//
|
|
2258
|
+
// It refused a required scope FK that no mapping supplied, because a load genuinely carried no
|
|
2259
|
+
// tenant. MEASURED 2026-09-11 against a real Mongo store, through the real engines, on a
|
|
2260
|
+
// destination shaped exactly like Wonder Todos' `externalCustomers`:
|
|
2261
|
+
//
|
|
2262
|
+
// | declaration | run | rows | tenant | reachable |
|
|
2263
|
+
// |-----------------------------------------------|--------------|------|--------|-----------|
|
|
2264
|
+
// | no mapping onto the scope FK | completed | 2 | NO | 0 |
|
|
2265
|
+
// | a CONSTANT mapping onto the scope FK | completed | 2 | YES | 2 |
|
|
2266
|
+
//
|
|
2267
|
+
// The first row is why a refusal existed at all: a `completed-pass` run with `entriesFailed: 0`
|
|
2268
|
+
// that writes rows no contextual read can find. A silent success producing unreachable data is
|
|
2269
|
+
// strictly worse than a refusal.
|
|
2270
|
+
//
|
|
2271
|
+
// But both remedies it offered are now WRONG. A `CONSTANT` id cannot be authored — organizations
|
|
2272
|
+
// are created at runtime, so there is no id to commit — and a STANDALONE anchor was measured to
|
|
2273
|
+
// answer 403 `parent_scope_denied` to an ORG_OWNER, because `initiatorIds.organizationId` is filled
|
|
2274
|
+
// only from URL parameters and a standalone resource is not routed under its scope parent. The rule
|
|
2275
|
+
// was refusing the one correct shape and recommending two broken ones.
|
|
2276
|
+
//
|
|
2277
|
+
// ## What it refuses now, and why each one is a LIE rather than an incompleteness
|
|
2278
|
+
//
|
|
2279
|
+
// Every clause below rejects a declaration that would be UNTRUE if it ran, which is the test
|
|
2280
|
+
// `application-creation-directive.md` sets for a refusal. None of them asks anyone to decide
|
|
2281
|
+
// anything: each names the one shape that works.
|
|
2282
|
+
if (externalDataPipeline !== undefined) {
|
|
2283
|
+
// #2010: the fields a pipeline copies are what its source holds, so personal-data categories on them contradict
|
|
2284
|
+
// a NO_SUBJECT_DATA stance on its binding. A CONSTANT entry reads nothing from the source; an unmapped field is
|
|
2285
|
+
// the application's own. The same fields the privacy notice's source statement counts.
|
|
2286
|
+
const copiedFields = new Set(externalDataPipeline.mapping
|
|
2287
|
+
.filter((entry) => entry.kind !== ExternalDataMappingEntryKind.CONSTANT)
|
|
2288
|
+
.map((entry) => entry.localField));
|
|
2289
|
+
const copiedPersonalFields = personalFieldsContradictingNoSubjectDataStance({
|
|
2290
|
+
stance: externalDataPipeline.binding.erasure.stance,
|
|
2291
|
+
mainSchema,
|
|
2292
|
+
sourcedFields: copiedFields,
|
|
2293
|
+
});
|
|
2294
|
+
if (copiedPersonalFields.length > 0) {
|
|
2295
|
+
throw createConfigurationError(`[${resourceIdentifier}] invalid externalDataPipeline erasure stance: ${describeNoSubjectDataStanceContradiction({ system: externalDataPipeline.binding.system, personalFields: copiedPersonalFields })}`);
|
|
2296
|
+
}
|
|
2297
|
+
const pipelineDestinationRefusal = (reason) => {
|
|
2298
|
+
throw createConfigurationError(`[${resourceIdentifier}] invalid externalDataPipeline declaration: ${reason}
|
|
2299
|
+
`
|
|
2300
|
+
+ `
|
|
2301
|
+
`
|
|
2302
|
+
+ `A pipeline reads a SYSTEM OF RECORD — a deployment the operator runs, read with the application's own
|
|
2303
|
+
`
|
|
2304
|
+
+ `service identity — so every row it loads belongs to the organization that OWNS the application, and the
|
|
2305
|
+
`
|
|
2306
|
+
+ `engine stamps that organization onto each entry as it is built. What the destination owes is somewhere
|
|
2307
|
+
`
|
|
2308
|
+
+ `to put it: an ORGANIZATIONS primary scope, reached through a ROUTED relationship
|
|
2309
|
+
`
|
|
2310
|
+
+ `(accessScopeStrategy: REQUIRES_CONTEXT) that names a REQUIRED foreignKeyField, with that field mapped by
|
|
2311
|
+
`
|
|
2312
|
+
+ `nothing and declared .excludeFromCreate().excludeFromUpdate().`);
|
|
2313
|
+
};
|
|
2314
|
+
// (a) The destination must be ORGANIZATIONS-scoped. Decision Q2 of #1049: system-of-record data
|
|
2315
|
+
// belongs to the owner organization, so an APPLICATION- or USER_SELF-scoped destination is a
|
|
2316
|
+
// statement about ownership that contradicts where the rows come from.
|
|
2317
|
+
if (resourcePrimaryScope !== ResourcePrimaryScope.ORGANIZATIONS) {
|
|
2318
|
+
pipelineDestinationRefusal(`its primary scope is ${String(resourcePrimaryScope)}, and a system-of-record destination must be ORGANIZATIONS.`);
|
|
2319
|
+
}
|
|
2320
|
+
// (b) There must BE a routed scope relationship carrying a foreign key. Without one the stamp has
|
|
2321
|
+
// nowhere to land: a field the schema does not declare is dropped by the strict re-parse, and
|
|
2322
|
+
// the row lands unanchored — the measured failure above, arriving through the fix for it.
|
|
2323
|
+
// STANDALONE is called out by name because it is the remedy the previous rule recommended.
|
|
2324
|
+
if (primaryScopeRelationship === undefined) {
|
|
2325
|
+
pipelineDestinationRefusal('it declares no primary-scope relationship, so a loaded row has no tenant field.');
|
|
2326
|
+
}
|
|
2327
|
+
if (primaryScopeRelationship.accessScopeStrategy === ResourceRelationshipAccessScopeStrategy.STANDALONE) {
|
|
2328
|
+
pipelineDestinationRefusal('its primary-scope relationship is STANDALONE. A standalone resource is not routed under its organization, so '
|
|
2329
|
+
+ '`initiatorIds.organizationId` is never filled and an ORG_OWNER is answered 403 parent_scope_denied — measured '
|
|
2330
|
+
+ 'on `billableServices`, 2026-09-14. This was the previous rule\'s own first recommendation.');
|
|
2331
|
+
}
|
|
2332
|
+
const scopeForeignKeyField = primaryScopeRelationship.foreignKeyField;
|
|
2333
|
+
if (scopeForeignKeyField === undefined) {
|
|
2334
|
+
pipelineDestinationRefusal('its primary-scope relationship names no foreignKeyField, so there is no column to stamp the owner organization '
|
|
2335
|
+
+ 'onto. (A VIRTUAL read-through resource is the opposite case and must NOT name one — its rows are projected, '
|
|
2336
|
+
+ 'never stored.)');
|
|
2337
|
+
}
|
|
2338
|
+
// (c) Nothing may MAP onto the tenant field. Two sources of truth for the tenant is the defect,
|
|
2339
|
+
// not a convenience: a mapping wins at load time and the stamp becomes decoration.
|
|
2340
|
+
if (externalDataPipeline.mapping.some((entry) => entry.localField === scopeForeignKeyField)) {
|
|
2341
|
+
pipelineDestinationRefusal(`a mapping entry writes '${String(scopeForeignKeyField)}', which the engine stamps. Two sources of truth for the `
|
|
2342
|
+
+ 'tenant is exactly the ambiguity this rule exists to remove — remove the mapping entry.');
|
|
2343
|
+
}
|
|
2344
|
+
// (d) The tenant field must be REQUIRED. Optional means "a row without a tenant is legal", and no
|
|
2345
|
+
// row loaded from a system of record is: an untenanted row is unreadable, and the schema would
|
|
2346
|
+
// be promising that it is a supported state.
|
|
2347
|
+
const scopeFieldSchema = getZodObjectShape(mainSchema)[scopeForeignKeyField];
|
|
2348
|
+
if (scopeFieldSchema === undefined) {
|
|
2349
|
+
pipelineDestinationRefusal(`its primary-scope relationship names foreignKeyField '${String(scopeForeignKeyField)}', which the schema does not `
|
|
2350
|
+
+ 'declare. The stamp would be dropped by the strict re-parse and every row would land unanchored.');
|
|
2351
|
+
}
|
|
2352
|
+
// `unwrapSchema` strips optional/nullable/default wrappers, so an unwrapped schema IDENTICAL to
|
|
2353
|
+
// the declared one means nothing wrapped it — the same test the mapping validation above uses.
|
|
2354
|
+
if (unwrapSchema(scopeFieldSchema) !== scopeFieldSchema) {
|
|
2355
|
+
pipelineDestinationRefusal(`'${String(scopeForeignKeyField)}' is optional, nullable or defaulted. A row loaded from a system of record always `
|
|
2356
|
+
+ 'has an owner, so an absent tenant is not a state this resource can be in — and declaring it legal makes an '
|
|
2357
|
+
+ 'unreadable row look like a supported one.');
|
|
2358
|
+
}
|
|
2359
|
+
// (e) The tenant field must be excluded from CREATE and UPDATE. It is engine-supplied, so a
|
|
2360
|
+
// client that could send it could hand its own rows to another organization — and one that
|
|
2361
|
+
// could update it could move them.
|
|
2362
|
+
if (!isExcludedFromCreate(scopeFieldSchema) || !isExcludedFromUpdate(scopeFieldSchema)) {
|
|
2363
|
+
pipelineDestinationRefusal(`'${String(scopeForeignKeyField)}' is engine-supplied and must be declared `
|
|
2364
|
+
+ '.excludeFromCreate().excludeFromUpdate(). Without them a caller can name the tenant on a write — creating a row '
|
|
2365
|
+
+ 'under another organization, or moving an existing one out of its own.');
|
|
2366
|
+
}
|
|
2367
|
+
/*
|
|
2368
|
+
* (f) The destination population is NOT constrained here, and that DIVERGES from #868's review
|
|
2369
|
+
* decision R2(e), which said to refuse `OPEN` in this slice. Recorded rather than done quietly.
|
|
2370
|
+
*
|
|
2371
|
+
* R2(e)'s reason was that "caller-minted rows under another organization contradict 'belongs to
|
|
2372
|
+
* the owner'". Two things measured against that:
|
|
2373
|
+
*
|
|
2374
|
+
* - Nothing depends on the claim being universally true. The per-row tenant gate reads each
|
|
2375
|
+
* row's own anchor, so a loaded row owned by the owner organization and a caller-minted row
|
|
2376
|
+
* owned by its creator are both read correctly, by different people. There is no site that
|
|
2377
|
+
* asserts "every row of this resource belongs to the owner".
|
|
2378
|
+
* - A caller cannot name the tenant anyway: clause (e) above requires `.excludeFromCreate()`, so
|
|
2379
|
+
* a caller-minted row takes its organization from the request context like any other, and the
|
|
2380
|
+
* orphan walk cannot reach it either — the walk filters on `__seed.seedKey`, which a
|
|
2381
|
+
* caller-minted row does not carry.
|
|
2382
|
+
*
|
|
2383
|
+
* And the deciding one is this repository's own test for a refusal
|
|
2384
|
+
* (`application-creation-directive.md`): if this refuses, what does the operator do next? The
|
|
2385
|
+
* answer would be "change your product decision about whether callers may add rows" — a
|
|
2386
|
+
* DECISION, not a repair to an untrue artifact. That makes it a workflow gate rather than a
|
|
2387
|
+
* refusal, and the directive says a workflow must MARK rather than block.
|
|
2388
|
+
*
|
|
2389
|
+
* Refusing it would also have made three shipped, tested behaviours unreachable: the CREATE/UPDATE
|
|
2390
|
+
* DTO stripping that protects remote-authoritative fields on caller-minted rows, the admission of
|
|
2391
|
+
* create-shaped custom operations, and the admission of a declared caller CREATE. Those pins live
|
|
2392
|
+
* in `external-data-pipeline-coherence.test.ts` and still pass.
|
|
2393
|
+
*/
|
|
2394
|
+
/*
|
|
2395
|
+
* (g) #1684 — every REMOTE_REFERENCE writes the foreign key of a DECLARED relationship to its target.
|
|
2396
|
+
*
|
|
2397
|
+
* The relationship is what makes the written value a foreign key to the rest of the framework — a
|
|
2398
|
+
* picker, a nested read, a cascade — rather than a string that happens to hold a row id. So a reference
|
|
2399
|
+
* whose local field is not the `foreignKeyField` of a relationship between this resource and the target
|
|
2400
|
+
* would write a value nothing treats as a link: refused. A self-reference (Odoo `res.partner.parent_id`)
|
|
2401
|
+
* is a relationship whose two ends are this resource.
|
|
2402
|
+
*
|
|
2403
|
+
* Checked here, where relationships are compiled; the target's own kind (pipeline destination or virtual
|
|
2404
|
+
* resource on the same system of record) and the orphan-cascade acknowledgement need the TARGET's
|
|
2405
|
+
* configuration and are refused at startup by the resources registry.
|
|
2406
|
+
*/
|
|
2407
|
+
for (const entry of externalDataPipeline.mapping) {
|
|
2408
|
+
if (entry.kind !== ExternalDataMappingEntryKind.REMOTE_REFERENCE)
|
|
2409
|
+
continue;
|
|
2410
|
+
const declaresEdge = relevantRelationships.some((relationship) => relationship.foreignKeyField === entry.localField
|
|
2411
|
+
&& (relationship.resourceType1 === entry.targetResourceType || relationship.resourceType2 === entry.targetResourceType)
|
|
2412
|
+
&& (relationship.resourceType1 === resourceIdentifier || relationship.resourceType2 === resourceIdentifier));
|
|
2413
|
+
if (!declaresEdge) {
|
|
2414
|
+
throw createConfigurationError(`[${resourceIdentifier}] invalid externalDataPipeline declaration: mapping('${entry.localField}') is a REMOTE_REFERENCE to `
|
|
2415
|
+
+ `'${entry.targetResourceType}', and no relationship between '${String(resourceIdentifier)}' and '${entry.targetResourceType}' `
|
|
2416
|
+
+ `names '${entry.localField}' as its foreignKeyField. Declare the relationship (a self-reference is a relationship whose two `
|
|
2417
|
+
+ 'ends are this resource) so the resolved value is a foreign key the rest of the framework follows, not a bare id.');
|
|
2418
|
+
}
|
|
2419
|
+
}
|
|
2420
|
+
}
|
|
2421
|
+
// ========================================
|
|
1829
2422
|
// isAnonymizable VALIDATION & ENRICHMENT (W7.3a)
|
|
1830
2423
|
// ========================================
|
|
1831
2424
|
let effectiveMainSchema = mainSchema;
|
|
@@ -2102,7 +2695,7 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2102
2695
|
resolveImpersonalizeResetValue(fieldSchema, fieldName);
|
|
2103
2696
|
}
|
|
2104
2697
|
catch (error) {
|
|
2105
|
-
throw createConfigurationError(`[${resourceIdentifier}] ${
|
|
2698
|
+
throw createConfigurationError(`[${resourceIdentifier}] ${describeCaughtError(error)}`);
|
|
2106
2699
|
}
|
|
2107
2700
|
}
|
|
2108
2701
|
}
|
|
@@ -2170,6 +2763,20 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2170
2763
|
// fields after the strict parse — see deriveTrustedSystemWritePreservedFields).
|
|
2171
2764
|
effectiveMainSchema = effectiveMainSchema.extend({
|
|
2172
2765
|
retentionStatus: RetentionStatusSchema
|
|
2766
|
+
/*
|
|
2767
|
+
* A framework VOCABULARY, declared as one. `RetentionStatus` is injected onto every resource
|
|
2768
|
+
* that declares a `retentionPolicy`, so without this its members would take their words from
|
|
2769
|
+
* each field PATH in turn — the same enum described afresh per resource, by an LLM that
|
|
2770
|
+
* reaches a different phrasing each time. `.systemEnum()` routes them to
|
|
2771
|
+
* `system_enums.RetentionStatus.*`, authored once and read everywhere.
|
|
2772
|
+
*
|
|
2773
|
+
* It changes nothing visible today, deliberately: the field is `.isHidden()` in both modes,
|
|
2774
|
+
* so the planner now asks for no words for it at all (#1298). The declaration is here so
|
|
2775
|
+
* that the day a surface shows a retention state — a retained-row badge, an erasure report —
|
|
2776
|
+
* it inherits ONE vocabulary rather than starting the per-path drift that #1298 measured on
|
|
2777
|
+
* its sibling `impersonalizedAt`, which had collected eleven English labels unseen.
|
|
2778
|
+
*/
|
|
2779
|
+
.systemEnum('RetentionStatus')
|
|
2173
2780
|
.default(RetentionStatus.ACTIVE)
|
|
2174
2781
|
.isDBIndexed()
|
|
2175
2782
|
.excludeFromCreate()
|
|
@@ -2206,6 +2813,153 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2206
2813
|
seeRetained: ResourceSystemAccessMode.ALLOWED,
|
|
2207
2814
|
};
|
|
2208
2815
|
}
|
|
2816
|
+
// ========================================
|
|
2817
|
+
// retentionBinding VALIDATION & ENRICHMENT (#1613 — how long a row is kept)
|
|
2818
|
+
// ========================================
|
|
2819
|
+
//
|
|
2820
|
+
// A separate axis from `retentionPolicy` above: that one is what an ERASURE does to a row, this one
|
|
2821
|
+
// is how long the row lives. Every refusal here is about the binding being UNENFORCEABLE as written —
|
|
2822
|
+
// a clock that reads a field the row does not have, or two retention authorities on one row — and
|
|
2823
|
+
// each names the exact fix, because the alternative is a period the application publishes and the
|
|
2824
|
+
// sweep silently cannot honour.
|
|
2825
|
+
//
|
|
2826
|
+
// assurance-control: WILDO.PRIVACY.STORAGE_LIMITATION — a declared retention class is refused at
|
|
2827
|
+
// configuration build unless the sweep can actually compute when each row expires.
|
|
2828
|
+
// A tenant's rows never expire by `.ttl()` (#1634). MongoDB deletes a TTL row itself, with no application code
|
|
2829
|
+
// running, so no legal hold, cascade or file release could ever reach it — and a hold on an organization claims
|
|
2830
|
+
// to suspend EVERY deletion of that organization's data. `.ttl()` is for application-scoped framework plumbing
|
|
2831
|
+
// (job executions, job payloads); a tenant resource binds a retention class, whose sweep asks the hold.
|
|
2832
|
+
if (resourcePrimaryScope === ResourcePrimaryScope.ORGANIZATIONS) {
|
|
2833
|
+
const tenantTtlFields = collectRowTtlPolicies(effectiveMainSchema).map((policy) => policy.fieldName);
|
|
2834
|
+
if (tenantTtlFields.length > 0) {
|
|
2835
|
+
throw createConfigurationError(`[${resourceIdentifier}] is scoped to an organization and declares .ttl() on [${tenantTtlFields.join(', ')}]. ` +
|
|
2836
|
+
`A tenant's rows are never expired by the database's own TTL, which no legal hold can suspend: bind a ` +
|
|
2837
|
+
`retentionBinding instead (its sweep deletes through the service layer and skips held rows).`);
|
|
2838
|
+
}
|
|
2839
|
+
}
|
|
2840
|
+
let retentionBinding;
|
|
2841
|
+
if (authoredRetentionBinding !== undefined) {
|
|
2842
|
+
const parsedBinding = ResourceRetentionBindingSchema.safeParse(authoredRetentionBinding);
|
|
2843
|
+
if (!parsedBinding.success) {
|
|
2844
|
+
throw createConfigurationError(`[${resourceIdentifier}] retentionBinding is invalid: ${parsedBinding.error.issues.map((issue) => `${issue.path.join('.') || '(root)'}: ${issue.message}`).join('; ')}.`);
|
|
2845
|
+
}
|
|
2846
|
+
retentionBinding = parsedBinding.data;
|
|
2847
|
+
if (!isZodObject(effectiveMainSchema)) {
|
|
2848
|
+
throw createConfigurationError(`[${resourceIdentifier}] retentionBinding requires a ZodObject mainSchema: the retention clock is a field of the row.`);
|
|
2849
|
+
}
|
|
2850
|
+
const bindingShape = getZodObjectShape(effectiveMainSchema);
|
|
2851
|
+
// One row, one retention authority. `.ttl()` expires the row by a fixed number of seconds, and on
|
|
2852
|
+
// MongoDB natively with no application code running — so no cascade, file release or hold could
|
|
2853
|
+
// ever run for it. Two authorities on one row also means two answers to "when does this go".
|
|
2854
|
+
const ttlFields = collectRowTtlPolicies(effectiveMainSchema).map((policy) => policy.fieldName);
|
|
2855
|
+
if (ttlFields.length > 0) {
|
|
2856
|
+
throw createConfigurationError(`[${resourceIdentifier}] declares BOTH retentionBinding (${retentionBinding.retentionClass}) and .ttl() on ` +
|
|
2857
|
+
`[${ttlFields.join(', ')}]. One row takes one retention authority: remove the .ttl() and let the class ` +
|
|
2858
|
+
`period apply (the retention sweep deletes through the service layer, so cascades, files and RAG chunks ` +
|
|
2859
|
+
`go with the row), or drop retentionBinding if this is framework plumbing that holds no business data.`);
|
|
2860
|
+
}
|
|
2861
|
+
const namesClosureField = retentionBinding.closureFieldName !== undefined;
|
|
2862
|
+
const isClosureEvent = retentionBinding.startPoint === RetentionStartPoint.CLOSURE_EVENT;
|
|
2863
|
+
if (isClosureEvent !== namesClosureField) {
|
|
2864
|
+
throw createConfigurationError(isClosureEvent
|
|
2865
|
+
? `[${resourceIdentifier}] retentionBinding.startPoint CLOSURE_EVENT requires closureFieldName: the date field ` +
|
|
2866
|
+
`whose value is the closure instant. While it is null the row never expires.`
|
|
2867
|
+
: `[${resourceIdentifier}] retentionBinding.closureFieldName is only meaningful with startPoint CLOSURE_EVENT ` +
|
|
2868
|
+
`(got ${retentionBinding.startPoint}). Remove it, or use CLOSURE_EVENT.`);
|
|
2869
|
+
}
|
|
2870
|
+
if (retentionBinding.startPoint === RetentionStartPoint.SCOPE_DELETED) {
|
|
2871
|
+
// The clock is the ORGANIZATION's deletion, so the row must name an organization.
|
|
2872
|
+
if (!bindingShape.organizationId) {
|
|
2873
|
+
throw createConfigurationError(`[${resourceIdentifier}] retentionBinding.startPoint SCOPE_DELETED counts from the row's organization being ` +
|
|
2874
|
+
`marked for deletion, but this resource has no organizationId field. Use CREATED, LAST_UPDATED or CLOSURE_EVENT.`);
|
|
2875
|
+
}
|
|
2876
|
+
if (bindingShape[RETENTION_STARTED_AT_FIELD_NAME]) {
|
|
2877
|
+
throw createConfigurationError(`[${resourceIdentifier}] retentionBinding SCOPE_DELETED injects a reserved '${RETENTION_STARTED_AT_FIELD_NAME}' ` +
|
|
2878
|
+
`field, but this resource already declares one. Rename that field (the retention clock is factory-injected).`);
|
|
2879
|
+
}
|
|
2880
|
+
// The ONE stored retention instant. Nothing on the row records when its organization was marked,
|
|
2881
|
+
// and the organization row itself is destroyed by the purge, so the purge stamps it here first.
|
|
2882
|
+
// Server-owned in every direction: no caller can author it on create or update, it never leaves the
|
|
2883
|
+
// backend, and it is indexed because the sweep queries it on every run.
|
|
2884
|
+
effectiveMainSchema = effectiveMainSchema.extend({
|
|
2885
|
+
[RETENTION_STARTED_AT_FIELD_NAME]: z.date()
|
|
2886
|
+
.optional()
|
|
2887
|
+
.isDBIndexed()
|
|
2888
|
+
.excludeFromCreate()
|
|
2889
|
+
.excludeFromUpdate()
|
|
2890
|
+
.isBackendOnly()
|
|
2891
|
+
.isHidden(),
|
|
2892
|
+
});
|
|
2893
|
+
}
|
|
2894
|
+
else {
|
|
2895
|
+
// Every other start point READS an instant the row already carries, so that field must exist,
|
|
2896
|
+
// be a date, and — for the closure field the author chose — be indexed (the sweep queries it on
|
|
2897
|
+
// every run). `createdAt`/`updatedAt` are indexed by convention and maintained by both adapters.
|
|
2898
|
+
const startFieldName = resolveRetentionStartFieldName(retentionBinding);
|
|
2899
|
+
const startFieldSchema = bindingShape[startFieldName];
|
|
2900
|
+
if (!startFieldSchema || getZodType(unwrapSchema(startFieldSchema)) !== 'date') {
|
|
2901
|
+
throw createConfigurationError(`[${resourceIdentifier}] retentionBinding.startPoint ${retentionBinding.startPoint} reads the row's ` +
|
|
2902
|
+
`'${startFieldName}', which must be a date field of this resource${startFieldSchema ? ' (it is not a date)' : ' (it does not exist)'}.` +
|
|
2903
|
+
(isClosureEvent ? ' Name a z.date() field that is set when the record closes.' : ` Declare ${startFieldName}: z.date() on the schema.`));
|
|
2904
|
+
}
|
|
2905
|
+
if (isClosureEvent && !isDBIndexed(startFieldSchema)) {
|
|
2906
|
+
throw createConfigurationError(`[${resourceIdentifier}] retentionBinding closure field '${startFieldName}' must be .isDBIndexed(): the ` +
|
|
2907
|
+
`retention sweep selects expired rows by it on every run, and an unindexed scan grows with the table.`);
|
|
2908
|
+
}
|
|
2909
|
+
}
|
|
2910
|
+
}
|
|
2911
|
+
// ========================================
|
|
2912
|
+
// retentionPolicy.statutoryRetention (#1635 — a statute keeps the row through an erasure)
|
|
2913
|
+
// ========================================
|
|
2914
|
+
//
|
|
2915
|
+
// Read AFTER both axes above are resolved, because every rule here is a relation BETWEEN them: the
|
|
2916
|
+
// ground lives on the erasure treatment (`retentionPolicy`), and the period it lasts for lives on the
|
|
2917
|
+
// binding (`retentionBinding`). Each refusal names the declaration that would make it true.
|
|
2918
|
+
//
|
|
2919
|
+
// assurance-control: WILDO.PRIVACY.STORAGE_LIMITATION — a row kept through an erasure on a statutory ground
|
|
2920
|
+
// must be bound to the period that ground lasts for, and to a start point whose clock a restricted row can reach.
|
|
2921
|
+
const statutoryRetention = retentionPolicy?.mode ? retentionPolicy.statutoryRetention : undefined;
|
|
2922
|
+
if (retentionBinding?.retentionClass === DataRetentionClass.BUSINESS_RECORDS && !statutoryRetention) {
|
|
2923
|
+
// Invariant 1 of #1635. A BUSINESS_RECORDS row is kept because the law says so; without the ground an
|
|
2924
|
+
// erasure would treat it as the author's choice (or, with no retentionPolicy at all, reach it through the
|
|
2925
|
+
// delete cascade's default) and could not tell the data subject why it was kept or until when.
|
|
2926
|
+
throw createConfigurationError(`[${resourceIdentifier}] binds retention class BUSINESS_RECORDS, whose period is a statutory minimum, but declares no ` +
|
|
2927
|
+
`retentionPolicy.statutoryRetention. Declare retentionPolicy: { mode, statutoryRetention: { ground: ` +
|
|
2928
|
+
`StatutoryRetentionGround.LEGAL_OBLIGATION, rationale: '<the statute>' } } (and a dataSubjectPolicy), so a subject ` +
|
|
2929
|
+
`erasure RESTRICTS these rows until their period ends instead of deleting records the law requires kept. If no ` +
|
|
2930
|
+
`statute applies, bind RESOURCE_DATA instead.`);
|
|
2931
|
+
}
|
|
2932
|
+
if (statutoryRetention) {
|
|
2933
|
+
if (!Object.values(StatutoryRetentionGround).includes(statutoryRetention.ground)) {
|
|
2934
|
+
throw createConfigurationError(`[${resourceIdentifier}] retentionPolicy.statutoryRetention.ground '${String(statutoryRetention.ground)}' is not a ` +
|
|
2935
|
+
`StatutoryRetentionGround (${Object.values(StatutoryRetentionGround).join(', ')}).`);
|
|
2936
|
+
}
|
|
2937
|
+
if (typeof statutoryRetention.rationale !== 'string' || statutoryRetention.rationale.trim().length === 0) {
|
|
2938
|
+
throw createConfigurationError(`[${resourceIdentifier}] retentionPolicy.statutoryRetention.rationale is empty. Name the statute that requires these ` +
|
|
2939
|
+
`rows kept — an operator answering a data subject has to be able to say which law, and a ground with no law named ` +
|
|
2940
|
+
`is a claim nobody can check.`);
|
|
2941
|
+
}
|
|
2942
|
+
if (retentionBinding?.retentionClass !== DataRetentionClass.BUSINESS_RECORDS) {
|
|
2943
|
+
// The PERIOD the ground lasts for is the BUSINESS_RECORDS class period: without that binding there is no end,
|
|
2944
|
+
// and a statutory ground with no end is a standing retention nobody decided.
|
|
2945
|
+
throw createConfigurationError(`[${resourceIdentifier}] declares retentionPolicy.statutoryRetention but ${retentionBinding ? `binds ${retentionBinding.retentionClass}` : 'declares no retentionBinding'}. ` +
|
|
2946
|
+
`A statutory ground lasts for the statutory period, which is dataRetention[BUSINESS_RECORDS]: bind ` +
|
|
2947
|
+
`retentionBinding: { retentionClass: DataRetentionClass.BUSINESS_RECORDS, startPoint: RetentionStartPoint.END_OF_CALENDAR_YEAR }.`);
|
|
2948
|
+
}
|
|
2949
|
+
if (retentionBinding.startPoint === RetentionStartPoint.CLOSURE_EVENT || retentionBinding.startPoint === RetentionStartPoint.LAST_UPDATED) {
|
|
2950
|
+
// Both clocks are ones a RESTRICTED row cannot keep honestly. A restricted row is frozen — every ordinary write is
|
|
2951
|
+
// refused — so a CLOSURE_EVENT row that is still open when its subject is erased can never be closed, and would be
|
|
2952
|
+
// kept forever. And the restriction is itself a write, which moves `updatedAt`, so a LAST_UPDATED clock would be
|
|
2953
|
+
// RESTARTED by the very erasure that reports when it ends. Neither is how a statute counts: HGB §257(5) and
|
|
2954
|
+
// AO §147(4) count from the end of the calendar year.
|
|
2955
|
+
throw createConfigurationError(`[${resourceIdentifier}] declares retentionPolicy.statutoryRetention with retentionBinding.startPoint ` +
|
|
2956
|
+
`${retentionBinding.startPoint}, a clock a restricted row cannot keep: ` +
|
|
2957
|
+
(retentionBinding.startPoint === RetentionStartPoint.CLOSURE_EVENT
|
|
2958
|
+
? `an erasure freezes the row, so a record still open when its subject is erased could never be closed and would be kept forever. `
|
|
2959
|
+
: `the restriction write moves updatedAt, so the erasure would restart the period it reports. `) +
|
|
2960
|
+
`Use END_OF_CALENDAR_YEAR (how commercial and tax statutes count), CREATED, or SCOPE_DELETED.`);
|
|
2961
|
+
}
|
|
2962
|
+
}
|
|
2209
2963
|
// ── dataSubjectPolicy: WHO the row is, and whose session an erasure ends ──────────────────────
|
|
2210
2964
|
//
|
|
2211
2965
|
// Placed AFTER the retention operation contract on purpose: a config can be wrong in several ways
|
|
@@ -2328,6 +3082,130 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2328
3082
|
// consumes. Unlike a nested `.impersonalizeWith()` — which is a boot error because the row would
|
|
2329
3083
|
// flip to RETAINED with the field intact — a nested category breaks nothing at runtime; it simply
|
|
2330
3084
|
// never reaches a notice.
|
|
3085
|
+
/*
|
|
3086
|
+
* ENGINE-INJECTED ANCHORS on a read-through resource (#1058 R7).
|
|
3087
|
+
*
|
|
3088
|
+
* ## What is being injected, and why an author cannot declare it
|
|
3089
|
+
*
|
|
3090
|
+
* A VIRTUAL resource's schema describes the REMOTE entity. Every field in it comes from the
|
|
3091
|
+
* target, and there is no local row — which is exactly why such a resource may carry no field of
|
|
3092
|
+
* ours, no file and no retrieval corpus. So the two anchors the engine needs have nowhere to be
|
|
3093
|
+
* authored:
|
|
3094
|
+
*
|
|
3095
|
+
* - `organizationId` — the application's OWNER organization, stamped onto every projected row
|
|
3096
|
+
* (#1055 §6). The engine's per-row tenant gate reads it; without it, every read answered
|
|
3097
|
+
* `row_carries_no_tenant_anchor`;
|
|
3098
|
+
* - `organizationUnitId` — the ORGANIZATION UNIT owning the row's remote PARTITION (#1058 §3),
|
|
3099
|
+
* and the field `READ_THROUGH_ORGANIZATION_UNIT_FIELD_NAME` names as this resource's derived
|
|
3100
|
+
* `unitFieldName`.
|
|
3101
|
+
*
|
|
3102
|
+
* Both were already WRITTEN by the projector before this. What they lacked was a declared place:
|
|
3103
|
+
* the resource's own contract, its specification and its OpenAPI knew nothing of two fields every
|
|
3104
|
+
* served row carries. `billable-services.schemas.ts` names that gap as this slice's, and this is
|
|
3105
|
+
* it — the declaration, not the stamp.
|
|
3106
|
+
*
|
|
3107
|
+
* ## Required vs optional, which is a statement about the rows
|
|
3108
|
+
*
|
|
3109
|
+
* `organizationId` is REQUIRED: a row that reaches a caller always has one, because the repository
|
|
3110
|
+
* refuses with `OWNER_ORGANIZATION_ABSENT` before serving anything when there is no owner.
|
|
3111
|
+
*
|
|
3112
|
+
* `organizationUnitId` is OPTIONAL, and that is not caution. Two kinds of row genuinely have no
|
|
3113
|
+
* unit — a SHARED row whose partition field is unset (E2, an Odoo product belonging to no company)
|
|
3114
|
+
* and a row of a partition no operator has assigned (E3). Declaring it required would make both
|
|
3115
|
+
* states illegal in a contract that serves them.
|
|
3116
|
+
*
|
|
3117
|
+
* ## Neither can be changed, and only the unit can be NAMED — on a create (#1679)
|
|
3118
|
+
*
|
|
3119
|
+
* `organizationId` is excluded from CREATE and UPDATE, for the reason the pipeline lane states about
|
|
3120
|
+
* its own tenant stamp: a caller who could send it could hand rows to another organization, and one
|
|
3121
|
+
* who could update it could move them. The owner is the application's, never a caller's.
|
|
3122
|
+
*
|
|
3123
|
+
* `organizationUnitId` is excluded from UPDATE for the same reason — a row's partition never moves —
|
|
3124
|
+
* and is ADMITTED on CREATE, because on a writable resource it is how a caller says which unit's
|
|
3125
|
+
* partition a new row belongs to. It is never sent to the remote system: the repository resolves the
|
|
3126
|
+
* unit to its assigned partition key, checks it against the caller's grant, and writes the PARTITION
|
|
3127
|
+
* field itself (#1679). A member confined to one unit need not send it at all; an organization-wide
|
|
3128
|
+
* caller, or a member of several units, must. On a resource with no CREATE operation the admission is
|
|
3129
|
+
* inert, since there is no create DTO for it to appear in.
|
|
3130
|
+
*/
|
|
3131
|
+
if (persistenceAdapter === PersistenceAdapter.HTTP_API) {
|
|
3132
|
+
// EXPLICIT object check, for the reason the retention injection above records: `getZodObjectShape`
|
|
3133
|
+
// returns `{}` for a union, so a try/catch around it is dead code and the real failure surfaces
|
|
3134
|
+
// later as an undiagnosable `extend is not a function`.
|
|
3135
|
+
if (!isZodObject(effectiveMainSchema)) {
|
|
3136
|
+
throw createConfigurationError(`[${resourceIdentifier}] persistenceAdapter 'http-api' injects the '${HTTP_API_ENGINE_INJECTED_FIELDS.join("' and '")}' `
|
|
3137
|
+
+ 'anchors, which requires a ZodObject mainSchema — polymorphic/union mainSchemas are not supported on a '
|
|
3138
|
+
+ 'read-through resource.');
|
|
3139
|
+
}
|
|
3140
|
+
const httpApiShape = getZodObjectShape(effectiveMainSchema);
|
|
3141
|
+
for (const injectedField of HTTP_API_ENGINE_INJECTED_FIELDS) {
|
|
3142
|
+
/*
|
|
3143
|
+
* Zod-4 `.extend()` SILENTLY OVERWRITES a duplicate key, so an author's own field would be
|
|
3144
|
+
* clobbered rather than reported. Refused for a second reason too: the engine stamps this field
|
|
3145
|
+
* on every projected row regardless, so an authored one could never be the value served — it
|
|
3146
|
+
* would be a declaration the author can read in their own schema and never observe taking
|
|
3147
|
+
* effect.
|
|
3148
|
+
*/
|
|
3149
|
+
if (httpApiShape[injectedField]) {
|
|
3150
|
+
throw createConfigurationError(`[${resourceIdentifier}] declares '${injectedField}', which the engine INJECTS on every http-api resource and `
|
|
3151
|
+
+ 'STAMPS on every projected row. An authored field of that name is never the value served — remove it.');
|
|
3152
|
+
}
|
|
3153
|
+
/*
|
|
3154
|
+
* And nothing in the BINDING may target them either.
|
|
3155
|
+
*
|
|
3156
|
+
* The projector applies both stamps LAST, so a mapping onto one is inert rather than dangerous
|
|
3157
|
+
* — which is precisely why it must be refused here. An authoring mistake that silently does
|
|
3158
|
+
* nothing is worse than one that fails: the author reads a declaration that looks like it
|
|
3159
|
+
* decides the tenant, and no run ever disagrees with them.
|
|
3160
|
+
*
|
|
3161
|
+
* This refusal is what the projector's own comment has claimed since #1055. It did not exist —
|
|
3162
|
+
* measured 2026-09-18 across `saas-models`, `saas-backend-lib` and `saas-specifications`, where
|
|
3163
|
+
* the only mapping-target refusals were the external-data PIPELINE's. It matters more now than
|
|
3164
|
+
* it did then: before this block the fields were undeclared, so an author had no reason to
|
|
3165
|
+
* think of them; declaring them is what makes mapping onto one a thing somebody would try.
|
|
3166
|
+
*/
|
|
3167
|
+
if (resolvedHttpApiBinding?.fieldMappings.some((mapping) => mapping.localField === injectedField)) {
|
|
3168
|
+
throw createConfigurationError(`[${resourceIdentifier}] httpApiBinding maps a remote field onto '${injectedField}', which the engine stamps `
|
|
3169
|
+
+ 'after every mapping. The mapping can never take effect — remove it.');
|
|
3170
|
+
}
|
|
3171
|
+
if (resolvedHttpApiBinding?.keyFields.some((keyField) => keyField.localField === injectedField)) {
|
|
3172
|
+
throw createConfigurationError(`[${resourceIdentifier}] httpApiBinding declares a key component landing on '${injectedField}', which the engine `
|
|
3173
|
+
+ 'stamps after every key component. Name a different localField.');
|
|
3174
|
+
}
|
|
3175
|
+
}
|
|
3176
|
+
effectiveMainSchema = effectiveMainSchema.extend({
|
|
3177
|
+
/*
|
|
3178
|
+
* `.isDBIndexed().isForeignKey()` on the tenant anchor, and the reason is a MEASUREMENT rather
|
|
3179
|
+
* than a convention.
|
|
3180
|
+
*
|
|
3181
|
+
* The SQL planner plans a table for an http-api resource today, and before this injection it
|
|
3182
|
+
* derived the tenant column — WITH its index — from the primary-scope relationship. A bare
|
|
3183
|
+
* `z.string()` here takes precedence over that derivation, so the first `wildo db diff` after
|
|
3184
|
+
* the injection reported `DROP_INDEX organizationId` on Wonder Todos: a declared field
|
|
3185
|
+
* silently replacing a derived one, and dropping its index on the way past.
|
|
3186
|
+
*
|
|
3187
|
+
* These decorators restore the plan the relationship produced. They are also what
|
|
3188
|
+
* `resource-schema-awareness.md` requires of every `organizationId` in an application's own
|
|
3189
|
+
* schema, so the injected field now matches what an author would have had to write.
|
|
3190
|
+
*/
|
|
3191
|
+
[HTTP_API_TENANT_ANCHOR_FIELD]: z.string()
|
|
3192
|
+
.isDBIndexed()
|
|
3193
|
+
.isForeignKey()
|
|
3194
|
+
.excludeFromCreate()
|
|
3195
|
+
.excludeFromUpdate(),
|
|
3196
|
+
/*
|
|
3197
|
+
* NOT indexed, deliberately. A read-through resource has no local row, so nothing ever queries
|
|
3198
|
+
* this table by unit — the confinement is a predicate pushed to the REMOTE, in the remote's own
|
|
3199
|
+
* partition key. An index here would cost a migration on every PostgreSQL-backed surface to
|
|
3200
|
+
* serve a query that cannot be issued.
|
|
3201
|
+
*/
|
|
3202
|
+
[READ_THROUGH_ORGANIZATION_UNIT_FIELD_NAME]: z.string()
|
|
3203
|
+
.optional()
|
|
3204
|
+
.excludeFromUpdate()
|
|
3205
|
+
// Described here because no application authors this field (#1625): every read-through resource gets it.
|
|
3206
|
+
.describe('The organization unit that owns the part of the external system this record lives in. Absent for a record every unit shares, or one in a part no unit has been assigned. On a create it names the unit the new record goes to; it never changes afterwards.'),
|
|
3207
|
+
});
|
|
3208
|
+
}
|
|
2331
3209
|
if (isZodObject(effectiveMainSchema)) {
|
|
2332
3210
|
for (const [fieldName, fieldSchema] of Object.entries(getZodObjectShape(effectiveMainSchema))) {
|
|
2333
3211
|
const declared = getDataCategories(fieldSchema);
|
|
@@ -2473,6 +3351,8 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2473
3351
|
const userNotifications = processUserNotifications(config.userNotifications || [], resourceIdentifier, operation, resourcePrimaryScope);
|
|
2474
3352
|
// Process m2mNotifications using helper function
|
|
2475
3353
|
const m2mNotifications = processM2MNotifications(config.m2mNotifications || [], resourceIdentifier, operation);
|
|
3354
|
+
// Parse once so partial authored policies keep defaults and every variant shares the same policy.
|
|
3355
|
+
const queueConfig = ResourceConfiguration_QueueConfigSchema.parse(config.queueConfig);
|
|
2476
3356
|
// Process each variant to create flattened operations
|
|
2477
3357
|
config.variants.forEach((variantParams, variantIndex) => {
|
|
2478
3358
|
// Note: Cascading delete is now handled via childOperations.lifecycle.onParentDelete on relationships
|
|
@@ -2493,7 +3373,7 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2493
3373
|
// ── Dev-time guardrail: custom op borrowing a NON-object envelope verb ──
|
|
2494
3374
|
// A custom operation that borrows DELETE / DELETE_MANY / COUNT via
|
|
2495
3375
|
// `resourceOperationLike` inherits that verb's DEFAULT response envelope
|
|
2496
|
-
// (`{ id
|
|
3376
|
+
// (`{ id }` / `{ deletedIds, deletedCount }` / `{ count }`) as
|
|
2497
3377
|
// its responseDto AND internalDto. That envelope is almost never what a
|
|
2498
3378
|
// custom op actually returns, so at runtime the service output fails
|
|
2499
3379
|
// `transformOutput`'s `internalDto.parse` → HTTP 500
|
|
@@ -2556,6 +3436,7 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2556
3436
|
operationIdentifier: operation,
|
|
2557
3437
|
isOperationDefault,
|
|
2558
3438
|
serviceRuntimeMode: config.serviceRuntimeMode || ResourceOperation_ServiceRuntimeMode.INLINE,
|
|
3439
|
+
queueConfig,
|
|
2559
3440
|
requestDto: derivedRequestDto, // Temporary - will be replaced by buildAllOperationDtos
|
|
2560
3441
|
responseDto: operationResponseDto, // Temporary - will be replaced by buildAllOperationDtos
|
|
2561
3442
|
// When the variant supplied an explicit `requestDto`, it is an author-owned
|
|
@@ -2572,6 +3453,10 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2572
3453
|
// parts, unlike the notification families above, which the factory stamps with scope and
|
|
2573
3454
|
// identifier. `undefined` means the operation consumes no metered product.
|
|
2574
3455
|
recordsUsage: config.recordsUsage,
|
|
3456
|
+
// Same reasoning: one authored object, carried as-is. `undefined` means this operation
|
|
3457
|
+
// declares no purpose of its own beyond whatever `serviceConsentRequirement` already
|
|
3458
|
+
// requires application-wide (#1258 Step 3).
|
|
3459
|
+
consentGate: config.consentGate,
|
|
2575
3460
|
// Fields from ResourceConfiguration_OperationVariant_Base
|
|
2576
3461
|
variantType: variantParams.variantType,
|
|
2577
3462
|
resourceOperationLike: variantParams.resourceOperationLike,
|
|
@@ -2583,6 +3468,10 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2583
3468
|
collectionExport: variantParams.collectionExport,
|
|
2584
3469
|
requiredFeatures: normalizeRequiredFeatures(variantParams.requiredFeatures),
|
|
2585
3470
|
riskLevel: variantParams.riskLevel || ResourceOperationRiskLevel.LOW,
|
|
3471
|
+
// Undeclared stays undefined on purpose: `resolveOperationReversibility` derives the
|
|
3472
|
+
// answer from `resourceOperationLike` when the field is absent, so defaulting it here
|
|
3473
|
+
// would freeze the derivation at config time and make a DELETE added later look reversible.
|
|
3474
|
+
reversibility: variantParams.reversibility,
|
|
2586
3475
|
// Forwarded for the same reason as the flags below: the frontend resources client reads it
|
|
2587
3476
|
// off the RUNTIME operation, so dropping it here would leave a declared long-run timeout
|
|
2588
3477
|
// silently unapplied and the 30s default cutting the request (issue #237).
|
|
@@ -2597,10 +3486,24 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2597
3486
|
// an unforwarded flag would leave the authored requirement silently unenforced — the exact
|
|
2598
3487
|
// failure mode the flag exists to prevent.
|
|
2599
3488
|
requiresStepUpAuthentication: variantParams.requiresStepUpAuthentication,
|
|
3489
|
+
// Forwarded for the same reason: the controller, the service tier and the frontend client all read it off the
|
|
3490
|
+
// RUNTIME operation, so an unforwarded declaration would refuse every keyed request as undeclared. On a
|
|
3491
|
+
// read-through WRITE it is DERIVED as REQUIRED (#1679): a remote write cannot be rolled back, so every retry
|
|
3492
|
+
// must replay the first outcome — see `resolveHttpApiWriteIdempotencyKeyRequirement`.
|
|
3493
|
+
idempotencyKey: resolveHttpApiWriteIdempotencyKeyRequirement(variantParams.idempotencyKey, persistenceAdapter === PersistenceAdapter.HTTP_API
|
|
3494
|
+
&& resolveHttpApiWriteVerb(isCustomOperation ? (variantParams.resourceOperationLike ?? operation) : operation) !== undefined),
|
|
3495
|
+
// Forwarded for the same reason (#1985): `doOperation` asks the challenge off the RUNTIME operation, and the OpenAPI
|
|
3496
|
+
// projector documents the header from it. An unforwarded declaration would leave a public form unprotected while
|
|
3497
|
+
// its configuration says otherwise. A bulk twin inherits it with the rest of these fields.
|
|
3498
|
+
submissionChallenge: variantParams.submissionChallenge,
|
|
2600
3499
|
admitsCrossTenantPlatformAdministration: variantParams.admitsCrossTenantPlatformAdministration,
|
|
2601
3500
|
// Same forwarding obligation as its cross-tenant sibling: the authorizer reads this off the
|
|
2602
3501
|
// RUNTIME operation, so dropping it here would silently re-close the admin surface.
|
|
2603
3502
|
admitsCrossSubjectUserAdministration: variantParams.admitsCrossSubjectUserAdministration,
|
|
3503
|
+
// Third sibling, same forwarding obligation: the scope-root directory classification reads
|
|
3504
|
+
// this off the RUNTIME operation, so dropping it here would re-close a door whose declared
|
|
3505
|
+
// collection shape is the only thing that makes it safe (#1267).
|
|
3506
|
+
admitsSelfConfinedScopeRootWrite: variantParams.admitsSelfConfinedScopeRootWrite,
|
|
2604
3507
|
// Forwarded for the same reason again: the post-commit audit emission reads it off the
|
|
2605
3508
|
// RUNTIME operation. Dropping it would either lose an authored below-floor opt-in (a silent
|
|
2606
3509
|
// audit gap) or lose an authored suppression (a duplicate row next to a purpose-built event).
|
|
@@ -2620,6 +3523,7 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2620
3523
|
// REVOKED partnership both admitting a share.)
|
|
2621
3524
|
referenceConstraints: variantParams.referenceConstraints,
|
|
2622
3525
|
};
|
|
3526
|
+
assertSubmissionChallengeDeclaration(String(operation), variantParams.variantType, variantParams.submissionChallenge);
|
|
2623
3527
|
if (isUrlisableOperationVariantType(variantParams.variantType)) {
|
|
2624
3528
|
const apiCallParams = variantParams;
|
|
2625
3529
|
const isCallbackVariant = apiCallParams.variantType === ResourceOperationVariantType.API_CALL_WITH_CALLBACK;
|
|
@@ -2632,6 +3536,20 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2632
3536
|
if (haveBulkOperation && (operationToCheck === CoreResourceOperation.READ || operationToCheck === CoreResourceOperation.LIST)) {
|
|
2633
3537
|
throw createConfigurationError(`Operation '${operation}' cannot have bulk operations (read and list are not bulkable)`);
|
|
2634
3538
|
}
|
|
3539
|
+
/*
|
|
3540
|
+
* A bulk twin of CREATE has no coherent meaning, so it is refused rather than half-built (#1551).
|
|
3541
|
+
*
|
|
3542
|
+
* The twin keeps `operationIdentifier: 'create'`, so the controller, the service dispatcher and both
|
|
3543
|
+
* repositories route it to the SINGLE-row create; only the request DTO pretended otherwise, and this
|
|
3544
|
+
* factory and the DTO builder even disagreed on which pretence. Batch creation is CREATE_MANY, whose
|
|
3545
|
+
* request is the `{ data: row[] }` envelope its service reads. No authored resource declared a bulk
|
|
3546
|
+
* twin of CREATE when this refusal was added (22 `haveBulkOperation` declarations, all on DELETE or
|
|
3547
|
+
* UPDATE-like operations).
|
|
3548
|
+
*/
|
|
3549
|
+
if (haveBulkOperation && operationToCheck === CoreResourceOperation.CREATE) {
|
|
3550
|
+
throw createConfigurationError(`Operation '${operation}' cannot have a bulk twin: every tier would run it as a single-row create. `
|
|
3551
|
+
+ `Declare ${CoreResourceOperation.CREATE_MANY} for batch creation — its request is { data: row[] }.`);
|
|
3552
|
+
}
|
|
2635
3553
|
const tokenStateSideEffects = [
|
|
2636
3554
|
...(apiCallParams.tokenGeneration ? ['tokenGeneration'] : []),
|
|
2637
3555
|
...(apiCallParams.tokenRevocation ? ['tokenRevocation'] : []),
|
|
@@ -2648,6 +3566,35 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2648
3566
|
throw createConfigurationError(`Operation '${operation}' cannot revoke tokens before a CREATE operation because no current resource state exists. `
|
|
2649
3567
|
+ 'Move token revocation to an operation that addresses an existing resource.');
|
|
2650
3568
|
}
|
|
3569
|
+
/*
|
|
3570
|
+
* (After the token-state checks, so a declaration that breaks both is told about the token rule too.)
|
|
3571
|
+
*
|
|
3572
|
+
* A client-facing core UPDATE_MANY or DELETE_MANY is a route that can never succeed, so it is refused
|
|
3573
|
+
* (#1793).
|
|
3574
|
+
*
|
|
3575
|
+
* This loop builds it as a NON-bulk operation (`isBulkOperation: false` below) mounted on the
|
|
3576
|
+
* collection path, and only a bulk operation has its selector lifted out of the body — `_ids` by the
|
|
3577
|
+
* service's `doOperation`, `_match` by the controller. So no request shape can reach
|
|
3578
|
+
* `updateMany` / `deleteMany` with a target, and the route answers every call with
|
|
3579
|
+
* `service_resource_validation_failed`. Measured on a running stack against an escalation-policy
|
|
3580
|
+
* collection before its variant moved: `{}`, `{ _ids: [...] }`, a filter and a field patch were all
|
|
3581
|
+
* refused, while GET on the same collection answered 200.
|
|
3582
|
+
*
|
|
3583
|
+
* The two working doors are named in the message: INTERNAL_CALL keeps the operation as the service
|
|
3584
|
+
* capability retention scrubs and anonymous-ownership transfer call with an explicit target, and a
|
|
3585
|
+
* `haveBulkOperation: true` variant on UPDATE / DELETE (or a custom operation) is the client bulk door,
|
|
3586
|
+
* with its selector, its max-selection limit and its place in the bulk bar. Scoped to the CORE
|
|
3587
|
+
* identifiers: a custom operation that borrows `resourceOperationLike: UPDATE_MANY` has its own request
|
|
3588
|
+
* and implementation and is unaffected. CREATE_MANY's `{ data: row[] }` form works and is untouched.
|
|
3589
|
+
*/
|
|
3590
|
+
if (!isCustomOperation
|
|
3591
|
+
&& (operation === CoreResourceOperation.UPDATE_MANY || operation === CoreResourceOperation.DELETE_MANY)) {
|
|
3592
|
+
throw createConfigurationError(`Operation '${operation}' cannot be declared ${apiCallParams.variantType}: a client-facing core ${operation} is mounted `
|
|
3593
|
+
+ 'as a non-bulk route, no selector ever reaches it, and it refuses every request. '
|
|
3594
|
+
+ `Declare it ${ResourceOperationVariantType.INTERNAL_CALL} for a service-side capability, or give `
|
|
3595
|
+
+ `${operation === CoreResourceOperation.UPDATE_MANY ? CoreResourceOperation.UPDATE : CoreResourceOperation.DELETE} `
|
|
3596
|
+
+ 'a `haveBulkOperation: true` variant for a client bulk action.');
|
|
3597
|
+
}
|
|
2651
3598
|
// Determine HTTP verb - for custom operations, use resourceOperationLike
|
|
2652
3599
|
let httpVerb;
|
|
2653
3600
|
if (isCustomOperation) {
|
|
@@ -2668,6 +3615,9 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2668
3615
|
if (apiCallParams.tokenRevocation) {
|
|
2669
3616
|
validateTokenRevocationConfig(apiCallParams.tokenRevocation, resourceIdentifier, operation);
|
|
2670
3617
|
}
|
|
3618
|
+
if (apiCallParams.tokenAuthentication) {
|
|
3619
|
+
validateTokenAuthenticationConfig(apiCallParams.tokenAuthentication, resourceIdentifier, operation);
|
|
3620
|
+
}
|
|
2671
3621
|
const apiCallOperationFields = {
|
|
2672
3622
|
...baseOperationFields,
|
|
2673
3623
|
httpVerb,
|
|
@@ -2698,6 +3648,16 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2698
3648
|
|| variantParams.resourceOperationLike === CoreResourceOperation.SEARCH;
|
|
2699
3649
|
const isListLike = operation === CoreResourceOperation.LIST
|
|
2700
3650
|
|| variantParams.resourceOperationLike === CoreResourceOperation.LIST;
|
|
3651
|
+
if (isSearchLike || isListLike) {
|
|
3652
|
+
assertCollectionFieldsNameResourceFields({
|
|
3653
|
+
resourceIdentifier: String(resourceIdentifier),
|
|
3654
|
+
operationLabel: `operation "${String(operation)}"${apiCallParams.variantKey ? ` (variant "${apiCallParams.variantKey}")` : ''}`,
|
|
3655
|
+
schemaShape: getZodObjectShape(effectiveMainSchema),
|
|
3656
|
+
filterFields: variantParams.filterFields,
|
|
3657
|
+
sortFields: variantParams.sortFields,
|
|
3658
|
+
searchableFields: isSearchLike ? variantParams.searchableFields : undefined,
|
|
3659
|
+
});
|
|
3660
|
+
}
|
|
2701
3661
|
if (isSearchLike) {
|
|
2702
3662
|
const pageSize = variantParams.pageSize ?? 20;
|
|
2703
3663
|
const isSearchable = variantParams.isSearchable !== false;
|
|
@@ -2705,13 +3665,10 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2705
3665
|
const searchableOptions = variantParams.searchableOptions || { caseSensitive: false, fullMatchOnly: false };
|
|
2706
3666
|
const rawFilterFields = variantParams.filterFields || {};
|
|
2707
3667
|
const sortFields = variantParams.sortFields || [];
|
|
2708
|
-
const maxPaginatedResultPerPageLimit = variantParams.maxPaginatedResultPerPageLimit ||
|
|
2709
|
-
|
|
2710
|
-
|
|
2711
|
-
|
|
2712
|
-
filterFields[key] = value;
|
|
2713
|
-
}
|
|
2714
|
-
});
|
|
3668
|
+
const maxPaginatedResultPerPageLimit = variantParams.maxPaginatedResultPerPageLimit || DEFAULT_SEARCH_PAGE_CEILING;
|
|
3669
|
+
// Every entry is a Zod type by now: `assertCollectionFieldsNameResourceFields` refused the
|
|
3670
|
+
// function-valued slot above.
|
|
3671
|
+
const filterFields = rawFilterFields;
|
|
2715
3672
|
const searchQueryRequestSchema = createResourceSearchQueryRequestSchema({
|
|
2716
3673
|
filterFields,
|
|
2717
3674
|
allowedSortFields: sortFields,
|
|
@@ -2725,6 +3682,12 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2725
3682
|
validateArrayConstraints: true,
|
|
2726
3683
|
maxResultsPerPageLimit: maxPaginatedResultPerPageLimit
|
|
2727
3684
|
});
|
|
3685
|
+
// An author's `customResponseDto` wins here exactly as it does for every other operation
|
|
3686
|
+
// (`deriveResponseDto` above). This block used to overwrite it with the generated schema and
|
|
3687
|
+
// stamp `hasCustomResponseDto: false`, so a searchable variant silently lost the contract it
|
|
3688
|
+
// declared — found when inbound deliveries declared one to keep the raw payload out of a page
|
|
3689
|
+
// (#1596). A custom DTO must carry the same page ceiling as this variant.
|
|
3690
|
+
const customSearchResponseDto = variantParams.customResponseDto;
|
|
2728
3691
|
Object.assign(apiCallOperationFields, {
|
|
2729
3692
|
pageSize,
|
|
2730
3693
|
isSearchable,
|
|
@@ -2734,8 +3697,8 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2734
3697
|
sortFields,
|
|
2735
3698
|
maxPaginatedResultPerPageLimit,
|
|
2736
3699
|
searchQueryRequestSchema,
|
|
2737
|
-
responseDto: paginatedResponseSchema,
|
|
2738
|
-
hasCustomResponseDto:
|
|
3700
|
+
responseDto: customSearchResponseDto ?? paginatedResponseSchema,
|
|
3701
|
+
hasCustomResponseDto: customSearchResponseDto !== undefined,
|
|
2739
3702
|
});
|
|
2740
3703
|
}
|
|
2741
3704
|
if (isListLike) {
|
|
@@ -2746,7 +3709,7 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2746
3709
|
// LIST has one pagination authority. Keep the effective ceiling on the resolved
|
|
2747
3710
|
// operation so request/response DTO construction, repositories, auto-generated
|
|
2748
3711
|
// SUMMARY/CONTEXT variants and API-reference projection all observe the same value.
|
|
2749
|
-
maxPaginatedResultPerPageLimit: variantParams.maxPaginatedResultPerPageLimit ??
|
|
3712
|
+
maxPaginatedResultPerPageLimit: variantParams.maxPaginatedResultPerPageLimit ?? DEFAULT_LIST_PAGE_CEILING,
|
|
2750
3713
|
};
|
|
2751
3714
|
if (variantParams.filterFields !== undefined) {
|
|
2752
3715
|
listEnrichment.filterFields = variantParams.filterFields;
|
|
@@ -2761,28 +3724,27 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2761
3724
|
operations.push(apiCallOperationFields);
|
|
2762
3725
|
// Add bulk operation if enabled
|
|
2763
3726
|
if (haveBulkOperation) {
|
|
2764
|
-
|
|
2765
|
-
|
|
2766
|
-
|
|
2767
|
-
|
|
2768
|
-
|
|
2769
|
-
|
|
2770
|
-
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
|
-
|
|
2774
|
-
|
|
2775
|
-
|
|
2776
|
-
}
|
|
2777
|
-
|
|
2778
|
-
|
|
2779
|
-
: Resources_BulkOperationBaseSchema;
|
|
2780
|
-
})();
|
|
3727
|
+
// The documented, enforced batch limit (`BULK_OPERATION_DEFAULT_MAX_SELECTION` unless the
|
|
3728
|
+
// variant declares `bulkOperationMaxSelection`). A bulk CREATE is bounded on its `data` rows
|
|
3729
|
+
// for the same reason a bulk UPDATE/DELETE is bounded on its `_ids`.
|
|
3730
|
+
const bulkMaxSelection = resolveBulkOperationMaxSelection(apiCallParams);
|
|
3731
|
+
const rowRequestDto = apiCallOperationFields.requestDto;
|
|
3732
|
+
// The DTO builder rebuilds this later from the same function; both must agree.
|
|
3733
|
+
const bulkDto = wrapRequestDtoAsBulk({
|
|
3734
|
+
rowRequestDto: rowRequestDto && !(rowRequestDto instanceof z.ZodObject && Object.keys(rowRequestDto.shape).length === 0)
|
|
3735
|
+
? rowRequestDto
|
|
3736
|
+
: undefined,
|
|
3737
|
+
maxSelection: bulkMaxSelection,
|
|
3738
|
+
// The DTO builder's predicate, verbatim, so the two constructions cannot disagree: a bulk twin
|
|
3739
|
+
// of CREATE is refused above, and only CREATE_MANY takes `{ data: [] }`.
|
|
3740
|
+
isCreate: operationToCheck === CoreResourceOperation.CREATE_MANY,
|
|
3741
|
+
});
|
|
2781
3742
|
const bulkOperationFields = {
|
|
2782
3743
|
...apiCallOperationFields,
|
|
2783
3744
|
isBulkOperation: true,
|
|
2784
3745
|
isOperationDefault: false, // Bulk operations are never default
|
|
2785
|
-
requestDto: bulkDto
|
|
3746
|
+
requestDto: bulkDto,
|
|
3747
|
+
bulkOperationMaxSelection: bulkMaxSelection,
|
|
2786
3748
|
};
|
|
2787
3749
|
operations.push(bulkOperationFields);
|
|
2788
3750
|
}
|
|
@@ -2792,7 +3754,10 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2792
3754
|
const { variantType, ...specificFields } = variantParams; // Extract variantType and get rest
|
|
2793
3755
|
const nonApiCallOperation = {
|
|
2794
3756
|
...baseOperationFields,
|
|
2795
|
-
...specificFields
|
|
3757
|
+
...specificFields,
|
|
3758
|
+
...((variantParams.variantType === ResourceOperationVariantType.CRON_JOB || variantParams.variantType === ResourceOperationVariantType.BATCH_JOB)
|
|
3759
|
+
? { scheduledRecovery: normalizeScheduledRecoveryPolicy(variantParams.scheduledRecovery) }
|
|
3760
|
+
: {}),
|
|
2796
3761
|
};
|
|
2797
3762
|
operations.push(nonApiCallOperation);
|
|
2798
3763
|
}
|
|
@@ -2834,6 +3799,7 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2834
3799
|
operationIdentifier: operation,
|
|
2835
3800
|
isOperationDefault: false, // Auto-variants are never operation default
|
|
2836
3801
|
serviceRuntimeMode: config.serviceRuntimeMode || ResourceOperation_ServiceRuntimeMode.INLINE,
|
|
3802
|
+
queueConfig,
|
|
2837
3803
|
requestDto: defaultApiCallVariant.requestDto || deriveRequestDto(operation, effectiveMainSchema, undefined), // Temporary - will be replaced by buildAllOperationDtos
|
|
2838
3804
|
// Forwarded for the same reason as `unimplementedAcknowledgement` below: an auto-variant
|
|
2839
3805
|
// is a projection of the default variant, so it inherits that variant's request contract
|
|
@@ -2841,6 +3807,15 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2841
3807
|
// AUTHORED contract look auto-derived to the request-contract-breadth guard.
|
|
2842
3808
|
hasCustomRequestDto: defaultApiCallVariant.hasCustomRequestDto ?? !!defaultApiCallVariant.requestDto,
|
|
2843
3809
|
responseDto, // Temporary - will be replaced by buildAllOperationDtos
|
|
3810
|
+
// Stamped like every other factory-built operation, and it is what makes "temporary" true. An
|
|
3811
|
+
// auto-variant's `responseDto` is framework-derived, but without the flag the DTO rebuild
|
|
3812
|
+
// fell back to its structural heuristic, found the temporary schema "significantly
|
|
3813
|
+
// different" from the rebuilt one and PRESERVED it as custom. For a CONTEXT variant that
|
|
3814
|
+
// temporary schema is the context DTO of the empty-registry factory pass, so the full-
|
|
3815
|
+
// registry rebuild added the runtime relationship field BESIDE the fallback one:
|
|
3816
|
+
// `users/self/context` declared both `userSelfPreference` and `userSelfPreferences`, at
|
|
3817
|
+
// runtime and in the published API reference (#582).
|
|
3818
|
+
hasCustomResponseDto: false,
|
|
2844
3819
|
notificationBadgeOperations: config.notificationBadgeOperations || [],
|
|
2845
3820
|
userNotifications,
|
|
2846
3821
|
m2mNotifications,
|
|
@@ -2848,6 +3823,9 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2848
3823
|
resourceOperationLike: defaultApiCallVariant.resourceOperationLike,
|
|
2849
3824
|
requiredFeatures: normalizeRequiredFeatures(defaultApiCallVariant.requiredFeatures),
|
|
2850
3825
|
riskLevel: defaultApiCallVariant.riskLevel || ResourceOperationRiskLevel.LOW,
|
|
3826
|
+
// Inherited like riskLevel: an auto-variant is a projection of the default variant, so a
|
|
3827
|
+
// SUMMARY or CONTEXT derivative of an irreversible operation is equally irreversible.
|
|
3828
|
+
reversibility: defaultApiCallVariant.reversibility,
|
|
2851
3829
|
// Inherited like riskLevel: an auto-variant is a projection of the default variant. The
|
|
2852
3830
|
// read-shaped projections are unlikely to need it, but inheriting keeps "projection of
|
|
2853
3831
|
// the default" a single consistent rule rather than a per-field accident.
|
|
@@ -2863,11 +3841,19 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2863
3841
|
// anyway — inheriting keeps that a property of the exemption list rather than an accident
|
|
2864
3842
|
// of this projection.)
|
|
2865
3843
|
requiresStepUpAuthentication: defaultApiCallVariant.requiresStepUpAuthentication,
|
|
3844
|
+
// Inherited like step-up: an auto-variant projects the default variant's contract, header included.
|
|
3845
|
+
idempotencyKey: defaultApiCallVariant.idempotencyKey,
|
|
3846
|
+
// Inherited like the Idempotency-Key: a projection of a protected operation asks the same challenge (#1985).
|
|
3847
|
+
submissionChallenge: defaultApiCallVariant.submissionChallenge,
|
|
2866
3848
|
admitsCrossTenantPlatformAdministration: defaultApiCallVariant.admitsCrossTenantPlatformAdministration,
|
|
2867
3849
|
// Inherited for the same reason as the cross-tenant flag: an auto-variant is a PROJECTION of
|
|
2868
3850
|
// the default operation and must make the same addressing claim, or it would refuse the very
|
|
2869
3851
|
// subjects the operation it projects is admitted to administer.
|
|
2870
3852
|
admitsCrossSubjectUserAdministration: defaultApiCallVariant.admitsCrossSubjectUserAdministration,
|
|
3853
|
+
// Inherited for the same reason as both siblings: an auto-variant projects the default
|
|
3854
|
+
// variant's contract, and a projection that dropped this claim would be classified as an
|
|
3855
|
+
// unconfined directory write while the operation it projects is not.
|
|
3856
|
+
admitsSelfConfinedScopeRootWrite: defaultApiCallVariant.admitsSelfConfinedScopeRootWrite,
|
|
2871
3857
|
// Inherited for the same reason: an auto-variant is a projection of the default variant,
|
|
2872
3858
|
// so it must make the same audit claim. Inheriting a `suppressGenericEvent` matters most —
|
|
2873
3859
|
// the purpose-built event that supersedes the default covers its projections too, and a
|
|
@@ -2924,6 +3910,17 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
2924
3910
|
if (defaultApiCallVariant.tokenRevocation) {
|
|
2925
3911
|
validateTokenRevocationConfig(defaultApiCallVariant.tokenRevocation, resourceIdentifier, `${operation}.${variantKey}`);
|
|
2926
3912
|
}
|
|
3913
|
+
// `tokenAuthentication` is deliberately NOT re-validated here, and the absence is a decision
|
|
3914
|
+
// rather than an omission (issue #313). `defaultApiCallVariant` is SELECTED from `operations`
|
|
3915
|
+
// — variants that were built, and validated, by the authored path above — so its
|
|
3916
|
+
// `tokenAuthentication` cannot be a value that block has not already refused. A guard here
|
|
3917
|
+
// would be unreachable, and an unreachable guard is not defence in depth: it is an untested
|
|
3918
|
+
// claim that reads like coverage (`.claude/rules/invariant-call-site-enumeration.md` #25,
|
|
3919
|
+
// #19). Measured: neutering it left every pin in
|
|
3920
|
+
// `token-authentication-type-list.guard.test.ts` green.
|
|
3921
|
+
//
|
|
3922
|
+
// The same is true of the two blocks immediately above — they predate this note and are kept
|
|
3923
|
+
// as found, but do not add a fourth on their model.
|
|
2927
3924
|
return baseOperationFields;
|
|
2928
3925
|
};
|
|
2929
3926
|
// Generate READ.summary variant
|
|
@@ -3093,6 +4090,25 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
3093
4090
|
`its transport group — a lone variant marked \`isDefault: false\` leaves the group with NO default.`);
|
|
3094
4091
|
}
|
|
3095
4092
|
}
|
|
4093
|
+
// ── RESOLVABILITY of the retention-class sweep's delete (#1613) ───────────
|
|
4094
|
+
//
|
|
4095
|
+
// The class sweep deletes expired rows through the SERVICE layer — so cascades, file release and RAG
|
|
4096
|
+
// chunk removal run — preferring a DELETE_MANY and falling back to per-row DELETE, exactly the
|
|
4097
|
+
// anonymous-session cleanup's disjunction. A binding with neither resolvable would boot green and then
|
|
4098
|
+
// fail the first sweep that found an expired row, which is a published period nothing can enforce.
|
|
4099
|
+
if (retentionBinding) {
|
|
4100
|
+
const deleteAlternatives = [CoreResourceOperation.DELETE_MANY, CoreResourceOperation.DELETE];
|
|
4101
|
+
if (!deleteAlternatives.some((alternative) => operations.some((candidate) => isServiceResolvableDefaultOperation(candidate, alternative)))) {
|
|
4102
|
+
const declaredVariants = operations
|
|
4103
|
+
.filter((candidate) => deleteAlternatives.includes(candidate.operationIdentifier))
|
|
4104
|
+
.map((candidate) => `${String(candidate.operationIdentifier)}/${candidate.variantType}${candidate.isOperationDefault ? ' (default)' : ''}`);
|
|
4105
|
+
throw createConfigurationError(`[${resourceIdentifier}] retentionBinding requires DELETE_MANY or DELETE to be SERVICE-RESOLVABLE: the retention ` +
|
|
4106
|
+
`sweep deletes expired rows through the service layer so cascades, files and RAG chunks go with them. ` +
|
|
4107
|
+
`Declared variants: [${declaredVariants.length > 0 ? declaredVariants.join(', ') : 'none'}]. Declare one as the ` +
|
|
4108
|
+
`default ${ResourceOperationVariantType.INTERNAL_CALL} variant (route-less and service-resolvable); ` +
|
|
4109
|
+
`REPOSITORY_ONLY is served by a different transport and does not resolve.`);
|
|
4110
|
+
}
|
|
4111
|
+
}
|
|
3096
4112
|
// ── RESOLVABILITY half of the ANONYMIZABLE operation contract ───────────
|
|
3097
4113
|
//
|
|
3098
4114
|
// Same two-halves shape as retention above, for the other dynamic-loop capability. The presence
|
|
@@ -3146,6 +4162,7 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
3146
4162
|
isSystemResource,
|
|
3147
4163
|
primaryKeyIdentifiesInitiator,
|
|
3148
4164
|
systemAccessPolicy: effectiveSystemAccessPolicy,
|
|
4165
|
+
subjectErasureLane,
|
|
3149
4166
|
isAnonymizable,
|
|
3150
4167
|
transpositionPolicy: isAnonymizable
|
|
3151
4168
|
? (transpositionPolicy ?? ResourceTranspositionPolicy.ADD)
|
|
@@ -3157,11 +4174,14 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
3157
4174
|
retentionPolicy: retentionPolicy?.mode ? retentionPolicy : undefined,
|
|
3158
4175
|
// Paired with `retentionPolicy` by the guards above, so these two are present together or not at all.
|
|
3159
4176
|
dataSubjectPolicy: retentionPolicy?.mode ? dataSubjectPolicy : undefined,
|
|
4177
|
+
// Validated and parsed above, so the resolved value is exactly the strict-parsed declaration.
|
|
4178
|
+
retentionBinding,
|
|
3160
4179
|
// Normalize (mirror retentionPolicy): the resolved portabilityPolicy is present IFF the
|
|
3161
4180
|
// resource actually declared a default. An absent `defaultProvenance` is a policy-shaped
|
|
3162
4181
|
// opt-out, and shipping a truthy-but-empty object would make an Art. 20 export believe a
|
|
3163
4182
|
// default exists and silently include fields nobody classified.
|
|
3164
4183
|
portabilityPolicy: portabilityPolicy?.defaultProvenance ? portabilityPolicy : undefined,
|
|
4184
|
+
workUnit,
|
|
3165
4185
|
operations: operations // Temporary - will be replaced
|
|
3166
4186
|
};
|
|
3167
4187
|
// Pre-compute all DTOs for each operation using buildAllOperationDtos
|
|
@@ -3169,6 +4189,27 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
3169
4189
|
// If needed, the registry can be passed as a parameter to the factory function
|
|
3170
4190
|
const resourceRegistry = new Map();
|
|
3171
4191
|
const operationsWithDtos = operations.map(operation => ResourcesConfigOperationsDtosBuilderUtils.buildAllOperationDtos(operation, resourceConfig, resourceRegistry));
|
|
4192
|
+
// ── A closure clock is SERVER-OWNED (#1613 review F1) ─────────────────
|
|
4193
|
+
//
|
|
4194
|
+
// `CLOSURE_EVENT` deletes a row the declared period after its closure date. If ANY client-routed
|
|
4195
|
+
// operation's request can carry that date, a caller can backdate it and the next sweep deletes an OPEN
|
|
4196
|
+
// record — without DELETE permission and without the period passing. Checked HERE, against the FINAL
|
|
4197
|
+
// request DTOs, so it covers every shape uniformly: create, create_many, update, update_many and every
|
|
4198
|
+
// custom operation with its own request schema (a "close" operation taking the date is the same hole).
|
|
4199
|
+
// Route-less variants (INTERNAL_CALL, REPOSITORY_ONLY) are the owning code's own writes and pass; the
|
|
4200
|
+
// handlers that own the field declare it in `authoritativeFields`. `isNotEditable()` enforces nothing here.
|
|
4201
|
+
if (retentionBinding?.startPoint === RetentionStartPoint.CLOSURE_EVENT && retentionBinding.closureFieldName) {
|
|
4202
|
+
const closureFieldName = retentionBinding.closureFieldName;
|
|
4203
|
+
const clientRouted = new Set([ResourceOperationVariantType.API_CALL, ResourceOperationVariantType.API_CALL_WITH_CALLBACK]);
|
|
4204
|
+
const writers = operationsWithDtos.filter((operation) => clientRouted.has(operation.variantType) && requestSchemaCarriesField(operation.requestDto, closureFieldName));
|
|
4205
|
+
if (writers.length > 0) {
|
|
4206
|
+
throw createConfigurationError(`[${resourceIdentifier}] retentionBinding closure field '${closureFieldName}' is writable by a client-routed ` +
|
|
4207
|
+
`${[...new Set(writers.map((writer) => String(writer.operationIdentifier)))].join('/')}: a caller could backdate ` +
|
|
4208
|
+
`it and the retention sweep would delete an open record. Mark it .excludeFromCreate().excludeFromUpdate(), keep it ` +
|
|
4209
|
+
`out of any custom request schema, and set it in the owning handlers, declaring it in authoritativeFields so their ` +
|
|
4210
|
+
`write survives the re-parse.`);
|
|
4211
|
+
}
|
|
4212
|
+
}
|
|
3172
4213
|
return {
|
|
3173
4214
|
isDisabled: params.isDisabled ?? false,
|
|
3174
4215
|
resourcePrimaryScope,
|
|
@@ -3187,6 +4228,7 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
3187
4228
|
isSystemResource,
|
|
3188
4229
|
primaryKeyIdentifiesInitiator,
|
|
3189
4230
|
systemAccessPolicy: effectiveSystemAccessPolicy,
|
|
4231
|
+
subjectErasureLane,
|
|
3190
4232
|
isAnonymizable,
|
|
3191
4233
|
transpositionPolicy: isAnonymizable
|
|
3192
4234
|
? (transpositionPolicy ?? ResourceTranspositionPolicy.ADD)
|
|
@@ -3196,12 +4238,219 @@ export function createResourceConfiguration_Initialization(params) {
|
|
|
3196
4238
|
retentionPolicy: retentionPolicy?.mode ? retentionPolicy : undefined,
|
|
3197
4239
|
// Paired with `retentionPolicy` by the guards above, so these two are present together or not at all.
|
|
3198
4240
|
dataSubjectPolicy: retentionPolicy?.mode ? dataSubjectPolicy : undefined,
|
|
4241
|
+
// Validated and parsed above, so the resolved value is exactly the strict-parsed declaration.
|
|
4242
|
+
retentionBinding,
|
|
3199
4243
|
// Normalize (mirror retentionPolicy): the resolved portabilityPolicy is present IFF the
|
|
3200
4244
|
// resource actually declared a default. An absent `defaultProvenance` is a policy-shaped
|
|
3201
4245
|
// opt-out, and shipping a truthy-but-empty object would make an Art. 20 export believe a
|
|
3202
4246
|
// default exists and silently include fields nobody classified.
|
|
3203
4247
|
portabilityPolicy: portabilityPolicy?.defaultProvenance ? portabilityPolicy : undefined,
|
|
4248
|
+
workUnit,
|
|
3204
4249
|
operations: operationsWithDtos
|
|
3205
4250
|
};
|
|
3206
4251
|
}
|
|
4252
|
+
/**
|
|
4253
|
+
* Why a declared constant cannot be written to a local field, or `null` when it can (#1685). The field's own Zod type
|
|
4254
|
+
* decides: an enum takes only its members, a string / number / boolean field only that primitive. Any other field
|
|
4255
|
+
* type cannot be checked from here, and an expression writing an unchecked value is refused rather than trusted.
|
|
4256
|
+
*/
|
|
4257
|
+
function describeExternalDataConstantMisfit(value, targetSchema) {
|
|
4258
|
+
const inner = unwrapSchema(targetSchema);
|
|
4259
|
+
if (inner instanceof z.ZodEnum) {
|
|
4260
|
+
const members = inner.options;
|
|
4261
|
+
return members.includes(value) ? null : `${JSON.stringify(value)} is not a member of the field's enum (${members.map((member) => JSON.stringify(member)).join(', ')})`;
|
|
4262
|
+
}
|
|
4263
|
+
if (inner instanceof z.ZodString)
|
|
4264
|
+
return typeof value === 'string' ? null : `${JSON.stringify(value)} is not a string`;
|
|
4265
|
+
if (inner instanceof z.ZodNumber)
|
|
4266
|
+
return typeof value === 'number' ? null : `${JSON.stringify(value)} is not a number`;
|
|
4267
|
+
if (inner instanceof z.ZodBoolean)
|
|
4268
|
+
return typeof value === 'boolean' ? null : `${JSON.stringify(value)} is not a boolean`;
|
|
4269
|
+
return `a declared value cannot be checked against this field's type (${getZodType(inner)})`;
|
|
4270
|
+
}
|
|
4271
|
+
/**
|
|
4272
|
+
* The destination-schema half of an OUTBOUND pipeline's coherence (#1690) — the arrows of the INBOUND rules reversed.
|
|
4273
|
+
*
|
|
4274
|
+
* - every SENT field (a mapping entry's `localField`) exists and is the application's own: a field declared
|
|
4275
|
+
* `.excludeFromCreate()` AND `.excludeFromUpdate()` is one no caller can ever set, so sending it would send a value
|
|
4276
|
+
* nobody decided. (Excluded from one of the two is fine — a field set once on create and never changed is common.)
|
|
4277
|
+
* - `remoteKeyLocalField` exists, is a STRING, ACCEPTS ABSENCE (a row is created locally before the system of record
|
|
4278
|
+
* has assigned it a key) and is excluded from create and update: the engine writes it, once, from the create's
|
|
4279
|
+
* answer, and a caller that could write it could point a local row at any remote record. No `.isBusinessKey()` or
|
|
4280
|
+
* `.isUnique()` is required: nothing upserts on it, and the engine never writes one key to two rows.
|
|
4281
|
+
* - `partitionUnitLocalField`, when declared, exists, is a STRING and accepts absence — the unit a row belongs to,
|
|
4282
|
+
* which decides the partition it is created in. A row with no unit is not sent on a partitioned instance.
|
|
4283
|
+
* - a REMOTE_REFERENCE's local foreign key is a STRING that accepts absence (it is the caller's link, possibly empty),
|
|
4284
|
+
* and its value shape is resolved from the dialect exactly as for an inbound entry, because the reverse translation
|
|
4285
|
+
* sends the target's key in that shape.
|
|
4286
|
+
* - `population` and `orphanPolicy` describe an INBOUND load and are refused when AUTHORED with anything but their
|
|
4287
|
+
* default. Both carry defaults, so the parsed declaration cannot tell a written value from an omitted one; the
|
|
4288
|
+
* authored object can. A value EQUAL to the default is let through, because a declaration that was parsed once
|
|
4289
|
+
* already (a configuration re-materialized from its own parsed pipeline) carries both, and it declares nothing an
|
|
4290
|
+
* inbound load would read differently.
|
|
4291
|
+
*/
|
|
4292
|
+
function validateExternalDataOutboundDeclarationAgainstSchema(declaration, shape, authored, refuse) {
|
|
4293
|
+
const defaults = { population: ExternalDataDestinationPopulation.CLOSED, orphanPolicy: ExternalDataOrphanPolicy.REPORT };
|
|
4294
|
+
for (const field of ['population', 'orphanPolicy']) {
|
|
4295
|
+
if (authored[field] !== undefined && authored[field] !== defaults[field]) {
|
|
4296
|
+
refuse(`${field}: describes the rows an INBOUND pass loads, and an OUTBOUND pipeline loads none — it sends the destination's own rows. Remove it.`);
|
|
4297
|
+
}
|
|
4298
|
+
}
|
|
4299
|
+
const requireStringAcceptingAbsence = (fieldName, context) => {
|
|
4300
|
+
const fieldSchema = shape[fieldName];
|
|
4301
|
+
if (!fieldSchema)
|
|
4302
|
+
refuse(`${context}: local field '${fieldName}' does not exist on mainSchema.`);
|
|
4303
|
+
if (!(unwrapSchema(fieldSchema) instanceof z.ZodString))
|
|
4304
|
+
refuse(`${context}: '${fieldName}' must be a STRING field.`);
|
|
4305
|
+
if (unwrapSchema(fieldSchema) === fieldSchema)
|
|
4306
|
+
refuse(`${context}: '${fieldName}' must be optional or nullable — a row can exist locally without it.`);
|
|
4307
|
+
return fieldSchema;
|
|
4308
|
+
};
|
|
4309
|
+
const keySchema = requireStringAcceptingAbsence(declaration.remoteKeyLocalField, 'remoteKeyLocalField');
|
|
4310
|
+
/*
|
|
4311
|
+
* ONE RECORD, ONE ROW (#2039 review) — made a property of the STORE rather than of each code path that writes the key.
|
|
4312
|
+
*
|
|
4313
|
+
* A remote key names one record of the system of record, so two local rows holding it would each send their edits to
|
|
4314
|
+
* that record, overwriting each other's. The pass cannot make that (the system of record mints a fresh key per create),
|
|
4315
|
+
* but an operator's answer to an unknown create can, and a check at the door is a read-then-write any concurrent writer
|
|
4316
|
+
* slips past. A UNIQUE index cannot be slipped past, on any path.
|
|
4317
|
+
*
|
|
4318
|
+
* It must IGNORE rows with no key yet — every row before its first send has none. `.isUnique()` gives exactly that on
|
|
4319
|
+
* both stores: its default is sparse, which MongoDB builds as a sparse (or, on a retention-governed resource, a
|
|
4320
|
+
* `$exists`-partial) unique index and PostgreSQL plans with NULLs distinct. MongoDB's one blind spot is an EXPLICIT null,
|
|
4321
|
+
* which a sparse index still indexes — so the field must also refuse null: `.optional()`, never `.nullable()`, which
|
|
4322
|
+
* makes "absent" the only empty state a validated write can store.
|
|
4323
|
+
*
|
|
4324
|
+
* Checked rather than applied by the factory, for the inbound rule's reason (the same field there must be declared
|
|
4325
|
+
* `.isUnique()`, "boot-CHECKED, not factory-mutated"): the application's own schema file shows the index it gets, and
|
|
4326
|
+
* the migration its planner writes is the one its author reads.
|
|
4327
|
+
*/
|
|
4328
|
+
const uniqueParams = getUniqueFieldParams(keySchema);
|
|
4329
|
+
if (uniqueParams === undefined || uniqueParams.sparse === false || (uniqueParams.scope !== undefined && uniqueParams.scope !== 'global') || uniqueParams.compoundWith !== undefined) {
|
|
4330
|
+
refuse(`remoteKeyLocalField: '${declaration.remoteKeyLocalField}' must be declared .isUnique() — one remote record, one local row: two rows holding `
|
|
4331
|
+
+ 'one key would each overwrite the other\'s record. Plain `.isUnique()` (global, sparse, the default) ignores the rows not yet sent.');
|
|
4332
|
+
}
|
|
4333
|
+
if (keySchema.safeParse(null).success) {
|
|
4334
|
+
refuse(`remoteKeyLocalField: '${declaration.remoteKeyLocalField}' accepts null. Declare it .optional(), not .nullable(): its unique index ignores a row `
|
|
4335
|
+
+ 'with no key only while "no key" is ABSENT — MongoDB indexes an explicit null, so a second unsent row would collide with the first.');
|
|
4336
|
+
}
|
|
4337
|
+
if (!isExcludedFromCreate(keySchema) || !isExcludedFromUpdate(keySchema)) {
|
|
4338
|
+
refuse(`remoteKeyLocalField: '${declaration.remoteKeyLocalField}' must be declared .excludeFromCreate() and .excludeFromUpdate() — the engine `
|
|
4339
|
+
+ 'writes it once, from the key the system of record answers a create with, and a caller that could write it could point a local row '
|
|
4340
|
+
+ 'at any remote record.');
|
|
4341
|
+
}
|
|
4342
|
+
if (declaration.partitionUnitLocalField !== undefined) {
|
|
4343
|
+
requireStringAcceptingAbsence(declaration.partitionUnitLocalField, 'partitionUnitLocalField');
|
|
4344
|
+
}
|
|
4345
|
+
for (const entry of declaration.mapping) {
|
|
4346
|
+
const context = `mapping('${entry.localField}')`;
|
|
4347
|
+
const fieldSchema = shape[entry.localField];
|
|
4348
|
+
if (!fieldSchema)
|
|
4349
|
+
refuse(`${context}: local field '${entry.localField}' does not exist on mainSchema.`);
|
|
4350
|
+
if (isExcludedFromCreate(fieldSchema) && isExcludedFromUpdate(fieldSchema)) {
|
|
4351
|
+
refuse(`${context}: '${entry.localField}' is declared .excludeFromCreate() and .excludeFromUpdate(), so no caller can ever set it and an OUTBOUND `
|
|
4352
|
+
+ 'pipeline would send a value nobody decided. A field this pipeline SENDS is the application\'s own: let callers write it.');
|
|
4353
|
+
}
|
|
4354
|
+
if (entry.kind === ExternalDataMappingEntryKind.REMOTE_REFERENCE) {
|
|
4355
|
+
requireStringAcceptingAbsence(entry.localField, context);
|
|
4356
|
+
entry.valueShape = resolveExternalDataRemoteReferenceValueShape(entry, declaration.binding.dialect);
|
|
4357
|
+
}
|
|
4358
|
+
}
|
|
4359
|
+
}
|
|
4360
|
+
/**
|
|
4361
|
+
* The destination-schema half of a declared expression's validation (#1685): what the local field must be for the
|
|
4362
|
+
* expression to write it — and, for a plain CONSTANT, whether the constant fits an enum or primitive field. The schema-independent half (duplicate codes, identity arithmetic, a concatenation of
|
|
4363
|
+
* literals) is `assertExternalDataPipelineDeclarationCoherence`'s.
|
|
4364
|
+
*
|
|
4365
|
+
* Runs where every other mapping target is checked — the resource factory, at module load, i.e. at startup — so a
|
|
4366
|
+
* renamed enum member, a mistyped constant or an expression pointed at the wrong kind of field stops the boot with
|
|
4367
|
+
* the entry named, instead of rejecting every row of every run. A remote field that does not exist cannot be known
|
|
4368
|
+
* here, offline; the extraction requests every field an expression reads, so the SOURCE refuses it on the first run
|
|
4369
|
+
* (Odoo raises "Invalid field", an OData service refuses an unknown `$select` property) rather than every row landing
|
|
4370
|
+
* null.
|
|
4371
|
+
*
|
|
4372
|
+
* Also RESOLVES, as for a `REMOTE_FIELD` entry, Odoo's absent-as-false coercion on a `CONDITIONAL` outcome that
|
|
4373
|
+
* copies a remote field: this is the one place the dialect and the target type are both known.
|
|
4374
|
+
*/
|
|
4375
|
+
function validateExternalDataExpressionAgainstTarget(entry, targetSchema, dialect, refuse) {
|
|
4376
|
+
const at = `mapping('${entry.localField}')`;
|
|
4377
|
+
const inner = unwrapSchema(targetSchema);
|
|
4378
|
+
const acceptsAbsence = inner !== targetSchema;
|
|
4379
|
+
// `required` exists on every expression but CONDITIONAL, whose strict shape refuses it — so only the others may
|
|
4380
|
+
// be told to declare it.
|
|
4381
|
+
const requireAbsenceCapable = (why) => {
|
|
4382
|
+
if (acceptsAbsence)
|
|
4383
|
+
return;
|
|
4384
|
+
refuse(entry.kind === ExternalDataMappingEntryKind.CONDITIONAL
|
|
4385
|
+
? `${at}: ${why}, so the field must be optional or nullable.`
|
|
4386
|
+
: `${at}: ${why}, so the field must be optional or nullable — or declare required: true (such rows are then rejected and reported).`);
|
|
4387
|
+
};
|
|
4388
|
+
switch (entry.kind) {
|
|
4389
|
+
/*
|
|
4390
|
+
* A CONSTANT, checked where a check is possible (#1685 review): a member the enum does not have, or a value of the
|
|
4391
|
+
* wrong primitive type, fails the boot rather than every row's load. A field of another type (a date, an object)
|
|
4392
|
+
* is left alone: a constant cannot express one, and refusing it would refuse declarations nothing proves wrong.
|
|
4393
|
+
*/
|
|
4394
|
+
case ExternalDataMappingEntryKind.CONSTANT: {
|
|
4395
|
+
if (inner instanceof z.ZodEnum || inner instanceof z.ZodString || inner instanceof z.ZodNumber || inner instanceof z.ZodBoolean) {
|
|
4396
|
+
const misfit = describeExternalDataConstantMisfit(entry.constant, targetSchema);
|
|
4397
|
+
if (misfit !== null)
|
|
4398
|
+
refuse(`${at}.constant: ${misfit}.`);
|
|
4399
|
+
}
|
|
4400
|
+
return;
|
|
4401
|
+
}
|
|
4402
|
+
case ExternalDataMappingEntryKind.ENUM_MAP: {
|
|
4403
|
+
if (!(inner instanceof z.ZodEnum))
|
|
4404
|
+
refuse(`${at}: an ENUM_MAP writes a member of a local enum, so its target must be an enum field.`);
|
|
4405
|
+
for (const { remoteValue, localValue } of entry.values) {
|
|
4406
|
+
const misfit = describeExternalDataConstantMisfit(localValue, targetSchema);
|
|
4407
|
+
if (misfit !== null)
|
|
4408
|
+
refuse(`${at}.values: the code ${JSON.stringify(remoteValue)} maps to ${misfit}.`);
|
|
4409
|
+
}
|
|
4410
|
+
if (entry.unmapped.policy === ExternalDataUnmappedValuePolicy.USE_DEFAULT) {
|
|
4411
|
+
const misfit = describeExternalDataConstantMisfit(entry.unmapped.localValue, targetSchema);
|
|
4412
|
+
if (misfit !== null)
|
|
4413
|
+
refuse(`${at}.unmapped.localValue: ${misfit}.`);
|
|
4414
|
+
}
|
|
4415
|
+
if (!entry.required)
|
|
4416
|
+
requireAbsenceCapable('an absent remote code lands null');
|
|
4417
|
+
return;
|
|
4418
|
+
}
|
|
4419
|
+
case ExternalDataMappingEntryKind.CONCATENATION:
|
|
4420
|
+
if (!(inner instanceof z.ZodString))
|
|
4421
|
+
refuse(`${at}: a CONCATENATION writes a string, so its target must be a string field.`);
|
|
4422
|
+
if (!entry.required)
|
|
4423
|
+
requireAbsenceCapable('a row whose every remote part is absent lands null');
|
|
4424
|
+
return;
|
|
4425
|
+
case ExternalDataMappingEntryKind.ARITHMETIC:
|
|
4426
|
+
if (!(inner instanceof z.ZodNumber))
|
|
4427
|
+
refuse(`${at}: an ARITHMETIC entry writes a number, so its target must be a number field.`);
|
|
4428
|
+
if (!entry.required)
|
|
4429
|
+
requireAbsenceCapable('an absent remote value lands null');
|
|
4430
|
+
return;
|
|
4431
|
+
case ExternalDataMappingEntryKind.CONDITIONAL: {
|
|
4432
|
+
const outcomes = [...entry.cases.map((entryCase) => entryCase.then), entry.otherwise];
|
|
4433
|
+
for (const outcome of outcomes) {
|
|
4434
|
+
if (outcome.kind === ExternalDataConditionalOutcomeKind.CONSTANT) {
|
|
4435
|
+
const misfit = describeExternalDataConstantMisfit(outcome.constant, targetSchema);
|
|
4436
|
+
if (misfit !== null)
|
|
4437
|
+
refuse(`${at}: an outcome writes ${misfit}.`);
|
|
4438
|
+
continue;
|
|
4439
|
+
}
|
|
4440
|
+
requireAbsenceCapable(`the outcome copying '${outcome.remoteField}' lands null when that field is absent`);
|
|
4441
|
+
// As for a REMOTE_FIELD entry: the timestamp coercion produces a Date, so it targets a date field.
|
|
4442
|
+
if (outcome.coercion === ExternalDataFieldCoercion.ISO_STRING_TO_DATE && !(inner instanceof z.ZodDate)) {
|
|
4443
|
+
refuse(`${at}: the outcome copying '${outcome.remoteField}' declares ISO_STRING_TO_DATE, which targets a date field.`);
|
|
4444
|
+
}
|
|
4445
|
+
// Odoo's false→null default, resolved as for a REMOTE_FIELD entry: a genuine boolean target keeps its false.
|
|
4446
|
+
if (dialect === HttpApiTransportDialect.ODOO_JSONRPC && outcome.coercion === ExternalDataFieldCoercion.NONE && !(inner instanceof z.ZodBoolean)) {
|
|
4447
|
+
outcome.coercion = ExternalDataFieldCoercion.ODOO_FALSE_AS_NULL;
|
|
4448
|
+
}
|
|
4449
|
+
}
|
|
4450
|
+
return;
|
|
4451
|
+
}
|
|
4452
|
+
default:
|
|
4453
|
+
return;
|
|
4454
|
+
}
|
|
4455
|
+
}
|
|
3207
4456
|
//# sourceMappingURL=resources-config.shared.factory.js.map
|