@adcp/sdk 5.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +17 -0
- package/.claude-plugin/plugin.json +25 -0
- package/ADCP_VERSION +1 -0
- package/AGENTS.md +282 -0
- package/LICENSE +191 -0
- package/README.md +816 -0
- package/bin/adcp-async-handler.js +275 -0
- package/bin/adcp-config.js +240 -0
- package/bin/adcp-fuzz.js +391 -0
- package/bin/adcp-grade.js +505 -0
- package/bin/adcp-json-stdout.js +36 -0
- package/bin/adcp-registry.js +745 -0
- package/bin/adcp-signing.js +233 -0
- package/bin/adcp-step-hints.js +246 -0
- package/bin/adcp-version-check.js +150 -0
- package/bin/adcp.js +4821 -0
- package/compliance/cache/3.0.0/domains/brand/index.yaml +167 -0
- package/compliance/cache/3.0.0/domains/creative/index.yaml +412 -0
- package/compliance/cache/3.0.0/domains/governance/index.yaml +683 -0
- package/compliance/cache/3.0.0/domains/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.0/domains/media-buy/index.yaml +742 -0
- package/compliance/cache/3.0.0/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.0/domains/media-buy/scenarios/delivery_reporting.yaml +180 -0
- package/compliance/cache/3.0.0/domains/media-buy/scenarios/governance_approved.yaml +186 -0
- package/compliance/cache/3.0.0/domains/media-buy/scenarios/governance_conditions.yaml +195 -0
- package/compliance/cache/3.0.0/domains/media-buy/scenarios/governance_denied.yaml +189 -0
- package/compliance/cache/3.0.0/domains/media-buy/scenarios/governance_denied_recovery.yaml +243 -0
- package/compliance/cache/3.0.0/domains/media-buy/scenarios/invalid_transitions.yaml +279 -0
- package/compliance/cache/3.0.0/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.0/domains/media-buy/scenarios/inventory_list_targeting.yaml +266 -0
- package/compliance/cache/3.0.0/domains/media-buy/scenarios/measurement_terms_rejected.yaml +194 -0
- package/compliance/cache/3.0.0/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.0/domains/media-buy/scenarios/proposal_finalize.yaml +242 -0
- package/compliance/cache/3.0.0/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.0/domains/media-buy/state-machine.yaml +437 -0
- package/compliance/cache/3.0.0/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.0.0/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.0/index.json +324 -0
- package/compliance/cache/3.0.0/protocols/brand/index.yaml +167 -0
- package/compliance/cache/3.0.0/protocols/creative/index.yaml +412 -0
- package/compliance/cache/3.0.0/protocols/governance/index.yaml +683 -0
- package/compliance/cache/3.0.0/protocols/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.0/protocols/media-buy/index.yaml +742 -0
- package/compliance/cache/3.0.0/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.0/protocols/media-buy/scenarios/delivery_reporting.yaml +180 -0
- package/compliance/cache/3.0.0/protocols/media-buy/scenarios/governance_approved.yaml +186 -0
- package/compliance/cache/3.0.0/protocols/media-buy/scenarios/governance_conditions.yaml +195 -0
- package/compliance/cache/3.0.0/protocols/media-buy/scenarios/governance_denied.yaml +189 -0
- package/compliance/cache/3.0.0/protocols/media-buy/scenarios/governance_denied_recovery.yaml +243 -0
- package/compliance/cache/3.0.0/protocols/media-buy/scenarios/invalid_transitions.yaml +279 -0
- package/compliance/cache/3.0.0/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.0/protocols/media-buy/scenarios/inventory_list_targeting.yaml +266 -0
- package/compliance/cache/3.0.0/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +194 -0
- package/compliance/cache/3.0.0/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.0/protocols/media-buy/scenarios/proposal_finalize.yaml +242 -0
- package/compliance/cache/3.0.0/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.0/protocols/media-buy/state-machine.yaml +437 -0
- package/compliance/cache/3.0.0/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.0.0/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.0/specialisms/audience-sync/index.yaml +280 -0
- package/compliance/cache/3.0.0/specialisms/brand-rights/index.yaml +346 -0
- package/compliance/cache/3.0.0/specialisms/brand-rights/scenarios/governance_denied.yaml +203 -0
- package/compliance/cache/3.0.0/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.0.0/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.0.0/specialisms/creative-ad-server/index.yaml +383 -0
- package/compliance/cache/3.0.0/specialisms/creative-generative/generative-seller.yaml +733 -0
- package/compliance/cache/3.0.0/specialisms/creative-generative/index.yaml +746 -0
- package/compliance/cache/3.0.0/specialisms/creative-template/index.yaml +413 -0
- package/compliance/cache/3.0.0/specialisms/governance-aware-seller/index.yaml +99 -0
- package/compliance/cache/3.0.0/specialisms/governance-delivery-monitor/index.yaml +419 -0
- package/compliance/cache/3.0.0/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.0.0/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.0.0/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.0.0/specialisms/sales-broadcast-tv/index.yaml +664 -0
- package/compliance/cache/3.0.0/specialisms/sales-catalog-driven/index.yaml +779 -0
- package/compliance/cache/3.0.0/specialisms/sales-guaranteed/index.yaml +479 -0
- package/compliance/cache/3.0.0/specialisms/sales-non-guaranteed/index.yaml +428 -0
- package/compliance/cache/3.0.0/specialisms/sales-proposal-mode/index.yaml +520 -0
- package/compliance/cache/3.0.0/specialisms/sales-social/index.yaml +521 -0
- package/compliance/cache/3.0.0/specialisms/signal-marketplace/index.yaml +415 -0
- package/compliance/cache/3.0.0/specialisms/signal-marketplace/scenarios/governance_denied.yaml +195 -0
- package/compliance/cache/3.0.0/specialisms/signal-owned/index.yaml +316 -0
- package/compliance/cache/3.0.0/specialisms/signed-requests/index.yaml +192 -0
- package/compliance/cache/3.0.0/test-kits/acme-outdoor.yaml +210 -0
- package/compliance/cache/3.0.0/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.0.0/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.0.0/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.0.0/test-kits/signed-requests-runner.yaml +153 -0
- package/compliance/cache/3.0.0/test-kits/substitution-observer-runner.yaml +690 -0
- package/compliance/cache/3.0.0/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.0.0/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.0.0/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.0.0/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.0.0/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.0.0/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.0.0/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.0.0/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.0.0/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.0.0/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.0.0/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.0.0/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.0.0/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/README.md +219 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.0.0/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.0.0/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.0.0/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.0.0/universal/deterministic-testing.yaml +1318 -0
- package/compliance/cache/3.0.0/universal/error-compliance.yaml +468 -0
- package/compliance/cache/3.0.0/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.0.0/universal/idempotency.yaml +577 -0
- package/compliance/cache/3.0.0/universal/runner-output-contract.yaml +335 -0
- package/compliance/cache/3.0.0/universal/schema-validation.yaml +514 -0
- package/compliance/cache/3.0.0/universal/security.yaml +428 -0
- package/compliance/cache/3.0.0/universal/storyboard-schema.yaml +1010 -0
- package/compliance/cache/3.0.0/universal/webhook-emission.yaml +337 -0
- package/compliance/cache/3.0.0.previous/domains/brand/index.yaml +167 -0
- package/compliance/cache/3.0.0.previous/domains/creative/index.yaml +412 -0
- package/compliance/cache/3.0.0.previous/domains/governance/index.yaml +683 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/index.yaml +742 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/scenarios/delivery_reporting.yaml +180 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/scenarios/governance_approved.yaml +186 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/scenarios/governance_conditions.yaml +195 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/scenarios/governance_denied.yaml +189 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/scenarios/governance_denied_recovery.yaml +243 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/scenarios/invalid_transitions.yaml +279 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/scenarios/inventory_list_targeting.yaml +266 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/scenarios/measurement_terms_rejected.yaml +194 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/scenarios/proposal_finalize.yaml +242 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.0.previous/domains/media-buy/state-machine.yaml +437 -0
- package/compliance/cache/3.0.0.previous/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.0.0.previous/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.0.previous/index.json +324 -0
- package/compliance/cache/3.0.0.previous/protocols/brand/index.yaml +167 -0
- package/compliance/cache/3.0.0.previous/protocols/creative/index.yaml +412 -0
- package/compliance/cache/3.0.0.previous/protocols/governance/index.yaml +683 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/index.yaml +742 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/scenarios/delivery_reporting.yaml +180 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/scenarios/governance_approved.yaml +186 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/scenarios/governance_conditions.yaml +195 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/scenarios/governance_denied.yaml +189 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/scenarios/governance_denied_recovery.yaml +243 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/scenarios/invalid_transitions.yaml +279 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/scenarios/inventory_list_targeting.yaml +266 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +194 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/scenarios/proposal_finalize.yaml +242 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.0.previous/protocols/media-buy/state-machine.yaml +437 -0
- package/compliance/cache/3.0.0.previous/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.0.0.previous/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.0.previous/specialisms/audience-sync/index.yaml +280 -0
- package/compliance/cache/3.0.0.previous/specialisms/brand-rights/index.yaml +346 -0
- package/compliance/cache/3.0.0.previous/specialisms/brand-rights/scenarios/governance_denied.yaml +203 -0
- package/compliance/cache/3.0.0.previous/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.0.0.previous/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.0.0.previous/specialisms/creative-ad-server/index.yaml +383 -0
- package/compliance/cache/3.0.0.previous/specialisms/creative-generative/generative-seller.yaml +733 -0
- package/compliance/cache/3.0.0.previous/specialisms/creative-generative/index.yaml +746 -0
- package/compliance/cache/3.0.0.previous/specialisms/creative-template/index.yaml +413 -0
- package/compliance/cache/3.0.0.previous/specialisms/governance-aware-seller/index.yaml +99 -0
- package/compliance/cache/3.0.0.previous/specialisms/governance-delivery-monitor/index.yaml +419 -0
- package/compliance/cache/3.0.0.previous/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.0.0.previous/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.0.0.previous/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.0.0.previous/specialisms/sales-broadcast-tv/index.yaml +664 -0
- package/compliance/cache/3.0.0.previous/specialisms/sales-catalog-driven/index.yaml +779 -0
- package/compliance/cache/3.0.0.previous/specialisms/sales-guaranteed/index.yaml +479 -0
- package/compliance/cache/3.0.0.previous/specialisms/sales-non-guaranteed/index.yaml +428 -0
- package/compliance/cache/3.0.0.previous/specialisms/sales-proposal-mode/index.yaml +520 -0
- package/compliance/cache/3.0.0.previous/specialisms/sales-social/index.yaml +521 -0
- package/compliance/cache/3.0.0.previous/specialisms/signal-marketplace/index.yaml +415 -0
- package/compliance/cache/3.0.0.previous/specialisms/signal-marketplace/scenarios/governance_denied.yaml +195 -0
- package/compliance/cache/3.0.0.previous/specialisms/signal-owned/index.yaml +316 -0
- package/compliance/cache/3.0.0.previous/specialisms/signed-requests/index.yaml +192 -0
- package/compliance/cache/3.0.0.previous/test-kits/acme-outdoor.yaml +210 -0
- package/compliance/cache/3.0.0.previous/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.0.0.previous/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.0.0.previous/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.0.0.previous/test-kits/signed-requests-runner.yaml +153 -0
- package/compliance/cache/3.0.0.previous/test-kits/substitution-observer-runner.yaml +690 -0
- package/compliance/cache/3.0.0.previous/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.0.0.previous/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.0.0.previous/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.0.0.previous/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.0.0.previous/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.0.0.previous/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.0.0.previous/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.0.0.previous/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.0.0.previous/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.0.0.previous/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.0.0.previous/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.0.0.previous/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.0.0.previous/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/README.md +219 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.0.0.previous/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.0.0.previous/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.0.0.previous/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.0.0.previous/universal/deterministic-testing.yaml +1318 -0
- package/compliance/cache/3.0.0.previous/universal/error-compliance.yaml +468 -0
- package/compliance/cache/3.0.0.previous/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.0.0.previous/universal/idempotency.yaml +577 -0
- package/compliance/cache/3.0.0.previous/universal/runner-output-contract.yaml +335 -0
- package/compliance/cache/3.0.0.previous/universal/schema-validation.yaml +514 -0
- package/compliance/cache/3.0.0.previous/universal/security.yaml +428 -0
- package/compliance/cache/3.0.0.previous/universal/storyboard-schema.yaml +1010 -0
- package/compliance/cache/3.0.0.previous/universal/webhook-emission.yaml +337 -0
- package/compliance/cache/3.0.1/domains/brand/index.yaml +163 -0
- package/compliance/cache/3.0.1/domains/creative/index.yaml +412 -0
- package/compliance/cache/3.0.1/domains/governance/index.yaml +683 -0
- package/compliance/cache/3.0.1/domains/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.1/domains/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/inventory_list_targeting.yaml +266 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.1/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.1/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.1/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.0.1/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.1/index.json +324 -0
- package/compliance/cache/3.0.1/protocols/brand/index.yaml +163 -0
- package/compliance/cache/3.0.1/protocols/creative/index.yaml +412 -0
- package/compliance/cache/3.0.1/protocols/governance/index.yaml +683 -0
- package/compliance/cache/3.0.1/protocols/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.1/protocols/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/inventory_list_targeting.yaml +266 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.1/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.1/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.1/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.0.1/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.1/specialisms/audience-sync/index.yaml +280 -0
- package/compliance/cache/3.0.1/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.0.1/specialisms/brand-rights/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.0.1/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.0.1/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.0.1/specialisms/creative-ad-server/index.yaml +383 -0
- package/compliance/cache/3.0.1/specialisms/creative-generative/generative-seller.yaml +758 -0
- package/compliance/cache/3.0.1/specialisms/creative-generative/index.yaml +746 -0
- package/compliance/cache/3.0.1/specialisms/creative-template/index.yaml +413 -0
- package/compliance/cache/3.0.1/specialisms/governance-aware-seller/index.yaml +136 -0
- package/compliance/cache/3.0.1/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.0.1/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.0.1/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.0.1/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.0.1/specialisms/sales-broadcast-tv/index.yaml +689 -0
- package/compliance/cache/3.0.1/specialisms/sales-catalog-driven/index.yaml +779 -0
- package/compliance/cache/3.0.1/specialisms/sales-guaranteed/index.yaml +504 -0
- package/compliance/cache/3.0.1/specialisms/sales-non-guaranteed/index.yaml +428 -0
- package/compliance/cache/3.0.1/specialisms/sales-proposal-mode/index.yaml +520 -0
- package/compliance/cache/3.0.1/specialisms/sales-social/index.yaml +577 -0
- package/compliance/cache/3.0.1/specialisms/signal-marketplace/index.yaml +415 -0
- package/compliance/cache/3.0.1/specialisms/signal-marketplace/scenarios/governance_denied.yaml +207 -0
- package/compliance/cache/3.0.1/specialisms/signal-owned/index.yaml +316 -0
- package/compliance/cache/3.0.1/test-kits/acme-outdoor.yaml +210 -0
- package/compliance/cache/3.0.1/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.0.1/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.0.1/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.0.1/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.0.1/test-kits/substitution-observer-runner.yaml +690 -0
- package/compliance/cache/3.0.1/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.0.1/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.0.1/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.0.1/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.0.1/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.0.1/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.0.1/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.0.1/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.0.1/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.0.1/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.0.1/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.0.1/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.0.1/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/README.md +219 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.0.1/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.0.1/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.0.1/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.0.1/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.0.1/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.0.1/universal/deterministic-testing.yaml +1343 -0
- package/compliance/cache/3.0.1/universal/error-compliance.yaml +474 -0
- package/compliance/cache/3.0.1/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.0.1/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.0.1/universal/get-signals-pagination-integrity.yaml +211 -0
- package/compliance/cache/3.0.1/universal/idempotency.yaml +593 -0
- package/compliance/cache/3.0.1/universal/pagination-integrity-creative-formats.yaml +258 -0
- package/compliance/cache/3.0.1/universal/pagination-integrity-list-accounts.yaml +262 -0
- package/compliance/cache/3.0.1/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.0.1/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.0.1/universal/runner-output-contract.yaml +339 -0
- package/compliance/cache/3.0.1/universal/schema-validation.yaml +526 -0
- package/compliance/cache/3.0.1/universal/security.yaml +431 -0
- package/compliance/cache/3.0.1/universal/signed-requests.yaml +205 -0
- package/compliance/cache/3.0.1/universal/storyboard-schema.yaml +1056 -0
- package/compliance/cache/3.0.1/universal/v3-envelope-integrity.yaml +104 -0
- package/compliance/cache/3.0.1/universal/webhook-emission.yaml +337 -0
- package/compliance/cache/3.0.1.previous/domains/brand/index.yaml +163 -0
- package/compliance/cache/3.0.1.previous/domains/creative/index.yaml +412 -0
- package/compliance/cache/3.0.1.previous/domains/governance/index.yaml +683 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/inventory_list_targeting.yaml +266 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.1.previous/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.1.previous/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.0.1.previous/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.1.previous/index.json +324 -0
- package/compliance/cache/3.0.1.previous/protocols/brand/index.yaml +163 -0
- package/compliance/cache/3.0.1.previous/protocols/creative/index.yaml +412 -0
- package/compliance/cache/3.0.1.previous/protocols/governance/index.yaml +683 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/inventory_list_targeting.yaml +266 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.1.previous/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.1.previous/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.0.1.previous/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.1.previous/specialisms/audience-sync/index.yaml +280 -0
- package/compliance/cache/3.0.1.previous/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.0.1.previous/specialisms/brand-rights/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.0.1.previous/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.0.1.previous/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.0.1.previous/specialisms/creative-ad-server/index.yaml +383 -0
- package/compliance/cache/3.0.1.previous/specialisms/creative-generative/generative-seller.yaml +758 -0
- package/compliance/cache/3.0.1.previous/specialisms/creative-generative/index.yaml +746 -0
- package/compliance/cache/3.0.1.previous/specialisms/creative-template/index.yaml +413 -0
- package/compliance/cache/3.0.1.previous/specialisms/governance-aware-seller/index.yaml +136 -0
- package/compliance/cache/3.0.1.previous/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.0.1.previous/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.0.1.previous/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.0.1.previous/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.0.1.previous/specialisms/sales-broadcast-tv/index.yaml +689 -0
- package/compliance/cache/3.0.1.previous/specialisms/sales-catalog-driven/index.yaml +779 -0
- package/compliance/cache/3.0.1.previous/specialisms/sales-guaranteed/index.yaml +504 -0
- package/compliance/cache/3.0.1.previous/specialisms/sales-non-guaranteed/index.yaml +428 -0
- package/compliance/cache/3.0.1.previous/specialisms/sales-proposal-mode/index.yaml +520 -0
- package/compliance/cache/3.0.1.previous/specialisms/sales-social/index.yaml +577 -0
- package/compliance/cache/3.0.1.previous/specialisms/signal-marketplace/index.yaml +415 -0
- package/compliance/cache/3.0.1.previous/specialisms/signal-marketplace/scenarios/governance_denied.yaml +207 -0
- package/compliance/cache/3.0.1.previous/specialisms/signal-owned/index.yaml +316 -0
- package/compliance/cache/3.0.1.previous/test-kits/acme-outdoor.yaml +210 -0
- package/compliance/cache/3.0.1.previous/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.0.1.previous/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.0.1.previous/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.0.1.previous/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.0.1.previous/test-kits/substitution-observer-runner.yaml +690 -0
- package/compliance/cache/3.0.1.previous/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.0.1.previous/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.0.1.previous/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.0.1.previous/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.0.1.previous/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.0.1.previous/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.0.1.previous/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.0.1.previous/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.0.1.previous/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.0.1.previous/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.0.1.previous/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.0.1.previous/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.0.1.previous/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/README.md +219 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.0.1.previous/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.0.1.previous/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.0.1.previous/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.0.1.previous/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.0.1.previous/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.0.1.previous/universal/deterministic-testing.yaml +1343 -0
- package/compliance/cache/3.0.1.previous/universal/error-compliance.yaml +474 -0
- package/compliance/cache/3.0.1.previous/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.0.1.previous/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.0.1.previous/universal/get-signals-pagination-integrity.yaml +211 -0
- package/compliance/cache/3.0.1.previous/universal/idempotency.yaml +593 -0
- package/compliance/cache/3.0.1.previous/universal/pagination-integrity-creative-formats.yaml +258 -0
- package/compliance/cache/3.0.1.previous/universal/pagination-integrity-list-accounts.yaml +262 -0
- package/compliance/cache/3.0.1.previous/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.0.1.previous/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.0.1.previous/universal/runner-output-contract.yaml +339 -0
- package/compliance/cache/3.0.1.previous/universal/schema-validation.yaml +526 -0
- package/compliance/cache/3.0.1.previous/universal/security.yaml +431 -0
- package/compliance/cache/3.0.1.previous/universal/signed-requests.yaml +205 -0
- package/compliance/cache/3.0.1.previous/universal/storyboard-schema.yaml +1056 -0
- package/compliance/cache/3.0.1.previous/universal/v3-envelope-integrity.yaml +104 -0
- package/compliance/cache/3.0.1.previous/universal/webhook-emission.yaml +337 -0
- package/dist/lib/adapters/content-standards-adapter.d.ts +106 -0
- package/dist/lib/adapters/content-standards-adapter.d.ts.map +1 -0
- package/dist/lib/adapters/content-standards-adapter.js +201 -0
- package/dist/lib/adapters/content-standards-adapter.js.map +1 -0
- package/dist/lib/adapters/governance-adapter.d.ts +88 -0
- package/dist/lib/adapters/governance-adapter.d.ts.map +1 -0
- package/dist/lib/adapters/governance-adapter.js +93 -0
- package/dist/lib/adapters/governance-adapter.js.map +1 -0
- package/dist/lib/adapters/index.d.ts +19 -0
- package/dist/lib/adapters/index.d.ts.map +1 -0
- package/dist/lib/adapters/index.js +47 -0
- package/dist/lib/adapters/index.js.map +1 -0
- package/dist/lib/adapters/property-list-adapter.d.ts +123 -0
- package/dist/lib/adapters/property-list-adapter.d.ts.map +1 -0
- package/dist/lib/adapters/property-list-adapter.js +231 -0
- package/dist/lib/adapters/property-list-adapter.js.map +1 -0
- package/dist/lib/adapters/proposal-manager.d.ts +142 -0
- package/dist/lib/adapters/proposal-manager.d.ts.map +1 -0
- package/dist/lib/adapters/proposal-manager.js +184 -0
- package/dist/lib/adapters/proposal-manager.js.map +1 -0
- package/dist/lib/adapters/si-session-manager.d.ts +164 -0
- package/dist/lib/adapters/si-session-manager.d.ts.map +1 -0
- package/dist/lib/adapters/si-session-manager.js +330 -0
- package/dist/lib/adapters/si-session-manager.js.map +1 -0
- package/dist/lib/advanced.d.ts +41 -0
- package/dist/lib/advanced.d.ts.map +1 -0
- package/dist/lib/advanced.js +49 -0
- package/dist/lib/advanced.js.map +1 -0
- package/dist/lib/agents/index.generated.d.ts +397 -0
- package/dist/lib/agents/index.generated.d.ts.map +1 -0
- package/dist/lib/agents/index.generated.js +624 -0
- package/dist/lib/agents/index.generated.js.map +1 -0
- package/dist/lib/auth/index.d.ts +39 -0
- package/dist/lib/auth/index.d.ts.map +1 -0
- package/dist/lib/auth/index.js +100 -0
- package/dist/lib/auth/index.js.map +1 -0
- package/dist/lib/auth/oauth/CLIFlowHandler.d.ts +61 -0
- package/dist/lib/auth/oauth/CLIFlowHandler.d.ts.map +1 -0
- package/dist/lib/auth/oauth/CLIFlowHandler.js +287 -0
- package/dist/lib/auth/oauth/CLIFlowHandler.js.map +1 -0
- package/dist/lib/auth/oauth/ClientCredentialsFlow.d.ts +134 -0
- package/dist/lib/auth/oauth/ClientCredentialsFlow.d.ts.map +1 -0
- package/dist/lib/auth/oauth/ClientCredentialsFlow.js +325 -0
- package/dist/lib/auth/oauth/ClientCredentialsFlow.js.map +1 -0
- package/dist/lib/auth/oauth/MCPOAuthProvider.d.ts +136 -0
- package/dist/lib/auth/oauth/MCPOAuthProvider.d.ts.map +1 -0
- package/dist/lib/auth/oauth/MCPOAuthProvider.js +255 -0
- package/dist/lib/auth/oauth/MCPOAuthProvider.js.map +1 -0
- package/dist/lib/auth/oauth/NonInteractiveFlowHandler.d.ts +37 -0
- package/dist/lib/auth/oauth/NonInteractiveFlowHandler.d.ts.map +1 -0
- package/dist/lib/auth/oauth/NonInteractiveFlowHandler.js +30 -0
- package/dist/lib/auth/oauth/NonInteractiveFlowHandler.js.map +1 -0
- package/dist/lib/auth/oauth/authorization-required.d.ts +112 -0
- package/dist/lib/auth/oauth/authorization-required.d.ts.map +1 -0
- package/dist/lib/auth/oauth/authorization-required.js +363 -0
- package/dist/lib/auth/oauth/authorization-required.js.map +1 -0
- package/dist/lib/auth/oauth/diagnose.d.ts +101 -0
- package/dist/lib/auth/oauth/diagnose.d.ts.map +1 -0
- package/dist/lib/auth/oauth/diagnose.js +630 -0
- package/dist/lib/auth/oauth/diagnose.js.map +1 -0
- package/dist/lib/auth/oauth/diagnostics.d.ts +129 -0
- package/dist/lib/auth/oauth/diagnostics.d.ts.map +1 -0
- package/dist/lib/auth/oauth/diagnostics.js +207 -0
- package/dist/lib/auth/oauth/diagnostics.js.map +1 -0
- package/dist/lib/auth/oauth/discovery.d.ts +96 -0
- package/dist/lib/auth/oauth/discovery.d.ts.map +1 -0
- package/dist/lib/auth/oauth/discovery.js +119 -0
- package/dist/lib/auth/oauth/discovery.js.map +1 -0
- package/dist/lib/auth/oauth/file-storage.d.ts +40 -0
- package/dist/lib/auth/oauth/file-storage.d.ts.map +1 -0
- package/dist/lib/auth/oauth/file-storage.js +112 -0
- package/dist/lib/auth/oauth/file-storage.js.map +1 -0
- package/dist/lib/auth/oauth/index.d.ts +133 -0
- package/dist/lib/auth/oauth/index.d.ts.map +1 -0
- package/dist/lib/auth/oauth/index.js +246 -0
- package/dist/lib/auth/oauth/index.js.map +1 -0
- package/dist/lib/auth/oauth/secret-resolver.d.ts +54 -0
- package/dist/lib/auth/oauth/secret-resolver.d.ts.map +1 -0
- package/dist/lib/auth/oauth/secret-resolver.js +96 -0
- package/dist/lib/auth/oauth/secret-resolver.js.map +1 -0
- package/dist/lib/auth/oauth/storage-registry.d.ts +44 -0
- package/dist/lib/auth/oauth/storage-registry.d.ts.map +1 -0
- package/dist/lib/auth/oauth/storage-registry.js +33 -0
- package/dist/lib/auth/oauth/storage-registry.js.map +1 -0
- package/dist/lib/auth/oauth/types.d.ts +114 -0
- package/dist/lib/auth/oauth/types.d.ts.map +1 -0
- package/dist/lib/auth/oauth/types.js +104 -0
- package/dist/lib/auth/oauth/types.js.map +1 -0
- package/dist/lib/client/index.d.ts +2 -0
- package/dist/lib/client/index.d.ts.map +1 -0
- package/dist/lib/client/index.js +26 -0
- package/dist/lib/client/index.js.map +1 -0
- package/dist/lib/compliance/index.d.ts +5 -0
- package/dist/lib/compliance/index.d.ts.map +1 -0
- package/dist/lib/compliance/index.js +52 -0
- package/dist/lib/compliance/index.js.map +1 -0
- package/dist/lib/compliance-fixtures/index.d.ts +167 -0
- package/dist/lib/compliance-fixtures/index.d.ts.map +1 -0
- package/dist/lib/compliance-fixtures/index.js +218 -0
- package/dist/lib/compliance-fixtures/index.js.map +1 -0
- package/dist/lib/compliance-fixtures/test-authorization-server.d.ts +88 -0
- package/dist/lib/compliance-fixtures/test-authorization-server.d.ts.map +1 -0
- package/dist/lib/compliance-fixtures/test-authorization-server.js +252 -0
- package/dist/lib/compliance-fixtures/test-authorization-server.js.map +1 -0
- package/dist/lib/conformance/index.d.ts +26 -0
- package/dist/lib/conformance/index.d.ts.map +1 -0
- package/dist/lib/conformance/index.js +34 -0
- package/dist/lib/conformance/index.js.map +1 -0
- package/dist/lib/conformance/invariants/uniformError.d.ts +45 -0
- package/dist/lib/conformance/invariants/uniformError.d.ts.map +1 -0
- package/dist/lib/conformance/invariants/uniformError.js +179 -0
- package/dist/lib/conformance/invariants/uniformError.js.map +1 -0
- package/dist/lib/conformance/invariants/uniformErrorComparator.d.ts +8 -0
- package/dist/lib/conformance/invariants/uniformErrorComparator.d.ts.map +1 -0
- package/dist/lib/conformance/invariants/uniformErrorComparator.js +488 -0
- package/dist/lib/conformance/invariants/uniformErrorComparator.js.map +1 -0
- package/dist/lib/conformance/oracle.d.ts +36 -0
- package/dist/lib/conformance/oracle.d.ts.map +1 -0
- package/dist/lib/conformance/oracle.js +267 -0
- package/dist/lib/conformance/oracle.js.map +1 -0
- package/dist/lib/conformance/runConformance.d.ts +17 -0
- package/dist/lib/conformance/runConformance.d.ts.map +1 -0
- package/dist/lib/conformance/runConformance.js +174 -0
- package/dist/lib/conformance/runConformance.js.map +1 -0
- package/dist/lib/conformance/runners.d.ts +27 -0
- package/dist/lib/conformance/runners.d.ts.map +1 -0
- package/dist/lib/conformance/runners.js +159 -0
- package/dist/lib/conformance/runners.js.map +1 -0
- package/dist/lib/conformance/schemaArbitrary.d.ts +39 -0
- package/dist/lib/conformance/schemaArbitrary.d.ts.map +1 -0
- package/dist/lib/conformance/schemaArbitrary.js +382 -0
- package/dist/lib/conformance/schemaArbitrary.js.map +1 -0
- package/dist/lib/conformance/schemaLoader.d.ts +12 -0
- package/dist/lib/conformance/schemaLoader.d.ts.map +1 -0
- package/dist/lib/conformance/schemaLoader.js +122 -0
- package/dist/lib/conformance/schemaLoader.js.map +1 -0
- package/dist/lib/conformance/seeder.d.ts +51 -0
- package/dist/lib/conformance/seeder.d.ts.map +1 -0
- package/dist/lib/conformance/seeder.js +341 -0
- package/dist/lib/conformance/seeder.js.map +1 -0
- package/dist/lib/conformance/types.d.ts +201 -0
- package/dist/lib/conformance/types.d.ts.map +1 -0
- package/dist/lib/conformance/types.js +56 -0
- package/dist/lib/conformance/types.js.map +1 -0
- package/dist/lib/core/ADCPMultiAgentClient.d.ts +624 -0
- package/dist/lib/core/ADCPMultiAgentClient.d.ts.map +1 -0
- package/dist/lib/core/ADCPMultiAgentClient.js +908 -0
- package/dist/lib/core/ADCPMultiAgentClient.js.map +1 -0
- package/dist/lib/core/AgentClient.d.ts +517 -0
- package/dist/lib/core/AgentClient.d.ts.map +1 -0
- package/dist/lib/core/AgentClient.js +784 -0
- package/dist/lib/core/AgentClient.js.map +1 -0
- package/dist/lib/core/AsyncHandler.d.ts +210 -0
- package/dist/lib/core/AsyncHandler.d.ts.map +1 -0
- package/dist/lib/core/AsyncHandler.js +182 -0
- package/dist/lib/core/AsyncHandler.js.map +1 -0
- package/dist/lib/core/ConfigurationManager.d.ts +79 -0
- package/dist/lib/core/ConfigurationManager.d.ts.map +1 -0
- package/dist/lib/core/ConfigurationManager.js +249 -0
- package/dist/lib/core/ConfigurationManager.js.map +1 -0
- package/dist/lib/core/ConversationTypes.d.ts +422 -0
- package/dist/lib/core/ConversationTypes.d.ts.map +1 -0
- package/dist/lib/core/ConversationTypes.js +5 -0
- package/dist/lib/core/ConversationTypes.js.map +1 -0
- package/dist/lib/core/CreativeAgentClient.d.ts +144 -0
- package/dist/lib/core/CreativeAgentClient.d.ts.map +1 -0
- package/dist/lib/core/CreativeAgentClient.js +169 -0
- package/dist/lib/core/CreativeAgentClient.js.map +1 -0
- package/dist/lib/core/GovernanceMiddleware.d.ts +93 -0
- package/dist/lib/core/GovernanceMiddleware.d.ts.map +1 -0
- package/dist/lib/core/GovernanceMiddleware.js +306 -0
- package/dist/lib/core/GovernanceMiddleware.js.map +1 -0
- package/dist/lib/core/GovernanceTypes.d.ts +116 -0
- package/dist/lib/core/GovernanceTypes.d.ts.map +1 -0
- package/dist/lib/core/GovernanceTypes.js +60 -0
- package/dist/lib/core/GovernanceTypes.js.map +1 -0
- package/dist/lib/core/ProtocolResponseParser.d.ts +80 -0
- package/dist/lib/core/ProtocolResponseParser.d.ts.map +1 -0
- package/dist/lib/core/ProtocolResponseParser.js +367 -0
- package/dist/lib/core/ProtocolResponseParser.js.map +1 -0
- package/dist/lib/core/ResponseValidator.d.ts +68 -0
- package/dist/lib/core/ResponseValidator.d.ts.map +1 -0
- package/dist/lib/core/ResponseValidator.js +283 -0
- package/dist/lib/core/ResponseValidator.js.map +1 -0
- package/dist/lib/core/SingleAgentClient.d.ts +1065 -0
- package/dist/lib/core/SingleAgentClient.d.ts.map +1 -0
- package/dist/lib/core/SingleAgentClient.js +2134 -0
- package/dist/lib/core/SingleAgentClient.js.map +1 -0
- package/dist/lib/core/TaskEventTypes.d.ts +220 -0
- package/dist/lib/core/TaskEventTypes.d.ts.map +1 -0
- package/dist/lib/core/TaskEventTypes.js +80 -0
- package/dist/lib/core/TaskEventTypes.js.map +1 -0
- package/dist/lib/core/TaskExecutor.d.ts +245 -0
- package/dist/lib/core/TaskExecutor.d.ts.map +1 -0
- package/dist/lib/core/TaskExecutor.js +1452 -0
- package/dist/lib/core/TaskExecutor.js.map +1 -0
- package/dist/lib/core/match.d.ts +84 -0
- package/dist/lib/core/match.d.ts.map +1 -0
- package/dist/lib/core/match.js +47 -0
- package/dist/lib/core/match.js.map +1 -0
- package/dist/lib/discovery/network-consistency-checker.d.ts +111 -0
- package/dist/lib/discovery/network-consistency-checker.d.ts.map +1 -0
- package/dist/lib/discovery/network-consistency-checker.js +541 -0
- package/dist/lib/discovery/network-consistency-checker.js.map +1 -0
- package/dist/lib/discovery/property-crawler.d.ts +91 -0
- package/dist/lib/discovery/property-crawler.d.ts.map +1 -0
- package/dist/lib/discovery/property-crawler.js +290 -0
- package/dist/lib/discovery/property-crawler.js.map +1 -0
- package/dist/lib/discovery/property-index.d.ts +68 -0
- package/dist/lib/discovery/property-index.d.ts.map +1 -0
- package/dist/lib/discovery/property-index.js +163 -0
- package/dist/lib/discovery/property-index.js.map +1 -0
- package/dist/lib/discovery/types.d.ts +42 -0
- package/dist/lib/discovery/types.d.ts.map +1 -0
- package/dist/lib/discovery/types.js +7 -0
- package/dist/lib/discovery/types.js.map +1 -0
- package/dist/lib/errors/index.d.ts +284 -0
- package/dist/lib/errors/index.d.ts.map +1 -0
- package/dist/lib/errors/index.js +446 -0
- package/dist/lib/errors/index.js.map +1 -0
- package/dist/lib/express-mcp/index.d.ts +62 -0
- package/dist/lib/express-mcp/index.d.ts.map +1 -0
- package/dist/lib/express-mcp/index.js +118 -0
- package/dist/lib/express-mcp/index.js.map +1 -0
- package/dist/lib/governance/index.d.ts +149 -0
- package/dist/lib/governance/index.d.ts.map +1 -0
- package/dist/lib/governance/index.js +171 -0
- package/dist/lib/governance/index.js.map +1 -0
- package/dist/lib/handlers/types.d.ts +119 -0
- package/dist/lib/handlers/types.d.ts.map +1 -0
- package/dist/lib/handlers/types.js +239 -0
- package/dist/lib/handlers/types.js.map +1 -0
- package/dist/lib/index.d.ts +118 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +689 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/net/address-guards.d.ts +34 -0
- package/dist/lib/net/address-guards.d.ts.map +1 -0
- package/dist/lib/net/address-guards.js +132 -0
- package/dist/lib/net/address-guards.js.map +1 -0
- package/dist/lib/net/index.d.ts +8 -0
- package/dist/lib/net/index.d.ts.map +1 -0
- package/dist/lib/net/index.js +17 -0
- package/dist/lib/net/index.js.map +1 -0
- package/dist/lib/net/ssrf-fetch.d.ts +56 -0
- package/dist/lib/net/ssrf-fetch.d.ts.map +1 -0
- package/dist/lib/net/ssrf-fetch.js +199 -0
- package/dist/lib/net/ssrf-fetch.js.map +1 -0
- package/dist/lib/observability/index.d.ts +8 -0
- package/dist/lib/observability/index.d.ts.map +1 -0
- package/dist/lib/observability/index.js +17 -0
- package/dist/lib/observability/index.js.map +1 -0
- package/dist/lib/observability/tracing.d.ts +42 -0
- package/dist/lib/observability/tracing.d.ts.map +1 -0
- package/dist/lib/observability/tracing.js +126 -0
- package/dist/lib/observability/tracing.js.map +1 -0
- package/dist/lib/protocols/a2a.d.ts +23 -0
- package/dist/lib/protocols/a2a.d.ts.map +1 -0
- package/dist/lib/protocols/a2a.js +268 -0
- package/dist/lib/protocols/a2a.js.map +1 -0
- package/dist/lib/protocols/index.d.ts +43 -0
- package/dist/lib/protocols/index.d.ts.map +1 -0
- package/dist/lib/protocols/index.js +264 -0
- package/dist/lib/protocols/index.js.map +1 -0
- package/dist/lib/protocols/mcp-tasks.d.ts +79 -0
- package/dist/lib/protocols/mcp-tasks.d.ts.map +1 -0
- package/dist/lib/protocols/mcp-tasks.js +407 -0
- package/dist/lib/protocols/mcp-tasks.js.map +1 -0
- package/dist/lib/protocols/mcp.d.ts +124 -0
- package/dist/lib/protocols/mcp.d.ts.map +1 -0
- package/dist/lib/protocols/mcp.js +564 -0
- package/dist/lib/protocols/mcp.js.map +1 -0
- package/dist/lib/protocols/rawResponseCapture.d.ts +44 -0
- package/dist/lib/protocols/rawResponseCapture.d.ts.map +1 -0
- package/dist/lib/protocols/rawResponseCapture.js +147 -0
- package/dist/lib/protocols/rawResponseCapture.js.map +1 -0
- package/dist/lib/registry/cursor-store.d.ts +19 -0
- package/dist/lib/registry/cursor-store.d.ts.map +1 -0
- package/dist/lib/registry/cursor-store.js +44 -0
- package/dist/lib/registry/cursor-store.js.map +1 -0
- package/dist/lib/registry/index.d.ts +278 -0
- package/dist/lib/registry/index.d.ts.map +1 -0
- package/dist/lib/registry/index.js +652 -0
- package/dist/lib/registry/index.js.map +1 -0
- package/dist/lib/registry/property-registry.d.ts +57 -0
- package/dist/lib/registry/property-registry.d.ts.map +1 -0
- package/dist/lib/registry/property-registry.js +92 -0
- package/dist/lib/registry/property-registry.js.map +1 -0
- package/dist/lib/registry/sync.d.ts +139 -0
- package/dist/lib/registry/sync.d.ts.map +1 -0
- package/dist/lib/registry/sync.js +390 -0
- package/dist/lib/registry/sync.js.map +1 -0
- package/dist/lib/registry/types.d.ts +112 -0
- package/dist/lib/registry/types.d.ts.map +1 -0
- package/dist/lib/registry/types.generated.d.ts +5680 -0
- package/dist/lib/registry/types.generated.d.ts.map +1 -0
- package/dist/lib/registry/types.generated.js +8 -0
- package/dist/lib/registry/types.generated.js.map +1 -0
- package/dist/lib/registry/types.js +9 -0
- package/dist/lib/registry/types.js.map +1 -0
- package/dist/lib/schemas/index.d.ts +76 -0
- package/dist/lib/schemas/index.d.ts.map +1 -0
- package/dist/lib/schemas/index.js +133 -0
- package/dist/lib/schemas/index.js.map +1 -0
- package/dist/lib/schemas-data/3.0.1/a2ui/bound-value.json +81 -0
- package/dist/lib/schemas-data/3.0.1/a2ui/component.json +32 -0
- package/dist/lib/schemas-data/3.0.1/a2ui/si-catalog.json +427 -0
- package/dist/lib/schemas-data/3.0.1/a2ui/surface.json +39 -0
- package/dist/lib/schemas-data/3.0.1/a2ui/user-action.json +47 -0
- package/dist/lib/schemas-data/3.0.1/account/get-account-financials-request.json +70 -0
- package/dist/lib/schemas-data/3.0.1/account/get-account-financials-response.json +320 -0
- package/dist/lib/schemas-data/3.0.1/account/list-accounts-request.json +42 -0
- package/dist/lib/schemas-data/3.0.1/account/list-accounts-response.json +108 -0
- package/dist/lib/schemas-data/3.0.1/account/report-usage-request.json +168 -0
- package/dist/lib/schemas-data/3.0.1/account/report-usage-response.json +56 -0
- package/dist/lib/schemas-data/3.0.1/account/sync-accounts-request.json +201 -0
- package/dist/lib/schemas-data/3.0.1/account/sync-accounts-response.json +346 -0
- package/dist/lib/schemas-data/3.0.1/account/sync-governance-request.json +170 -0
- package/dist/lib/schemas-data/3.0.1/account/sync-governance-response.json +193 -0
- package/dist/lib/schemas-data/3.0.1/adagents.json +1225 -0
- package/dist/lib/schemas-data/3.0.1/brand/acquire-rights-request.json +114 -0
- package/dist/lib/schemas-data/3.0.1/brand/acquire-rights-response.json +220 -0
- package/dist/lib/schemas-data/3.0.1/brand/creative-approval-request.json +63 -0
- package/dist/lib/schemas-data/3.0.1/brand/creative-approval-response.json +189 -0
- package/dist/lib/schemas-data/3.0.1/brand/get-brand-identity-request.json +56 -0
- package/dist/lib/schemas-data/3.0.1/brand/get-brand-identity-response.json +585 -0
- package/dist/lib/schemas-data/3.0.1/brand/get-rights-request.json +70 -0
- package/dist/lib/schemas-data/3.0.1/brand/get-rights-response.json +220 -0
- package/dist/lib/schemas-data/3.0.1/brand/revocation-notification.json +57 -0
- package/dist/lib/schemas-data/3.0.1/brand/rights-pricing-option.json +65 -0
- package/dist/lib/schemas-data/3.0.1/brand/rights-terms.json +70 -0
- package/dist/lib/schemas-data/3.0.1/brand/update-rights-request.json +63 -0
- package/dist/lib/schemas-data/3.0.1/brand/update-rights-response.json +99 -0
- package/dist/lib/schemas-data/3.0.1/brand.json +2582 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/calibrate-content-request.json +1712 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/calibrate-content-response.json +180 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/create-content-standards-request.json +3622 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/create-content-standards-response.json +116 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/get-content-standards-request.json +38 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/get-content-standards-response.json +3851 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/get-media-buy-artifacts-request.json +234 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/get-media-buy-artifacts-response.json +1880 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/list-content-standards-request.json +121 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/list-content-standards-response.json +3880 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/update-content-standards-request.json +3611 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/update-content-standards-response.json +131 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/validate-content-delivery-request.json +1766 -0
- package/dist/lib/schemas-data/3.0.1/bundled/content-standards/validate-content-delivery-response.json +208 -0
- package/dist/lib/schemas-data/3.0.1/bundled/core/tasks-get-request.json +60 -0
- package/dist/lib/schemas-data/3.0.1/bundled/core/tasks-get-response.json +264 -0
- package/dist/lib/schemas-data/3.0.1/bundled/core/tasks-list-request.json +318 -0
- package/dist/lib/schemas-data/3.0.1/bundled/core/tasks-list-response.json +258 -0
- package/dist/lib/schemas-data/3.0.1/bundled/creative/get-creative-delivery-request.json +245 -0
- package/dist/lib/schemas-data/3.0.1/bundled/creative/get-creative-delivery-response.json +5967 -0
- package/dist/lib/schemas-data/3.0.1/bundled/creative/get-creative-features-request.json +5091 -0
- package/dist/lib/schemas-data/3.0.1/bundled/creative/get-creative-features-response.json +230 -0
- package/dist/lib/schemas-data/3.0.1/bundled/creative/list-creative-formats-request.json +485 -0
- package/dist/lib/schemas-data/3.0.1/bundled/creative/list-creative-formats-response.json +4076 -0
- package/dist/lib/schemas-data/3.0.1/bundled/creative/list-creatives-request.json +687 -0
- package/dist/lib/schemas-data/3.0.1/bundled/creative/list-creatives-response.json +5977 -0
- package/dist/lib/schemas-data/3.0.1/bundled/creative/preview-creative-request.json +9624 -0
- package/dist/lib/schemas-data/3.0.1/bundled/creative/preview-creative-response.json +5931 -0
- package/dist/lib/schemas-data/3.0.1/bundled/creative/sync-creatives-request.json +5268 -0
- package/dist/lib/schemas-data/3.0.1/bundled/creative/sync-creatives-response.json +1146 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/build-creative-request.json +5369 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/build-creative-response.json +10286 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/create-media-buy-request.json +7893 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/create-media-buy-response.json +4170 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/get-media-buy-delivery-request.json +494 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/get-media-buy-delivery-response.json +4256 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/get-media-buys-request.json +261 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/get-media-buys-response.json +2357 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/get-products-request.json +2046 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/get-products-response.json +6809 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/list-creative-formats-request.json +311 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/list-creative-formats-response.json +4080 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/log-event-request.json +394 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/log-event-response.json +193 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/package-request.json +6923 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/provide-performance-feedback-request.json +119 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/provide-performance-feedback-response.json +142 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/sync-audiences-request.json +454 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/sync-audiences-response.json +335 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/sync-catalogs-request.json +836 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/sync-catalogs-response.json +344 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/sync-event-sources-request.json +299 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/sync-event-sources-response.json +461 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/update-media-buy-request.json +13548 -0
- package/dist/lib/schemas-data/3.0.1/bundled/media-buy/update-media-buy-response.json +2799 -0
- package/dist/lib/schemas-data/3.0.1/bundled/property/create-property-list-request.json +661 -0
- package/dist/lib/schemas-data/3.0.1/bundled/property/create-property-list-response.json +928 -0
- package/dist/lib/schemas-data/3.0.1/bundled/property/delete-property-list-request.json +198 -0
- package/dist/lib/schemas-data/3.0.1/bundled/property/delete-property-list-response.json +44 -0
- package/dist/lib/schemas-data/3.0.1/bundled/property/get-property-list-request.json +212 -0
- package/dist/lib/schemas-data/3.0.1/bundled/property/get-property-list-response.json +1001 -0
- package/dist/lib/schemas-data/3.0.1/bundled/property/list-property-lists-request.json +204 -0
- package/dist/lib/schemas-data/3.0.1/bundled/property/list-property-lists-response.json +946 -0
- package/dist/lib/schemas-data/3.0.1/bundled/property/update-property-list-request.json +670 -0
- package/dist/lib/schemas-data/3.0.1/bundled/property/update-property-list-response.json +923 -0
- package/dist/lib/schemas-data/3.0.1/bundled/property/validate-property-delivery-request.json +308 -0
- package/dist/lib/schemas-data/3.0.1/bundled/property/validate-property-delivery-response.json +418 -0
- package/dist/lib/schemas-data/3.0.1/bundled/protocol/get-adcp-capabilities-request.json +47 -0
- package/dist/lib/schemas-data/3.0.1/bundled/protocol/get-adcp-capabilities-response.json +1729 -0
- package/dist/lib/schemas-data/3.0.1/bundled/signals/activate-signal-request.json +269 -0
- package/dist/lib/schemas-data/3.0.1/bundled/signals/activate-signal-response.json +320 -0
- package/dist/lib/schemas-data/3.0.1/bundled/signals/get-signals-request.json +409 -0
- package/dist/lib/schemas-data/3.0.1/bundled/signals/get-signals-response.json +689 -0
- package/dist/lib/schemas-data/3.0.1/bundled/sponsored-intelligence/si-get-offering-request.json +57 -0
- package/dist/lib/schemas-data/3.0.1/bundled/sponsored-intelligence/si-get-offering-response.json +207 -0
- package/dist/lib/schemas-data/3.0.1/bundled/sponsored-intelligence/si-initiate-session-request.json +322 -0
- package/dist/lib/schemas-data/3.0.1/bundled/sponsored-intelligence/si-initiate-session-response.json +618 -0
- package/dist/lib/schemas-data/3.0.1/bundled/sponsored-intelligence/si-send-message-request.json +81 -0
- package/dist/lib/schemas-data/3.0.1/bundled/sponsored-intelligence/si-send-message-response.json +589 -0
- package/dist/lib/schemas-data/3.0.1/bundled/sponsored-intelligence/si-terminate-session-request.json +87 -0
- package/dist/lib/schemas-data/3.0.1/bundled/sponsored-intelligence/si-terminate-session-response.json +156 -0
- package/dist/lib/schemas-data/3.0.1/collection/base-collection-source.json +118 -0
- package/dist/lib/schemas-data/3.0.1/collection/collection-list-changed-webhook.json +74 -0
- package/dist/lib/schemas-data/3.0.1/collection/collection-list-filters.json +85 -0
- package/dist/lib/schemas-data/3.0.1/collection/collection-list.json +71 -0
- package/dist/lib/schemas-data/3.0.1/collection/create-collection-list-request.json +62 -0
- package/dist/lib/schemas-data/3.0.1/collection/create-collection-list-response.json +33 -0
- package/dist/lib/schemas-data/3.0.1/collection/delete-collection-list-request.json +43 -0
- package/dist/lib/schemas-data/3.0.1/collection/delete-collection-list-response.json +34 -0
- package/dist/lib/schemas-data/3.0.1/collection/get-collection-list-request.json +57 -0
- package/dist/lib/schemas-data/3.0.1/collection/get-collection-list-response.json +122 -0
- package/dist/lib/schemas-data/3.0.1/collection/list-collection-lists-request.json +33 -0
- package/dist/lib/schemas-data/3.0.1/collection/list-collection-lists-response.json +29 -0
- package/dist/lib/schemas-data/3.0.1/collection/update-collection-list-request.json +71 -0
- package/dist/lib/schemas-data/3.0.1/collection/update-collection-list-response.json +28 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/artifact-webhook-payload.json +88 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/artifact.json +407 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/calibrate-content-request.json +42 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/calibrate-content-response.json +93 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/content-standards.json +83 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/create-content-standards-request.json +177 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/create-content-standards-response.json +53 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/get-content-standards-request.json +28 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/get-content-standards-response.json +47 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/get-media-buy-artifacts-request.json +79 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/get-media-buy-artifacts-response.json +136 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/list-content-standards-request.json +49 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/list-content-standards-response.json +55 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/update-content-standards-request.json +166 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/update-content-standards-response.json +68 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/validate-content-delivery-request.json +96 -0
- package/dist/lib/schemas-data/3.0.1/content-standards/validate-content-delivery-response.json +121 -0
- package/dist/lib/schemas-data/3.0.1/core/account-ref.json +71 -0
- package/dist/lib/schemas-data/3.0.1/core/account.json +344 -0
- package/dist/lib/schemas-data/3.0.1/core/activation-key.json +50 -0
- package/dist/lib/schemas-data/3.0.1/core/ad-inventory-config.json +39 -0
- package/dist/lib/schemas-data/3.0.1/core/agent-encryption-key.json +41 -0
- package/dist/lib/schemas-data/3.0.1/core/agent-signing-key.json +55 -0
- package/dist/lib/schemas-data/3.0.1/core/app-item.json +170 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/audio-asset.json +82 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/brief-asset.json +22 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/catalog-asset.json +22 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/css-asset.json +31 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/daast-asset.json +88 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/html-asset.json +54 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/image-asset.json +49 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/javascript-asset.json +54 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/markdown-asset.json +37 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/text-asset.json +31 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/url-asset.json +36 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/vast-asset.json +94 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/video-asset.json +179 -0
- package/dist/lib/schemas-data/3.0.1/core/assets/webhook-asset.json +97 -0
- package/dist/lib/schemas-data/3.0.1/core/async-response-data.json +128 -0
- package/dist/lib/schemas-data/3.0.1/core/attribution-window.json +33 -0
- package/dist/lib/schemas-data/3.0.1/core/audience-member.json +70 -0
- package/dist/lib/schemas-data/3.0.1/core/audience-selector.json +134 -0
- package/dist/lib/schemas-data/3.0.1/core/brand-id.json +16 -0
- package/dist/lib/schemas-data/3.0.1/core/brand-ref.json +76 -0
- package/dist/lib/schemas-data/3.0.1/core/business-entity.json +207 -0
- package/dist/lib/schemas-data/3.0.1/core/cancellation-policy.json +49 -0
- package/dist/lib/schemas-data/3.0.1/core/catalog-field-mapping.json +144 -0
- package/dist/lib/schemas-data/3.0.1/core/catalog.json +222 -0
- package/dist/lib/schemas-data/3.0.1/core/catchment.json +221 -0
- package/dist/lib/schemas-data/3.0.1/core/collection-distribution.json +41 -0
- package/dist/lib/schemas-data/3.0.1/core/collection-list-ref.json +29 -0
- package/dist/lib/schemas-data/3.0.1/core/collection-selector.json +27 -0
- package/dist/lib/schemas-data/3.0.1/core/collection.json +116 -0
- package/dist/lib/schemas-data/3.0.1/core/content-rating.json +22 -0
- package/dist/lib/schemas-data/3.0.1/core/context.json +8 -0
- package/dist/lib/schemas-data/3.0.1/core/creative-asset.json +150 -0
- package/dist/lib/schemas-data/3.0.1/core/creative-assignment.json +32 -0
- package/dist/lib/schemas-data/3.0.1/core/creative-brief.json +136 -0
- package/dist/lib/schemas-data/3.0.1/core/creative-consumption.json +30 -0
- package/dist/lib/schemas-data/3.0.1/core/creative-filters.json +119 -0
- package/dist/lib/schemas-data/3.0.1/core/creative-item.json +79 -0
- package/dist/lib/schemas-data/3.0.1/core/creative-manifest.json +96 -0
- package/dist/lib/schemas-data/3.0.1/core/creative-policy.json +31 -0
- package/dist/lib/schemas-data/3.0.1/core/creative-variable.json +47 -0
- package/dist/lib/schemas-data/3.0.1/core/creative-variant.json +60 -0
- package/dist/lib/schemas-data/3.0.1/core/data-provider-signal-selector.json +94 -0
- package/dist/lib/schemas-data/3.0.1/core/date-range.json +24 -0
- package/dist/lib/schemas-data/3.0.1/core/datetime-range.json +24 -0
- package/dist/lib/schemas-data/3.0.1/core/daypart-target.json +39 -0
- package/dist/lib/schemas-data/3.0.1/core/deadline-policy.json +58 -0
- package/dist/lib/schemas-data/3.0.1/core/delivery-forecast.json +86 -0
- package/dist/lib/schemas-data/3.0.1/core/delivery-metrics.json +327 -0
- package/dist/lib/schemas-data/3.0.1/core/deployment.json +93 -0
- package/dist/lib/schemas-data/3.0.1/core/destination-item.json +168 -0
- package/dist/lib/schemas-data/3.0.1/core/destination.json +53 -0
- package/dist/lib/schemas-data/3.0.1/core/diagnostic-issue.json +27 -0
- package/dist/lib/schemas-data/3.0.1/core/duration.json +30 -0
- package/dist/lib/schemas-data/3.0.1/core/education-item.json +168 -0
- package/dist/lib/schemas-data/3.0.1/core/error.json +52 -0
- package/dist/lib/schemas-data/3.0.1/core/event-custom-data.json +86 -0
- package/dist/lib/schemas-data/3.0.1/core/event-source-health.json +70 -0
- package/dist/lib/schemas-data/3.0.1/core/event.json +54 -0
- package/dist/lib/schemas-data/3.0.1/core/ext.json +8 -0
- package/dist/lib/schemas-data/3.0.1/core/feature-requirement.json +45 -0
- package/dist/lib/schemas-data/3.0.1/core/flight-item.json +159 -0
- package/dist/lib/schemas-data/3.0.1/core/forecast-point.json +85 -0
- package/dist/lib/schemas-data/3.0.1/core/forecast-range.json +38 -0
- package/dist/lib/schemas-data/3.0.1/core/format-id.json +48 -0
- package/dist/lib/schemas-data/3.0.1/core/format.json +904 -0
- package/dist/lib/schemas-data/3.0.1/core/frequency-cap.json +73 -0
- package/dist/lib/schemas-data/3.0.1/core/generation-credential.json +44 -0
- package/dist/lib/schemas-data/3.0.1/core/geo-breakdown-support.json +38 -0
- package/dist/lib/schemas-data/3.0.1/core/hotel-item.json +214 -0
- package/dist/lib/schemas-data/3.0.1/core/identifier.json +22 -0
- package/dist/lib/schemas-data/3.0.1/core/industry-identifier.json +22 -0
- package/dist/lib/schemas-data/3.0.1/core/insertion-order.json +91 -0
- package/dist/lib/schemas-data/3.0.1/core/installment-deadlines.json +29 -0
- package/dist/lib/schemas-data/3.0.1/core/installment.json +108 -0
- package/dist/lib/schemas-data/3.0.1/core/job-item.json +199 -0
- package/dist/lib/schemas-data/3.0.1/core/limited-series.json +28 -0
- package/dist/lib/schemas-data/3.0.1/core/material-deadline.json +31 -0
- package/dist/lib/schemas-data/3.0.1/core/mcp-webhook-payload.json +163 -0
- package/dist/lib/schemas-data/3.0.1/core/measurement-readiness.json +43 -0
- package/dist/lib/schemas-data/3.0.1/core/measurement-terms.json +63 -0
- package/dist/lib/schemas-data/3.0.1/core/measurement-window.json +54 -0
- package/dist/lib/schemas-data/3.0.1/core/media-buy-features.json +24 -0
- package/dist/lib/schemas-data/3.0.1/core/media-buy.json +101 -0
- package/dist/lib/schemas-data/3.0.1/core/offering-asset-group.json +118 -0
- package/dist/lib/schemas-data/3.0.1/core/offering.json +267 -0
- package/dist/lib/schemas-data/3.0.1/core/optimization-goal.json +285 -0
- package/dist/lib/schemas-data/3.0.1/core/outcome-measurement.json +48 -0
- package/dist/lib/schemas-data/3.0.1/core/overlay.json +89 -0
- package/dist/lib/schemas-data/3.0.1/core/package.json +170 -0
- package/dist/lib/schemas-data/3.0.1/core/pagination-request.json +21 -0
- package/dist/lib/schemas-data/3.0.1/core/pagination-response.json +26 -0
- package/dist/lib/schemas-data/3.0.1/core/performance-feedback.json +90 -0
- package/dist/lib/schemas-data/3.0.1/core/performance-standard.json +33 -0
- package/dist/lib/schemas-data/3.0.1/core/placement-definition.json +81 -0
- package/dist/lib/schemas-data/3.0.1/core/placement.json +42 -0
- package/dist/lib/schemas-data/3.0.1/core/planned-delivery.json +84 -0
- package/dist/lib/schemas-data/3.0.1/core/price.json +59 -0
- package/dist/lib/schemas-data/3.0.1/core/pricing-option.json +35 -0
- package/dist/lib/schemas-data/3.0.1/core/product-allocation.json +69 -0
- package/dist/lib/schemas-data/3.0.1/core/product-filters.json +435 -0
- package/dist/lib/schemas-data/3.0.1/core/product.json +493 -0
- package/dist/lib/schemas-data/3.0.1/core/property-id.json +15 -0
- package/dist/lib/schemas-data/3.0.1/core/property-list-ref.json +29 -0
- package/dist/lib/schemas-data/3.0.1/core/property-tag.json +16 -0
- package/dist/lib/schemas-data/3.0.1/core/property.json +70 -0
- package/dist/lib/schemas-data/3.0.1/core/proposal.json +89 -0
- package/dist/lib/schemas-data/3.0.1/core/protocol-envelope.json +186 -0
- package/dist/lib/schemas-data/3.0.1/core/provenance.json +234 -0
- package/dist/lib/schemas-data/3.0.1/core/publisher-property-selector.json +92 -0
- package/dist/lib/schemas-data/3.0.1/core/push-notification-config.json +47 -0
- package/dist/lib/schemas-data/3.0.1/core/real-estate-item.json +241 -0
- package/dist/lib/schemas-data/3.0.1/core/reference-asset.json +36 -0
- package/dist/lib/schemas-data/3.0.1/core/reporting-capabilities.json +118 -0
- package/dist/lib/schemas-data/3.0.1/core/reporting-webhook.json +67 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/asset-requirements.json +44 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/audio-asset-requirements.json +68 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/catalog-field-binding.json +172 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/catalog-requirements.json +68 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/css-asset-requirements.json +15 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/daast-asset-requirements.json +17 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/html-asset-requirements.json +38 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/image-asset-requirements.json +151 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/javascript-asset-requirements.json +40 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/markdown-asset-requirements.json +15 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/offering-asset-constraint.json +66 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/text-asset-requirements.json +41 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/url-asset-requirements.json +50 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/vast-asset-requirements.json +21 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/video-asset-requirements.json +172 -0
- package/dist/lib/schemas-data/3.0.1/core/requirements/webhook-asset-requirements.json +21 -0
- package/dist/lib/schemas-data/3.0.1/core/response.json +24 -0
- package/dist/lib/schemas-data/3.0.1/core/rights-constraint.json +98 -0
- package/dist/lib/schemas-data/3.0.1/core/seller-agent-ref.json +30 -0
- package/dist/lib/schemas-data/3.0.1/core/signal-definition.json +89 -0
- package/dist/lib/schemas-data/3.0.1/core/signal-filters.json +43 -0
- package/dist/lib/schemas-data/3.0.1/core/signal-id.json +66 -0
- package/dist/lib/schemas-data/3.0.1/core/signal-pricing-option.json +7 -0
- package/dist/lib/schemas-data/3.0.1/core/signal-pricing.json +194 -0
- package/dist/lib/schemas-data/3.0.1/core/signal-targeting.json +93 -0
- package/dist/lib/schemas-data/3.0.1/core/special.json +31 -0
- package/dist/lib/schemas-data/3.0.1/core/start-timing.json +18 -0
- package/dist/lib/schemas-data/3.0.1/core/store-item.json +259 -0
- package/dist/lib/schemas-data/3.0.1/core/talent.json +27 -0
- package/dist/lib/schemas-data/3.0.1/core/targeting.json +510 -0
- package/dist/lib/schemas-data/3.0.1/core/tasks-get-request.json +50 -0
- package/dist/lib/schemas-data/3.0.1/core/tasks-get-response.json +159 -0
- package/dist/lib/schemas-data/3.0.1/core/tasks-list-request.json +185 -0
- package/dist/lib/schemas-data/3.0.1/core/tasks-list-response.json +153 -0
- package/dist/lib/schemas-data/3.0.1/core/user-match.json +90 -0
- package/dist/lib/schemas-data/3.0.1/core/vehicle-item.json +231 -0
- package/dist/lib/schemas-data/3.0.1/core/vendor-pricing-option.json +24 -0
- package/dist/lib/schemas-data/3.0.1/core/x-entity-types.json +69 -0
- package/dist/lib/schemas-data/3.0.1/creative/asset-types/index.json +118 -0
- package/dist/lib/schemas-data/3.0.1/creative/creative-feature-result.json +69 -0
- package/dist/lib/schemas-data/3.0.1/creative/get-creative-delivery-request.json +75 -0
- package/dist/lib/schemas-data/3.0.1/creative/get-creative-delivery-response.json +143 -0
- package/dist/lib/schemas-data/3.0.1/creative/get-creative-features-request.json +41 -0
- package/dist/lib/schemas-data/3.0.1/creative/get-creative-features-response.json +76 -0
- package/dist/lib/schemas-data/3.0.1/creative/list-creative-formats-request.json +150 -0
- package/dist/lib/schemas-data/3.0.1/creative/list-creative-formats-response.json +64 -0
- package/dist/lib/schemas-data/3.0.1/creative/list-creatives-request.json +184 -0
- package/dist/lib/schemas-data/3.0.1/creative/list-creatives-response.json +445 -0
- package/dist/lib/schemas-data/3.0.1/creative/preview-creative-request.json +212 -0
- package/dist/lib/schemas-data/3.0.1/creative/preview-creative-response.json +307 -0
- package/dist/lib/schemas-data/3.0.1/creative/preview-render.json +225 -0
- package/dist/lib/schemas-data/3.0.1/creative/sync-creatives-async-response-input-required.json +25 -0
- package/dist/lib/schemas-data/3.0.1/creative/sync-creatives-async-response-submitted.json +16 -0
- package/dist/lib/schemas-data/3.0.1/creative/sync-creatives-async-response-working.json +46 -0
- package/dist/lib/schemas-data/3.0.1/creative/sync-creatives-request.json +242 -0
- package/dist/lib/schemas-data/3.0.1/creative/sync-creatives-response.json +270 -0
- package/dist/lib/schemas-data/3.0.1/enums/account-scope.json +19 -0
- package/dist/lib/schemas-data/3.0.1/enums/account-status.json +23 -0
- package/dist/lib/schemas-data/3.0.1/enums/action-source.json +29 -0
- package/dist/lib/schemas-data/3.0.1/enums/adcp-protocol.json +23 -0
- package/dist/lib/schemas-data/3.0.1/enums/adjustment-kind.json +19 -0
- package/dist/lib/schemas-data/3.0.1/enums/advertiser-industry.json +175 -0
- package/dist/lib/schemas-data/3.0.1/enums/age-verification-method.json +14 -0
- package/dist/lib/schemas-data/3.0.1/enums/assessment-status.json +19 -0
- package/dist/lib/schemas-data/3.0.1/enums/asset-content-type.json +23 -0
- package/dist/lib/schemas-data/3.0.1/enums/attribution-model.json +14 -0
- package/dist/lib/schemas-data/3.0.1/enums/audience-source.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/audience-status.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/audio-channel-layout.json +13 -0
- package/dist/lib/schemas-data/3.0.1/enums/auth-scheme.json +11 -0
- package/dist/lib/schemas-data/3.0.1/enums/available-metric.json +31 -0
- package/dist/lib/schemas-data/3.0.1/enums/billing-party.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/binary-verdict.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/brand-agent-type.json +27 -0
- package/dist/lib/schemas-data/3.0.1/enums/canceled-by.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/catalog-action.json +14 -0
- package/dist/lib/schemas-data/3.0.1/enums/catalog-item-status.json +19 -0
- package/dist/lib/schemas-data/3.0.1/enums/catalog-type.json +22 -0
- package/dist/lib/schemas-data/3.0.1/enums/channels.json +51 -0
- package/dist/lib/schemas-data/3.0.1/enums/cloud-storage-protocol.json +12 -0
- package/dist/lib/schemas-data/3.0.1/enums/co-branding-requirement.json +12 -0
- package/dist/lib/schemas-data/3.0.1/enums/collection-cadence.json +23 -0
- package/dist/lib/schemas-data/3.0.1/enums/collection-kind.json +19 -0
- package/dist/lib/schemas-data/3.0.1/enums/collection-relationship.json +21 -0
- package/dist/lib/schemas-data/3.0.1/enums/collection-status.json +19 -0
- package/dist/lib/schemas-data/3.0.1/enums/consent-basis.json +13 -0
- package/dist/lib/schemas-data/3.0.1/enums/content-id-type.json +21 -0
- package/dist/lib/schemas-data/3.0.1/enums/content-rating-system.json +33 -0
- package/dist/lib/schemas-data/3.0.1/enums/creative-action.json +14 -0
- package/dist/lib/schemas-data/3.0.1/enums/creative-agent-capability.json +14 -0
- package/dist/lib/schemas-data/3.0.1/enums/creative-approval-status.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/creative-identifier-type.json +22 -0
- package/dist/lib/schemas-data/3.0.1/enums/creative-quality.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/creative-sort-field.json +14 -0
- package/dist/lib/schemas-data/3.0.1/enums/creative-status.json +21 -0
- package/dist/lib/schemas-data/3.0.1/enums/daast-tracking-event.json +32 -0
- package/dist/lib/schemas-data/3.0.1/enums/daast-version.json +11 -0
- package/dist/lib/schemas-data/3.0.1/enums/day-of-week.json +16 -0
- package/dist/lib/schemas-data/3.0.1/enums/delegation-authority.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/delivery-type.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/demographic-system.json +23 -0
- package/dist/lib/schemas-data/3.0.1/enums/derivative-type.json +21 -0
- package/dist/lib/schemas-data/3.0.1/enums/device-platform.json +21 -0
- package/dist/lib/schemas-data/3.0.1/enums/device-type.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/digital-source-type.json +29 -0
- package/dist/lib/schemas-data/3.0.1/enums/dimension-unit.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/disclosure-persistence.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/disclosure-position.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/distance-unit.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/distribution-identifier-type.json +53 -0
- package/dist/lib/schemas-data/3.0.1/enums/error-code.json +101 -0
- package/dist/lib/schemas-data/3.0.1/enums/escalation-severity.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/event-type.json +67 -0
- package/dist/lib/schemas-data/3.0.1/enums/exclusivity.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/feature-check-status.json +19 -0
- package/dist/lib/schemas-data/3.0.1/enums/feed-format.json +14 -0
- package/dist/lib/schemas-data/3.0.1/enums/feedback-source.json +13 -0
- package/dist/lib/schemas-data/3.0.1/enums/forecast-method.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/forecast-range-unit.json +27 -0
- package/dist/lib/schemas-data/3.0.1/enums/forecastable-metric.json +43 -0
- package/dist/lib/schemas-data/3.0.1/enums/format-id-parameter.json +11 -0
- package/dist/lib/schemas-data/3.0.1/enums/frame-rate-type.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/frequency-cap-scope.json +13 -0
- package/dist/lib/schemas-data/3.0.1/enums/genre-taxonomy.json +29 -0
- package/dist/lib/schemas-data/3.0.1/enums/geo-level.json +13 -0
- package/dist/lib/schemas-data/3.0.1/enums/gop-type.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/governance-decision.json +18 -0
- package/dist/lib/schemas-data/3.0.1/enums/governance-domain.json +13 -0
- package/dist/lib/schemas-data/3.0.1/enums/governance-mode.json +18 -0
- package/dist/lib/schemas-data/3.0.1/enums/governance-phase.json +12 -0
- package/dist/lib/schemas-data/3.0.1/enums/history-entry-type.json +11 -0
- package/dist/lib/schemas-data/3.0.1/enums/http-method.json +11 -0
- package/dist/lib/schemas-data/3.0.1/enums/identifier-types.json +61 -0
- package/dist/lib/schemas-data/3.0.1/enums/installment-status.json +25 -0
- package/dist/lib/schemas-data/3.0.1/enums/javascript-module-type.json +12 -0
- package/dist/lib/schemas-data/3.0.1/enums/landing-page-requirement.json +12 -0
- package/dist/lib/schemas-data/3.0.1/enums/makegood-remedy.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/markdown-flavor.json +11 -0
- package/dist/lib/schemas-data/3.0.1/enums/match-id-type.json +29 -0
- package/dist/lib/schemas-data/3.0.1/enums/match-type.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/media-buy-status.json +25 -0
- package/dist/lib/schemas-data/3.0.1/enums/media-buy-valid-action.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/metric-type.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/metro-system.json +14 -0
- package/dist/lib/schemas-data/3.0.1/enums/moov-atom-position.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/notification-type.json +13 -0
- package/dist/lib/schemas-data/3.0.1/enums/outcome-type.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/pacing.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/payment-terms.json +23 -0
- package/dist/lib/schemas-data/3.0.1/enums/performance-standard-metric.json +21 -0
- package/dist/lib/schemas-data/3.0.1/enums/policy-category.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/policy-enforcement.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/postal-system.json +20 -0
- package/dist/lib/schemas-data/3.0.1/enums/preview-output-format.json +11 -0
- package/dist/lib/schemas-data/3.0.1/enums/pricing-model.json +29 -0
- package/dist/lib/schemas-data/3.0.1/enums/production-quality.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/property-type.json +31 -0
- package/dist/lib/schemas-data/3.0.1/enums/proposal-status.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/publisher-identifier-types.json +19 -0
- package/dist/lib/schemas-data/3.0.1/enums/purchase-type.json +13 -0
- package/dist/lib/schemas-data/3.0.1/enums/reach-unit.json +23 -0
- package/dist/lib/schemas-data/3.0.1/enums/reporting-frequency.json +12 -0
- package/dist/lib/schemas-data/3.0.1/enums/response-type.json +19 -0
- package/dist/lib/schemas-data/3.0.1/enums/restricted-attribute.json +31 -0
- package/dist/lib/schemas-data/3.0.1/enums/right-type.json +22 -0
- package/dist/lib/schemas-data/3.0.1/enums/right-use.json +36 -0
- package/dist/lib/schemas-data/3.0.1/enums/rights-billing-period.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/scan-type.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/si-session-status.json +19 -0
- package/dist/lib/schemas-data/3.0.1/enums/signal-catalog-type.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/signal-source.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/signal-value-type.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/snapshot-unavailable-reason.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/sort-direction.json +11 -0
- package/dist/lib/schemas-data/3.0.1/enums/sort-metric.json +31 -0
- package/dist/lib/schemas-data/3.0.1/enums/special-category.json +35 -0
- package/dist/lib/schemas-data/3.0.1/enums/specialism.json +55 -0
- package/dist/lib/schemas-data/3.0.1/enums/talent-role.json +29 -0
- package/dist/lib/schemas-data/3.0.1/enums/task-status.json +29 -0
- package/dist/lib/schemas-data/3.0.1/enums/task-type.json +57 -0
- package/dist/lib/schemas-data/3.0.1/enums/transport-mode.json +19 -0
- package/dist/lib/schemas-data/3.0.1/enums/travel-time-unit.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/uid-type.json +31 -0
- package/dist/lib/schemas-data/3.0.1/enums/universal-macro.json +149 -0
- package/dist/lib/schemas-data/3.0.1/enums/update-frequency.json +13 -0
- package/dist/lib/schemas-data/3.0.1/enums/url-asset-type.json +12 -0
- package/dist/lib/schemas-data/3.0.1/enums/validation-mode.json +11 -0
- package/dist/lib/schemas-data/3.0.1/enums/vast-tracking-event.json +41 -0
- package/dist/lib/schemas-data/3.0.1/enums/vast-version.json +14 -0
- package/dist/lib/schemas-data/3.0.1/enums/viewability-standard.json +15 -0
- package/dist/lib/schemas-data/3.0.1/enums/wcag-level.json +17 -0
- package/dist/lib/schemas-data/3.0.1/enums/webhook-response-type.json +13 -0
- package/dist/lib/schemas-data/3.0.1/enums/webhook-security-method.json +12 -0
- package/dist/lib/schemas-data/3.0.1/error-details/account-setup-required.json +22 -0
- package/dist/lib/schemas-data/3.0.1/error-details/audience-too-small.json +18 -0
- package/dist/lib/schemas-data/3.0.1/error-details/budget-too-low.json +18 -0
- package/dist/lib/schemas-data/3.0.1/error-details/conflict.json +28 -0
- package/dist/lib/schemas-data/3.0.1/error-details/creative-rejected.json +27 -0
- package/dist/lib/schemas-data/3.0.1/error-details/policy-violation.json +27 -0
- package/dist/lib/schemas-data/3.0.1/error-details/rate-limited.json +31 -0
- package/dist/lib/schemas-data/3.0.1/error-details/vendor-error-codes.json +55 -0
- package/dist/lib/schemas-data/3.0.1/extensions/extension-meta.json +69 -0
- package/dist/lib/schemas-data/3.0.1/extensions/index.json +9 -0
- package/dist/lib/schemas-data/3.0.1/governance/attribute-definition.json +82 -0
- package/dist/lib/schemas-data/3.0.1/governance/audience-constraints.json +27 -0
- package/dist/lib/schemas-data/3.0.1/governance/check-governance-request.json +198 -0
- package/dist/lib/schemas-data/3.0.1/governance/check-governance-response.json +217 -0
- package/dist/lib/schemas-data/3.0.1/governance/get-plan-audit-logs-request.json +79 -0
- package/dist/lib/schemas-data/3.0.1/governance/get-plan-audit-logs-response.json +423 -0
- package/dist/lib/schemas-data/3.0.1/governance/policy-category-definition.json +95 -0
- package/dist/lib/schemas-data/3.0.1/governance/policy-entry.json +165 -0
- package/dist/lib/schemas-data/3.0.1/governance/policy-ref.json +27 -0
- package/dist/lib/schemas-data/3.0.1/governance/report-plan-outcome-request.json +165 -0
- package/dist/lib/schemas-data/3.0.1/governance/report-plan-outcome-response.json +89 -0
- package/dist/lib/schemas-data/3.0.1/governance/sync-plans-request.json +449 -0
- package/dist/lib/schemas-data/3.0.1/governance/sync-plans-response.json +119 -0
- package/dist/lib/schemas-data/3.0.1/index.json +1678 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/build-creative-async-response-input-required.json +32 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/build-creative-async-response-submitted.json +16 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/build-creative-async-response-working.json +36 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/build-creative-request.json +138 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/build-creative-response.json +293 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/create-media-buy-async-response-input-required.json +31 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/create-media-buy-async-response-submitted.json +16 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/create-media-buy-async-response-working.json +36 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/create-media-buy-request.json +221 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/create-media-buy-response.json +194 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/get-media-buy-delivery-request.json +205 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/get-media-buy-delivery-response.json +704 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/get-media-buys-request.json +66 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/get-media-buys-response.json +394 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/get-products-async-response-input-required.json +38 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/get-products-async-response-submitted.json +21 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/get-products-async-response-working.json +34 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/get-products-request.json +229 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/get-products-response.json +195 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/list-creative-formats-request.json +103 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/list-creative-formats-response.json +68 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/log-event-request.json +53 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/log-event-response.json +130 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/package-request.json +133 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/package-update.json +202 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/provide-performance-feedback-request.json +73 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/provide-performance-feedback-response.json +79 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/sync-audiences-request.json +127 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/sync-audiences-response.json +191 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/sync-catalogs-async-response-input-required.json +26 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/sync-catalogs-async-response-submitted.json +16 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/sync-catalogs-async-response-working.json +56 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/sync-catalogs-request.json +162 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/sync-catalogs-response.json +213 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/sync-event-sources-request.json +82 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/sync-event-sources-response.json +167 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/update-media-buy-async-response-input-required.json +24 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/update-media-buy-async-response-submitted.json +16 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/update-media-buy-async-response-working.json +36 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/update-media-buy-request.json +99 -0
- package/dist/lib/schemas-data/3.0.1/media-buy/update-media-buy-response.json +119 -0
- package/dist/lib/schemas-data/3.0.1/pricing-options/cpa-option.json +75 -0
- package/dist/lib/schemas-data/3.0.1/pricing-options/cpc-option.json +71 -0
- package/dist/lib/schemas-data/3.0.1/pricing-options/cpcv-option.json +71 -0
- package/dist/lib/schemas-data/3.0.1/pricing-options/cpm-option.json +71 -0
- package/dist/lib/schemas-data/3.0.1/pricing-options/cpp-option.json +90 -0
- package/dist/lib/schemas-data/3.0.1/pricing-options/cpv-option.json +107 -0
- package/dist/lib/schemas-data/3.0.1/pricing-options/flat-rate-option.json +116 -0
- package/dist/lib/schemas-data/3.0.1/pricing-options/price-breakdown.json +88 -0
- package/dist/lib/schemas-data/3.0.1/pricing-options/price-guidance.json +30 -0
- package/dist/lib/schemas-data/3.0.1/pricing-options/time-option.json +97 -0
- package/dist/lib/schemas-data/3.0.1/pricing-options/vcpm-option.json +71 -0
- package/dist/lib/schemas-data/3.0.1/property/authorization-result.json +50 -0
- package/dist/lib/schemas-data/3.0.1/property/base-property-source.json +98 -0
- package/dist/lib/schemas-data/3.0.1/property/create-property-list-request.json +62 -0
- package/dist/lib/schemas-data/3.0.1/property/create-property-list-response.json +33 -0
- package/dist/lib/schemas-data/3.0.1/property/delete-property-list-request.json +43 -0
- package/dist/lib/schemas-data/3.0.1/property/delete-property-list-response.json +34 -0
- package/dist/lib/schemas-data/3.0.1/property/delivery-record.json +35 -0
- package/dist/lib/schemas-data/3.0.1/property/get-property-list-request.json +57 -0
- package/dist/lib/schemas-data/3.0.1/property/get-property-list-response.json +53 -0
- package/dist/lib/schemas-data/3.0.1/property/list-property-lists-request.json +33 -0
- package/dist/lib/schemas-data/3.0.1/property/list-property-lists-response.json +29 -0
- package/dist/lib/schemas-data/3.0.1/property/property-error.json +34 -0
- package/dist/lib/schemas-data/3.0.1/property/property-feature-definition.json +96 -0
- package/dist/lib/schemas-data/3.0.1/property/property-feature-result.json +50 -0
- package/dist/lib/schemas-data/3.0.1/property/property-feature-value.json +59 -0
- package/dist/lib/schemas-data/3.0.1/property/property-feature.json +26 -0
- package/dist/lib/schemas-data/3.0.1/property/property-list-changed-webhook.json +74 -0
- package/dist/lib/schemas-data/3.0.1/property/property-list-filters.json +51 -0
- package/dist/lib/schemas-data/3.0.1/property/property-list.json +79 -0
- package/dist/lib/schemas-data/3.0.1/property/update-property-list-request.json +71 -0
- package/dist/lib/schemas-data/3.0.1/property/update-property-list-response.json +28 -0
- package/dist/lib/schemas-data/3.0.1/property/validate-property-delivery-request.json +49 -0
- package/dist/lib/schemas-data/3.0.1/property/validate-property-delivery-response.json +180 -0
- package/dist/lib/schemas-data/3.0.1/property/validation-result.json +101 -0
- package/dist/lib/schemas-data/3.0.1/protocol/get-adcp-capabilities-request.json +37 -0
- package/dist/lib/schemas-data/3.0.1/protocol/get-adcp-capabilities-response.json +1108 -0
- package/dist/lib/schemas-data/3.0.1/signals/activate-signal-request.json +66 -0
- package/dist/lib/schemas-data/3.0.1/signals/activate-signal-response.json +81 -0
- package/dist/lib/schemas-data/3.0.1/signals/get-signals-request.json +80 -0
- package/dist/lib/schemas-data/3.0.1/signals/get-signals-response.json +130 -0
- package/dist/lib/schemas-data/3.0.1/sponsored-intelligence/si-capabilities.json +154 -0
- package/dist/lib/schemas-data/3.0.1/sponsored-intelligence/si-get-offering-request.json +47 -0
- package/dist/lib/schemas-data/3.0.1/sponsored-intelligence/si-get-offering-response.json +150 -0
- package/dist/lib/schemas-data/3.0.1/sponsored-intelligence/si-identity.json +104 -0
- package/dist/lib/schemas-data/3.0.1/sponsored-intelligence/si-initiate-session-request.json +65 -0
- package/dist/lib/schemas-data/3.0.1/sponsored-intelligence/si-initiate-session-response.json +64 -0
- package/dist/lib/schemas-data/3.0.1/sponsored-intelligence/si-send-message-request.json +71 -0
- package/dist/lib/schemas-data/3.0.1/sponsored-intelligence/si-send-message-response.json +123 -0
- package/dist/lib/schemas-data/3.0.1/sponsored-intelligence/si-terminate-session-request.json +77 -0
- package/dist/lib/schemas-data/3.0.1/sponsored-intelligence/si-terminate-session-response.json +86 -0
- package/dist/lib/schemas-data/3.0.1/sponsored-intelligence/si-ui-element.json +341 -0
- package/dist/lib/server/a2a-adapter.d.ts +234 -0
- package/dist/lib/server/a2a-adapter.d.ts.map +1 -0
- package/dist/lib/server/a2a-adapter.js +503 -0
- package/dist/lib/server/a2a-adapter.js.map +1 -0
- package/dist/lib/server/adcp-server.d.ts +265 -0
- package/dist/lib/server/adcp-server.d.ts.map +1 -0
- package/dist/lib/server/adcp-server.js +187 -0
- package/dist/lib/server/adcp-server.js.map +1 -0
- package/dist/lib/server/auth-introspection.d.ts +83 -0
- package/dist/lib/server/auth-introspection.d.ts.map +1 -0
- package/dist/lib/server/auth-introspection.js +297 -0
- package/dist/lib/server/auth-introspection.js.map +1 -0
- package/dist/lib/server/auth-signature.d.ts +322 -0
- package/dist/lib/server/auth-signature.d.ts.map +1 -0
- package/dist/lib/server/auth-signature.js +310 -0
- package/dist/lib/server/auth-signature.js.map +1 -0
- package/dist/lib/server/auth.d.ts +303 -0
- package/dist/lib/server/auth.d.ts.map +1 -0
- package/dist/lib/server/auth.js +387 -0
- package/dist/lib/server/auth.js.map +1 -0
- package/dist/lib/server/create-adcp-server.d.ts +968 -0
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -0
- package/dist/lib/server/create-adcp-server.js +1831 -0
- package/dist/lib/server/create-adcp-server.js.map +1 -0
- package/dist/lib/server/envelope-allowlist.d.ts +109 -0
- package/dist/lib/server/envelope-allowlist.d.ts.map +1 -0
- package/dist/lib/server/envelope-allowlist.js +155 -0
- package/dist/lib/server/envelope-allowlist.js.map +1 -0
- package/dist/lib/server/errors.d.ts +129 -0
- package/dist/lib/server/errors.d.ts.map +1 -0
- package/dist/lib/server/errors.js +85 -0
- package/dist/lib/server/errors.js.map +1 -0
- package/dist/lib/server/express-adapter.d.ts +169 -0
- package/dist/lib/server/express-adapter.d.ts.map +1 -0
- package/dist/lib/server/express-adapter.js +271 -0
- package/dist/lib/server/express-adapter.js.map +1 -0
- package/dist/lib/server/governance.d.ts +122 -0
- package/dist/lib/server/governance.d.ts.map +1 -0
- package/dist/lib/server/governance.js +189 -0
- package/dist/lib/server/governance.js.map +1 -0
- package/dist/lib/server/idempotency/backends/memory.d.ts +22 -0
- package/dist/lib/server/idempotency/backends/memory.d.ts.map +1 -0
- package/dist/lib/server/idempotency/backends/memory.js +78 -0
- package/dist/lib/server/idempotency/backends/memory.js.map +1 -0
- package/dist/lib/server/idempotency/backends/pg.d.ts +76 -0
- package/dist/lib/server/idempotency/backends/pg.d.ts.map +1 -0
- package/dist/lib/server/idempotency/backends/pg.js +163 -0
- package/dist/lib/server/idempotency/backends/pg.js.map +1 -0
- package/dist/lib/server/idempotency/index.d.ts +7 -0
- package/dist/lib/server/idempotency/index.d.ts.map +1 -0
- package/dist/lib/server/idempotency/index.js +15 -0
- package/dist/lib/server/idempotency/index.js.map +1 -0
- package/dist/lib/server/idempotency/store.d.ts +302 -0
- package/dist/lib/server/idempotency/store.d.ts.map +1 -0
- package/dist/lib/server/idempotency/store.js +272 -0
- package/dist/lib/server/idempotency/store.js.map +1 -0
- package/dist/lib/server/index.d.ts +50 -0
- package/dist/lib/server/index.d.ts.map +1 -0
- package/dist/lib/server/index.js +164 -0
- package/dist/lib/server/index.js.map +1 -0
- package/dist/lib/server/media-buy-helpers.d.ts +47 -0
- package/dist/lib/server/media-buy-helpers.d.ts.map +1 -0
- package/dist/lib/server/media-buy-helpers.js +43 -0
- package/dist/lib/server/media-buy-helpers.js.map +1 -0
- package/dist/lib/server/pin-and-bind-fetch.d.ts +115 -0
- package/dist/lib/server/pin-and-bind-fetch.d.ts.map +1 -0
- package/dist/lib/server/pin-and-bind-fetch.js +244 -0
- package/dist/lib/server/pin-and-bind-fetch.js.map +1 -0
- package/dist/lib/server/postgres-state-store.d.ts +76 -0
- package/dist/lib/server/postgres-state-store.d.ts.map +1 -0
- package/dist/lib/server/postgres-state-store.js +218 -0
- package/dist/lib/server/postgres-state-store.js.map +1 -0
- package/dist/lib/server/postgres-task-store.d.ts +121 -0
- package/dist/lib/server/postgres-task-store.d.ts.map +1 -0
- package/dist/lib/server/postgres-task-store.js +298 -0
- package/dist/lib/server/postgres-task-store.js.map +1 -0
- package/dist/lib/server/product-defaults.d.ts +16 -0
- package/dist/lib/server/product-defaults.d.ts.map +1 -0
- package/dist/lib/server/product-defaults.js +25 -0
- package/dist/lib/server/product-defaults.js.map +1 -0
- package/dist/lib/server/responses.d.ts +257 -0
- package/dist/lib/server/responses.d.ts.map +1 -0
- package/dist/lib/server/responses.js +542 -0
- package/dist/lib/server/responses.js.map +1 -0
- package/dist/lib/server/serve.d.ts +308 -0
- package/dist/lib/server/serve.d.ts.map +1 -0
- package/dist/lib/server/serve.js +663 -0
- package/dist/lib/server/serve.js.map +1 -0
- package/dist/lib/server/state-store.d.ts +296 -0
- package/dist/lib/server/state-store.d.ts.map +1 -0
- package/dist/lib/server/state-store.js +459 -0
- package/dist/lib/server/state-store.js.map +1 -0
- package/dist/lib/server/structured-serialize.d.ts +30 -0
- package/dist/lib/server/structured-serialize.d.ts.map +1 -0
- package/dist/lib/server/structured-serialize.js +109 -0
- package/dist/lib/server/structured-serialize.js.map +1 -0
- package/dist/lib/server/targeting-helpers.d.ts +90 -0
- package/dist/lib/server/targeting-helpers.d.ts.map +1 -0
- package/dist/lib/server/targeting-helpers.js +144 -0
- package/dist/lib/server/targeting-helpers.js.map +1 -0
- package/dist/lib/server/tasks.d.ts +91 -0
- package/dist/lib/server/tasks.d.ts.map +1 -0
- package/dist/lib/server/tasks.js +116 -0
- package/dist/lib/server/tasks.js.map +1 -0
- package/dist/lib/server/test-controller-bridge.d.ts +192 -0
- package/dist/lib/server/test-controller-bridge.d.ts.map +1 -0
- package/dist/lib/server/test-controller-bridge.js +207 -0
- package/dist/lib/server/test-controller-bridge.js.map +1 -0
- package/dist/lib/server/test-controller.d.ts +388 -0
- package/dist/lib/server/test-controller.d.ts.map +1 -0
- package/dist/lib/server/test-controller.js +735 -0
- package/dist/lib/server/test-controller.js.map +1 -0
- package/dist/lib/server/webhook-emitter.d.ts +192 -0
- package/dist/lib/server/webhook-emitter.d.ts.map +1 -0
- package/dist/lib/server/webhook-emitter.js +316 -0
- package/dist/lib/server/webhook-emitter.js.map +1 -0
- package/dist/lib/server/wrap-envelope.d.ts +162 -0
- package/dist/lib/server/wrap-envelope.d.ts.map +1 -0
- package/dist/lib/server/wrap-envelope.js +145 -0
- package/dist/lib/server/wrap-envelope.js.map +1 -0
- package/dist/lib/signing/agent-context.d.ts +73 -0
- package/dist/lib/signing/agent-context.d.ts.map +1 -0
- package/dist/lib/signing/agent-context.js +104 -0
- package/dist/lib/signing/agent-context.js.map +1 -0
- package/dist/lib/signing/agent-fetch.d.ts +177 -0
- package/dist/lib/signing/agent-fetch.d.ts.map +1 -0
- package/dist/lib/signing/agent-fetch.js +271 -0
- package/dist/lib/signing/agent-fetch.js.map +1 -0
- package/dist/lib/signing/brand-jwks.d.ts +102 -0
- package/dist/lib/signing/brand-jwks.d.ts.map +1 -0
- package/dist/lib/signing/brand-jwks.js +433 -0
- package/dist/lib/signing/brand-jwks.js.map +1 -0
- package/dist/lib/signing/canonicalize.d.ts +39 -0
- package/dist/lib/signing/canonicalize.d.ts.map +1 -0
- package/dist/lib/signing/canonicalize.js +149 -0
- package/dist/lib/signing/canonicalize.js.map +1 -0
- package/dist/lib/signing/capability-cache.d.ts +70 -0
- package/dist/lib/signing/capability-cache.d.ts.map +1 -0
- package/dist/lib/signing/capability-cache.js +90 -0
- package/dist/lib/signing/capability-cache.js.map +1 -0
- package/dist/lib/signing/capability-priming.d.ts +30 -0
- package/dist/lib/signing/capability-priming.d.ts.map +1 -0
- package/dist/lib/signing/capability-priming.js +145 -0
- package/dist/lib/signing/capability-priming.js.map +1 -0
- package/dist/lib/signing/client.d.ts +25 -0
- package/dist/lib/signing/client.d.ts.map +1 -0
- package/dist/lib/signing/client.js +70 -0
- package/dist/lib/signing/client.js.map +1 -0
- package/dist/lib/signing/content-digest.d.ts +9 -0
- package/dist/lib/signing/content-digest.d.ts.map +1 -0
- package/dist/lib/signing/content-digest.js +48 -0
- package/dist/lib/signing/content-digest.js.map +1 -0
- package/dist/lib/signing/crypto.d.ts +5 -0
- package/dist/lib/signing/crypto.d.ts.map +1 -0
- package/dist/lib/signing/crypto.js +35 -0
- package/dist/lib/signing/crypto.js.map +1 -0
- package/dist/lib/signing/ecdsa-encoding.d.ts +20 -0
- package/dist/lib/signing/ecdsa-encoding.d.ts.map +1 -0
- package/dist/lib/signing/ecdsa-encoding.js +91 -0
- package/dist/lib/signing/ecdsa-encoding.js.map +1 -0
- package/dist/lib/signing/errors.d.ts +49 -0
- package/dist/lib/signing/errors.d.ts.map +1 -0
- package/dist/lib/signing/errors.js +48 -0
- package/dist/lib/signing/errors.js.map +1 -0
- package/dist/lib/signing/fetch-async.d.ts +23 -0
- package/dist/lib/signing/fetch-async.d.ts.map +1 -0
- package/dist/lib/signing/fetch-async.js +96 -0
- package/dist/lib/signing/fetch-async.js.map +1 -0
- package/dist/lib/signing/fetch.d.ts +17 -0
- package/dist/lib/signing/fetch.d.ts.map +1 -0
- package/dist/lib/signing/fetch.js +89 -0
- package/dist/lib/signing/fetch.js.map +1 -0
- package/dist/lib/signing/index.d.ts +16 -0
- package/dist/lib/signing/index.d.ts.map +1 -0
- package/dist/lib/signing/index.js +32 -0
- package/dist/lib/signing/index.js.map +1 -0
- package/dist/lib/signing/jwks-helpers.d.ts +48 -0
- package/dist/lib/signing/jwks-helpers.d.ts.map +1 -0
- package/dist/lib/signing/jwks-helpers.js +87 -0
- package/dist/lib/signing/jwks-helpers.js.map +1 -0
- package/dist/lib/signing/jwks-https.d.ts +61 -0
- package/dist/lib/signing/jwks-https.d.ts.map +1 -0
- package/dist/lib/signing/jwks-https.js +165 -0
- package/dist/lib/signing/jwks-https.js.map +1 -0
- package/dist/lib/signing/jwks.d.ts +10 -0
- package/dist/lib/signing/jwks.d.ts.map +1 -0
- package/dist/lib/signing/jwks.js +15 -0
- package/dist/lib/signing/jwks.js.map +1 -0
- package/dist/lib/signing/middleware.d.ts +77 -0
- package/dist/lib/signing/middleware.d.ts.map +1 -0
- package/dist/lib/signing/middleware.js +77 -0
- package/dist/lib/signing/middleware.js.map +1 -0
- package/dist/lib/signing/parser.d.ts +35 -0
- package/dist/lib/signing/parser.d.ts.map +1 -0
- package/dist/lib/signing/parser.js +244 -0
- package/dist/lib/signing/parser.js.map +1 -0
- package/dist/lib/signing/postgres-replay-store.d.ts +138 -0
- package/dist/lib/signing/postgres-replay-store.d.ts.map +1 -0
- package/dist/lib/signing/postgres-replay-store.js +236 -0
- package/dist/lib/signing/postgres-replay-store.js.map +1 -0
- package/dist/lib/signing/provider.d.ts +81 -0
- package/dist/lib/signing/provider.d.ts.map +1 -0
- package/dist/lib/signing/provider.js +3 -0
- package/dist/lib/signing/provider.js.map +1 -0
- package/dist/lib/signing/replay.d.ts +62 -0
- package/dist/lib/signing/replay.d.ts.map +1 -0
- package/dist/lib/signing/replay.js +106 -0
- package/dist/lib/signing/replay.js.map +1 -0
- package/dist/lib/signing/revocation-https.d.ts +79 -0
- package/dist/lib/signing/revocation-https.d.ts.map +1 -0
- package/dist/lib/signing/revocation-https.js +144 -0
- package/dist/lib/signing/revocation-https.js.map +1 -0
- package/dist/lib/signing/revocation.d.ts +11 -0
- package/dist/lib/signing/revocation.d.ts.map +1 -0
- package/dist/lib/signing/revocation.js +18 -0
- package/dist/lib/signing/revocation.js.map +1 -0
- package/dist/lib/signing/server.d.ts +27 -0
- package/dist/lib/signing/server.d.ts.map +1 -0
- package/dist/lib/signing/server.js +67 -0
- package/dist/lib/signing/server.js.map +1 -0
- package/dist/lib/signing/signer-async.d.ts +24 -0
- package/dist/lib/signing/signer-async.d.ts.map +1 -0
- package/dist/lib/signing/signer-async.js +34 -0
- package/dist/lib/signing/signer-async.js.map +1 -0
- package/dist/lib/signing/signer.d.ts +94 -0
- package/dist/lib/signing/signer.d.ts.map +1 -0
- package/dist/lib/signing/signer.js +131 -0
- package/dist/lib/signing/signer.js.map +1 -0
- package/dist/lib/signing/testing.d.ts +45 -0
- package/dist/lib/signing/testing.d.ts.map +1 -0
- package/dist/lib/signing/testing.js +81 -0
- package/dist/lib/signing/testing.js.map +1 -0
- package/dist/lib/signing/types.d.ts +90 -0
- package/dist/lib/signing/types.d.ts.map +1 -0
- package/dist/lib/signing/types.js +9 -0
- package/dist/lib/signing/types.js.map +1 -0
- package/dist/lib/signing/verifier.d.ts +23 -0
- package/dist/lib/signing/verifier.d.ts.map +1 -0
- package/dist/lib/signing/verifier.js +386 -0
- package/dist/lib/signing/verifier.js.map +1 -0
- package/dist/lib/signing/webhook-verifier.d.ts +119 -0
- package/dist/lib/signing/webhook-verifier.d.ts.map +1 -0
- package/dist/lib/signing/webhook-verifier.js +292 -0
- package/dist/lib/signing/webhook-verifier.js.map +1 -0
- package/dist/lib/storage/MemoryStorage.d.ts +93 -0
- package/dist/lib/storage/MemoryStorage.d.ts.map +1 -0
- package/dist/lib/storage/MemoryStorage.js +219 -0
- package/dist/lib/storage/MemoryStorage.js.map +1 -0
- package/dist/lib/storage/interfaces.d.ts +195 -0
- package/dist/lib/storage/interfaces.d.ts.map +1 -0
- package/dist/lib/storage/interfaces.js +5 -0
- package/dist/lib/storage/interfaces.js.map +1 -0
- package/dist/lib/substitution/encoder/SubstitutionEncoder.d.ts +45 -0
- package/dist/lib/substitution/encoder/SubstitutionEncoder.d.ts.map +1 -0
- package/dist/lib/substitution/encoder/SubstitutionEncoder.js +73 -0
- package/dist/lib/substitution/encoder/SubstitutionEncoder.js.map +1 -0
- package/dist/lib/substitution/encoder/index.d.ts +2 -0
- package/dist/lib/substitution/encoder/index.d.ts.map +1 -0
- package/dist/lib/substitution/encoder/index.js +7 -0
- package/dist/lib/substitution/encoder/index.js.map +1 -0
- package/dist/lib/substitution/index.d.ts +36 -0
- package/dist/lib/substitution/index.d.ts.map +1 -0
- package/dist/lib/substitution/index.js +56 -0
- package/dist/lib/substitution/index.js.map +1 -0
- package/dist/lib/substitution/observer/SubstitutionObserver.d.ts +91 -0
- package/dist/lib/substitution/observer/SubstitutionObserver.d.ts.map +1 -0
- package/dist/lib/substitution/observer/SubstitutionObserver.js +248 -0
- package/dist/lib/substitution/observer/SubstitutionObserver.js.map +1 -0
- package/dist/lib/substitution/observer/alignment.d.ts +24 -0
- package/dist/lib/substitution/observer/alignment.d.ts.map +1 -0
- package/dist/lib/substitution/observer/alignment.js +279 -0
- package/dist/lib/substitution/observer/alignment.js.map +1 -0
- package/dist/lib/substitution/observer/assertions.d.ts +48 -0
- package/dist/lib/substitution/observer/assertions.d.ts.map +1 -0
- package/dist/lib/substitution/observer/assertions.js +145 -0
- package/dist/lib/substitution/observer/assertions.js.map +1 -0
- package/dist/lib/substitution/observer/html-parser.d.ts +29 -0
- package/dist/lib/substitution/observer/html-parser.d.ts.map +1 -0
- package/dist/lib/substitution/observer/html-parser.js +308 -0
- package/dist/lib/substitution/observer/html-parser.js.map +1 -0
- package/dist/lib/substitution/observer/index.d.ts +7 -0
- package/dist/lib/substitution/observer/index.d.ts.map +1 -0
- package/dist/lib/substitution/observer/index.js +21 -0
- package/dist/lib/substitution/observer/index.js.map +1 -0
- package/dist/lib/substitution/observer/ssrf.d.ts +29 -0
- package/dist/lib/substitution/observer/ssrf.d.ts.map +1 -0
- package/dist/lib/substitution/observer/ssrf.js +226 -0
- package/dist/lib/substitution/observer/ssrf.js.map +1 -0
- package/dist/lib/substitution/rfc3986.d.ts +51 -0
- package/dist/lib/substitution/rfc3986.d.ts.map +1 -0
- package/dist/lib/substitution/rfc3986.js +139 -0
- package/dist/lib/substitution/rfc3986.js.map +1 -0
- package/dist/lib/substitution/types.d.ts +147 -0
- package/dist/lib/substitution/types.d.ts.map +1 -0
- package/dist/lib/substitution/types.js +8 -0
- package/dist/lib/substitution/types.js.map +1 -0
- package/dist/lib/substitution/vectors.d.ts +18 -0
- package/dist/lib/substitution/vectors.d.ts.map +1 -0
- package/dist/lib/substitution/vectors.js +79 -0
- package/dist/lib/substitution/vectors.js.map +1 -0
- package/dist/lib/testing/agent-tester.d.ts +34 -0
- package/dist/lib/testing/agent-tester.d.ts.map +1 -0
- package/dist/lib/testing/agent-tester.js +421 -0
- package/dist/lib/testing/agent-tester.js.map +1 -0
- package/dist/lib/testing/client.d.ts +104 -0
- package/dist/lib/testing/client.d.ts.map +1 -0
- package/dist/lib/testing/client.js +487 -0
- package/dist/lib/testing/client.js.map +1 -0
- package/dist/lib/testing/compliance/briefs.d.ts +11 -0
- package/dist/lib/testing/compliance/briefs.d.ts.map +1 -0
- package/dist/lib/testing/compliance/briefs.js +156 -0
- package/dist/lib/testing/compliance/briefs.js.map +1 -0
- package/dist/lib/testing/compliance/comply.d.ts +83 -0
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -0
- package/dist/lib/testing/compliance/comply.js +1275 -0
- package/dist/lib/testing/compliance/comply.js.map +1 -0
- package/dist/lib/testing/compliance/index.d.ts +10 -0
- package/dist/lib/testing/compliance/index.d.ts.map +1 -0
- package/dist/lib/testing/compliance/index.js +18 -0
- package/dist/lib/testing/compliance/index.js.map +1 -0
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts +17 -0
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts.map +1 -0
- package/dist/lib/testing/compliance/storyboard-tracks.js +147 -0
- package/dist/lib/testing/compliance/storyboard-tracks.js.map +1 -0
- package/dist/lib/testing/compliance/types.d.ts +145 -0
- package/dist/lib/testing/compliance/types.d.ts.map +1 -0
- package/dist/lib/testing/compliance/types.js +6 -0
- package/dist/lib/testing/compliance/types.js.map +1 -0
- package/dist/lib/testing/comply-controller.d.ts +193 -0
- package/dist/lib/testing/comply-controller.d.ts.map +1 -0
- package/dist/lib/testing/comply-controller.js +199 -0
- package/dist/lib/testing/comply-controller.js.map +1 -0
- package/dist/lib/testing/controller-assertions.d.ts +67 -0
- package/dist/lib/testing/controller-assertions.d.ts.map +1 -0
- package/dist/lib/testing/controller-assertions.js +60 -0
- package/dist/lib/testing/controller-assertions.js.map +1 -0
- package/dist/lib/testing/formatter.d.ts +17 -0
- package/dist/lib/testing/formatter.d.ts.map +1 -0
- package/dist/lib/testing/formatter.js +92 -0
- package/dist/lib/testing/formatter.js.map +1 -0
- package/dist/lib/testing/index.d.ts +19 -0
- package/dist/lib/testing/index.d.ts.map +1 -0
- package/dist/lib/testing/index.js +185 -0
- package/dist/lib/testing/index.js.map +1 -0
- package/dist/lib/testing/local-agent-runner.d.ts +189 -0
- package/dist/lib/testing/local-agent-runner.d.ts.map +1 -0
- package/dist/lib/testing/local-agent-runner.js +290 -0
- package/dist/lib/testing/local-agent-runner.js.map +1 -0
- package/dist/lib/testing/orchestrator.d.ts +70 -0
- package/dist/lib/testing/orchestrator.d.ts.map +1 -0
- package/dist/lib/testing/orchestrator.js +278 -0
- package/dist/lib/testing/orchestrator.js.map +1 -0
- package/dist/lib/testing/scenarios/brand-rights.d.ts +41 -0
- package/dist/lib/testing/scenarios/brand-rights.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/brand-rights.js +278 -0
- package/dist/lib/testing/scenarios/brand-rights.js.map +1 -0
- package/dist/lib/testing/scenarios/capabilities.d.ts +27 -0
- package/dist/lib/testing/scenarios/capabilities.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/capabilities.js +332 -0
- package/dist/lib/testing/scenarios/capabilities.js.map +1 -0
- package/dist/lib/testing/scenarios/creative.d.ts +38 -0
- package/dist/lib/testing/scenarios/creative.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/creative.js +429 -0
- package/dist/lib/testing/scenarios/creative.js.map +1 -0
- package/dist/lib/testing/scenarios/deterministic.d.ts +37 -0
- package/dist/lib/testing/scenarios/deterministic.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/deterministic.js +705 -0
- package/dist/lib/testing/scenarios/deterministic.js.map +1 -0
- package/dist/lib/testing/scenarios/discovery.d.ts +15 -0
- package/dist/lib/testing/scenarios/discovery.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/discovery.js +68 -0
- package/dist/lib/testing/scenarios/discovery.js.map +1 -0
- package/dist/lib/testing/scenarios/edge-cases.d.ts +64 -0
- package/dist/lib/testing/scenarios/edge-cases.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/edge-cases.js +569 -0
- package/dist/lib/testing/scenarios/edge-cases.js.map +1 -0
- package/dist/lib/testing/scenarios/error-compliance.d.ts +30 -0
- package/dist/lib/testing/scenarios/error-compliance.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/error-compliance.js +372 -0
- package/dist/lib/testing/scenarios/error-compliance.js.map +1 -0
- package/dist/lib/testing/scenarios/governance.d.ts +114 -0
- package/dist/lib/testing/scenarios/governance.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/governance.js +1619 -0
- package/dist/lib/testing/scenarios/governance.js.map +1 -0
- package/dist/lib/testing/scenarios/health.d.ts +12 -0
- package/dist/lib/testing/scenarios/health.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/health.js +21 -0
- package/dist/lib/testing/scenarios/health.js.map +1 -0
- package/dist/lib/testing/scenarios/index.d.ts +20 -0
- package/dist/lib/testing/scenarios/index.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/index.js +96 -0
- package/dist/lib/testing/scenarios/index.js.map +1 -0
- package/dist/lib/testing/scenarios/media-buy.d.ts +128 -0
- package/dist/lib/testing/scenarios/media-buy.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/media-buy.js +1655 -0
- package/dist/lib/testing/scenarios/media-buy.js.map +1 -0
- package/dist/lib/testing/scenarios/schema-compliance.d.ts +17 -0
- package/dist/lib/testing/scenarios/schema-compliance.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/schema-compliance.js +194 -0
- package/dist/lib/testing/scenarios/schema-compliance.js.map +1 -0
- package/dist/lib/testing/scenarios/signals.d.ts +22 -0
- package/dist/lib/testing/scenarios/signals.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/signals.js +221 -0
- package/dist/lib/testing/scenarios/signals.js.map +1 -0
- package/dist/lib/testing/scenarios/sponsored-intelligence.d.ts +45 -0
- package/dist/lib/testing/scenarios/sponsored-intelligence.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/sponsored-intelligence.js +554 -0
- package/dist/lib/testing/scenarios/sponsored-intelligence.js.map +1 -0
- package/dist/lib/testing/scenarios/trusted-match.d.ts +22 -0
- package/dist/lib/testing/scenarios/trusted-match.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/trusted-match.js +128 -0
- package/dist/lib/testing/scenarios/trusted-match.js.map +1 -0
- package/dist/lib/testing/seed-merge.d.ts +150 -0
- package/dist/lib/testing/seed-merge.d.ts.map +1 -0
- package/dist/lib/testing/seed-merge.js +315 -0
- package/dist/lib/testing/seed-merge.js.map +1 -0
- package/dist/lib/testing/storyboard/assertions.d.ts +148 -0
- package/dist/lib/testing/storyboard/assertions.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/assertions.js +270 -0
- package/dist/lib/testing/storyboard/assertions.js.map +1 -0
- package/dist/lib/testing/storyboard/compliance.d.ts +166 -0
- package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/compliance.js +434 -0
- package/dist/lib/testing/storyboard/compliance.js.map +1 -0
- package/dist/lib/testing/storyboard/context.d.ts +124 -0
- package/dist/lib/testing/storyboard/context.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/context.js +560 -0
- package/dist/lib/testing/storyboard/context.js.map +1 -0
- package/dist/lib/testing/storyboard/default-invariants.d.ts +36 -0
- package/dist/lib/testing/storyboard/default-invariants.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/default-invariants.js +882 -0
- package/dist/lib/testing/storyboard/default-invariants.js.map +1 -0
- package/dist/lib/testing/storyboard/index.d.ts +34 -0
- package/dist/lib/testing/storyboard/index.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/index.js +110 -0
- package/dist/lib/testing/storyboard/index.js.map +1 -0
- package/dist/lib/testing/storyboard/junit.d.ts +2 -0
- package/dist/lib/testing/storyboard/junit.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/junit.js +104 -0
- package/dist/lib/testing/storyboard/junit.js.map +1 -0
- package/dist/lib/testing/storyboard/loader.d.ts +28 -0
- package/dist/lib/testing/storyboard/loader.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/loader.js +194 -0
- package/dist/lib/testing/storyboard/loader.js.map +1 -0
- package/dist/lib/testing/storyboard/path.d.ts +76 -0
- package/dist/lib/testing/storyboard/path.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/path.js +258 -0
- package/dist/lib/testing/storyboard/path.js.map +1 -0
- package/dist/lib/testing/storyboard/probes.d.ts +148 -0
- package/dist/lib/testing/storyboard/probes.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/probes.js +402 -0
- package/dist/lib/testing/storyboard/probes.js.map +1 -0
- package/dist/lib/testing/storyboard/rejection-hints.d.ts +41 -0
- package/dist/lib/testing/storyboard/rejection-hints.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/rejection-hints.js +344 -0
- package/dist/lib/testing/storyboard/rejection-hints.js.map +1 -0
- package/dist/lib/testing/storyboard/request-builder.d.ts +35 -0
- package/dist/lib/testing/storyboard/request-builder.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-builder.js +845 -0
- package/dist/lib/testing/storyboard/request-builder.js.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/builder.d.ts +60 -0
- package/dist/lib/testing/storyboard/request-signing/builder.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/builder.js +462 -0
- package/dist/lib/testing/storyboard/request-signing/builder.js.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/grader.d.ts +166 -0
- package/dist/lib/testing/storyboard/request-signing/grader.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/grader.js +517 -0
- package/dist/lib/testing/storyboard/request-signing/grader.js.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/index.d.ts +38 -0
- package/dist/lib/testing/storyboard/request-signing/index.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/index.js +62 -0
- package/dist/lib/testing/storyboard/request-signing/index.js.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.ts +10 -0
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.js +81 -0
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.js.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/probe.d.ts +41 -0
- package/dist/lib/testing/storyboard/request-signing/probe.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/probe.js +220 -0
- package/dist/lib/testing/storyboard/request-signing/probe.js.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/synthesize.d.ts +28 -0
- package/dist/lib/testing/storyboard/request-signing/synthesize.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/synthesize.js +79 -0
- package/dist/lib/testing/storyboard/request-signing/synthesize.js.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/test-kit.d.ts +42 -0
- package/dist/lib/testing/storyboard/request-signing/test-kit.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/test-kit.js +101 -0
- package/dist/lib/testing/storyboard/request-signing/test-kit.js.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/types.d.ts +72 -0
- package/dist/lib/testing/storyboard/request-signing/types.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/types.js +6 -0
- package/dist/lib/testing/storyboard/request-signing/types.js.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts +16 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.js +242 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.js.map +1 -0
- package/dist/lib/testing/storyboard/runner.d.ts +141 -0
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/runner.js +2349 -0
- package/dist/lib/testing/storyboard/runner.js.map +1 -0
- package/dist/lib/testing/storyboard/sandbox-entities.d.ts +56 -0
- package/dist/lib/testing/storyboard/sandbox-entities.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/sandbox-entities.js +222 -0
- package/dist/lib/testing/storyboard/sandbox-entities.js.map +1 -0
- package/dist/lib/testing/storyboard/seeding.d.ts +72 -0
- package/dist/lib/testing/storyboard/seeding.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/seeding.js +282 -0
- package/dist/lib/testing/storyboard/seeding.js.map +1 -0
- package/dist/lib/testing/storyboard/shape-drift-hints.d.ts +54 -0
- package/dist/lib/testing/storyboard/shape-drift-hints.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/shape-drift-hints.js +200 -0
- package/dist/lib/testing/storyboard/shape-drift-hints.js.map +1 -0
- package/dist/lib/testing/storyboard/signer-grader/grader.d.ts +56 -0
- package/dist/lib/testing/storyboard/signer-grader/grader.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/signer-grader/grader.js +270 -0
- package/dist/lib/testing/storyboard/signer-grader/grader.js.map +1 -0
- package/dist/lib/testing/storyboard/signer-grader/index.d.ts +3 -0
- package/dist/lib/testing/storyboard/signer-grader/index.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/signer-grader/index.js +6 -0
- package/dist/lib/testing/storyboard/signer-grader/index.js.map +1 -0
- package/dist/lib/testing/storyboard/signer-grader/types.d.ts +62 -0
- package/dist/lib/testing/storyboard/signer-grader/types.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/signer-grader/types.js +3 -0
- package/dist/lib/testing/storyboard/signer-grader/types.js.map +1 -0
- package/dist/lib/testing/storyboard/strict-validation-hints.d.ts +28 -0
- package/dist/lib/testing/storyboard/strict-validation-hints.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/strict-validation-hints.js +128 -0
- package/dist/lib/testing/storyboard/strict-validation-hints.js.map +1 -0
- package/dist/lib/testing/storyboard/task-map.d.ts +25 -0
- package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/task-map.js +130 -0
- package/dist/lib/testing/storyboard/task-map.js.map +1 -0
- package/dist/lib/testing/storyboard/test-kit.d.ts +52 -0
- package/dist/lib/testing/storyboard/test-kit.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/test-kit.js +93 -0
- package/dist/lib/testing/storyboard/test-kit.js.map +1 -0
- package/dist/lib/testing/storyboard/types.d.ts +1404 -0
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/types.js +35 -0
- package/dist/lib/testing/storyboard/types.js.map +1 -0
- package/dist/lib/testing/storyboard/validations.d.ts +103 -0
- package/dist/lib/testing/storyboard/validations.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/validations.js +1729 -0
- package/dist/lib/testing/storyboard/validations.js.map +1 -0
- package/dist/lib/testing/storyboard/webhook-assertions.d.ts +62 -0
- package/dist/lib/testing/storyboard/webhook-assertions.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/webhook-assertions.js +538 -0
- package/dist/lib/testing/storyboard/webhook-assertions.js.map +1 -0
- package/dist/lib/testing/storyboard/webhook-receiver.d.ts +104 -0
- package/dist/lib/testing/storyboard/webhook-receiver.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/webhook-receiver.js +402 -0
- package/dist/lib/testing/storyboard/webhook-receiver.js.map +1 -0
- package/dist/lib/testing/stubs/governance-agent-stub.d.ts +72 -0
- package/dist/lib/testing/stubs/governance-agent-stub.d.ts.map +1 -0
- package/dist/lib/testing/stubs/governance-agent-stub.js +297 -0
- package/dist/lib/testing/stubs/governance-agent-stub.js.map +1 -0
- package/dist/lib/testing/stubs/index.d.ts +3 -0
- package/dist/lib/testing/stubs/index.d.ts.map +1 -0
- package/dist/lib/testing/stubs/index.js +6 -0
- package/dist/lib/testing/stubs/index.js.map +1 -0
- package/dist/lib/testing/test-controller.d.ts +46 -0
- package/dist/lib/testing/test-controller.d.ts.map +1 -0
- package/dist/lib/testing/test-controller.js +143 -0
- package/dist/lib/testing/test-controller.js.map +1 -0
- package/dist/lib/testing/test-helpers.d.ts +213 -0
- package/dist/lib/testing/test-helpers.d.ts.map +1 -0
- package/dist/lib/testing/test-helpers.js +250 -0
- package/dist/lib/testing/test-helpers.js.map +1 -0
- package/dist/lib/testing/types.d.ts +222 -0
- package/dist/lib/testing/types.d.ts.map +1 -0
- package/dist/lib/testing/types.js +6 -0
- package/dist/lib/testing/types.js.map +1 -0
- package/dist/lib/types/adcp.d.ts +625 -0
- package/dist/lib/types/adcp.d.ts.map +1 -0
- package/dist/lib/types/adcp.js +20 -0
- package/dist/lib/types/adcp.js.map +1 -0
- package/dist/lib/types/asset-instances.d.ts +32 -0
- package/dist/lib/types/asset-instances.d.ts.map +1 -0
- package/dist/lib/types/asset-instances.js +24 -0
- package/dist/lib/types/asset-instances.js.map +1 -0
- package/dist/lib/types/compat.d.ts +105 -0
- package/dist/lib/types/compat.d.ts.map +1 -0
- package/dist/lib/types/compat.js +52 -0
- package/dist/lib/types/compat.js.map +1 -0
- package/dist/lib/types/core.generated.d.ts +15973 -0
- package/dist/lib/types/core.generated.d.ts.map +1 -0
- package/dist/lib/types/core.generated.js +5 -0
- package/dist/lib/types/core.generated.js.map +1 -0
- package/dist/lib/types/enums.generated.d.ts +139 -0
- package/dist/lib/types/enums.generated.d.ts.map +1 -0
- package/dist/lib/types/enums.generated.js +158 -0
- package/dist/lib/types/enums.generated.js.map +1 -0
- package/dist/lib/types/error-codes.d.ts +32 -0
- package/dist/lib/types/error-codes.d.ts.map +1 -0
- package/dist/lib/types/error-codes.js +146 -0
- package/dist/lib/types/error-codes.js.map +1 -0
- package/dist/lib/types/format-asset-slots.d.ts +117 -0
- package/dist/lib/types/format-asset-slots.d.ts.map +1 -0
- package/dist/lib/types/format-asset-slots.js +20 -0
- package/dist/lib/types/format-asset-slots.js.map +1 -0
- package/dist/lib/types/index.d.ts +20 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/types/index.js +48 -0
- package/dist/lib/types/index.js.map +1 -0
- package/dist/lib/types/inline-enums.aliases.d.ts +53 -0
- package/dist/lib/types/inline-enums.aliases.d.ts.map +1 -0
- package/dist/lib/types/inline-enums.aliases.js +73 -0
- package/dist/lib/types/inline-enums.aliases.js.map +1 -0
- package/dist/lib/types/inline-enums.generated.d.ts +157 -0
- package/dist/lib/types/inline-enums.generated.d.ts.map +1 -0
- package/dist/lib/types/inline-enums.generated.js +239 -0
- package/dist/lib/types/inline-enums.generated.js.map +1 -0
- package/dist/lib/types/schemas.generated.d.ts +46531 -0
- package/dist/lib/types/schemas.generated.d.ts.map +1 -0
- package/dist/lib/types/schemas.generated.js +5867 -0
- package/dist/lib/types/schemas.generated.js.map +1 -0
- package/dist/lib/types/sync-rows.d.ts +37 -0
- package/dist/lib/types/sync-rows.d.ts.map +1 -0
- package/dist/lib/types/sync-rows.js +21 -0
- package/dist/lib/types/sync-rows.js.map +1 -0
- package/dist/lib/types/tools.generated.d.ts +13423 -0
- package/dist/lib/types/tools.generated.d.ts.map +1 -0
- package/dist/lib/types/tools.generated.js +5 -0
- package/dist/lib/types/tools.generated.js.map +1 -0
- package/dist/lib/types/wellknown-schemas.generated.d.ts +1363 -0
- package/dist/lib/types/wellknown-schemas.generated.d.ts.map +1 -0
- package/dist/lib/types/wellknown-schemas.generated.js +14 -0
- package/dist/lib/types/wellknown-schemas.generated.js.map +1 -0
- package/dist/lib/utils/a2a-discovery.d.ts +42 -0
- package/dist/lib/utils/a2a-discovery.d.ts.map +1 -0
- package/dist/lib/utils/a2a-discovery.js +68 -0
- package/dist/lib/utils/a2a-discovery.js.map +1 -0
- package/dist/lib/utils/adcp-version-config.d.ts +11 -0
- package/dist/lib/utils/adcp-version-config.d.ts.map +1 -0
- package/dist/lib/utils/adcp-version-config.js +44 -0
- package/dist/lib/utils/adcp-version-config.js.map +1 -0
- package/dist/lib/utils/asset-builders.d.ts +44 -0
- package/dist/lib/utils/asset-builders.d.ts.map +1 -0
- package/dist/lib/utils/asset-builders.js +84 -0
- package/dist/lib/utils/asset-builders.js.map +1 -0
- package/dist/lib/utils/capabilities.d.ts +259 -0
- package/dist/lib/utils/capabilities.d.ts.map +1 -0
- package/dist/lib/utils/capabilities.js +463 -0
- package/dist/lib/utils/capabilities.js.map +1 -0
- package/dist/lib/utils/creative-adapter.d.ts +91 -0
- package/dist/lib/utils/creative-adapter.d.ts.map +1 -0
- package/dist/lib/utils/creative-adapter.js +156 -0
- package/dist/lib/utils/creative-adapter.js.map +1 -0
- package/dist/lib/utils/deprecation.d.ts +11 -0
- package/dist/lib/utils/deprecation.d.ts.map +1 -0
- package/dist/lib/utils/deprecation.js +23 -0
- package/dist/lib/utils/deprecation.js.map +1 -0
- package/dist/lib/utils/error-extraction.d.ts +43 -0
- package/dist/lib/utils/error-extraction.d.ts.map +1 -0
- package/dist/lib/utils/error-extraction.js +225 -0
- package/dist/lib/utils/error-extraction.js.map +1 -0
- package/dist/lib/utils/extract-result.d.ts +45 -0
- package/dist/lib/utils/extract-result.d.ts.map +1 -0
- package/dist/lib/utils/extract-result.js +27 -0
- package/dist/lib/utils/extract-result.js.map +1 -0
- package/dist/lib/utils/format-asset-slot-builders.d.ts +76 -0
- package/dist/lib/utils/format-asset-slot-builders.d.ts.map +1 -0
- package/dist/lib/utils/format-asset-slot-builders.js +174 -0
- package/dist/lib/utils/format-asset-slot-builders.js.map +1 -0
- package/dist/lib/utils/format-assets.d.ts +100 -0
- package/dist/lib/utils/format-assets.d.ts.map +1 -0
- package/dist/lib/utils/format-assets.js +147 -0
- package/dist/lib/utils/format-assets.js.map +1 -0
- package/dist/lib/utils/format-render-builders.d.ts +76 -0
- package/dist/lib/utils/format-render-builders.d.ts.map +1 -0
- package/dist/lib/utils/format-render-builders.js +76 -0
- package/dist/lib/utils/format-render-builders.js.map +1 -0
- package/dist/lib/utils/format-renders.d.ts +96 -0
- package/dist/lib/utils/format-renders.d.ts.map +1 -0
- package/dist/lib/utils/format-renders.js +141 -0
- package/dist/lib/utils/format-renders.js.map +1 -0
- package/dist/lib/utils/idempotency.d.ts +96 -0
- package/dist/lib/utils/idempotency.d.ts.map +1 -0
- package/dist/lib/utils/idempotency.js +156 -0
- package/dist/lib/utils/idempotency.js.map +1 -0
- package/dist/lib/utils/index.d.ts +39 -0
- package/dist/lib/utils/index.d.ts.map +1 -0
- package/dist/lib/utils/index.js +196 -0
- package/dist/lib/utils/index.js.map +1 -0
- package/dist/lib/utils/jcs.d.ts +30 -0
- package/dist/lib/utils/jcs.d.ts.map +1 -0
- package/dist/lib/utils/jcs.js +167 -0
- package/dist/lib/utils/jcs.js.map +1 -0
- package/dist/lib/utils/logger.d.ts +55 -0
- package/dist/lib/utils/logger.d.ts.map +1 -0
- package/dist/lib/utils/logger.js +100 -0
- package/dist/lib/utils/logger.js.map +1 -0
- package/dist/lib/utils/pagination.d.ts +31 -0
- package/dist/lib/utils/pagination.d.ts.map +1 -0
- package/dist/lib/utils/pagination.js +51 -0
- package/dist/lib/utils/pagination.js.map +1 -0
- package/dist/lib/utils/preview-normalizer.d.ts +109 -0
- package/dist/lib/utils/preview-normalizer.d.ts.map +1 -0
- package/dist/lib/utils/preview-normalizer.js +122 -0
- package/dist/lib/utils/preview-normalizer.js.map +1 -0
- package/dist/lib/utils/preview-utils.d.ts +87 -0
- package/dist/lib/utils/preview-utils.d.ts.map +1 -0
- package/dist/lib/utils/preview-utils.js +340 -0
- package/dist/lib/utils/preview-utils.js.map +1 -0
- package/dist/lib/utils/pricing-adapter.d.ts +144 -0
- package/dist/lib/utils/pricing-adapter.d.ts.map +1 -0
- package/dist/lib/utils/pricing-adapter.js +322 -0
- package/dist/lib/utils/pricing-adapter.js.map +1 -0
- package/dist/lib/utils/protocol-detection.d.ts +26 -0
- package/dist/lib/utils/protocol-detection.d.ts.map +1 -0
- package/dist/lib/utils/protocol-detection.js +62 -0
- package/dist/lib/utils/protocol-detection.js.map +1 -0
- package/dist/lib/utils/render-builders.d.ts +41 -0
- package/dist/lib/utils/render-builders.d.ts.map +1 -0
- package/dist/lib/utils/render-builders.js +52 -0
- package/dist/lib/utils/render-builders.js.map +1 -0
- package/dist/lib/utils/request-normalizer.d.ts +26 -0
- package/dist/lib/utils/request-normalizer.d.ts.map +1 -0
- package/dist/lib/utils/request-normalizer.js +175 -0
- package/dist/lib/utils/request-normalizer.js.map +1 -0
- package/dist/lib/utils/response-schemas.d.ts +9 -0
- package/dist/lib/utils/response-schemas.d.ts.map +1 -0
- package/dist/lib/utils/response-schemas.js +129 -0
- package/dist/lib/utils/response-schemas.js.map +1 -0
- package/dist/lib/utils/response-unwrapper.d.ts +54 -0
- package/dist/lib/utils/response-unwrapper.d.ts.map +1 -0
- package/dist/lib/utils/response-unwrapper.js +406 -0
- package/dist/lib/utils/response-unwrapper.js.map +1 -0
- package/dist/lib/utils/retry.d.ts +15 -0
- package/dist/lib/utils/retry.d.ts.map +1 -0
- package/dist/lib/utils/retry.js +22 -0
- package/dist/lib/utils/retry.js.map +1 -0
- package/dist/lib/utils/sync-creatives-adapter.d.ts +18 -0
- package/dist/lib/utils/sync-creatives-adapter.d.ts.map +1 -0
- package/dist/lib/utils/sync-creatives-adapter.js +46 -0
- package/dist/lib/utils/sync-creatives-adapter.js.map +1 -0
- package/dist/lib/utils/tool-request-schemas.d.ts +15 -0
- package/dist/lib/utils/tool-request-schemas.d.ts.map +1 -0
- package/dist/lib/utils/tool-request-schemas.js +129 -0
- package/dist/lib/utils/tool-request-schemas.js.map +1 -0
- package/dist/lib/utils/typeGuards.d.ts +147 -0
- package/dist/lib/utils/typeGuards.d.ts.map +1 -0
- package/dist/lib/utils/typeGuards.js +240 -0
- package/dist/lib/utils/typeGuards.js.map +1 -0
- package/dist/lib/utils/union-errors.d.ts +20 -0
- package/dist/lib/utils/union-errors.d.ts.map +1 -0
- package/dist/lib/utils/union-errors.js +38 -0
- package/dist/lib/utils/union-errors.js.map +1 -0
- package/dist/lib/utils/validate-user-agent.d.ts +8 -0
- package/dist/lib/utils/validate-user-agent.d.ts.map +1 -0
- package/dist/lib/utils/validate-user-agent.js +15 -0
- package/dist/lib/utils/validate-user-agent.js.map +1 -0
- package/dist/lib/validation/client-hooks.d.ts +49 -0
- package/dist/lib/validation/client-hooks.d.ts.map +1 -0
- package/dist/lib/validation/client-hooks.js +82 -0
- package/dist/lib/validation/client-hooks.js.map +1 -0
- package/dist/lib/validation/index.d.ts +37 -0
- package/dist/lib/validation/index.d.ts.map +1 -0
- package/dist/lib/validation/index.js +202 -0
- package/dist/lib/validation/index.js.map +1 -0
- package/dist/lib/validation/schema-errors.d.ts +67 -0
- package/dist/lib/validation/schema-errors.d.ts.map +1 -0
- package/dist/lib/validation/schema-errors.js +75 -0
- package/dist/lib/validation/schema-errors.js.map +1 -0
- package/dist/lib/validation/schema-loader.d.ts +24 -0
- package/dist/lib/validation/schema-loader.d.ts.map +1 -0
- package/dist/lib/validation/schema-loader.js +315 -0
- package/dist/lib/validation/schema-loader.js.map +1 -0
- package/dist/lib/validation/schema-validator.d.ts +83 -0
- package/dist/lib/validation/schema-validator.d.ts.map +1 -0
- package/dist/lib/validation/schema-validator.js +142 -0
- package/dist/lib/validation/schema-validator.js.map +1 -0
- package/dist/lib/validation/sync-creatives.d.ts +327 -0
- package/dist/lib/validation/sync-creatives.d.ts.map +1 -0
- package/dist/lib/validation/sync-creatives.js +72 -0
- package/dist/lib/validation/sync-creatives.js.map +1 -0
- package/dist/lib/version.d.ts +63 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +85 -0
- package/dist/lib/version.js.map +1 -0
- package/docs/README.md +42 -0
- package/docs/guides/BUILD-AN-AGENT.md +632 -0
- package/docs/llms.txt +1197 -0
- package/examples/README.md +117 -0
- package/examples/adcp.config.json +30 -0
- package/examples/basic-a2a.ts +76 -0
- package/examples/basic-mcp.ts +50 -0
- package/examples/batch-preview-test.ts +266 -0
- package/examples/comply-controller-seller.ts +146 -0
- package/examples/conversation-client.ts +291 -0
- package/examples/debug-preview-response.ts +73 -0
- package/examples/debug-preview-with-logging.ts +50 -0
- package/examples/easy-config-demo.ts +242 -0
- package/examples/env-config.ts +51 -0
- package/examples/error-compliant-server.ts +241 -0
- package/examples/gcp-kms-signing-provider.ts +281 -0
- package/examples/generative-creative-demo.ts +196 -0
- package/examples/inspect-card-formats.ts +161 -0
- package/examples/logger-usage.ts +165 -0
- package/examples/oauth-cli-example.ts +154 -0
- package/examples/pr78-async-patterns-demo.ts +247 -0
- package/examples/seller-test-controller.ts +320 -0
- package/examples/signals-agent.ts +201 -0
- package/examples/simple-getting-started.ts +225 -0
- package/examples/simple-protocol-demo.ts +75 -0
- package/examples/test-helpers-demo.ts +239 -0
- package/examples/zod-validation-example.ts +126 -0
- package/package.json +313 -0
- package/skills/adcp/SKILL.md +326 -0
- package/skills/adcp-brand/SKILL.md +202 -0
- package/skills/adcp-brand.previous/SKILL.md +202 -0
- package/skills/adcp-creative/SKILL.md +301 -0
- package/skills/adcp-creative.previous/SKILL.md +301 -0
- package/skills/adcp-governance/SKILL.md +566 -0
- package/skills/adcp-governance.previous/SKILL.md +566 -0
- package/skills/adcp-media-buy/SKILL.md +446 -0
- package/skills/adcp-media-buy.previous/SKILL.md +446 -0
- package/skills/adcp-si/SKILL.md +206 -0
- package/skills/adcp-si.previous/SKILL.md +206 -0
- package/skills/adcp-signals/SKILL.md +204 -0
- package/skills/adcp-signals.previous/SKILL.md +204 -0
- package/skills/build-brand-rights-agent/SKILL.md +528 -0
- package/skills/build-creative-agent/SKILL.md +824 -0
- package/skills/build-generative-seller-agent/SKILL.md +579 -0
- package/skills/build-governance-agent/SKILL.md +966 -0
- package/skills/build-retail-media-agent/SKILL.md +488 -0
- package/skills/build-seller-agent/SKILL.md +1407 -0
- package/skills/build-seller-agent/deployment.md +407 -0
- package/skills/build-seller-agent/specialisms/audience-sync.md +63 -0
- package/skills/build-seller-agent/specialisms/sales-broadcast-tv.md +71 -0
- package/skills/build-seller-agent/specialisms/sales-guaranteed.md +67 -0
- package/skills/build-seller-agent/specialisms/sales-non-guaranteed.md +39 -0
- package/skills/build-seller-agent/specialisms/sales-proposal-mode.md +51 -0
- package/skills/build-seller-agent/specialisms/sales-social.md +30 -0
- package/skills/build-seller-agent/specialisms/signed-requests.md +89 -0
- package/skills/build-si-agent/SKILL.md +347 -0
- package/skills/build-signals-agent/SKILL.md +527 -0
- package/skills/call-adcp-agent/SKILL.md +255 -0
- package/skills/call-adcp-agent.previous/SKILL.md +255 -0
|
@@ -0,0 +1,2349 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Storyboard execution engine.
|
|
4
|
+
*
|
|
5
|
+
* Two entry points:
|
|
6
|
+
* - runStoryboard(): run all phases/steps sequentially
|
|
7
|
+
* - runStoryboardStep(): run a single step (stateless, LLM-friendly)
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.resolveCapabilityPath = resolveCapabilityPath;
|
|
11
|
+
exports.__redactSecretsForTest = __redactSecretsForTest;
|
|
12
|
+
exports.__filterResponseHeadersForTest = __filterResponseHeadersForTest;
|
|
13
|
+
exports.__defaultAuthHeadersForRawProbeForTest = __defaultAuthHeadersForRawProbeForTest;
|
|
14
|
+
exports.runStoryboard = runStoryboard;
|
|
15
|
+
exports.listStrictOnlyFailures = listStrictOnlyFailures;
|
|
16
|
+
exports.summarizeStrictValidation = summarizeStrictValidation;
|
|
17
|
+
exports.runStoryboardStep = runStoryboardStep;
|
|
18
|
+
exports.applyBrandInvariant = applyBrandInvariant;
|
|
19
|
+
exports.applyIdempotencyInvariant = applyIdempotencyInvariant;
|
|
20
|
+
exports.getFirstStepPreview = getFirstStepPreview;
|
|
21
|
+
const client_1 = require("../client");
|
|
22
|
+
const protocols_1 = require("../../protocols");
|
|
23
|
+
const rawResponseCapture_1 = require("../../protocols/rawResponseCapture");
|
|
24
|
+
const task_map_1 = require("./task-map");
|
|
25
|
+
const context_1 = require("./context");
|
|
26
|
+
const rejection_hints_1 = require("./rejection-hints");
|
|
27
|
+
const shape_drift_hints_1 = require("./shape-drift-hints");
|
|
28
|
+
const strict_validation_hints_1 = require("./strict-validation-hints");
|
|
29
|
+
const validations_1 = require("./validations");
|
|
30
|
+
const request_builder_1 = require("./request-builder");
|
|
31
|
+
const client_2 = require("../client");
|
|
32
|
+
const idempotency_1 = require("../../utils/idempotency");
|
|
33
|
+
const schema_loader_1 = require("../../validation/schema-loader");
|
|
34
|
+
const probes_1 = require("./probes");
|
|
35
|
+
const test_kit_1 = require("./test-kit");
|
|
36
|
+
const loader_1 = require("./loader");
|
|
37
|
+
const probe_dispatch_1 = require("./request-signing/probe-dispatch");
|
|
38
|
+
const webhook_receiver_1 = require("./webhook-receiver");
|
|
39
|
+
const webhook_assertions_1 = require("./webhook-assertions");
|
|
40
|
+
const seeding_1 = require("./seeding");
|
|
41
|
+
const types_1 = require("./types");
|
|
42
|
+
const assertions_1 = require("./assertions");
|
|
43
|
+
// ────────────────────────────────────────────────────────────
|
|
44
|
+
// Runner-output contract helpers
|
|
45
|
+
// ────────────────────────────────────────────────────────────
|
|
46
|
+
const SKIP_DETAILS = {
|
|
47
|
+
not_applicable: 'Not applicable: agent did not declare the protocol or specialism this storyboard targets.',
|
|
48
|
+
no_phases: 'Storyboard has no executable phases (placeholder).',
|
|
49
|
+
prerequisite_failed: 'Skipped: a prerequisite step or contract did not pass.',
|
|
50
|
+
missing_tool: 'Skipped: agent did not advertise the required tool.',
|
|
51
|
+
missing_test_controller: 'Skipped: deterministic_testing phase requires comply_test_controller, which the agent did not advertise.',
|
|
52
|
+
unsatisfied_contract: 'Skipped: test-kit contract is out of scope for this grading run.',
|
|
53
|
+
peer_branch_taken: 'Skipped: a peer branch in the same any_of branch set already contributed the aggregation flag.',
|
|
54
|
+
};
|
|
55
|
+
const CONTROLLER_SEEDING_FAILED_DETAIL = 'Skipped: pre-flight comply_test_controller seeding failed; the agent was not populated with the storyboard fixtures the remaining phases depend on.';
|
|
56
|
+
const OAUTH_NOT_ADVERTISED_DETAIL = 'Skipped: agent does not advertise OAuth — /.well-known/oauth-protected-resource returned 404 (RFC 9728 §3). API-key path must carry auth_mechanism_verified for this storyboard to pass.';
|
|
57
|
+
/**
|
|
58
|
+
* Per-reason override strings for detailed skip reasons that want a more
|
|
59
|
+
* specific message than the canonical fallback. Used only when the probe
|
|
60
|
+
* itself didn't emit an error-style detail.
|
|
61
|
+
*/
|
|
62
|
+
const DETAILED_SKIP_DETAILS = {
|
|
63
|
+
oauth_not_advertised: OAUTH_NOT_ADVERTISED_DETAIL,
|
|
64
|
+
controller_seeding_failed: CONTROLLER_SEEDING_FAILED_DETAIL,
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Walk a dotted key path (e.g. `"adcp.idempotency.supported"`) through a
|
|
68
|
+
* nested object. Returns `undefined` when any segment is missing or the
|
|
69
|
+
* intermediate value is not an object — the caller treats `undefined` as
|
|
70
|
+
* "path absent" and does NOT skip the storyboard (absence means the agent
|
|
71
|
+
* hasn't explicitly opted out, so failing the storyboard surfaces the gap).
|
|
72
|
+
*
|
|
73
|
+
* Exported for direct testing. Inline copies of this logic in test code
|
|
74
|
+
* silently drift from the runtime when edge cases (null prototypes,
|
|
75
|
+
* Symbol keys, prototype-chain access) get tightened — testing the real
|
|
76
|
+
* implementation forecloses that class of bug.
|
|
77
|
+
*/
|
|
78
|
+
function resolveCapabilityPath(raw, dottedPath) {
|
|
79
|
+
const keys = dottedPath.split('.');
|
|
80
|
+
let current = raw;
|
|
81
|
+
for (const key of keys) {
|
|
82
|
+
if (current === null || typeof current !== 'object')
|
|
83
|
+
return undefined;
|
|
84
|
+
current = current[key];
|
|
85
|
+
}
|
|
86
|
+
return current;
|
|
87
|
+
}
|
|
88
|
+
function buildSkip(reason, detail) {
|
|
89
|
+
return { reason, detail: detail ?? SKIP_DETAILS[reason] };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Resolve each phase's branch-set membership, combining explicit
|
|
93
|
+
* `branch_set: { id, semantics }` declarations with the implicit detection
|
|
94
|
+
* fallback the schema + adcp#2646 mandate: an `optional: true` phase with a
|
|
95
|
+
* step declaring `contributes_to: <flag>` that matches a later
|
|
96
|
+
* `assert_contribution check: any_of, allowed_values: [<flag>]` target is a
|
|
97
|
+
* branch-set member even when the author hasn't migrated to the explicit
|
|
98
|
+
* keyword. Explicit declarations take precedence. Returned map is keyed by
|
|
99
|
+
* phase id; phases outside any branch set are absent from the map.
|
|
100
|
+
*
|
|
101
|
+
* First-match wins: if an optional phase has steps contributing to more
|
|
102
|
+
* than one any_of flag, the earliest matching step (by storyboard
|
|
103
|
+
* declaration order) decides the phase's branch-set membership. Authors
|
|
104
|
+
* wanting a phase in multiple branch sets should declare `branch_set:`
|
|
105
|
+
* explicitly — the implicit path does not synthesize multi-set membership.
|
|
106
|
+
*/
|
|
107
|
+
function resolveBranchSets(storyboard) {
|
|
108
|
+
const resolved = new Map();
|
|
109
|
+
for (const phase of storyboard.phases) {
|
|
110
|
+
if (phase.branch_set)
|
|
111
|
+
resolved.set(phase.id, phase.branch_set);
|
|
112
|
+
}
|
|
113
|
+
const anyOfFlags = new Set();
|
|
114
|
+
for (const phase of storyboard.phases) {
|
|
115
|
+
for (const step of phase.steps) {
|
|
116
|
+
if (step.task !== 'assert_contribution')
|
|
117
|
+
continue;
|
|
118
|
+
for (const v of step.validations ?? []) {
|
|
119
|
+
if (v.check !== 'any_of')
|
|
120
|
+
continue;
|
|
121
|
+
for (const flag of v.allowed_values ?? []) {
|
|
122
|
+
if (typeof flag === 'string')
|
|
123
|
+
anyOfFlags.add(flag);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const phase of storyboard.phases) {
|
|
129
|
+
if (resolved.has(phase.id))
|
|
130
|
+
continue;
|
|
131
|
+
if (!phase.optional)
|
|
132
|
+
continue;
|
|
133
|
+
for (const step of phase.steps) {
|
|
134
|
+
if (!step.contributes_to)
|
|
135
|
+
continue;
|
|
136
|
+
if (!anyOfFlags.has(step.contributes_to))
|
|
137
|
+
continue;
|
|
138
|
+
resolved.set(phase.id, { id: step.contributes_to, semantics: 'any_of' });
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return resolved;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Re-grade non-contributing branch-set peers per the `any_of` semantics in
|
|
146
|
+
* storyboard-schema.yaml ("Per-step grading in any_of branch patterns").
|
|
147
|
+
*
|
|
148
|
+
* Runs after the main phase loop because peer contribution status isn't
|
|
149
|
+
* knowable until all peer phases have executed. For every phase in a
|
|
150
|
+
* branch set (explicit `branch_set:` declaration or implicit detection via
|
|
151
|
+
* `resolveBranchSets`) whose flag was contributed by a different phase,
|
|
152
|
+
* this phase's raw step failures are moot — the agent took the other
|
|
153
|
+
* branch. Each such failed step is rewritten to a skipped result with
|
|
154
|
+
* `skip_reason: 'peer_branch_taken'` and the detail string the
|
|
155
|
+
* runner-output-contract mandates:
|
|
156
|
+
*
|
|
157
|
+
* "<flag> contributed by <peer_phase_id>.<peer_step_id> — <this_phase_id> is moot"
|
|
158
|
+
*
|
|
159
|
+
* The `<this_branch_id>` contract placeholder resolves to the non-chosen
|
|
160
|
+
* peer's phase id — `branch_set.id` is shared across peers and could not
|
|
161
|
+
* disambiguate. Only `any_of` semantics drives re-grading today; other
|
|
162
|
+
* (reserved) values are rejected at parse in `validateBranchSet`.
|
|
163
|
+
*
|
|
164
|
+
* `countedAsFailed` names step results the main loop added to `failedCount`
|
|
165
|
+
* as hard failures — either non-optional phases or the `presenceDetected`
|
|
166
|
+
* PRM 2xx path (adcp-client#677: "an agent that serves PRM MUST serve it
|
|
167
|
+
* correctly"). These stand: re-grading them would paper over the exact
|
|
168
|
+
* invariants the hard-failure paths exist to enforce. The post-pass only
|
|
169
|
+
* relabels swallowed optional-phase failures, which by construction are not
|
|
170
|
+
* in `countedAsFailed`.
|
|
171
|
+
*/
|
|
172
|
+
function applyBranchSetGrading(phases, phaseResults, branchSetByPhaseId, contributions, contributionSources, countedAsFailed) {
|
|
173
|
+
let skippedDelta = 0;
|
|
174
|
+
for (let i = 0; i < phases.length; i++) {
|
|
175
|
+
const phaseDef = phases[i];
|
|
176
|
+
const phaseResult = phaseResults[i];
|
|
177
|
+
if (!phaseDef || !phaseResult)
|
|
178
|
+
continue;
|
|
179
|
+
const branchSet = branchSetByPhaseId.get(phaseDef.id);
|
|
180
|
+
if (!branchSet)
|
|
181
|
+
continue;
|
|
182
|
+
if (branchSet.semantics !== 'any_of')
|
|
183
|
+
continue;
|
|
184
|
+
const flag = branchSet.id;
|
|
185
|
+
if (!contributions.has(flag))
|
|
186
|
+
continue;
|
|
187
|
+
const source = contributionSources.get(flag);
|
|
188
|
+
if (!source || source.phaseId === phaseDef.id)
|
|
189
|
+
continue;
|
|
190
|
+
const detail = `${flag} contributed by ${source.phaseId}.${source.stepId} — ${phaseDef.id} is moot`;
|
|
191
|
+
let regraded = false;
|
|
192
|
+
for (const step of phaseResult.steps) {
|
|
193
|
+
if (step.passed || step.skipped)
|
|
194
|
+
continue;
|
|
195
|
+
if (countedAsFailed.has(step))
|
|
196
|
+
continue;
|
|
197
|
+
step.passed = true;
|
|
198
|
+
step.skipped = true;
|
|
199
|
+
step.skip_reason = 'peer_branch_taken';
|
|
200
|
+
step.skip = { reason: 'peer_branch_taken', detail };
|
|
201
|
+
delete step.error;
|
|
202
|
+
skippedDelta++;
|
|
203
|
+
regraded = true;
|
|
204
|
+
}
|
|
205
|
+
if (regraded) {
|
|
206
|
+
phaseResult.passed = phaseResult.steps.every(s => s.passed || s.skipped);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return { skippedDelta };
|
|
210
|
+
}
|
|
211
|
+
function extractionFromTaskResult(taskResult) {
|
|
212
|
+
if (!taskResult)
|
|
213
|
+
return { path: 'none' };
|
|
214
|
+
// Prefer the explicit provenance stamped by the response unwrapper / raw
|
|
215
|
+
// MCP probe. Fall back to inference only when the tag is missing (e.g.,
|
|
216
|
+
// synthetic TaskResults built by validation harnesses).
|
|
217
|
+
if (taskResult._extraction_path !== undefined)
|
|
218
|
+
return { path: taskResult._extraction_path };
|
|
219
|
+
if (!taskResult.success && taskResult.error)
|
|
220
|
+
return { path: 'error' };
|
|
221
|
+
return taskResult.data !== undefined && taskResult.data !== null ? { path: 'structured_content' } : { path: 'none' };
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Keys whose values must never appear verbatim in a compliance report.
|
|
225
|
+
* Matching is case-insensitive and structural: any property whose final
|
|
226
|
+
* path segment matches is replaced with `'[redacted]'` before the payload
|
|
227
|
+
* is persisted on a step result. The contract spec calls for exactly this:
|
|
228
|
+
* "Secrets SHOULD be redacted with the literal string '[redacted]'".
|
|
229
|
+
*/
|
|
230
|
+
const SECRET_KEY_PATTERN = /^(authorization|credentials?|token|api[_-]?key|password|secret|client[_-]secret|refresh[_-]token|access[_-]token|bearer|session[_-]token|session[_-]id|offering[_-]token|cookie|set[_-]cookie)$/i;
|
|
231
|
+
function __redactSecretsForTest(value) {
|
|
232
|
+
return redactSecrets(value);
|
|
233
|
+
}
|
|
234
|
+
function __filterResponseHeadersForTest(headers) {
|
|
235
|
+
return filterResponseHeaders(headers);
|
|
236
|
+
}
|
|
237
|
+
function __defaultAuthHeadersForRawProbeForTest(options) {
|
|
238
|
+
return defaultAuthHeadersForRawProbe(options);
|
|
239
|
+
}
|
|
240
|
+
function redactSecrets(value, depth = 0) {
|
|
241
|
+
if (depth > 32)
|
|
242
|
+
return value; // cheap cycle guard
|
|
243
|
+
if (Array.isArray(value))
|
|
244
|
+
return value.map(v => redactSecrets(v, depth + 1));
|
|
245
|
+
if (value && typeof value === 'object') {
|
|
246
|
+
const out = {};
|
|
247
|
+
for (const [k, v] of Object.entries(value)) {
|
|
248
|
+
out[k] =
|
|
249
|
+
SECRET_KEY_PATTERN.test(k) && (typeof v === 'string' || typeof v === 'number')
|
|
250
|
+
? '[redacted]'
|
|
251
|
+
: redactSecrets(v, depth + 1);
|
|
252
|
+
}
|
|
253
|
+
return out;
|
|
254
|
+
}
|
|
255
|
+
return value;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Response headers to echo on a RunnerResponseRecord. Everything else is
|
|
259
|
+
* dropped — agents can (and do) include `set-cookie`, echoed `authorization`,
|
|
260
|
+
* reverse-proxy breadcrumbs (`x-amz-*`, `x-azure-*`, `x-internal-*`) that a
|
|
261
|
+
* hostile agent could use to bait us into publishing internal state in a
|
|
262
|
+
* shared compliance report.
|
|
263
|
+
*/
|
|
264
|
+
const RESPONSE_HEADER_ALLOWLIST = new Set([
|
|
265
|
+
'content-type',
|
|
266
|
+
'content-length',
|
|
267
|
+
'content-encoding',
|
|
268
|
+
'www-authenticate',
|
|
269
|
+
'location',
|
|
270
|
+
'retry-after',
|
|
271
|
+
'x-request-id',
|
|
272
|
+
'x-correlation-id',
|
|
273
|
+
]);
|
|
274
|
+
function filterResponseHeaders(headers) {
|
|
275
|
+
if (!headers)
|
|
276
|
+
return undefined;
|
|
277
|
+
const out = {};
|
|
278
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
279
|
+
if (RESPONSE_HEADER_ALLOWLIST.has(k.toLowerCase()))
|
|
280
|
+
out[k] = v;
|
|
281
|
+
}
|
|
282
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
283
|
+
}
|
|
284
|
+
// ────────────────────────────────────────────────────────────
|
|
285
|
+
// runStoryboard: execute all phases/steps
|
|
286
|
+
// ────────────────────────────────────────────────────────────
|
|
287
|
+
/**
|
|
288
|
+
* Run an entire storyboard against an agent.
|
|
289
|
+
*
|
|
290
|
+
* Pass a single URL for the standard single-instance run. Pass an array of
|
|
291
|
+
* URLs to engage multi-instance mode: the runner round-robins each step
|
|
292
|
+
* across the provided URLs so that (brand, account)-scoped state created on
|
|
293
|
+
* one instance must be visible on the next. Sellers whose state lives only
|
|
294
|
+
* in-process will fail this mode — the failure signature is a prior write
|
|
295
|
+
* succeeding on instance A while a subsequent read returns NOT_FOUND or
|
|
296
|
+
* empty on instance B.
|
|
297
|
+
*/
|
|
298
|
+
async function runStoryboard(agentUrlOrUrls, storyboard, options = {}) {
|
|
299
|
+
(0, test_kit_1.validateTestKit)(options.test_kit);
|
|
300
|
+
// Enforce authoring-time branch_set invariants regardless of how the
|
|
301
|
+
// storyboard reached us. YAML callers already ran these rules in
|
|
302
|
+
// parseStoryboard; programmatic callers (hand-built Storyboard objects or
|
|
303
|
+
// alternative YAML loaders) reach this point without the loader having
|
|
304
|
+
// fired, and the runtime's grading depends on the invariants holding.
|
|
305
|
+
// `validateStoryboardShape` is idempotent so the double-pass is safe.
|
|
306
|
+
(0, loader_1.validateStoryboardShape)(storyboard);
|
|
307
|
+
const agentUrls = Array.isArray(agentUrlOrUrls) ? agentUrlOrUrls : [agentUrlOrUrls];
|
|
308
|
+
if (agentUrls.length === 0) {
|
|
309
|
+
throw new Error('runStoryboard: at least one agent URL required');
|
|
310
|
+
}
|
|
311
|
+
const isMultiInstance = agentUrls.length > 1;
|
|
312
|
+
if (isMultiInstance && options._client) {
|
|
313
|
+
throw new Error('runStoryboard: _client override is incompatible with multi-instance mode. ' +
|
|
314
|
+
'Remove _client (or pass a single agent URL) to use round-robin dispatch.');
|
|
315
|
+
}
|
|
316
|
+
const requestedStrategy = options.multi_instance_strategy ?? 'round-robin';
|
|
317
|
+
if (requestedStrategy === 'multi-pass' && isMultiInstance) {
|
|
318
|
+
// Webhook receivers bind a fresh ephemeral port per pass. Each pass would
|
|
319
|
+
// advertise a different URL via `{{runner.webhook_base}}`; agents caching
|
|
320
|
+
// the pass-1 URL would deliver into a dead port in pass 2. Reject rather
|
|
321
|
+
// than silently mis-route. The spec-correct test for webhook retry /
|
|
322
|
+
// idempotency is one pass.
|
|
323
|
+
if (options.webhook_receiver) {
|
|
324
|
+
throw new Error('runStoryboard: webhook_receiver is incompatible with multi_instance_strategy: "multi-pass". ' +
|
|
325
|
+
'Each pass would bind a fresh receiver URL, so agents caching the pass-1 URL would deliver ' +
|
|
326
|
+
'to a dead port in pass 2. Use round-robin when the storyboard needs a webhook receiver, ' +
|
|
327
|
+
'or run multi-pass on a storyboard without webhook observation.');
|
|
328
|
+
}
|
|
329
|
+
return runMultiPass(agentUrls, storyboard, options);
|
|
330
|
+
}
|
|
331
|
+
return executeStoryboardPass(agentUrls, storyboard, options, 0);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Build a minimal StoryboardResult for a storyboard skipped by a
|
|
335
|
+
* `requires_capability` predicate. The single synthetic step carries
|
|
336
|
+
* `skip_reason: 'capability_unsupported'` so CLI reports and JUnit
|
|
337
|
+
* consumers render it as a skip rather than a pass or failure.
|
|
338
|
+
*/
|
|
339
|
+
function buildCapabilityUnsupportedResult(agentUrls, storyboard, detail) {
|
|
340
|
+
const syntheticStep = {
|
|
341
|
+
storyboard_id: storyboard.id,
|
|
342
|
+
step_id: 'capability_unsupported',
|
|
343
|
+
phase_id: 'capability_unsupported',
|
|
344
|
+
title: 'Storyboard skipped: capability not supported by this agent',
|
|
345
|
+
task: '',
|
|
346
|
+
passed: true,
|
|
347
|
+
skipped: true,
|
|
348
|
+
skip_reason: 'capability_unsupported',
|
|
349
|
+
skip: { reason: 'unsatisfied_contract', detail },
|
|
350
|
+
duration_ms: 0,
|
|
351
|
+
validations: [],
|
|
352
|
+
context: {},
|
|
353
|
+
error: detail,
|
|
354
|
+
extraction: { path: 'none' },
|
|
355
|
+
};
|
|
356
|
+
return {
|
|
357
|
+
storyboard_id: storyboard.id,
|
|
358
|
+
storyboard_title: storyboard.title,
|
|
359
|
+
agent_url: agentUrls[0],
|
|
360
|
+
overall_passed: true,
|
|
361
|
+
phases: [
|
|
362
|
+
{
|
|
363
|
+
phase_id: 'capability_unsupported',
|
|
364
|
+
phase_title: 'Capability unsupported',
|
|
365
|
+
passed: true,
|
|
366
|
+
steps: [syntheticStep],
|
|
367
|
+
duration_ms: 0,
|
|
368
|
+
},
|
|
369
|
+
],
|
|
370
|
+
context: {},
|
|
371
|
+
total_duration_ms: 0,
|
|
372
|
+
passed_count: 0,
|
|
373
|
+
failed_count: 0,
|
|
374
|
+
skipped_count: 1,
|
|
375
|
+
tested_at: new Date().toISOString(),
|
|
376
|
+
strict_validation_summary: {
|
|
377
|
+
observable: false,
|
|
378
|
+
checked: 0,
|
|
379
|
+
passed: 0,
|
|
380
|
+
failed: 0,
|
|
381
|
+
strict_only_failures: 0,
|
|
382
|
+
lenient_also_failed: 0,
|
|
383
|
+
},
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Execute a single pass of the storyboard against the supplied replica URLs
|
|
388
|
+
* using round-robin dispatch starting at `dispatchOffset`. Called directly
|
|
389
|
+
* by `runStoryboard` (offset 0) and repeatedly by `runMultiPass` (offsets
|
|
390
|
+
* 0..N-1). Taking the offset as an explicit parameter keeps the dispatcher
|
|
391
|
+
* primitive out of the public `StoryboardRunOptions` type.
|
|
392
|
+
*/
|
|
393
|
+
async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOffset, preSeeded) {
|
|
394
|
+
const start = Date.now();
|
|
395
|
+
const isMultiInstance = agentUrls.length > 1;
|
|
396
|
+
// Build one client per URL. In single-URL mode `_client` (from comply()) is
|
|
397
|
+
// honored so the shared MCP transport is reused across storyboards.
|
|
398
|
+
const clients = agentUrls.map(url => (0, client_1.getOrCreateClient)(url, options));
|
|
399
|
+
// Discover agent profile against the first instance; all instances are
|
|
400
|
+
// expected to run the same code behind a shared state store, so one probe
|
|
401
|
+
// is sufficient. For multi-instance runs, skipping N-1 redundant
|
|
402
|
+
// get_agent_info calls also keeps CI output clean.
|
|
403
|
+
let profile;
|
|
404
|
+
if (!options._client) {
|
|
405
|
+
const discovered = await (0, client_1.getOrDiscoverProfile)(clients[0], options);
|
|
406
|
+
profile = discovered.profile;
|
|
407
|
+
// Populate agentTools from discovered profile if not already set
|
|
408
|
+
if (!options.agentTools && profile?.tools) {
|
|
409
|
+
options = { ...options, agentTools: profile.tools };
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
profile = options._profile;
|
|
414
|
+
}
|
|
415
|
+
// Evaluate requires_capability predicate before any phase setup.
|
|
416
|
+
// When the agent explicitly declared it doesn't support what this storyboard
|
|
417
|
+
// tests (e.g. `adcp.idempotency.supported: false`), skip the whole storyboard
|
|
418
|
+
// rather than producing a cascade of misleading per-phase failures.
|
|
419
|
+
if (storyboard.requires_capability) {
|
|
420
|
+
const rawCaps = profile?.raw_capabilities;
|
|
421
|
+
if (rawCaps !== undefined) {
|
|
422
|
+
const { path, equals } = storyboard.requires_capability;
|
|
423
|
+
const actual = resolveCapabilityPath(rawCaps, path);
|
|
424
|
+
// Absence semantics — load-bearing. `actual === undefined` means
|
|
425
|
+
// the agent didn't declare the capability at all (field missing
|
|
426
|
+
// from `get_adcp_capabilities` response). We deliberately RUN the
|
|
427
|
+
// storyboard in that case rather than skip it: an agent that
|
|
428
|
+
// pre-dates the capability field hasn't explicitly opted out, so
|
|
429
|
+
// the storyboard's failures surface a real spec-coverage gap
|
|
430
|
+
// (under-declared agent) rather than a behavior the agent
|
|
431
|
+
// affirmatively refused. Skip ONLY when the agent declared a
|
|
432
|
+
// value AND that value disagrees with the predicate.
|
|
433
|
+
if (actual !== undefined && actual !== equals) {
|
|
434
|
+
const detail = `Capability predicate \`${path} === ${JSON.stringify(equals)}\` not satisfied: ` +
|
|
435
|
+
`agent declared ${JSON.stringify(actual)}.`;
|
|
436
|
+
if (!options._client)
|
|
437
|
+
await (0, protocols_1.closeConnections)(options.protocol);
|
|
438
|
+
return buildCapabilityUnsupportedResult(agentUrls, storyboard, detail);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
let context = { ...options.context };
|
|
443
|
+
if (options.context)
|
|
444
|
+
(0, context_1.forwardAliasCache)(options.context, context);
|
|
445
|
+
const contributions = new Set();
|
|
446
|
+
// First phase/step that contributed each flag. Branch-set post-pass reads
|
|
447
|
+
// this to emit the contract-mandated peer_branch_taken detail string
|
|
448
|
+
// ("<flag> contributed by <peer_phase_id>.<peer_step_id> — …"). Only the
|
|
449
|
+
// first contributor is recorded — downstream peers observing the same flag
|
|
450
|
+
// are redundant and the contract calls out a single peer.
|
|
451
|
+
const contributionSources = new Map();
|
|
452
|
+
const priorStepResults = new Map();
|
|
453
|
+
const priorProbes = new Map();
|
|
454
|
+
const contextProvenance = new Map();
|
|
455
|
+
const priorA2aEnvelopes = new Map();
|
|
456
|
+
const phaseResults = [];
|
|
457
|
+
let passedCount = 0;
|
|
458
|
+
let failedCount = 0;
|
|
459
|
+
let skippedCount = 0;
|
|
460
|
+
// Step results whose failures the main loop added to failedCount. The
|
|
461
|
+
// branch-set post-pass decrements only for entries that were actually
|
|
462
|
+
// counted, so an optional phase that hit `presenceDetected` (a PRM 2xx
|
|
463
|
+
// inside an otherwise-optional phase) has its leak correctly reversed.
|
|
464
|
+
const countedAsFailed = new Set();
|
|
465
|
+
// Start an ephemeral webhook receiver when the run opts in. The base URL
|
|
466
|
+
// is exposed via `{{runner.webhook_base}}` / `{{runner.webhook_url:<id>}}`
|
|
467
|
+
// substitutions so storyboards can inject per-step URLs into
|
|
468
|
+
// `push_notification_config.url`. See adcontextprotocol/adcp#2431.
|
|
469
|
+
const webhookReceiver = options.webhook_receiver
|
|
470
|
+
? await (0, webhook_receiver_1.createWebhookReceiver)({
|
|
471
|
+
...(options.webhook_receiver.mode && { mode: options.webhook_receiver.mode }),
|
|
472
|
+
...(options.webhook_receiver.host !== undefined && { host: options.webhook_receiver.host }),
|
|
473
|
+
...(options.webhook_receiver.port !== undefined && { port: options.webhook_receiver.port }),
|
|
474
|
+
...(options.webhook_receiver.public_url !== undefined && { public_url: options.webhook_receiver.public_url }),
|
|
475
|
+
})
|
|
476
|
+
: undefined;
|
|
477
|
+
const runnerVars = (0, context_1.createRunnerVariables)({
|
|
478
|
+
...(webhookReceiver && { webhookBase: webhookReceiver.base_url }),
|
|
479
|
+
});
|
|
480
|
+
// Pre-arm retry-replay policies for any expect_webhook_retry_keys_stable
|
|
481
|
+
// steps. Ordering matters: the receiver must be rejecting deliveries
|
|
482
|
+
// before the triggering step fires its webhook, otherwise the first
|
|
483
|
+
// delivery succeeds and the sender never retries.
|
|
484
|
+
if (webhookReceiver)
|
|
485
|
+
(0, webhook_assertions_1.armWebhookAssertions)(storyboard, runnerVars, webhookReceiver);
|
|
486
|
+
// Flatten all steps for next-step preview lookups
|
|
487
|
+
const allSteps = flattenSteps(storyboard);
|
|
488
|
+
// Inner passes always dispatch round-robin; only the outer runMultiPass
|
|
489
|
+
// caller knows about the multi-pass strategy. This keeps createDispatcher's
|
|
490
|
+
// strategy parameter narrow.
|
|
491
|
+
const dispatch = createDispatcher(agentUrls, clients, 'round-robin', dispatchOffset);
|
|
492
|
+
// Resolve cross-step assertions declared on `storyboard.invariants`.
|
|
493
|
+
// `resolveAssertions` throws on unknown ids — fail fast here rather than
|
|
494
|
+
// silently skip, since a missing assertion means unknown conformance gaps.
|
|
495
|
+
const assertions = (0, assertions_1.resolveAssertions)(storyboard.invariants);
|
|
496
|
+
// Step-level `invariants.disable` uses the resolved set as its universe:
|
|
497
|
+
// an id is only a valid step-level opt-out if it actually runs on this
|
|
498
|
+
// storyboard. Typos and dead-code references (already disabled run-wide)
|
|
499
|
+
// fail fast here for the same reason.
|
|
500
|
+
(0, assertions_1.validateStepInvariants)(storyboard, assertions);
|
|
501
|
+
const assertionContexts = new Map();
|
|
502
|
+
for (const spec of assertions) {
|
|
503
|
+
assertionContexts.set(spec.id, {
|
|
504
|
+
storyboard,
|
|
505
|
+
agentUrl: agentUrls[0],
|
|
506
|
+
options,
|
|
507
|
+
state: {},
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
const assertionResults = [];
|
|
511
|
+
let assertionsFailed = false;
|
|
512
|
+
for (const spec of assertions) {
|
|
513
|
+
if (spec.onStart)
|
|
514
|
+
await spec.onStart(assertionContexts.get(spec.id));
|
|
515
|
+
}
|
|
516
|
+
// Placeholder storyboards with no executable phases get a distinct skip
|
|
517
|
+
// reason per the runner-output contract. Without this, the overall result
|
|
518
|
+
// would pass vacuously — `passed_count === 0 && failed_count === 0` — and
|
|
519
|
+
// an implementor reading the report can't tell "nothing tested" from
|
|
520
|
+
// "everything passed".
|
|
521
|
+
const hasExecutableSteps = storyboard.phases.some(p => p.steps.length > 0);
|
|
522
|
+
if (!hasExecutableSteps) {
|
|
523
|
+
const isScenarioComposed = (storyboard.requires_scenarios?.length ?? 0) > 0;
|
|
524
|
+
const detail = isScenarioComposed
|
|
525
|
+
? `Storyboard "${storyboard.id}" has no local phases — its test surface is fully composed from the scenarios listed in \`requires_scenarios\`.`
|
|
526
|
+
: `Storyboard "${storyboard.id}" has no executable phases — populate \`phases[].steps\` or remove the storyboard.`;
|
|
527
|
+
const syntheticStep = {
|
|
528
|
+
storyboard_id: storyboard.id,
|
|
529
|
+
// Synthetic sentinel. Functionally non-colliding because downstream
|
|
530
|
+
// consumers (CLI report, storyboard-tracks) key on `skip_reason`,
|
|
531
|
+
// not `phase_id`/`step_id`. Matches the documented `RunnerSkipReason`
|
|
532
|
+
// vocabulary in storyboard/types.ts.
|
|
533
|
+
step_id: 'no_phases',
|
|
534
|
+
phase_id: 'no_phases',
|
|
535
|
+
title: 'Storyboard has no executable phases',
|
|
536
|
+
task: '',
|
|
537
|
+
passed: true,
|
|
538
|
+
skipped: true,
|
|
539
|
+
skip_reason: 'no_phases',
|
|
540
|
+
skip: buildSkip('no_phases', detail),
|
|
541
|
+
duration_ms: 0,
|
|
542
|
+
validations: [],
|
|
543
|
+
context,
|
|
544
|
+
error: detail,
|
|
545
|
+
extraction: { path: 'none' },
|
|
546
|
+
};
|
|
547
|
+
phaseResults.push({
|
|
548
|
+
phase_id: 'no_phases',
|
|
549
|
+
phase_title: 'No phases',
|
|
550
|
+
passed: true, // skipped step is neutral — phase must not fail
|
|
551
|
+
steps: [syntheticStep],
|
|
552
|
+
duration_ms: 0,
|
|
553
|
+
});
|
|
554
|
+
skippedCount++;
|
|
555
|
+
}
|
|
556
|
+
// Pre-flight controller seeding (adcp-client#778). When the storyboard
|
|
557
|
+
// declares `prerequisites.controller_seeding: true` and carries a
|
|
558
|
+
// `fixtures:` block, fire the corresponding `seed_*` scenarios on
|
|
559
|
+
// `comply_test_controller` so the seller's catalog / ledger holds every
|
|
560
|
+
// fixture id the downstream phases reference. On any seed failure we
|
|
561
|
+
// cascade-skip the remaining phases with `controller_seeding_failed` so
|
|
562
|
+
// the report shows "setup broke" instead of a thicket of per-step
|
|
563
|
+
// PRODUCT_NOT_FOUND / VALIDATION_ERROR failures. Runs against the first
|
|
564
|
+
// client only: in multi-instance mode the seller is expected to share
|
|
565
|
+
// state across replicas (that is what multi-instance tests exist to
|
|
566
|
+
// verify). Sellers that hold per-replica state must opt out via
|
|
567
|
+
// `skip_controller_seeding`.
|
|
568
|
+
//
|
|
569
|
+
// The seeding phase is held in a sidecar rather than pushed into
|
|
570
|
+
// `phaseResults` up-front so every downstream consumer that indexes
|
|
571
|
+
// `phaseResults[i]` against `storyboard.phases[i]` (branch-set grading,
|
|
572
|
+
// `requiredPhasesPassed`) keeps working. It is spliced to the front of
|
|
573
|
+
// `phaseResults` at the end so the report reads top-to-bottom in the
|
|
574
|
+
// order the runner actually executed things.
|
|
575
|
+
//
|
|
576
|
+
// Multi-pass mode populates `preSeeded` so seeding fires exactly once
|
|
577
|
+
// across all passes — see `runMultiPass`. Without the sidecar, every
|
|
578
|
+
// pass would re-seed and the aggregator's cross-pass sum would inflate
|
|
579
|
+
// `failed_count`/`skipped_count` by N when a single fixture broke.
|
|
580
|
+
let seedingPhaseResult = null;
|
|
581
|
+
let seedingFailed = false;
|
|
582
|
+
let seedingMissingController = false;
|
|
583
|
+
{
|
|
584
|
+
const seeding = preSeeded !== undefined
|
|
585
|
+
? preSeeded.result
|
|
586
|
+
: await (0, seeding_1.runControllerSeeding)(clients[0], storyboard, options, context);
|
|
587
|
+
if (seeding) {
|
|
588
|
+
const attach = preSeeded === undefined || preSeeded.attach;
|
|
589
|
+
if (attach) {
|
|
590
|
+
seedingPhaseResult = seeding.phase;
|
|
591
|
+
passedCount += seeding.passedCount;
|
|
592
|
+
failedCount += seeding.failedCount;
|
|
593
|
+
if (seeding.missingController)
|
|
594
|
+
skippedCount += seeding.phase.steps.length;
|
|
595
|
+
}
|
|
596
|
+
if (seeding.missingController) {
|
|
597
|
+
seedingMissingController = true;
|
|
598
|
+
}
|
|
599
|
+
else if (!seeding.allPassed) {
|
|
600
|
+
seedingFailed = true;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
for (const phase of storyboard.phases) {
|
|
605
|
+
const phaseStart = Date.now();
|
|
606
|
+
const stepResults = [];
|
|
607
|
+
let phasePassed = true;
|
|
608
|
+
let statefulFailed = false;
|
|
609
|
+
// PRM presence-probe state (adcp-client#677). `phaseAbsent` flips when
|
|
610
|
+
// /.well-known/oauth-protected-resource returns 404 — subsequent steps
|
|
611
|
+
// in this phase cascade-skip instead of failing their http_status:200
|
|
612
|
+
// validations. `presenceDetected` flips when PRM returns a 2xx: the
|
|
613
|
+
// agent IS advertising OAuth, so validation failures in this phase
|
|
614
|
+
// become hard failures regardless of `optional: true`, closing the
|
|
615
|
+
// spoofing path where a broken PRM + valid API key could silently pass.
|
|
616
|
+
let phaseAbsent = false;
|
|
617
|
+
let presenceDetected = false;
|
|
618
|
+
if (shouldSkipPhase(phase, options)) {
|
|
619
|
+
phaseResults.push({
|
|
620
|
+
phase_id: phase.id,
|
|
621
|
+
phase_title: phase.title,
|
|
622
|
+
passed: true, // optional phase skipped — neutral
|
|
623
|
+
steps: [],
|
|
624
|
+
duration_ms: 0,
|
|
625
|
+
});
|
|
626
|
+
continue;
|
|
627
|
+
}
|
|
628
|
+
// Seeding-cascade skip: either the pre-flight seed phase failed (setup
|
|
629
|
+
// break) or the agent doesn't advertise `comply_test_controller`
|
|
630
|
+
// (coverage gap). Both paths emit skipped steps; the reasons differ so
|
|
631
|
+
// compliance reports distinguish "agent misconfigured" from "agent not
|
|
632
|
+
// graded against this storyboard". `controller_seeding_failed` is a
|
|
633
|
+
// detailed reason mapped to canonical `prerequisite_failed`;
|
|
634
|
+
// `missing_test_controller` is canonical on its own. Emits full step
|
|
635
|
+
// rows (not an empty phase) so implementors see exactly which
|
|
636
|
+
// buyer-side operations were elided.
|
|
637
|
+
if (seedingMissingController || seedingFailed) {
|
|
638
|
+
const cascadeSkip = seedingMissingController
|
|
639
|
+
? {
|
|
640
|
+
skip_reason: 'missing_test_controller',
|
|
641
|
+
skip: { reason: 'missing_test_controller', detail: SKIP_DETAILS.missing_test_controller },
|
|
642
|
+
}
|
|
643
|
+
: {
|
|
644
|
+
skip_reason: 'controller_seeding_failed',
|
|
645
|
+
skip: { reason: 'prerequisite_failed', detail: CONTROLLER_SEEDING_FAILED_DETAIL },
|
|
646
|
+
};
|
|
647
|
+
const cascadeSteps = phase.steps.map(step => ({
|
|
648
|
+
storyboard_id: storyboard.id,
|
|
649
|
+
step_id: step.id,
|
|
650
|
+
phase_id: phase.id,
|
|
651
|
+
title: step.title,
|
|
652
|
+
task: step.task,
|
|
653
|
+
passed: true,
|
|
654
|
+
skipped: true,
|
|
655
|
+
...cascadeSkip,
|
|
656
|
+
duration_ms: 0,
|
|
657
|
+
validations: [],
|
|
658
|
+
context,
|
|
659
|
+
extraction: { path: 'none' },
|
|
660
|
+
}));
|
|
661
|
+
phaseResults.push({
|
|
662
|
+
phase_id: phase.id,
|
|
663
|
+
phase_title: phase.title,
|
|
664
|
+
passed: true,
|
|
665
|
+
steps: cascadeSteps,
|
|
666
|
+
duration_ms: 0,
|
|
667
|
+
});
|
|
668
|
+
skippedCount += cascadeSteps.length;
|
|
669
|
+
continue;
|
|
670
|
+
}
|
|
671
|
+
for (const step of phase.steps) {
|
|
672
|
+
// Cascade-skip when the PRM presence probe declared the phase absent.
|
|
673
|
+
if (phaseAbsent) {
|
|
674
|
+
const cascadeResult = {
|
|
675
|
+
storyboard_id: storyboard.id,
|
|
676
|
+
step_id: step.id,
|
|
677
|
+
phase_id: phase.id,
|
|
678
|
+
title: step.title,
|
|
679
|
+
task: step.task,
|
|
680
|
+
passed: true,
|
|
681
|
+
skipped: true,
|
|
682
|
+
skip_reason: 'oauth_not_advertised',
|
|
683
|
+
skip: { reason: 'not_applicable', detail: OAUTH_NOT_ADVERTISED_DETAIL },
|
|
684
|
+
duration_ms: 0,
|
|
685
|
+
validations: [],
|
|
686
|
+
context,
|
|
687
|
+
extraction: { path: 'none' },
|
|
688
|
+
};
|
|
689
|
+
stepResults.push(cascadeResult);
|
|
690
|
+
priorStepResults.set(step.id, cascadeResult);
|
|
691
|
+
skippedCount++;
|
|
692
|
+
continue;
|
|
693
|
+
}
|
|
694
|
+
// Skip remaining steps if a stateful dependency failed
|
|
695
|
+
if (statefulFailed && step.stateful) {
|
|
696
|
+
const detail = 'Skipped: prior stateful step failed.';
|
|
697
|
+
stepResults.push({
|
|
698
|
+
storyboard_id: storyboard.id,
|
|
699
|
+
step_id: step.id,
|
|
700
|
+
phase_id: phase.id,
|
|
701
|
+
title: step.title,
|
|
702
|
+
task: step.task,
|
|
703
|
+
passed: false,
|
|
704
|
+
skipped: true,
|
|
705
|
+
skip_reason: 'prerequisite_failed',
|
|
706
|
+
skip: buildSkip('prerequisite_failed', detail),
|
|
707
|
+
duration_ms: 0,
|
|
708
|
+
validations: [],
|
|
709
|
+
context,
|
|
710
|
+
error: detail,
|
|
711
|
+
extraction: { path: 'none' },
|
|
712
|
+
});
|
|
713
|
+
skippedCount++;
|
|
714
|
+
phasePassed = false;
|
|
715
|
+
continue;
|
|
716
|
+
}
|
|
717
|
+
const assignment = dispatch.nextFor(step);
|
|
718
|
+
const rawResult = await executeStep(assignment.client, step, phase.id, context, allSteps, options, {
|
|
719
|
+
contributions,
|
|
720
|
+
priorStepResults,
|
|
721
|
+
priorProbes,
|
|
722
|
+
agentUrl: assignment.agentUrl,
|
|
723
|
+
webhookReceiver,
|
|
724
|
+
runnerVars,
|
|
725
|
+
contextProvenance,
|
|
726
|
+
priorA2aEnvelopes,
|
|
727
|
+
agentLibraryVersion: profile?.library_version,
|
|
728
|
+
});
|
|
729
|
+
const result = { ...rawResult, storyboard_id: storyboard.id };
|
|
730
|
+
if (isMultiInstance) {
|
|
731
|
+
result.agent_url = assignment.agentUrl;
|
|
732
|
+
result.agent_index = assignment.instanceIndex + 1;
|
|
733
|
+
}
|
|
734
|
+
stepResults.push(result);
|
|
735
|
+
priorStepResults.set(step.id, result);
|
|
736
|
+
// Fire per-step assertions. Each result is appended to the step's
|
|
737
|
+
// `validations[]` under `check: "assertion"` so existing UI renders
|
|
738
|
+
// them alongside inline checks, and mirrored into `assertionResults`
|
|
739
|
+
// for the storyboard-level `assertions[]` surface. Any failure flips
|
|
740
|
+
// `result.passed` so the counting below treats it like a validation
|
|
741
|
+
// failure — that's what makes assertions gating, not advisory.
|
|
742
|
+
for (const spec of assertions) {
|
|
743
|
+
if (!spec.onStep)
|
|
744
|
+
continue;
|
|
745
|
+
// Per-step opt-out: authors use `step.invariants.disable: [id]` to
|
|
746
|
+
// suppress a default invariant on a step that deliberately models
|
|
747
|
+
// behavior the invariant would flag (validated at runner start).
|
|
748
|
+
if ((0, assertions_1.stepDisablesAssertion)(step.invariants, spec.id))
|
|
749
|
+
continue;
|
|
750
|
+
const raw = await spec.onStep(assertionContexts.get(spec.id), result);
|
|
751
|
+
for (const r of raw) {
|
|
752
|
+
const full = { ...r, assertion_id: spec.id, scope: 'step', step_id: step.id };
|
|
753
|
+
assertionResults.push(full);
|
|
754
|
+
result.validations.push({
|
|
755
|
+
check: 'assertion',
|
|
756
|
+
passed: r.passed,
|
|
757
|
+
description: `${spec.id}: ${r.description}`,
|
|
758
|
+
...(r.error !== undefined && { error: r.error }),
|
|
759
|
+
});
|
|
760
|
+
// Issue #935: assertions can attach a structured hint that the
|
|
761
|
+
// runner mirrors into the owning step's `hints[]`. Today only
|
|
762
|
+
// `status.monotonic` populates `hint`; the merge here keeps the
|
|
763
|
+
// taxonomy unified so a single CLI/JUnit/Addie renderer can drive
|
|
764
|
+
// off `step.hints[]` regardless of which subsystem produced it.
|
|
765
|
+
if (r.hint) {
|
|
766
|
+
const existing = result.hints ?? [];
|
|
767
|
+
result.hints = [...existing, r.hint];
|
|
768
|
+
}
|
|
769
|
+
if (!r.passed) {
|
|
770
|
+
result.passed = false;
|
|
771
|
+
assertionsFailed = true;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
// PRM presence accounting — must happen after the step result lands so
|
|
776
|
+
// both the skipped-404 and 2xx paths are visible.
|
|
777
|
+
if (step.task === 'protected_resource_metadata') {
|
|
778
|
+
if (result.skipped && result.skip_reason === 'oauth_not_advertised') {
|
|
779
|
+
phaseAbsent = true;
|
|
780
|
+
}
|
|
781
|
+
else {
|
|
782
|
+
const status = result.response?.status;
|
|
783
|
+
if (typeof status === 'number' && status >= 200 && status < 300) {
|
|
784
|
+
presenceDetected = true;
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
// Record contribution on success, honoring optional contributes_if predicate.
|
|
789
|
+
if (!result.skipped && result.passed && step.contributes_to) {
|
|
790
|
+
if (evalContributesIf(step.contributes_if, priorStepResults)) {
|
|
791
|
+
const flag = step.contributes_to;
|
|
792
|
+
if (!contributions.has(flag)) {
|
|
793
|
+
contributionSources.set(flag, { phaseId: phase.id, stepId: step.id });
|
|
794
|
+
}
|
|
795
|
+
contributions.add(flag);
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
if (result.skipped) {
|
|
799
|
+
skippedCount++;
|
|
800
|
+
context = result.context;
|
|
801
|
+
}
|
|
802
|
+
else if (result.passed) {
|
|
803
|
+
context = result.context;
|
|
804
|
+
passedCount++;
|
|
805
|
+
}
|
|
806
|
+
else {
|
|
807
|
+
phasePassed = false;
|
|
808
|
+
// Optional phases normally swallow step failures — the storyboard's
|
|
809
|
+
// final assert_contribution gate decides pass/fail via the "API key
|
|
810
|
+
// OR OAuth" logic. Exception: once a PRM presence probe has
|
|
811
|
+
// detected the agent IS advertising OAuth, subsequent validation
|
|
812
|
+
// failures in this phase are hard failures (adcp-client#677). An
|
|
813
|
+
// agent that serves PRM MUST serve it correctly.
|
|
814
|
+
if (!phase.optional || presenceDetected) {
|
|
815
|
+
failedCount++;
|
|
816
|
+
countedAsFailed.add(result);
|
|
817
|
+
}
|
|
818
|
+
if (step.stateful)
|
|
819
|
+
statefulFailed = true;
|
|
820
|
+
// In multi-instance mode, annotate the failure with the cross-instance
|
|
821
|
+
// attribution block so CI readers pattern-match it as a deployment bug.
|
|
822
|
+
if (isMultiInstance) {
|
|
823
|
+
annotateMultiInstanceFailure(result, storyboard, stepResults);
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
phaseResults.push({
|
|
828
|
+
phase_id: phase.id,
|
|
829
|
+
phase_title: phase.title,
|
|
830
|
+
passed: phasePassed,
|
|
831
|
+
steps: stepResults,
|
|
832
|
+
duration_ms: Date.now() - phaseStart,
|
|
833
|
+
});
|
|
834
|
+
}
|
|
835
|
+
// Branch-set post-pass: phases in a branch set (explicit `branch_set:`
|
|
836
|
+
// declaration or implicit detection via shared `contributes_to` + a later
|
|
837
|
+
// any_of `assert_contribution`) whose flag was contributed by a peer have
|
|
838
|
+
// their failed steps re-graded as skipped with `peer_branch_taken`. See
|
|
839
|
+
// storyboard-schema.yaml (lines 205-223) and runner-output-contract.yaml
|
|
840
|
+
// (reasons.peer_branch_taken). Done after all phases run — peer
|
|
841
|
+
// contribution status isn't knowable inside the per-phase loop. Runs
|
|
842
|
+
// before storyboard-scoped assertions so `onEnd` hooks see the finalized
|
|
843
|
+
// per-step grades (a moot peer's "failure" should not trip a cross-step
|
|
844
|
+
// invariant).
|
|
845
|
+
const branchSetsByPhaseId = resolveBranchSets(storyboard);
|
|
846
|
+
const branchSetDelta = applyBranchSetGrading(storyboard.phases, phaseResults, branchSetsByPhaseId, contributions, contributionSources, countedAsFailed);
|
|
847
|
+
skippedCount += branchSetDelta.skippedDelta;
|
|
848
|
+
// Fire storyboard-scoped assertions. These observe the full run and can
|
|
849
|
+
// emit `scope: "storyboard"` findings that flip `overall_passed` without
|
|
850
|
+
// being attributable to a single step (e.g. "saw >1 acquire for the same
|
|
851
|
+
// replayed idempotency_key across the run").
|
|
852
|
+
for (const spec of assertions) {
|
|
853
|
+
if (!spec.onEnd)
|
|
854
|
+
continue;
|
|
855
|
+
const raw = await spec.onEnd(assertionContexts.get(spec.id));
|
|
856
|
+
for (const r of raw) {
|
|
857
|
+
assertionResults.push({ ...r, assertion_id: spec.id, scope: 'storyboard' });
|
|
858
|
+
if (!r.passed)
|
|
859
|
+
assertionsFailed = true;
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
// Overall pass requires (a) no required-phase failures AND (b) at least one
|
|
863
|
+
// required phase actually passed with at least one non-skipped step AND
|
|
864
|
+
// (c) no assertion failures. Without (b) a storyboard where every phase is
|
|
865
|
+
// marked optional and every required phase's steps are skipped (e.g.
|
|
866
|
+
// required_tools filtered out everything) would pass vacuously. (c) makes
|
|
867
|
+
// assertions gating — a run with all validations green but a cross-step
|
|
868
|
+
// invariant broken is not conformant.
|
|
869
|
+
// When no phases had executable steps the storyboard result is a skip, not a
|
|
870
|
+
// failure. The index-aligned guard below would hit storyboard.phases[0] ===
|
|
871
|
+
// undefined for an empty-phases storyboard and force requiredPhasesPassed to
|
|
872
|
+
// false, flipping overall_passed to false. Short-circuit to true so the
|
|
873
|
+
// no-phases sentinel produces overall_passed: true (consistent with how
|
|
874
|
+
// buildNotApplicableStoryboardResult shapes its result in comply.ts).
|
|
875
|
+
const requiredPhasesPassed = !hasExecutableSteps ||
|
|
876
|
+
phaseResults.some((p, idx) => {
|
|
877
|
+
const phaseDef = storyboard.phases[idx];
|
|
878
|
+
if (!phaseDef || phaseDef.optional || !p.passed)
|
|
879
|
+
return false;
|
|
880
|
+
return p.steps.some(s => !s.skipped && s.passed);
|
|
881
|
+
});
|
|
882
|
+
// Prepend the pre-flight seeding phase now that every consumer that
|
|
883
|
+
// index-aligns `phaseResults` with `storyboard.phases` has run. Reader
|
|
884
|
+
// order matches execution order.
|
|
885
|
+
if (seedingPhaseResult)
|
|
886
|
+
phaseResults.unshift(seedingPhaseResult);
|
|
887
|
+
const schemasUsed = collectSchemasUsed(phaseResults);
|
|
888
|
+
const strictSummary = summarizeStrictValidation(phaseResults);
|
|
889
|
+
const result = {
|
|
890
|
+
storyboard_id: storyboard.id,
|
|
891
|
+
storyboard_title: storyboard.title,
|
|
892
|
+
agent_url: agentUrls[0],
|
|
893
|
+
...(isMultiInstance && { agent_urls: [...agentUrls] }),
|
|
894
|
+
// Inner multi-pass passes surface as `round-robin` (that's what they are
|
|
895
|
+
// individually); the aggregating wrapper relabels the top-level result
|
|
896
|
+
// `multi-pass`.
|
|
897
|
+
...(isMultiInstance && { multi_instance_strategy: 'round-robin' }),
|
|
898
|
+
overall_passed: failedCount === 0 && requiredPhasesPassed && !assertionsFailed,
|
|
899
|
+
phases: phaseResults,
|
|
900
|
+
context,
|
|
901
|
+
total_duration_ms: Date.now() - start,
|
|
902
|
+
passed_count: passedCount,
|
|
903
|
+
failed_count: failedCount,
|
|
904
|
+
skipped_count: skippedCount,
|
|
905
|
+
tested_at: new Date().toISOString(),
|
|
906
|
+
...(schemasUsed.length > 0 ? { schemas_used: schemasUsed } : {}),
|
|
907
|
+
...(assertionResults.length > 0 ? { assertions: assertionResults } : {}),
|
|
908
|
+
strict_validation_summary: strictSummary,
|
|
909
|
+
};
|
|
910
|
+
// Close protocol connections when the runner created its own client. The
|
|
911
|
+
// connection pool is keyed by URL+auth, so a single closeConnections() call
|
|
912
|
+
// evicts every instance's transport regardless of how many URLs we used.
|
|
913
|
+
if (!options._client) {
|
|
914
|
+
await (0, protocols_1.closeConnections)(options.protocol);
|
|
915
|
+
}
|
|
916
|
+
if (webhookReceiver)
|
|
917
|
+
await webhookReceiver.close();
|
|
918
|
+
return result;
|
|
919
|
+
}
|
|
920
|
+
/**
|
|
921
|
+
* Run the storyboard N times — once per replica — with the round-robin
|
|
922
|
+
* dispatcher starting at a different replica each pass. Lets each step hit
|
|
923
|
+
* a different replica across passes, so a bug isolated to one replica
|
|
924
|
+
* (stale config, divergent version, local cache miss) surfaces on the pass
|
|
925
|
+
* that sends the relevant step there.
|
|
926
|
+
*
|
|
927
|
+
* Known limitation (follow-up adcontextprotocol/adcp-client#607 option 2):
|
|
928
|
+
* for N=2, offset-shift preserves pair parity — a write→read pair whose
|
|
929
|
+
* dispatch indices differ by an even amount lands same-replica in every
|
|
930
|
+
* pass (the canonical property_lists case: write at step 0, read at step
|
|
931
|
+
* 2). Cross-replica state-persistence testing at N=2 is primarily the job
|
|
932
|
+
* of single-pass round-robin (which catches adjacent write→read pairs);
|
|
933
|
+
* dependency-aware dispatch that reads `context_inputs` and assigns a
|
|
934
|
+
* replica different from the writer of the specific state key being read
|
|
935
|
+
* is the spec-aligned fix for non-adjacent pairs and should be preferred
|
|
936
|
+
* over multi-pass for that purpose.
|
|
937
|
+
*
|
|
938
|
+
* The aggregated result AND-combines `overall_passed` across passes, sums
|
|
939
|
+
* the pass/fail/skip counts, and exposes the per-pass detail via `passes[]`.
|
|
940
|
+
* The top-level `phases` is the first pass's phases so single-pass consumers
|
|
941
|
+
* keep working; richer consumers read `passes[]`.
|
|
942
|
+
*/
|
|
943
|
+
async function runMultiPass(agentUrls, storyboard, options) {
|
|
944
|
+
const start = Date.now();
|
|
945
|
+
// Run pre-flight controller seeding ONCE at the run level (adcp-client#778)
|
|
946
|
+
// so the aggregator doesn't sum N redundant seed batches into
|
|
947
|
+
// `failed_count` / `skipped_count`. Every pass inherits the same outcome;
|
|
948
|
+
// only the first pass attaches the synthetic `__controller_seeding__`
|
|
949
|
+
// phase to its `phaseResults`, so the aggregated top-level counts reflect
|
|
950
|
+
// a single seeding pass across the whole run.
|
|
951
|
+
const preSeedClients = agentUrls.map(url => (0, client_1.getOrCreateClient)(url, options));
|
|
952
|
+
const preSeedContext = { ...options.context };
|
|
953
|
+
const preSeededResult = await (0, seeding_1.runControllerSeeding)(preSeedClients[0], storyboard, options, preSeedContext);
|
|
954
|
+
const passes = [];
|
|
955
|
+
const passResults = [];
|
|
956
|
+
for (let passIdx = 0; passIdx < agentUrls.length; passIdx++) {
|
|
957
|
+
const passSeeded = { result: preSeededResult, attach: passIdx === 0 };
|
|
958
|
+
const result = await executeStoryboardPass(agentUrls, storyboard, options, passIdx, passSeeded);
|
|
959
|
+
passResults.push(result);
|
|
960
|
+
passes.push({
|
|
961
|
+
pass_index: passIdx + 1,
|
|
962
|
+
dispatch_offset: passIdx,
|
|
963
|
+
overall_passed: result.overall_passed,
|
|
964
|
+
phases: result.phases,
|
|
965
|
+
passed_count: result.passed_count,
|
|
966
|
+
failed_count: result.failed_count,
|
|
967
|
+
skipped_count: result.skipped_count,
|
|
968
|
+
duration_ms: result.total_duration_ms,
|
|
969
|
+
});
|
|
970
|
+
}
|
|
971
|
+
const first = passResults[0];
|
|
972
|
+
const overallPassed = passes.every(p => p.overall_passed);
|
|
973
|
+
const passed = passes.reduce((sum, p) => sum + p.passed_count, 0);
|
|
974
|
+
const failed = passes.reduce((sum, p) => sum + p.failed_count, 0);
|
|
975
|
+
const skipped = passes.reduce((sum, p) => sum + p.skipped_count, 0);
|
|
976
|
+
const schemasUsed = passResults.flatMap(r => r.schemas_used ?? []);
|
|
977
|
+
const schemasDedup = [...new Map(schemasUsed.map(s => [s.schema_id, s])).values()];
|
|
978
|
+
// Assertions are scoped per-pass — each pass's runner resolved them
|
|
979
|
+
// independently and reported `assertion_id` identically. Concatenate so
|
|
980
|
+
// readers see a per-pass timeline; de-duplicating would hide a real
|
|
981
|
+
// "passed on pass 1, failed on pass 2" divergence.
|
|
982
|
+
const assertionsAgg = passResults.flatMap(r => r.assertions ?? []);
|
|
983
|
+
return {
|
|
984
|
+
storyboard_id: storyboard.id,
|
|
985
|
+
storyboard_title: storyboard.title,
|
|
986
|
+
agent_url: agentUrls[0],
|
|
987
|
+
agent_urls: [...agentUrls],
|
|
988
|
+
multi_instance_strategy: 'multi-pass',
|
|
989
|
+
overall_passed: overallPassed,
|
|
990
|
+
phases: first.phases,
|
|
991
|
+
passes,
|
|
992
|
+
context: first.context,
|
|
993
|
+
total_duration_ms: Date.now() - start,
|
|
994
|
+
passed_count: passed,
|
|
995
|
+
failed_count: failed,
|
|
996
|
+
skipped_count: skipped,
|
|
997
|
+
tested_at: new Date().toISOString(),
|
|
998
|
+
...(schemasDedup.length > 0 ? { schemas_used: schemasDedup } : {}),
|
|
999
|
+
...(assertionsAgg.length > 0 ? { assertions: assertionsAgg } : {}),
|
|
1000
|
+
};
|
|
1001
|
+
}
|
|
1002
|
+
/**
|
|
1003
|
+
* Collect a deduplicated list of schemas applied during this run. Drawn
|
|
1004
|
+
* from every validation result with a schema_id; dropping empties keeps
|
|
1005
|
+
* the list proportional to what actually ran.
|
|
1006
|
+
*/
|
|
1007
|
+
function collectSchemasUsed(phases) {
|
|
1008
|
+
const seen = new Set();
|
|
1009
|
+
const out = [];
|
|
1010
|
+
for (const phase of phases) {
|
|
1011
|
+
for (const step of phase.steps) {
|
|
1012
|
+
for (const v of step.validations) {
|
|
1013
|
+
if (v.schema_id && v.schema_url && !seen.has(v.schema_id)) {
|
|
1014
|
+
seen.add(v.schema_id);
|
|
1015
|
+
out.push({ schema_id: v.schema_id, schema_url: v.schema_url });
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
return out;
|
|
1021
|
+
}
|
|
1022
|
+
/**
|
|
1023
|
+
* Walk every response_schema validation and aggregate the strict/lenient
|
|
1024
|
+
* delta. Always returns a summary; `observable: false` signals "run had
|
|
1025
|
+
* no strict-eligible checks" (distinct from strict-clean with zero
|
|
1026
|
+
* findings). See issue #820 follow-up.
|
|
1027
|
+
*
|
|
1028
|
+
* `checked` counts validations with a `strict` verdict attached.
|
|
1029
|
+
* `passed` / `failed` partition `checked` by `strict.valid`.
|
|
1030
|
+
* `strict_only_failures` = #(lenient-pass ∧ strict-fail) — the agent's
|
|
1031
|
+
* production-readiness gap.
|
|
1032
|
+
* `lenient_also_failed` = #(lenient-fail ∧ strict-fail) — step already
|
|
1033
|
+
* broken, strict-rejection isn't new signal.
|
|
1034
|
+
*
|
|
1035
|
+
* Exported so callers post-processing a `StoryboardResult` (dashboards,
|
|
1036
|
+
* CI formatters) can compute the same summary over a subset of phases
|
|
1037
|
+
* without re-running validation.
|
|
1038
|
+
*/
|
|
1039
|
+
/**
|
|
1040
|
+
* Flatten every `strict_only_failure` (lenient-pass ∧ strict-fail) into a
|
|
1041
|
+
* dashboard-friendly row list. Each row carries the step/phase context
|
|
1042
|
+
* needed for triage without re-walking the nested result tree:
|
|
1043
|
+
*
|
|
1044
|
+
* { phase_id, step_id, task, variant, issues }
|
|
1045
|
+
*
|
|
1046
|
+
* Exported because the ValidationResult tree is four levels deep
|
|
1047
|
+
* (`phases[].steps[].validations[].strict.issues[]`) and a consumer
|
|
1048
|
+
* seeing `strict_only_failures: 7` in the summary needs a direct path
|
|
1049
|
+
* to the seven offending responses. This is that path.
|
|
1050
|
+
*
|
|
1051
|
+
* Returns `[]` on runs with no strict-only failures OR no AJV coverage
|
|
1052
|
+
* (both cases produce zero rows). Inspect `strict_validation_summary`
|
|
1053
|
+
* for the total counts.
|
|
1054
|
+
*/
|
|
1055
|
+
function listStrictOnlyFailures(phases) {
|
|
1056
|
+
const rows = [];
|
|
1057
|
+
for (const phase of phases) {
|
|
1058
|
+
for (const step of phase.steps) {
|
|
1059
|
+
for (const v of step.validations) {
|
|
1060
|
+
if (v.check !== 'response_schema')
|
|
1061
|
+
continue;
|
|
1062
|
+
if (v.strict === undefined)
|
|
1063
|
+
continue;
|
|
1064
|
+
if (v.strict.valid)
|
|
1065
|
+
continue;
|
|
1066
|
+
if (!v.passed)
|
|
1067
|
+
continue; // already counted by lenient path
|
|
1068
|
+
rows.push({
|
|
1069
|
+
phase_id: phase.phase_id,
|
|
1070
|
+
step_id: step.step_id,
|
|
1071
|
+
task: step.task,
|
|
1072
|
+
variant: v.strict.variant,
|
|
1073
|
+
issues: v.strict.issues ?? [],
|
|
1074
|
+
});
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
return rows;
|
|
1079
|
+
}
|
|
1080
|
+
function summarizeStrictValidation(phases) {
|
|
1081
|
+
let checked = 0;
|
|
1082
|
+
let passed = 0;
|
|
1083
|
+
let strictOnlyFailures = 0;
|
|
1084
|
+
for (const phase of phases) {
|
|
1085
|
+
for (const step of phase.steps) {
|
|
1086
|
+
for (const v of step.validations) {
|
|
1087
|
+
if (v.check !== 'response_schema' || v.strict === undefined)
|
|
1088
|
+
continue;
|
|
1089
|
+
checked++;
|
|
1090
|
+
if (v.strict.valid) {
|
|
1091
|
+
passed++;
|
|
1092
|
+
}
|
|
1093
|
+
else if (v.passed) {
|
|
1094
|
+
// Lenient Zod accepted this response; strict AJV rejected it.
|
|
1095
|
+
// That's the agent's strictness gap — the signal #820 wants.
|
|
1096
|
+
strictOnlyFailures++;
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
const failed = checked - passed;
|
|
1102
|
+
return {
|
|
1103
|
+
observable: checked > 0,
|
|
1104
|
+
checked,
|
|
1105
|
+
passed,
|
|
1106
|
+
failed,
|
|
1107
|
+
strict_only_failures: strictOnlyFailures,
|
|
1108
|
+
lenient_also_failed: failed - strictOnlyFailures,
|
|
1109
|
+
};
|
|
1110
|
+
}
|
|
1111
|
+
// ────────────────────────────────────────────────────────────
|
|
1112
|
+
// runStoryboardStep: execute a single step (stateless)
|
|
1113
|
+
// ────────────────────────────────────────────────────────────
|
|
1114
|
+
/**
|
|
1115
|
+
* Run a single storyboard step.
|
|
1116
|
+
*
|
|
1117
|
+
* This is the core primitive for stateless, LLM-friendly execution.
|
|
1118
|
+
* Context is passed in and returned, enabling step-by-step orchestration.
|
|
1119
|
+
*/
|
|
1120
|
+
async function runStoryboardStep(agentUrl, storyboard, stepId, options = {}) {
|
|
1121
|
+
(0, test_kit_1.validateTestKit)(options.test_kit);
|
|
1122
|
+
const client = (0, client_1.getOrCreateClient)(agentUrl, options);
|
|
1123
|
+
// Discover agent profile for standalone step execution. Captured so the
|
|
1124
|
+
// executeStep call below can thread `library_version` through to
|
|
1125
|
+
// shape-drift hint detection (issue #850).
|
|
1126
|
+
let profile;
|
|
1127
|
+
if (!options._client) {
|
|
1128
|
+
const discovered = await (0, client_1.getOrDiscoverProfile)(client, options);
|
|
1129
|
+
profile = discovered.profile;
|
|
1130
|
+
}
|
|
1131
|
+
else {
|
|
1132
|
+
profile = options._profile;
|
|
1133
|
+
}
|
|
1134
|
+
const context = { ...options.context };
|
|
1135
|
+
if (options.context)
|
|
1136
|
+
(0, context_1.forwardAliasCache)(options.context, context);
|
|
1137
|
+
const webhookReceiver = options.webhook_receiver
|
|
1138
|
+
? await (0, webhook_receiver_1.createWebhookReceiver)({
|
|
1139
|
+
...(options.webhook_receiver.mode && { mode: options.webhook_receiver.mode }),
|
|
1140
|
+
...(options.webhook_receiver.host !== undefined && { host: options.webhook_receiver.host }),
|
|
1141
|
+
...(options.webhook_receiver.port !== undefined && { port: options.webhook_receiver.port }),
|
|
1142
|
+
...(options.webhook_receiver.public_url !== undefined && { public_url: options.webhook_receiver.public_url }),
|
|
1143
|
+
})
|
|
1144
|
+
: undefined;
|
|
1145
|
+
const runnerVars = (0, context_1.createRunnerVariables)({
|
|
1146
|
+
...(webhookReceiver && { webhookBase: webhookReceiver.base_url }),
|
|
1147
|
+
});
|
|
1148
|
+
if (webhookReceiver)
|
|
1149
|
+
(0, webhook_assertions_1.armWebhookAssertions)(storyboard, runnerVars, webhookReceiver);
|
|
1150
|
+
// Find the step
|
|
1151
|
+
const allSteps = flattenSteps(storyboard);
|
|
1152
|
+
const found = allSteps.find(s => s.step.id === stepId);
|
|
1153
|
+
if (!found) {
|
|
1154
|
+
if (webhookReceiver)
|
|
1155
|
+
await webhookReceiver.close();
|
|
1156
|
+
throw new Error(`Step "${stepId}" not found in storyboard "${storyboard.id}". ` +
|
|
1157
|
+
`Available steps: ${allSteps.map(s => s.step.id).join(', ')}`);
|
|
1158
|
+
}
|
|
1159
|
+
// Seed provenance from the caller-supplied map (threaded through from a
|
|
1160
|
+
// previous step's result). Storyboard-level runs build this internally;
|
|
1161
|
+
// here the caller owns accumulation across stateless invocations.
|
|
1162
|
+
const contextProvenance = new Map(Object.entries(options.context_provenance ?? {}));
|
|
1163
|
+
const result = await executeStep(client, found.step, found.phaseId, context, allSteps, options, {
|
|
1164
|
+
contributions: new Set(),
|
|
1165
|
+
priorStepResults: new Map(),
|
|
1166
|
+
priorProbes: new Map(),
|
|
1167
|
+
agentUrl,
|
|
1168
|
+
webhookReceiver,
|
|
1169
|
+
runnerVars,
|
|
1170
|
+
contextProvenance,
|
|
1171
|
+
priorA2aEnvelopes: new Map(),
|
|
1172
|
+
agentLibraryVersion: profile?.library_version,
|
|
1173
|
+
});
|
|
1174
|
+
if (!options._client) {
|
|
1175
|
+
await (0, protocols_1.closeConnections)(options.protocol);
|
|
1176
|
+
}
|
|
1177
|
+
if (webhookReceiver)
|
|
1178
|
+
await webhookReceiver.close();
|
|
1179
|
+
return result;
|
|
1180
|
+
}
|
|
1181
|
+
async function executeStep(
|
|
1182
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- client type varies (TestClient)
|
|
1183
|
+
client, step, phaseId, context, allSteps, options, state) {
|
|
1184
|
+
// Default empty state when this function is called standalone (runStoryboardStep).
|
|
1185
|
+
const runState = state ?? {
|
|
1186
|
+
contributions: new Set(),
|
|
1187
|
+
priorStepResults: new Map(),
|
|
1188
|
+
priorProbes: new Map(),
|
|
1189
|
+
agentUrl: '',
|
|
1190
|
+
contextProvenance: new Map(),
|
|
1191
|
+
};
|
|
1192
|
+
// HTTP probe tasks bypass the MCP client entirely.
|
|
1193
|
+
if (probes_1.PROBE_TASKS.has(step.task)) {
|
|
1194
|
+
return executeProbeStep(step, phaseId, context, allSteps, options, runState);
|
|
1195
|
+
}
|
|
1196
|
+
// Webhook-assertion pseudo-tasks observe the shared receiver instead of
|
|
1197
|
+
// driving the agent. They never reach the MCP/A2A transport.
|
|
1198
|
+
if (webhook_assertions_1.WEBHOOK_ASSERTION_TASKS.has(step.task)) {
|
|
1199
|
+
return (0, webhook_assertions_1.executeWebhookAssertionStep)(step, phaseId, context, allSteps, options, runState);
|
|
1200
|
+
}
|
|
1201
|
+
// Resolve $test_kit.* task references before any downstream dispatch / skip checks.
|
|
1202
|
+
// When the reference resolves to nothing, fall back to `task_default`.
|
|
1203
|
+
const resolvedTask = resolveTaskName(step, options);
|
|
1204
|
+
if (!resolvedTask) {
|
|
1205
|
+
return {
|
|
1206
|
+
step_id: step.id,
|
|
1207
|
+
phase_id: phaseId,
|
|
1208
|
+
title: step.title,
|
|
1209
|
+
task: step.task,
|
|
1210
|
+
passed: false,
|
|
1211
|
+
duration_ms: 0,
|
|
1212
|
+
validations: [],
|
|
1213
|
+
context,
|
|
1214
|
+
error: `Step task "${step.task}" references a test-kit field that resolved to nothing and no task_default is set.`,
|
|
1215
|
+
extraction: { path: 'none' },
|
|
1216
|
+
};
|
|
1217
|
+
}
|
|
1218
|
+
const effectiveStep = resolvedTask === step.task ? step : { ...step, task: resolvedTask };
|
|
1219
|
+
// Check requires_tool — skip if agent doesn't have it
|
|
1220
|
+
if (step.requires_tool && options.agentTools && !options.agentTools.includes(step.requires_tool)) {
|
|
1221
|
+
const next = getNextStepPreview(step.id, allSteps, context, runState.runnerVars);
|
|
1222
|
+
const reason = step.requires_tool === 'comply_test_controller' ? 'missing_test_controller' : 'missing_tool';
|
|
1223
|
+
const detail = reason === 'missing_test_controller'
|
|
1224
|
+
? `Deterministic-testing phase requires comply_test_controller; agent tools: [${(options.agentTools ?? []).join(', ')}].`
|
|
1225
|
+
: `Required tool "${step.requires_tool}" not advertised; agent tools: [${(options.agentTools ?? []).join(', ')}].`;
|
|
1226
|
+
return {
|
|
1227
|
+
step_id: step.id,
|
|
1228
|
+
phase_id: phaseId,
|
|
1229
|
+
title: step.title,
|
|
1230
|
+
task: step.task,
|
|
1231
|
+
passed: true,
|
|
1232
|
+
skipped: true,
|
|
1233
|
+
skip_reason: reason,
|
|
1234
|
+
skip: buildSkip(reason, detail),
|
|
1235
|
+
duration_ms: 0,
|
|
1236
|
+
validations: [],
|
|
1237
|
+
context,
|
|
1238
|
+
next,
|
|
1239
|
+
extraction: { path: 'none' },
|
|
1240
|
+
};
|
|
1241
|
+
}
|
|
1242
|
+
// Skip if agent doesn't implement the tool this step calls.
|
|
1243
|
+
if (options.agentTools && !options.agentTools.includes(effectiveStep.task)) {
|
|
1244
|
+
const next = getNextStepPreview(step.id, allSteps, context, runState.runnerVars);
|
|
1245
|
+
const detail = `Agent did not advertise tool "${effectiveStep.task}"; agent tools: [${(options.agentTools ?? []).join(', ')}].`;
|
|
1246
|
+
return {
|
|
1247
|
+
step_id: step.id,
|
|
1248
|
+
phase_id: phaseId,
|
|
1249
|
+
title: step.title,
|
|
1250
|
+
task: effectiveStep.task,
|
|
1251
|
+
passed: true,
|
|
1252
|
+
skipped: true,
|
|
1253
|
+
skip_reason: 'missing_tool',
|
|
1254
|
+
skip: buildSkip('missing_tool', detail),
|
|
1255
|
+
duration_ms: 0,
|
|
1256
|
+
validations: [],
|
|
1257
|
+
context,
|
|
1258
|
+
next,
|
|
1259
|
+
extraction: { path: 'none' },
|
|
1260
|
+
};
|
|
1261
|
+
}
|
|
1262
|
+
// Build request — priority (issue #820, fixture-authoritative):
|
|
1263
|
+
// 1. User-provided --request override
|
|
1264
|
+
// 2. For expect_error steps: sample_request directly (preserves intentionally invalid input)
|
|
1265
|
+
// 3. enrichRequest — fixture is the base, enricher fills gaps (fixture wins conflicts)
|
|
1266
|
+
// 4. sample_request with context injection when no enricher is registered
|
|
1267
|
+
// 5. Empty object (only reachable for non-mutating tasks with neither fixture nor enricher)
|
|
1268
|
+
let request;
|
|
1269
|
+
if (options.request) {
|
|
1270
|
+
request = { ...options.request };
|
|
1271
|
+
}
|
|
1272
|
+
else if (step.expect_error && step.sample_request) {
|
|
1273
|
+
request = (0, context_1.injectContext)({ ...step.sample_request }, context, runState.runnerVars);
|
|
1274
|
+
}
|
|
1275
|
+
else if ((0, request_builder_1.hasRequestEnricher)(effectiveStep.task)) {
|
|
1276
|
+
request = (0, request_builder_1.enrichRequest)(effectiveStep, context, options, runState.runnerVars);
|
|
1277
|
+
}
|
|
1278
|
+
else if (step.sample_request) {
|
|
1279
|
+
request = (0, context_1.injectContext)({ ...step.sample_request }, context, runState.runnerVars);
|
|
1280
|
+
}
|
|
1281
|
+
else {
|
|
1282
|
+
request = {};
|
|
1283
|
+
}
|
|
1284
|
+
// Apply explicit context_inputs on top of whatever request source was used
|
|
1285
|
+
if (step.context_inputs?.length) {
|
|
1286
|
+
request = (0, context_1.applyContextInputs)(request, step.context_inputs, context);
|
|
1287
|
+
}
|
|
1288
|
+
// Brand/account is a storyboard-run-scoped invariant: every step in a run
|
|
1289
|
+
// targets the same brand, so every outgoing request's brand context must
|
|
1290
|
+
// match the options. Enforcing this here (after builder + sample_request)
|
|
1291
|
+
// prevents session-key divergence across create/get/update/delete steps
|
|
1292
|
+
// when individual builders or sample_request YAML omit brand.
|
|
1293
|
+
request = applyBrandInvariant(request, options, effectiveStep.task);
|
|
1294
|
+
// Mutating AdCP requests require idempotency_key per spec. Storyboard
|
|
1295
|
+
// yamls generally omit it so authors don't have to remember it on every
|
|
1296
|
+
// mutating step — mint one here on the runner's behalf, matching how a
|
|
1297
|
+
// real buyer would operate. Suppressed when the step expects a missing-key
|
|
1298
|
+
// error (see `testsMissingIdempotencyKey` below) so that compliance
|
|
1299
|
+
// surfaces can still exercise the server's required-field check.
|
|
1300
|
+
request = applyIdempotencyInvariant(request, effectiveStep.task, step);
|
|
1301
|
+
// Detect unresolved $context placeholders — a prior step likely failed
|
|
1302
|
+
// and didn't produce the expected output. Skip rather than sending garbage.
|
|
1303
|
+
const unresolvedVars = findUnresolvedContextVars(request);
|
|
1304
|
+
if (unresolvedVars.length > 0 && !step.expect_error) {
|
|
1305
|
+
const next = getNextStepPreview(step.id, allSteps, context, runState.runnerVars);
|
|
1306
|
+
const detail = `Skipped: unresolved context variables from prior steps: ${unresolvedVars.join(', ')}.`;
|
|
1307
|
+
return {
|
|
1308
|
+
step_id: step.id,
|
|
1309
|
+
phase_id: phaseId,
|
|
1310
|
+
title: step.title,
|
|
1311
|
+
task: step.task,
|
|
1312
|
+
passed: false,
|
|
1313
|
+
skipped: true,
|
|
1314
|
+
skip_reason: 'prerequisite_failed',
|
|
1315
|
+
skip: buildSkip('prerequisite_failed', detail),
|
|
1316
|
+
duration_ms: 0,
|
|
1317
|
+
validations: [],
|
|
1318
|
+
context,
|
|
1319
|
+
error: detail,
|
|
1320
|
+
next,
|
|
1321
|
+
extraction: { path: 'none' },
|
|
1322
|
+
};
|
|
1323
|
+
}
|
|
1324
|
+
// Execute the task. When the step overrides auth, dispatch via the raw MCP
|
|
1325
|
+
// probe so we can (a) strip credentials or send arbitrary Bearer values
|
|
1326
|
+
// (which the SDK transport doesn't expose), and (b) capture the HTTP status
|
|
1327
|
+
// + `WWW-Authenticate` header for http_* validations.
|
|
1328
|
+
//
|
|
1329
|
+
// Tests for envelope validation on mutating tasks (e.g., "missing
|
|
1330
|
+
// idempotency_key returns INVALID_REQUEST") set `step.omit_idempotency_key`
|
|
1331
|
+
// to suppress both the runner's `applyIdempotencyInvariant` (above) and the
|
|
1332
|
+
// AdCP client's auto-inject — otherwise the SDK helpfully generates a UUID
|
|
1333
|
+
// and the server never sees a missing-key request. Paired flags so the two
|
|
1334
|
+
// layers agree; see `applyIdempotencyInvariant` for the runner-level skip.
|
|
1335
|
+
const testsMissingIdempotencyKey = step.omit_idempotency_key === true && (0, idempotency_1.isMutatingTask)(effectiveStep.task);
|
|
1336
|
+
// Defense-in-depth for the missing-key vector: when a mutating step sets
|
|
1337
|
+
// `omit_idempotency_key: true` and `step.auth` is unset, route via
|
|
1338
|
+
// `rawMcpProbe` anyway so no SDK-layer normalization can slip a key onto the
|
|
1339
|
+
// wire. The SDK's `skipIdempotencyAutoInject` plumbing already honors this
|
|
1340
|
+
// flag, but the raw-HTTP path removes the escape hatch entirely. A2A and
|
|
1341
|
+
// oauth stay on the SDK path — their dispatch can't be replicated here
|
|
1342
|
+
// (A2A uses a different envelope; oauth needs refresh semantics).
|
|
1343
|
+
const rawProbeHeaders = step.auth !== undefined
|
|
1344
|
+
? authHeadersForStep(step.auth, options)
|
|
1345
|
+
: testsMissingIdempotencyKey && options.protocol !== 'a2a'
|
|
1346
|
+
? defaultAuthHeadersForRawProbe(options)
|
|
1347
|
+
: undefined;
|
|
1348
|
+
const useRawProbe = rawProbeHeaders !== undefined;
|
|
1349
|
+
let taskResult;
|
|
1350
|
+
let stepResult;
|
|
1351
|
+
let httpResult;
|
|
1352
|
+
let responseRecord;
|
|
1353
|
+
let a2aEnvelope;
|
|
1354
|
+
if (useRawProbe) {
|
|
1355
|
+
const started = Date.now();
|
|
1356
|
+
try {
|
|
1357
|
+
const probe = await (0, probes_1.rawMcpProbe)({
|
|
1358
|
+
agentUrl: runState.agentUrl,
|
|
1359
|
+
toolName: effectiveStep.task,
|
|
1360
|
+
args: request,
|
|
1361
|
+
headers: rawProbeHeaders,
|
|
1362
|
+
allowPrivateIp: options.allow_http === true,
|
|
1363
|
+
});
|
|
1364
|
+
httpResult = probe.httpResult;
|
|
1365
|
+
taskResult = probe.taskResult;
|
|
1366
|
+
const durationMs = Date.now() - started;
|
|
1367
|
+
stepResult = {
|
|
1368
|
+
duration_ms: durationMs,
|
|
1369
|
+
passed: !httpResult.error,
|
|
1370
|
+
error: httpResult.error,
|
|
1371
|
+
};
|
|
1372
|
+
const filteredHeaders = filterResponseHeaders(httpResult.headers);
|
|
1373
|
+
responseRecord = {
|
|
1374
|
+
transport: 'mcp',
|
|
1375
|
+
payload: redactSecrets(httpResult.body),
|
|
1376
|
+
...(typeof httpResult.status === 'number' ? { status: httpResult.status } : {}),
|
|
1377
|
+
...(filteredHeaders && { headers: filteredHeaders }),
|
|
1378
|
+
duration_ms: durationMs,
|
|
1379
|
+
};
|
|
1380
|
+
}
|
|
1381
|
+
catch (err) {
|
|
1382
|
+
stepResult = {
|
|
1383
|
+
duration_ms: Date.now() - started,
|
|
1384
|
+
passed: false,
|
|
1385
|
+
error: err instanceof Error ? err.message : String(err),
|
|
1386
|
+
};
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
else {
|
|
1390
|
+
// For A2A runs, wrap the SDK dispatch in `withRawResponseCapture`
|
|
1391
|
+
// so storyboard validations can assert on the JSON-RPC `Task`
|
|
1392
|
+
// envelope the seller emitted (e.g. `a2a_submitted_artifact`
|
|
1393
|
+
// checks `Task.state` + `artifact.metadata.adcp_task_id` placement).
|
|
1394
|
+
// MCP path stays unwrapped — the SDK envelope is reconstructed from
|
|
1395
|
+
// `taskResult` already and capture would only add overhead.
|
|
1396
|
+
//
|
|
1397
|
+
// Selection note: gate on `options.protocol === 'a2a'` because
|
|
1398
|
+
// that's the only signal available at this point — discovery
|
|
1399
|
+
// hasn't run yet in `runStoryboardStep` (the runner branches off
|
|
1400
|
+
// `agentTools` later). If a future "auto-detect protocol" flow
|
|
1401
|
+
// lands, key the capture off the negotiated transport instead.
|
|
1402
|
+
const captureA2a = options.protocol === 'a2a';
|
|
1403
|
+
let a2aCaptures;
|
|
1404
|
+
const dispatch = () => (0, task_map_1.executeStoryboardTask)(client, effectiveStep.task, request, {
|
|
1405
|
+
skipIdempotencyAutoInject: testsMissingIdempotencyKey,
|
|
1406
|
+
});
|
|
1407
|
+
const run = await (0, client_1.runStep)(step.title, effectiveStep.task, async () => {
|
|
1408
|
+
if (!captureA2a)
|
|
1409
|
+
return dispatch();
|
|
1410
|
+
try {
|
|
1411
|
+
const { result: dispatchResult, captures } = await (0, rawResponseCapture_1.withRawResponseCapture)(dispatch);
|
|
1412
|
+
a2aCaptures = captures;
|
|
1413
|
+
return dispatchResult;
|
|
1414
|
+
}
|
|
1415
|
+
catch (err) {
|
|
1416
|
+
// `withRawResponseCapture` attaches partial captures to the
|
|
1417
|
+
// thrown error so we still get the wire-shape envelope when
|
|
1418
|
+
// the SDK threw mid-parse (e.g. agent emitted malformed JSON).
|
|
1419
|
+
// Bare-throw cases (network errors, no captures attached)
|
|
1420
|
+
// leave `a2aCaptures` undefined and the validator self-skips.
|
|
1421
|
+
const partial = (0, rawResponseCapture_1.getCapturesFromError)(err);
|
|
1422
|
+
if (partial)
|
|
1423
|
+
a2aCaptures = partial;
|
|
1424
|
+
throw err;
|
|
1425
|
+
}
|
|
1426
|
+
});
|
|
1427
|
+
taskResult = run.result;
|
|
1428
|
+
stepResult = run.step;
|
|
1429
|
+
if (captureA2a && a2aCaptures) {
|
|
1430
|
+
a2aEnvelope = parseLastA2aMessageSendCapture(a2aCaptures);
|
|
1431
|
+
}
|
|
1432
|
+
if (taskResult) {
|
|
1433
|
+
responseRecord = {
|
|
1434
|
+
transport: options.protocol === 'a2a' ? 'a2a' : 'mcp',
|
|
1435
|
+
payload: redactSecrets(taskResult.data ?? taskResult.error ?? null),
|
|
1436
|
+
duration_ms: stepResult.duration_ms,
|
|
1437
|
+
};
|
|
1438
|
+
}
|
|
1439
|
+
}
|
|
1440
|
+
const requestRecord = {
|
|
1441
|
+
transport: useRawProbe ? 'mcp' : options.protocol === 'a2a' ? 'a2a' : 'mcp',
|
|
1442
|
+
operation: effectiveStep.task,
|
|
1443
|
+
payload: redactSecrets(request),
|
|
1444
|
+
...(runState.agentUrl ? { url: runState.agentUrl } : {}),
|
|
1445
|
+
};
|
|
1446
|
+
// Feature-unsupported or unknown-tool errors → treat as skip
|
|
1447
|
+
const isUnsupported = stepResult.error?.includes('does not support:');
|
|
1448
|
+
const isUnknownTool = stepResult.error && /Unknown tool[:\s]/i.test(stepResult.error);
|
|
1449
|
+
if (!taskResult && (isUnsupported || isUnknownTool)) {
|
|
1450
|
+
const next = getNextStepPreview(step.id, allSteps, context, runState.runnerVars);
|
|
1451
|
+
const reason = isUnknownTool ? 'missing_tool' : 'not_applicable';
|
|
1452
|
+
const detail = isUnknownTool
|
|
1453
|
+
? `Agent rejected tool "${effectiveStep.task}" as unknown: ${stepResult.error}`
|
|
1454
|
+
: `Agent reported feature not supported: ${stepResult.error}`;
|
|
1455
|
+
return {
|
|
1456
|
+
step_id: step.id,
|
|
1457
|
+
phase_id: phaseId,
|
|
1458
|
+
title: step.title,
|
|
1459
|
+
task: step.task,
|
|
1460
|
+
passed: true,
|
|
1461
|
+
skipped: true,
|
|
1462
|
+
skip_reason: reason,
|
|
1463
|
+
skip: buildSkip(reason, detail),
|
|
1464
|
+
duration_ms: stepResult.duration_ms,
|
|
1465
|
+
validations: [],
|
|
1466
|
+
context,
|
|
1467
|
+
error: stepResult.error,
|
|
1468
|
+
next,
|
|
1469
|
+
extraction: { path: 'none' },
|
|
1470
|
+
};
|
|
1471
|
+
}
|
|
1472
|
+
// For expect_error steps where TaskResult has no data but has an error string,
|
|
1473
|
+
// wrap the error string so validations have something to check against.
|
|
1474
|
+
if (step.expect_error && !taskResult?.data && taskResult?.error) {
|
|
1475
|
+
taskResult = { ...taskResult, data: { error: taskResult.error } };
|
|
1476
|
+
}
|
|
1477
|
+
// Determine pass/fail — inverted when expect_error is set
|
|
1478
|
+
let passed;
|
|
1479
|
+
if (step.expect_error) {
|
|
1480
|
+
// Step passes when the task fails (returns an error)
|
|
1481
|
+
passed = !taskResult?.success || !!stepResult.error;
|
|
1482
|
+
}
|
|
1483
|
+
else {
|
|
1484
|
+
passed = stepResult.passed && (taskResult?.success ?? false);
|
|
1485
|
+
}
|
|
1486
|
+
// Run validations. Resolve `$context.<key>` placeholders in `value` and
|
|
1487
|
+
// `allowed_values` fields so expected values can reference prior steps
|
|
1488
|
+
// (e.g., replay tests assert `media_buy_id === $context.initial_media_buy_id`).
|
|
1489
|
+
let validations = [];
|
|
1490
|
+
if (step.validations?.length && (taskResult || httpResult)) {
|
|
1491
|
+
const resolvedValidations = step.validations.map(v => {
|
|
1492
|
+
const resolved = { ...v };
|
|
1493
|
+
if (resolved.value !== undefined) {
|
|
1494
|
+
resolved.value = (0, context_1.injectContext)({ __v: resolved.value }, context, runState.runnerVars).__v;
|
|
1495
|
+
}
|
|
1496
|
+
if (Array.isArray(resolved.allowed_values)) {
|
|
1497
|
+
resolved.allowed_values = resolved.allowed_values.map(av => (0, context_1.injectContext)({ __v: av }, context, runState.runnerVars).__v);
|
|
1498
|
+
}
|
|
1499
|
+
return resolved;
|
|
1500
|
+
});
|
|
1501
|
+
const vctx = {
|
|
1502
|
+
taskName: effectiveStep.task,
|
|
1503
|
+
...(taskResult && { taskResult }),
|
|
1504
|
+
...(httpResult && { httpResult }),
|
|
1505
|
+
agentUrl: runState.agentUrl,
|
|
1506
|
+
contributions: runState.contributions,
|
|
1507
|
+
...(effectiveStep.response_schema_ref && { responseSchemaRef: effectiveStep.response_schema_ref }),
|
|
1508
|
+
request: requestRecord,
|
|
1509
|
+
...(responseRecord && { response: responseRecord }),
|
|
1510
|
+
storyboardContext: context,
|
|
1511
|
+
...(a2aEnvelope && { a2aEnvelope }),
|
|
1512
|
+
...(() => {
|
|
1513
|
+
// Walk back through the run's captured A2A envelopes and use
|
|
1514
|
+
// the most recent prior step's envelope as the comparison
|
|
1515
|
+
// baseline. The map preserves insertion order, so the last
|
|
1516
|
+
// entry is the most recent prior step's capture.
|
|
1517
|
+
const map = runState.priorA2aEnvelopes;
|
|
1518
|
+
if (!map || map.size === 0)
|
|
1519
|
+
return {};
|
|
1520
|
+
let priorStepId;
|
|
1521
|
+
let priorEnv;
|
|
1522
|
+
for (const [stepId, env] of map) {
|
|
1523
|
+
priorStepId = stepId;
|
|
1524
|
+
priorEnv = env;
|
|
1525
|
+
}
|
|
1526
|
+
return {
|
|
1527
|
+
...(priorEnv && { priorA2aEnvelope: priorEnv }),
|
|
1528
|
+
...(priorStepId && { priorA2aStepId: priorStepId }),
|
|
1529
|
+
};
|
|
1530
|
+
})(),
|
|
1531
|
+
};
|
|
1532
|
+
validations = (0, validations_1.runValidations)(resolvedValidations, vctx);
|
|
1533
|
+
}
|
|
1534
|
+
const allValidationsPassed = validations.every(v => v.passed);
|
|
1535
|
+
// Persist the captured A2A envelope keyed by step id so cross-step
|
|
1536
|
+
// validators (`a2a_context_continuity`) on subsequent steps can
|
|
1537
|
+
// compare against it. Only fires when this step actually captured
|
|
1538
|
+
// an envelope — probe steps, MCP steps, and capture-bypass paths
|
|
1539
|
+
// don't insert, so cross-step comparisons walk back to the most
|
|
1540
|
+
// recent A2A step automatically via insertion-order iteration.
|
|
1541
|
+
if (a2aEnvelope && runState.priorA2aEnvelopes) {
|
|
1542
|
+
runState.priorA2aEnvelopes.set(step.id, a2aEnvelope);
|
|
1543
|
+
}
|
|
1544
|
+
// Extract context from responses. Forward the alias cache so
|
|
1545
|
+
// `$generate:uuid_v4#<alias>` placeholders in subsequent steps resolve
|
|
1546
|
+
// to the same UUID as prior steps with the same alias.
|
|
1547
|
+
const updatedContext = { ...context };
|
|
1548
|
+
(0, context_1.forwardAliasCache)(context, updatedContext);
|
|
1549
|
+
const hasData = taskResult?.data !== undefined && taskResult?.data !== null;
|
|
1550
|
+
// Convention-based extraction (for non-error steps, or when expect_error succeeded)
|
|
1551
|
+
if (passed && hasData && taskResult) {
|
|
1552
|
+
const extracted = (0, context_1.extractContextWithProvenance)(effectiveStep.task, taskResult.data, step.id);
|
|
1553
|
+
Object.assign(updatedContext, extracted.values);
|
|
1554
|
+
if (runState.contextProvenance) {
|
|
1555
|
+
for (const [key, entry] of Object.entries(extracted.provenance)) {
|
|
1556
|
+
runState.contextProvenance.set(key, entry);
|
|
1557
|
+
}
|
|
1558
|
+
}
|
|
1559
|
+
}
|
|
1560
|
+
// Explicit context_outputs. `generate:` entries fire unconditionally —
|
|
1561
|
+
// including on failed steps — because the generated ID was already
|
|
1562
|
+
// determined (and may already be inline-substituted via $generate:…#<key>)
|
|
1563
|
+
// before the request went out. Propagating it even on failure lets the
|
|
1564
|
+
// next step use the same ID for a forced-completion or tasks/get follow-up.
|
|
1565
|
+
// `path:` entries are gated on a non-null response and skip silently when
|
|
1566
|
+
// data is absent. Both paths write into updatedContext and receive
|
|
1567
|
+
// updatedContext for alias-cache coherence — forwardAliasCache above
|
|
1568
|
+
// ensures the minted value from any same-step $generate:…#<key> inline
|
|
1569
|
+
// substitution is visible here.
|
|
1570
|
+
if (step.context_outputs?.length) {
|
|
1571
|
+
const explicit = (0, context_1.applyContextOutputsWithProvenance)(hasData && taskResult ? taskResult.data : undefined, step.context_outputs, step.id, effectiveStep.task, updatedContext);
|
|
1572
|
+
Object.assign(updatedContext, explicit.values);
|
|
1573
|
+
if (runState.contextProvenance) {
|
|
1574
|
+
for (const [key, entry] of Object.entries(explicit.provenance)) {
|
|
1575
|
+
runState.contextProvenance.set(key, entry);
|
|
1576
|
+
}
|
|
1577
|
+
}
|
|
1578
|
+
}
|
|
1579
|
+
// Emit context-value-rejected hints when the seller's error lists the
|
|
1580
|
+
// values it would have accepted and the rejected request value traces
|
|
1581
|
+
// back to a prior-step $context.* write. Non-fatal: doesn't flip
|
|
1582
|
+
// pass/fail; collapses "SDK bug vs seller bug" triage to one line.
|
|
1583
|
+
//
|
|
1584
|
+
// Gate fires on any step-level failure — task-level failure OR a
|
|
1585
|
+
// validation failure on a 200-OK response. Some sellers return 200 with
|
|
1586
|
+
// an advisory `errors[]` + `available:` list (success envelope with
|
|
1587
|
+
// warnings), and the hint is most useful on exactly that shape. Before
|
|
1588
|
+
// adcp-client#883 the gate was task-level only and missed schema-
|
|
1589
|
+
// rejected-but-200 flows.
|
|
1590
|
+
//
|
|
1591
|
+
// - Normal steps: hints fire whenever the step failed.
|
|
1592
|
+
// - `expect_error` steps: `passed` is inverted (true when the task
|
|
1593
|
+
// failed), so a genuinely-failing `expect_error` step has
|
|
1594
|
+
// `passed && allValidationsPassed === true`, gate stays shut —
|
|
1595
|
+
// expected rejections don't chatter hints by design. When the
|
|
1596
|
+
// validations DO fail (the caller's assertion about the error
|
|
1597
|
+
// shape was wrong), hints fire and can point them at the source
|
|
1598
|
+
// step that supplied the rejected value.
|
|
1599
|
+
//
|
|
1600
|
+
// Hints trace to context that existed BEFORE this step's own writes,
|
|
1601
|
+
// since the rejected value can't have come from this step's own
|
|
1602
|
+
// extraction.
|
|
1603
|
+
const stepFailed = !(passed && allValidationsPassed);
|
|
1604
|
+
const contextRejectionHints = stepFailed && runState.contextProvenance
|
|
1605
|
+
? (0, rejection_hints_1.detectContextRejectionHints)(taskResult, request, context, runState.contextProvenance, effectiveStep.task)
|
|
1606
|
+
: [];
|
|
1607
|
+
// Shape-drift and strict-AJV hints fire on any step that has a parsed
|
|
1608
|
+
// payload, regardless of pass/fail — issue #935 widened the gate so
|
|
1609
|
+
// these structured diagnostics surface alongside the runner's existing
|
|
1610
|
+
// `ValidationResult.warning` prose without depending on Zod rejection.
|
|
1611
|
+
// Pre-process identically to validateResponseSchema: bare-array payloads
|
|
1612
|
+
// pass through; object payloads have the SDK-internal `_message` field
|
|
1613
|
+
// stripped so the detector sees what AJV does.
|
|
1614
|
+
const driftPayload = (() => {
|
|
1615
|
+
if (!hasData || !taskResult)
|
|
1616
|
+
return undefined;
|
|
1617
|
+
const raw = taskResult.data;
|
|
1618
|
+
if (Array.isArray(raw))
|
|
1619
|
+
return raw;
|
|
1620
|
+
if (raw && typeof raw === 'object') {
|
|
1621
|
+
const { _message, ...rest } = raw;
|
|
1622
|
+
return rest;
|
|
1623
|
+
}
|
|
1624
|
+
return raw;
|
|
1625
|
+
})();
|
|
1626
|
+
const shapeDriftHints = driftPayload === undefined
|
|
1627
|
+
? []
|
|
1628
|
+
: (0, shape_drift_hints_1.detectShapeDriftHints)(effectiveStep.task, driftPayload, runState.agentLibraryVersion);
|
|
1629
|
+
const strictHints = (0, strict_validation_hints_1.detectStrictValidationHints)(effectiveStep.task, validations);
|
|
1630
|
+
// Same root cause MAY produce both a `shape_drift` hint and a
|
|
1631
|
+
// `format_mismatch` (keyword: 'type') hint — e.g. `list_creatives`
|
|
1632
|
+
// returning a bare array. That's intentional co-emission, not a bug:
|
|
1633
|
+
// shape_drift carries the fix recipe ("use listCreativesResponse() to
|
|
1634
|
+
// wrap"); format_mismatch carries the structured RFC 6901 pointer +
|
|
1635
|
+
// AJV schema_path so renderers can deep-link into the schema.
|
|
1636
|
+
// Complementary fix lenses on the same fault.
|
|
1637
|
+
const hints = [...contextRejectionHints, ...shapeDriftHints, ...strictHints];
|
|
1638
|
+
// Build next step preview
|
|
1639
|
+
const next = getNextStepPreview(step.id, allSteps, updatedContext, runState.runnerVars);
|
|
1640
|
+
return {
|
|
1641
|
+
step_id: step.id,
|
|
1642
|
+
phase_id: phaseId,
|
|
1643
|
+
title: step.title,
|
|
1644
|
+
task: step.task,
|
|
1645
|
+
passed: passed && allValidationsPassed,
|
|
1646
|
+
expect_error: step.expect_error,
|
|
1647
|
+
duration_ms: stepResult.duration_ms,
|
|
1648
|
+
// Legacy `response` field (new code reads `response_record`).
|
|
1649
|
+
// Redact in case a downstream consumer still keys off it; the
|
|
1650
|
+
// modern `response_record.payload` path is already redacted.
|
|
1651
|
+
response: redactSecrets(taskResult?.data),
|
|
1652
|
+
validations,
|
|
1653
|
+
context: updatedContext,
|
|
1654
|
+
...(runState.contextProvenance &&
|
|
1655
|
+
runState.contextProvenance.size > 0 && {
|
|
1656
|
+
context_provenance: Object.fromEntries(runState.contextProvenance),
|
|
1657
|
+
}),
|
|
1658
|
+
error: step.expect_error ? undefined : truncateError(stepResult.error || taskResult?.error),
|
|
1659
|
+
next,
|
|
1660
|
+
request: requestRecord,
|
|
1661
|
+
...(responseRecord && { response_record: responseRecord }),
|
|
1662
|
+
extraction: extractionFromTaskResult(taskResult),
|
|
1663
|
+
...(hints.length > 0 && { hints }),
|
|
1664
|
+
};
|
|
1665
|
+
}
|
|
1666
|
+
// ────────────────────────────────────────────────────────────
|
|
1667
|
+
// Probe dispatch (raw HTTP tasks)
|
|
1668
|
+
// ────────────────────────────────────────────────────────────
|
|
1669
|
+
async function executeProbeStep(step, phaseId, context, allSteps, options, runState) {
|
|
1670
|
+
const start = Date.now();
|
|
1671
|
+
let httpResult;
|
|
1672
|
+
const probeOpts = { allowPrivateIp: options.allow_http === true };
|
|
1673
|
+
if (step.task === 'protected_resource_metadata') {
|
|
1674
|
+
httpResult = await (0, probes_1.probeProtectedResourceMetadata)(runState.agentUrl, probeOpts);
|
|
1675
|
+
// RFC 9728 presence semantics (adcp-client#677): a 404 means the agent is
|
|
1676
|
+
// honestly not advertising OAuth. Convert to a clean step skip so the
|
|
1677
|
+
// phase loop can cascade-skip the rest of oauth_discovery instead of
|
|
1678
|
+
// failing the http_status:200 validation. Any other status (including
|
|
1679
|
+
// 200) runs validations unchanged — an agent that serves PRM MUST serve
|
|
1680
|
+
// it correctly, regardless of whether the test kit also declared an
|
|
1681
|
+
// API key. Fetch errors (status 0) fall through to the normal failure
|
|
1682
|
+
// path since we can't distinguish "agent down" from "misconfigured".
|
|
1683
|
+
if (!httpResult.error && httpResult.status === 404) {
|
|
1684
|
+
httpResult.skipped = true;
|
|
1685
|
+
httpResult.skip_reason = 'oauth_not_advertised';
|
|
1686
|
+
}
|
|
1687
|
+
}
|
|
1688
|
+
else if (step.task === 'oauth_auth_server_metadata') {
|
|
1689
|
+
const prior = runState.priorProbes.get('protected_resource_metadata') ?? findPriorProbe(runState.priorStepResults);
|
|
1690
|
+
httpResult = await (0, probes_1.probeOauthAuthServerMetadata)(prior, probeOpts);
|
|
1691
|
+
}
|
|
1692
|
+
else if (step.task === 'assert_contribution') {
|
|
1693
|
+
// Synthetic: evaluate only through validations (any_of). No network call.
|
|
1694
|
+
httpResult = undefined;
|
|
1695
|
+
}
|
|
1696
|
+
else if (step.task === 'request_signing_probe') {
|
|
1697
|
+
httpResult = await (0, probe_dispatch_1.probeRequestSigningVector)(step.id, runState.agentUrl, options);
|
|
1698
|
+
}
|
|
1699
|
+
if (httpResult)
|
|
1700
|
+
runState.priorProbes.set(step.task, httpResult);
|
|
1701
|
+
const duration = Date.now() - start;
|
|
1702
|
+
const requestRecord = {
|
|
1703
|
+
transport: 'http',
|
|
1704
|
+
operation: step.task,
|
|
1705
|
+
payload: null,
|
|
1706
|
+
...(httpResult?.url ? { url: httpResult.url } : runState.agentUrl ? { url: runState.agentUrl } : {}),
|
|
1707
|
+
};
|
|
1708
|
+
const filteredProbeHeaders = filterResponseHeaders(httpResult?.headers);
|
|
1709
|
+
const responseRecord = httpResult
|
|
1710
|
+
? {
|
|
1711
|
+
transport: 'http',
|
|
1712
|
+
payload: redactSecrets(httpResult.body),
|
|
1713
|
+
status: httpResult.status,
|
|
1714
|
+
...(filteredProbeHeaders && { headers: filteredProbeHeaders }),
|
|
1715
|
+
duration_ms: duration,
|
|
1716
|
+
}
|
|
1717
|
+
: undefined;
|
|
1718
|
+
// Probe may self-skip (request_signing_probe uses this for operator opt-outs
|
|
1719
|
+
// and capability-profile mismatches). Surface as a skipped step without
|
|
1720
|
+
// running validations — skip ≠ fail. The detailed reason goes on
|
|
1721
|
+
// `skip_reason`; the canonical spec reason goes on `skip` so contract
|
|
1722
|
+
// consumers see a stable enum.
|
|
1723
|
+
if (httpResult?.skipped) {
|
|
1724
|
+
const detailedReason = (httpResult.skip_reason ?? 'probe_skipped');
|
|
1725
|
+
const canonicalReason = types_1.DETAILED_SKIP_TO_CANONICAL[detailedReason] ?? 'not_applicable';
|
|
1726
|
+
const detail = httpResult.error ?? DETAILED_SKIP_DETAILS[detailedReason] ?? SKIP_DETAILS[canonicalReason];
|
|
1727
|
+
return {
|
|
1728
|
+
step_id: step.id,
|
|
1729
|
+
phase_id: phaseId,
|
|
1730
|
+
title: step.title,
|
|
1731
|
+
task: step.task,
|
|
1732
|
+
passed: true,
|
|
1733
|
+
skipped: true,
|
|
1734
|
+
skip_reason: detailedReason,
|
|
1735
|
+
skip: { reason: canonicalReason, detail },
|
|
1736
|
+
duration_ms: duration,
|
|
1737
|
+
response: httpResult,
|
|
1738
|
+
validations: [],
|
|
1739
|
+
context,
|
|
1740
|
+
next: getNextStepPreview(step.id, allSteps, context, runState.runnerVars),
|
|
1741
|
+
request: requestRecord,
|
|
1742
|
+
...(responseRecord && { response_record: responseRecord }),
|
|
1743
|
+
extraction: { path: 'none', note: 'probe self-skipped' },
|
|
1744
|
+
};
|
|
1745
|
+
}
|
|
1746
|
+
const vctx = {
|
|
1747
|
+
taskName: step.task,
|
|
1748
|
+
httpResult,
|
|
1749
|
+
agentUrl: runState.agentUrl,
|
|
1750
|
+
contributions: runState.contributions,
|
|
1751
|
+
request: requestRecord,
|
|
1752
|
+
...(responseRecord && { response: responseRecord }),
|
|
1753
|
+
storyboardContext: context,
|
|
1754
|
+
};
|
|
1755
|
+
const validations = step.validations?.length ? (0, validations_1.runValidations)(step.validations, vctx) : [];
|
|
1756
|
+
const allValidationsPassed = validations.every(v => v.passed);
|
|
1757
|
+
// For probes, the "task passed" proxy is: fetch returned without error AND
|
|
1758
|
+
// all validations passed. For assert_contribution (no httpResult), we lean
|
|
1759
|
+
// on validations alone.
|
|
1760
|
+
const fetchOk = httpResult ? !httpResult.error : true;
|
|
1761
|
+
const passed = fetchOk && allValidationsPassed;
|
|
1762
|
+
const extraction = httpResult
|
|
1763
|
+
? httpResult.error
|
|
1764
|
+
? { path: 'error' }
|
|
1765
|
+
: { path: 'structured_content', note: 'http-probe body parsed as JSON' }
|
|
1766
|
+
: { path: 'none' };
|
|
1767
|
+
return {
|
|
1768
|
+
step_id: step.id,
|
|
1769
|
+
phase_id: phaseId,
|
|
1770
|
+
title: step.title,
|
|
1771
|
+
task: step.task,
|
|
1772
|
+
passed,
|
|
1773
|
+
duration_ms: duration,
|
|
1774
|
+
response: httpResult ?? undefined,
|
|
1775
|
+
validations,
|
|
1776
|
+
context,
|
|
1777
|
+
error: httpResult?.error ?? (passed ? undefined : 'Probe validations failed.'),
|
|
1778
|
+
next: getNextStepPreview(step.id, allSteps, context, runState.runnerVars),
|
|
1779
|
+
request: requestRecord,
|
|
1780
|
+
...(responseRecord && { response_record: responseRecord }),
|
|
1781
|
+
extraction,
|
|
1782
|
+
};
|
|
1783
|
+
}
|
|
1784
|
+
function findPriorProbe(priorStepResults) {
|
|
1785
|
+
// Fallback for runStoryboardStep where priorProbes isn't populated — reach
|
|
1786
|
+
// into the step result's response, which we set to the HttpProbeResult above.
|
|
1787
|
+
for (const r of priorStepResults.values()) {
|
|
1788
|
+
const resp = r.response;
|
|
1789
|
+
if (resp && typeof resp === 'object' && 'url' in resp && 'status' in resp)
|
|
1790
|
+
return resp;
|
|
1791
|
+
}
|
|
1792
|
+
return undefined;
|
|
1793
|
+
}
|
|
1794
|
+
/**
|
|
1795
|
+
* Reduce the captured fetch traffic for an A2A step into the
|
|
1796
|
+
* `A2ATaskEnvelope` validations consume. The A2A SDK fires multiple
|
|
1797
|
+
* requests per call (`/.well-known/agent-card.json` discovery on
|
|
1798
|
+
* fresh clients, then a `message/send` POST), and a single dispatch
|
|
1799
|
+
* may also poll `tasks/get` afterwards. We pick the capture whose
|
|
1800
|
+
* REQUEST body declares `method: 'message/send'`; if no capture
|
|
1801
|
+
* declares the method we fall back to the last POST with a
|
|
1802
|
+
* JSON-RPC-shaped body. GET captures and non-JSON bodies are
|
|
1803
|
+
* skipped — `undefined` here surfaces as `not_applicable` in the
|
|
1804
|
+
* validator, which is more useful than a garbage envelope.
|
|
1805
|
+
*
|
|
1806
|
+
* Captured response bodies pass through `redactSecrets` before
|
|
1807
|
+
* landing in `ValidationContext.a2aEnvelope`. The bearer-token
|
|
1808
|
+
* regex in `wrapFetchWithCapture` only catches `Bearer <token>`
|
|
1809
|
+
* substrings; AdCP-style secret-shaped fields (`api_key`,
|
|
1810
|
+
* `client_secret`, `access_token`) inside a DataPart payload only
|
|
1811
|
+
* get redacted here. Failure paths thread the envelope into
|
|
1812
|
+
* `ValidationResult.actual.failures[].actual` which lands in
|
|
1813
|
+
* persisted compliance reports — redacting at capture parse time
|
|
1814
|
+
* keeps that surface consistent with `responseRecord.payload`,
|
|
1815
|
+
* which the runner already redacts on the success path.
|
|
1816
|
+
*/
|
|
1817
|
+
function parseLastA2aMessageSendCapture(captures) {
|
|
1818
|
+
let messageSendIdx = -1;
|
|
1819
|
+
let lastPostIdx = -1;
|
|
1820
|
+
for (let i = captures.length - 1; i >= 0; i--) {
|
|
1821
|
+
const cap = captures[i];
|
|
1822
|
+
if (!cap || cap.method !== 'POST')
|
|
1823
|
+
continue;
|
|
1824
|
+
if (lastPostIdx === -1)
|
|
1825
|
+
lastPostIdx = i;
|
|
1826
|
+
// The fetch wrapper doesn't capture the request body, so disambiguate
|
|
1827
|
+
// by parsing the response and checking for an A2A `Task` shape on
|
|
1828
|
+
// the result. `tasks/get` and `message/send` both return tasks, but
|
|
1829
|
+
// only `message/send` is the immediate response we want to assert
|
|
1830
|
+
// on for submitted-arm shape checks. When the runner adds polling,
|
|
1831
|
+
// we'd need request-body capture to distinguish reliably; for v0
|
|
1832
|
+
// the last POST is `message/send` because the SDK doesn't poll
|
|
1833
|
+
// synchronously after a Task with terminal state.
|
|
1834
|
+
if (messageSendIdx === -1) {
|
|
1835
|
+
const env = tryParseJsonRpcEnvelope(cap.body);
|
|
1836
|
+
if (env && env.result !== undefined && isTaskShape(env.result)) {
|
|
1837
|
+
messageSendIdx = i;
|
|
1838
|
+
}
|
|
1839
|
+
}
|
|
1840
|
+
}
|
|
1841
|
+
const idx = messageSendIdx !== -1 ? messageSendIdx : lastPostIdx;
|
|
1842
|
+
if (idx === -1)
|
|
1843
|
+
return undefined;
|
|
1844
|
+
const cap = captures[idx];
|
|
1845
|
+
const envelope = tryParseJsonRpcEnvelope(cap.body);
|
|
1846
|
+
if (!envelope)
|
|
1847
|
+
return undefined;
|
|
1848
|
+
// `envelope.result` mirrors the JSON-RPC envelope as observed —
|
|
1849
|
+
// present when the response carried a `result`, absent when it
|
|
1850
|
+
// carried `error`. The convenience `result` field at the top level
|
|
1851
|
+
// coalesces undefined to `null` so validators reading the typed
|
|
1852
|
+
// `A2ATaskEnvelope.result` get a stable shape; the inner
|
|
1853
|
+
// `envelope.result` keeps presence-of-key fidelity for validators
|
|
1854
|
+
// that need to distinguish "result was null" from "result was
|
|
1855
|
+
// omitted". Both paths run through `redactSecrets`.
|
|
1856
|
+
const redactedResult = envelope.result !== undefined ? redactSecrets(envelope.result) : null;
|
|
1857
|
+
return {
|
|
1858
|
+
result: redactedResult,
|
|
1859
|
+
envelope: {
|
|
1860
|
+
...(envelope.jsonrpc !== undefined && { jsonrpc: envelope.jsonrpc }),
|
|
1861
|
+
...(envelope.id !== undefined && { id: envelope.id }),
|
|
1862
|
+
...(envelope.result !== undefined && { result: redactedResult }),
|
|
1863
|
+
...(envelope.error !== undefined && { error: redactSecrets(envelope.error) }),
|
|
1864
|
+
},
|
|
1865
|
+
http_status: cap.status,
|
|
1866
|
+
};
|
|
1867
|
+
}
|
|
1868
|
+
function tryParseJsonRpcEnvelope(body) {
|
|
1869
|
+
let parsed;
|
|
1870
|
+
try {
|
|
1871
|
+
parsed = JSON.parse(body);
|
|
1872
|
+
}
|
|
1873
|
+
catch {
|
|
1874
|
+
return undefined;
|
|
1875
|
+
}
|
|
1876
|
+
if (parsed == null || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
1877
|
+
return undefined;
|
|
1878
|
+
const envelope = parsed;
|
|
1879
|
+
if (envelope.jsonrpc !== '2.0')
|
|
1880
|
+
return undefined;
|
|
1881
|
+
if (envelope.result === undefined && envelope.error === undefined)
|
|
1882
|
+
return undefined;
|
|
1883
|
+
return envelope;
|
|
1884
|
+
}
|
|
1885
|
+
function isTaskShape(result) {
|
|
1886
|
+
return (result != null &&
|
|
1887
|
+
typeof result === 'object' &&
|
|
1888
|
+
!Array.isArray(result) &&
|
|
1889
|
+
result.kind === 'task');
|
|
1890
|
+
}
|
|
1891
|
+
// ────────────────────────────────────────────────────────────
|
|
1892
|
+
// Phase / step skip predicates
|
|
1893
|
+
// ────────────────────────────────────────────────────────────
|
|
1894
|
+
/**
|
|
1895
|
+
* Evaluate a phase's `skip_if` expression against the runtime options. Only
|
|
1896
|
+
* a tiny grammar is supported today; unknown expressions fail closed (phase runs).
|
|
1897
|
+
*/
|
|
1898
|
+
function shouldSkipPhase(phase, options) {
|
|
1899
|
+
const expr = phase.skip_if?.trim();
|
|
1900
|
+
if (!expr)
|
|
1901
|
+
return false;
|
|
1902
|
+
const match = /^(!?)test_kit\.([a-zA-Z0-9_.]+)$/.exec(expr);
|
|
1903
|
+
if (!match)
|
|
1904
|
+
return false; // unknown grammar → run the phase
|
|
1905
|
+
const negated = match[1] === '!';
|
|
1906
|
+
const path = match[2].split('.');
|
|
1907
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic test-kit shape
|
|
1908
|
+
let value = options.test_kit;
|
|
1909
|
+
for (const segment of path) {
|
|
1910
|
+
if (value == null || typeof value !== 'object') {
|
|
1911
|
+
value = undefined;
|
|
1912
|
+
break;
|
|
1913
|
+
}
|
|
1914
|
+
value = value[segment];
|
|
1915
|
+
}
|
|
1916
|
+
const truthy = Boolean(value);
|
|
1917
|
+
return negated ? !truthy : truthy;
|
|
1918
|
+
}
|
|
1919
|
+
/**
|
|
1920
|
+
* Resolve a `$test_kit.<path>` task reference against the runtime options.
|
|
1921
|
+
* Falls back to `step.task_default`. Returns undefined when neither yields a string.
|
|
1922
|
+
*/
|
|
1923
|
+
function resolveTaskName(step, options) {
|
|
1924
|
+
if (!step.task.startsWith('$test_kit.'))
|
|
1925
|
+
return step.task;
|
|
1926
|
+
const path = step.task.slice('$test_kit.'.length).split('.');
|
|
1927
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic test-kit shape
|
|
1928
|
+
let value = options.test_kit;
|
|
1929
|
+
for (const segment of path) {
|
|
1930
|
+
if (value == null || typeof value !== 'object') {
|
|
1931
|
+
value = undefined;
|
|
1932
|
+
break;
|
|
1933
|
+
}
|
|
1934
|
+
value = value[segment];
|
|
1935
|
+
}
|
|
1936
|
+
if (typeof value === 'string' && value.length > 0)
|
|
1937
|
+
return value;
|
|
1938
|
+
return step.task_default;
|
|
1939
|
+
}
|
|
1940
|
+
/**
|
|
1941
|
+
* Build headers for the raw MCP probe when a step needs raw dispatch without
|
|
1942
|
+
* an explicit `auth` override (defense-in-depth for `omit_idempotency_key`).
|
|
1943
|
+
* Returns `undefined` for `oauth` so the caller falls back to the SDK path —
|
|
1944
|
+
* refreshable-token semantics can't be replicated here and the SDK honors
|
|
1945
|
+
* `skipIdempotencyAutoInject` on that path anyway.
|
|
1946
|
+
*/
|
|
1947
|
+
function defaultAuthHeadersForRawProbe(options) {
|
|
1948
|
+
// Reject control chars and non-printable ASCII. Without this, undici's header
|
|
1949
|
+
// validator throws a message that includes the offending value — landing
|
|
1950
|
+
// secrets in logs. Validate raw inputs before encoding so the field name in
|
|
1951
|
+
// the error identifies which input to fix without echoing the value.
|
|
1952
|
+
const assertSafe = (value, field) => {
|
|
1953
|
+
if (/[\r\n]|[^\x20-\x7E]/.test(value)) {
|
|
1954
|
+
throw new Error(`${field} contains invalid characters (control chars or non-printable ASCII)`);
|
|
1955
|
+
}
|
|
1956
|
+
};
|
|
1957
|
+
const headers = {};
|
|
1958
|
+
if (options.auth) {
|
|
1959
|
+
if (options.auth.type === 'bearer') {
|
|
1960
|
+
if (!options.auth.token)
|
|
1961
|
+
throw new Error('options.auth.token is required for bearer auth');
|
|
1962
|
+
assertSafe(options.auth.token, 'options.auth.token');
|
|
1963
|
+
headers.authorization = `Bearer ${options.auth.token}`;
|
|
1964
|
+
}
|
|
1965
|
+
else if (options.auth.type === 'basic') {
|
|
1966
|
+
// RFC 7617 bans `:` in the userid — a colon would decode ambiguously on
|
|
1967
|
+
// the server. Fail loudly rather than silently producing a mangled header.
|
|
1968
|
+
if (options.auth.username.includes(':')) {
|
|
1969
|
+
throw new Error('options.auth.username must not contain colon (RFC 7617)');
|
|
1970
|
+
}
|
|
1971
|
+
assertSafe(options.auth.username, 'options.auth.username');
|
|
1972
|
+
assertSafe(options.auth.password, 'options.auth.password');
|
|
1973
|
+
const encoded = Buffer.from(`${options.auth.username}:${options.auth.password}`).toString('base64');
|
|
1974
|
+
headers.authorization = `Basic ${encoded}`;
|
|
1975
|
+
}
|
|
1976
|
+
else {
|
|
1977
|
+
return undefined;
|
|
1978
|
+
}
|
|
1979
|
+
}
|
|
1980
|
+
// Match SDK header casing so a raw-probe request is byte-indistinguishable
|
|
1981
|
+
// from an SDK-shaped one at the transport boundary. HTTP is case-insensitive;
|
|
1982
|
+
// this is purely for parity with capture/diff tooling.
|
|
1983
|
+
if (options.test_session_id) {
|
|
1984
|
+
assertSafe(options.test_session_id, 'options.test_session_id');
|
|
1985
|
+
headers['X-Test-Session-ID'] = options.test_session_id;
|
|
1986
|
+
}
|
|
1987
|
+
if (options.userAgent) {
|
|
1988
|
+
assertSafe(options.userAgent, 'options.userAgent');
|
|
1989
|
+
headers['User-Agent'] = options.userAgent;
|
|
1990
|
+
}
|
|
1991
|
+
return headers;
|
|
1992
|
+
}
|
|
1993
|
+
/**
|
|
1994
|
+
* Translate a `StepAuthDirective` into HTTP headers for the raw MCP probe.
|
|
1995
|
+
* - `'none'` returns an empty object and the probe sends no `Authorization`.
|
|
1996
|
+
* - `api_key` / `oauth_bearer` resolve the value from `value`, `from_test_kit`,
|
|
1997
|
+
* or `value_strategy` — in that order — and produce `Authorization: Bearer <value>`.
|
|
1998
|
+
*/
|
|
1999
|
+
function authHeadersForStep(directive, options) {
|
|
2000
|
+
if (directive === 'none')
|
|
2001
|
+
return {};
|
|
2002
|
+
let value;
|
|
2003
|
+
if ('value' in directive && directive.value) {
|
|
2004
|
+
value = directive.value;
|
|
2005
|
+
}
|
|
2006
|
+
else if ('from_test_kit' in directive && directive.from_test_kit) {
|
|
2007
|
+
value = options.test_kit?.auth?.api_key;
|
|
2008
|
+
}
|
|
2009
|
+
else if ('value_strategy' in directive && directive.value_strategy) {
|
|
2010
|
+
if (directive.value_strategy === 'random_invalid')
|
|
2011
|
+
value = (0, probes_1.generateRandomInvalidApiKey)();
|
|
2012
|
+
else if (directive.value_strategy === 'random_invalid_jwt')
|
|
2013
|
+
value = (0, probes_1.generateRandomInvalidJwt)();
|
|
2014
|
+
}
|
|
2015
|
+
if (!value)
|
|
2016
|
+
return {};
|
|
2017
|
+
// Reject CR/LF/NUL and non-printable ASCII — a test-kit key with stray
|
|
2018
|
+
// whitespace would otherwise crash undici's header validator and the raw
|
|
2019
|
+
// exception (containing the secret) lands in the serialized compliance
|
|
2020
|
+
// report. Fail loudly with a non-echoing error instead.
|
|
2021
|
+
if (/[\r\n\x00]|[^\x20-\x7E]/.test(value)) {
|
|
2022
|
+
throw new Error('test_kit.auth.api_key contains invalid characters (control chars or non-printable ASCII)');
|
|
2023
|
+
}
|
|
2024
|
+
return { authorization: `Bearer ${value}` };
|
|
2025
|
+
}
|
|
2026
|
+
/**
|
|
2027
|
+
* Evaluate a step's `contributes_if` expression. Grammar:
|
|
2028
|
+
* - `"prior_step.<step_id>.passed"` — prior step passed
|
|
2029
|
+
* Unknown expressions → false (contribution does NOT fire).
|
|
2030
|
+
*/
|
|
2031
|
+
function evalContributesIf(expr, priorStepResults) {
|
|
2032
|
+
if (!expr)
|
|
2033
|
+
return true;
|
|
2034
|
+
const match = /^prior_step\.([A-Za-z0-9_]+)\.passed$/.exec(expr.trim());
|
|
2035
|
+
if (!match)
|
|
2036
|
+
return false;
|
|
2037
|
+
const stepId = match[1];
|
|
2038
|
+
const prior = priorStepResults.get(stepId);
|
|
2039
|
+
return !!prior?.passed && !prior.skipped;
|
|
2040
|
+
}
|
|
2041
|
+
// ────────────────────────────────────────────────────────────
|
|
2042
|
+
// Brand/account invariant
|
|
2043
|
+
// ────────────────────────────────────────────────────────────
|
|
2044
|
+
/**
|
|
2045
|
+
* Force every outgoing request onto the storyboard's brand context.
|
|
2046
|
+
*
|
|
2047
|
+
* Sellers that scope session state by brand (spec-required for multi-tenant
|
|
2048
|
+
* isolation) derive a session key from `brand.domain` — or, when brand is
|
|
2049
|
+
* absent, from `account.brand.domain`. If any step in a run targets a
|
|
2050
|
+
* different brand, it lands in a different session and can't see state
|
|
2051
|
+
* created by earlier steps.
|
|
2052
|
+
*
|
|
2053
|
+
* This helper runs after builder / sample_request resolution and writes the
|
|
2054
|
+
* run-scoped brand into the addressing forms the tool's schema allows:
|
|
2055
|
+
*
|
|
2056
|
+
* - Top-level `brand` — only when the tool's request schema declares it
|
|
2057
|
+
* (e.g. `get_products`, `create_media_buy`, signal tools). Governance
|
|
2058
|
+
* tools like `sync_plans` do not declare `brand` at the request root
|
|
2059
|
+
* (brand belongs inside each `Plan` object) — injecting it would fail
|
|
2060
|
+
* the framework's strict AJV validation (#940).
|
|
2061
|
+
* - `account.brand` — merged into an existing `account` object only when
|
|
2062
|
+
* it uses the natural-key variant (`{brand, operator, sandbox?}`). The
|
|
2063
|
+
* `{account_id}` variant is closed (`additionalProperties: false`); merging
|
|
2064
|
+
* `brand` into it produces a payload that matches neither `oneOf` branch
|
|
2065
|
+
* and is rejected by AJV strict request validation. Detect the natural-key
|
|
2066
|
+
* variant by looking for an existing `brand` or `operator` key.
|
|
2067
|
+
* - Synthetic `account` — constructed only when the request has no
|
|
2068
|
+
* `account` AND the tool's schema declares `account` (e.g. `get_media_buys`,
|
|
2069
|
+
* `list_creatives`). Tools like `sync_plans` that declare neither
|
|
2070
|
+
* `brand` nor `account` at the root are left unchanged.
|
|
2071
|
+
*
|
|
2072
|
+
* When `taskName` is omitted or the schema is unavailable (not synced yet),
|
|
2073
|
+
* the function fails open and injects as before. Schema checks use raw JSON
|
|
2074
|
+
* reads, not AJV internals.
|
|
2075
|
+
*/
|
|
2076
|
+
function applyBrandInvariant(request, options, taskName) {
|
|
2077
|
+
// Only force the invariant when the caller has actually supplied a brand.
|
|
2078
|
+
// Storyboards that don't exercise brand-scoped tools (e.g. security
|
|
2079
|
+
// probes) legitimately run without one and should pass through unchanged.
|
|
2080
|
+
if (!options.brand && !options.brand_manifest)
|
|
2081
|
+
return request;
|
|
2082
|
+
const brand = (0, client_2.resolveBrand)(options);
|
|
2083
|
+
// Gate brand/account injection on the tool's request schema. Tools that
|
|
2084
|
+
// declare `additionalProperties: false` without listing the field will fail
|
|
2085
|
+
// the framework's strict AJV validator if we inject it (#940). Fails open
|
|
2086
|
+
// when taskName is absent or the schema isn't available.
|
|
2087
|
+
const topBrandOk = !taskName || (0, schema_loader_1.schemaAllowsTopLevelField)(taskName, 'brand');
|
|
2088
|
+
const topAccountOk = !taskName || (0, schema_loader_1.schemaAllowsTopLevelField)(taskName, 'account');
|
|
2089
|
+
const result = { ...request };
|
|
2090
|
+
if (topBrandOk)
|
|
2091
|
+
result.brand = brand;
|
|
2092
|
+
if ('account' in request) {
|
|
2093
|
+
// Caller sent an account — merge brand in only when it's a plain object
|
|
2094
|
+
// using AccountReference's natural-key variant (`{brand, operator, sandbox?}`).
|
|
2095
|
+
// The `{account_id}` variant is a closed object; merging `brand` would
|
|
2096
|
+
// produce a payload that matches neither `oneOf` branch under strict AJV.
|
|
2097
|
+
// Leave non-object values (null, array) and `{account_id}`-only payloads
|
|
2098
|
+
// alone so intentionally narrow or malformed requests aren't silently
|
|
2099
|
+
// "corrected."
|
|
2100
|
+
const existingAccount = request.account;
|
|
2101
|
+
if (existingAccount && typeof existingAccount === 'object' && !Array.isArray(existingAccount)) {
|
|
2102
|
+
const acct = existingAccount;
|
|
2103
|
+
const isNaturalKeyVariant = 'brand' in acct || 'operator' in acct;
|
|
2104
|
+
if (isNaturalKeyVariant) {
|
|
2105
|
+
result.account = { ...acct, brand };
|
|
2106
|
+
}
|
|
2107
|
+
}
|
|
2108
|
+
}
|
|
2109
|
+
else if (topAccountOk) {
|
|
2110
|
+
// No account on the request — construct one so tools whose schema
|
|
2111
|
+
// declares `account` but not top-level `brand` (e.g. get_media_buys,
|
|
2112
|
+
// list_creatives) still carry the run-scoped brand on the wire.
|
|
2113
|
+
result.account = (0, client_2.resolveAccount)(options);
|
|
2114
|
+
}
|
|
2115
|
+
return result;
|
|
2116
|
+
}
|
|
2117
|
+
/**
|
|
2118
|
+
* Mint an `idempotency_key` for mutating storyboard requests when one wasn't
|
|
2119
|
+
* supplied. Storyboard `sample_request` blocks generally omit it; the runner
|
|
2120
|
+
* fills it in so the server's required-field check doesn't short-circuit the
|
|
2121
|
+
* handler under test, including on `expect_error` steps that name specific
|
|
2122
|
+
* failure modes (GOVERNANCE_DENIED, UNAUTHORIZED, brand_mismatch, etc.).
|
|
2123
|
+
*
|
|
2124
|
+
* Skipped when:
|
|
2125
|
+
* - `step.omit_idempotency_key === true` — the scenario is explicitly
|
|
2126
|
+
* exercising the server's missing-key rejection path.
|
|
2127
|
+
* - the task isn't mutating per {@link MUTATING_TASKS}.
|
|
2128
|
+
* - the request already carries a key — typically a
|
|
2129
|
+
* `$generate:uuid_v4#alias` the context injector has resolved to a
|
|
2130
|
+
* concrete UUID for replay scenarios, or a BYOK key supplied inline.
|
|
2131
|
+
*/
|
|
2132
|
+
function applyIdempotencyInvariant(request, taskName, step) {
|
|
2133
|
+
if (step.omit_idempotency_key === true)
|
|
2134
|
+
return request;
|
|
2135
|
+
if (!(0, idempotency_1.isMutatingTask)(taskName))
|
|
2136
|
+
return request;
|
|
2137
|
+
if (typeof request.idempotency_key === 'string' && request.idempotency_key.length > 0)
|
|
2138
|
+
return request;
|
|
2139
|
+
return { ...request, idempotency_key: (0, idempotency_1.generateIdempotencyKey)() };
|
|
2140
|
+
}
|
|
2141
|
+
// ────────────────────────────────────────────────────────────
|
|
2142
|
+
// Helpers
|
|
2143
|
+
// ────────────────────────────────────────────────────────────
|
|
2144
|
+
const MAX_ERROR_LENGTH = 2000;
|
|
2145
|
+
function truncateError(error) {
|
|
2146
|
+
if (!error)
|
|
2147
|
+
return undefined;
|
|
2148
|
+
return error.length > MAX_ERROR_LENGTH ? error.slice(0, MAX_ERROR_LENGTH) + '...[truncated]' : error;
|
|
2149
|
+
}
|
|
2150
|
+
/**
|
|
2151
|
+
* Find any "$context.xxx" strings that weren't resolved during injection.
|
|
2152
|
+
*/
|
|
2153
|
+
function findUnresolvedContextVars(obj) {
|
|
2154
|
+
const vars = [];
|
|
2155
|
+
const walk = (val) => {
|
|
2156
|
+
if (typeof val === 'string') {
|
|
2157
|
+
const match = val.match(/^\$context\.(\w+)$/);
|
|
2158
|
+
if (match?.[1])
|
|
2159
|
+
vars.push(match[1]);
|
|
2160
|
+
}
|
|
2161
|
+
else if (Array.isArray(val)) {
|
|
2162
|
+
val.forEach(walk);
|
|
2163
|
+
}
|
|
2164
|
+
else if (val !== null && typeof val === 'object') {
|
|
2165
|
+
Object.values(val).forEach(walk);
|
|
2166
|
+
}
|
|
2167
|
+
};
|
|
2168
|
+
walk(obj);
|
|
2169
|
+
return vars;
|
|
2170
|
+
}
|
|
2171
|
+
function flattenSteps(storyboard) {
|
|
2172
|
+
const result = [];
|
|
2173
|
+
let index = 0;
|
|
2174
|
+
for (const phase of storyboard.phases) {
|
|
2175
|
+
for (const step of phase.steps) {
|
|
2176
|
+
result.push({ step, phaseId: phase.id, globalIndex: index++ });
|
|
2177
|
+
}
|
|
2178
|
+
}
|
|
2179
|
+
return result;
|
|
2180
|
+
}
|
|
2181
|
+
function getNextStepPreview(currentStepId, allSteps, context, runnerVars) {
|
|
2182
|
+
const currentIdx = allSteps.findIndex(s => s.step.id === currentStepId);
|
|
2183
|
+
if (currentIdx === -1 || currentIdx >= allSteps.length - 1)
|
|
2184
|
+
return undefined;
|
|
2185
|
+
const nextFlat = allSteps[currentIdx + 1];
|
|
2186
|
+
if (!nextFlat)
|
|
2187
|
+
return undefined;
|
|
2188
|
+
const nextStep = nextFlat.step;
|
|
2189
|
+
// Inject context into the next step's sample_request for preview
|
|
2190
|
+
const previewRequest = nextStep.sample_request
|
|
2191
|
+
? (0, context_1.injectContext)({ ...nextStep.sample_request }, context, runnerVars)
|
|
2192
|
+
: undefined;
|
|
2193
|
+
return {
|
|
2194
|
+
step_id: nextStep.id,
|
|
2195
|
+
phase_id: nextFlat.phaseId,
|
|
2196
|
+
title: nextStep.title,
|
|
2197
|
+
task: nextStep.task,
|
|
2198
|
+
narrative: nextStep.narrative,
|
|
2199
|
+
expected: nextStep.expected,
|
|
2200
|
+
sample_request: previewRequest,
|
|
2201
|
+
};
|
|
2202
|
+
}
|
|
2203
|
+
/**
|
|
2204
|
+
* Build a dispatcher that picks an (agent URL, client) pair per step.
|
|
2205
|
+
*
|
|
2206
|
+
* Single-URL runs always return the same assignment. Multi-URL runs use
|
|
2207
|
+
* round-robin — step N hits `clients[(N + startOffset) % N_urls]`.
|
|
2208
|
+
* Deterministic and reproducible for bug reports.
|
|
2209
|
+
*
|
|
2210
|
+
* `startOffset` lets the `multi-pass` strategy run the same storyboard with
|
|
2211
|
+
* the dispatcher starting at a different replica each pass so write→read
|
|
2212
|
+
* pairs separated by an even number of stateful steps get exercised
|
|
2213
|
+
* cross-replica on at least one pass.
|
|
2214
|
+
*/
|
|
2215
|
+
function createDispatcher(agentUrls, clients, _strategy, startOffset = 0) {
|
|
2216
|
+
let counter = startOffset;
|
|
2217
|
+
return {
|
|
2218
|
+
nextFor(_step) {
|
|
2219
|
+
const idx = ((counter % agentUrls.length) + agentUrls.length) % agentUrls.length;
|
|
2220
|
+
counter++;
|
|
2221
|
+
return {
|
|
2222
|
+
client: clients[idx],
|
|
2223
|
+
agentUrl: agentUrls[idx],
|
|
2224
|
+
instanceIndex: idx,
|
|
2225
|
+
};
|
|
2226
|
+
},
|
|
2227
|
+
};
|
|
2228
|
+
}
|
|
2229
|
+
const HORIZONTAL_SCALING_DOCS_URL = 'https://adcontextprotocol.org/docs/building/validate-your-agent#verifying-cross-instance-state';
|
|
2230
|
+
const NOT_FOUND_PATTERN = /not[_ ]found|not-found|\b404\b/i;
|
|
2231
|
+
// Agent-controlled text (error messages, response payloads) lands in terminal
|
|
2232
|
+
// output. Strip C0/C1 control chars so a hostile agent returning
|
|
2233
|
+
// `\x1b[2J\x1b[H` (clear screen) or `\r` (overwrite prior line) can't mangle
|
|
2234
|
+
// CI logs or forge terminal state. Tabs and newlines are preserved.
|
|
2235
|
+
// The cap bounds JSON-stringification cost if an agent returns an enormous
|
|
2236
|
+
// or deeply-nested response body.
|
|
2237
|
+
const MAX_ATTRIBUTION_SNIPPET = 512;
|
|
2238
|
+
function sanitizeAgentText(text) {
|
|
2239
|
+
return text.replace(/[\x00-\x08\x0b-\x1f\x7f-\x9f]/g, '').slice(0, MAX_ATTRIBUTION_SNIPPET);
|
|
2240
|
+
}
|
|
2241
|
+
/**
|
|
2242
|
+
* Detect the canonical horizontal-scaling failure signature on a step result.
|
|
2243
|
+
*
|
|
2244
|
+
* Reads structured fields the runner commonly populates (error string,
|
|
2245
|
+
* nested response.error/code/message/status) rather than regex-matching the
|
|
2246
|
+
* full stringified response — structured lookup is cheaper, resistant to an
|
|
2247
|
+
* agent smuggling "NOT_FOUND" into an unrelated field to falsely trigger the
|
|
2248
|
+
* canonical wording, and doesn't blow up on circular or oversized payloads.
|
|
2249
|
+
*/
|
|
2250
|
+
function isNotFoundSignature(result) {
|
|
2251
|
+
const candidates = [result.error];
|
|
2252
|
+
const resp = result.response;
|
|
2253
|
+
if (resp && typeof resp === 'object' && !Array.isArray(resp)) {
|
|
2254
|
+
candidates.push(resp.error, resp.code, resp.message, resp.status, resp.status_code);
|
|
2255
|
+
}
|
|
2256
|
+
for (const c of candidates) {
|
|
2257
|
+
if (typeof c === 'string' && NOT_FOUND_PATTERN.test(c))
|
|
2258
|
+
return true;
|
|
2259
|
+
if (typeof c === 'number' && c === 404)
|
|
2260
|
+
return true;
|
|
2261
|
+
}
|
|
2262
|
+
return false;
|
|
2263
|
+
}
|
|
2264
|
+
/**
|
|
2265
|
+
* Mutate a failed step result to include cross-instance attribution.
|
|
2266
|
+
*
|
|
2267
|
+
* In multi-instance mode any step failure is worth attributing because the
|
|
2268
|
+
* failure signature may not be NOT_FOUND — it can surface as 500, an empty
|
|
2269
|
+
* array, PERMISSION_DENIED, or stale status. Attribution always emits:
|
|
2270
|
+
* - which replica served this step and the immediate prior stateful write
|
|
2271
|
+
* - a replica→step map for pattern-matching in CI logs
|
|
2272
|
+
* - a single-replica repro command
|
|
2273
|
+
* When the signature matches the canonical horizontal-scaling case (prior
|
|
2274
|
+
* write on A, read fails on B with NOT_FOUND), the wording mirrors the
|
|
2275
|
+
* protocol docs verbatim so developers pattern-match the page they'll
|
|
2276
|
+
* eventually click through to.
|
|
2277
|
+
*/
|
|
2278
|
+
function annotateMultiInstanceFailure(result, storyboard, priorResults) {
|
|
2279
|
+
const currentInstance = result.agent_index;
|
|
2280
|
+
const currentUrl = result.agent_url;
|
|
2281
|
+
if (!currentInstance || !currentUrl)
|
|
2282
|
+
return;
|
|
2283
|
+
// Lookup stateful flag on step defs — needed to identify "prior writes".
|
|
2284
|
+
const stepDefs = new Map();
|
|
2285
|
+
for (const phase of storyboard.phases) {
|
|
2286
|
+
for (const s of phase.steps)
|
|
2287
|
+
stepDefs.set(s.id, s);
|
|
2288
|
+
}
|
|
2289
|
+
const priorCrossInstanceWrite = [...priorResults].reverse().find(prior => {
|
|
2290
|
+
if (!prior.passed || prior.skipped)
|
|
2291
|
+
return false;
|
|
2292
|
+
if (!prior.agent_index || prior.agent_index === currentInstance)
|
|
2293
|
+
return false;
|
|
2294
|
+
return stepDefs.get(prior.step_id)?.stateful === true;
|
|
2295
|
+
});
|
|
2296
|
+
const replicaMap = priorResults
|
|
2297
|
+
.filter(r => !r.skipped && r.agent_index)
|
|
2298
|
+
.map(r => ` [#${r.agent_index}] ${r.step_id} — ${r.passed ? 'ok' : 'FAIL'}`)
|
|
2299
|
+
.join('\n');
|
|
2300
|
+
const lines = [];
|
|
2301
|
+
if (priorCrossInstanceWrite) {
|
|
2302
|
+
const writerIdx = priorCrossInstanceWrite.agent_index;
|
|
2303
|
+
const writerUrl = priorCrossInstanceWrite.agent_url;
|
|
2304
|
+
// Wording deliberately mirrors the failure example in the protocol docs
|
|
2305
|
+
// ("<write> on replica A returned …; <read> on replica B returned NOT_FOUND;
|
|
2306
|
+
// → Brand-scoped state is not shared across replicas.") so CI readers
|
|
2307
|
+
// pattern-match the page they'll click through to.
|
|
2308
|
+
lines.push(`${priorCrossInstanceWrite.step_id} on replica [#${writerIdx}] (${writerUrl}) succeeded.`);
|
|
2309
|
+
lines.push(`${result.step_id} on replica [#${currentInstance}] (${currentUrl}) failed${isNotFoundSignature(result) ? ' with NOT_FOUND' : ''}.`);
|
|
2310
|
+
lines.push('→ Brand-scoped state is not shared across replicas.');
|
|
2311
|
+
lines.push(`See: ${HORIZONTAL_SCALING_DOCS_URL}`);
|
|
2312
|
+
}
|
|
2313
|
+
else {
|
|
2314
|
+
lines.push(`Multi-instance failure on replica [#${currentInstance}] (${currentUrl}). ` +
|
|
2315
|
+
`No prior cross-replica stateful write found — the failure may be intrinsic to this replica.`);
|
|
2316
|
+
}
|
|
2317
|
+
if (replicaMap) {
|
|
2318
|
+
lines.push('Replica → step map:');
|
|
2319
|
+
lines.push(replicaMap);
|
|
2320
|
+
}
|
|
2321
|
+
lines.push(`Reproduce single-replica: adcp storyboard run ${currentUrl} ${storyboard.id}`);
|
|
2322
|
+
// Agent-controlled text goes in the base line; control chars are stripped
|
|
2323
|
+
// so a hostile agent can't forge terminal escape sequences in CI output.
|
|
2324
|
+
const base = sanitizeAgentText(result.error ?? 'Step failed');
|
|
2325
|
+
result.error = `${base}\n\n${lines.join('\n')}`;
|
|
2326
|
+
}
|
|
2327
|
+
/**
|
|
2328
|
+
* Get a preview of the first step in a storyboard (for showing what will happen).
|
|
2329
|
+
*
|
|
2330
|
+
* `{{runner.*}}` tokens are passed through unchanged since no receiver is
|
|
2331
|
+
* bound at preview time. They'll resolve when the step actually runs.
|
|
2332
|
+
*/
|
|
2333
|
+
function getFirstStepPreview(storyboard, context = {}) {
|
|
2334
|
+
const firstPhase = storyboard.phases[0];
|
|
2335
|
+
if (!firstPhase?.steps[0])
|
|
2336
|
+
return undefined;
|
|
2337
|
+
const step = firstPhase.steps[0];
|
|
2338
|
+
const previewRequest = step.sample_request ? (0, context_1.injectContext)({ ...step.sample_request }, context) : undefined;
|
|
2339
|
+
return {
|
|
2340
|
+
step_id: step.id,
|
|
2341
|
+
phase_id: firstPhase.id,
|
|
2342
|
+
title: step.title,
|
|
2343
|
+
task: step.task,
|
|
2344
|
+
narrative: step.narrative,
|
|
2345
|
+
expected: step.expected,
|
|
2346
|
+
sample_request: previewRequest,
|
|
2347
|
+
};
|
|
2348
|
+
}
|
|
2349
|
+
//# sourceMappingURL=runner.js.map
|