@adcp/sdk 12.1.0 → 13.0.0-rc.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/README.md +19 -3
- package/bin/adcp-fuzz.js +3 -1
- package/dist/lib/adapters/content-standards-adapter.d.mts +9 -9
- package/dist/lib/adapters/content-standards-adapter.d.ts +9 -9
- package/dist/lib/adapters/content-standards-adapter.d.ts.map +1 -1
- package/dist/lib/adapters/content-standards-adapter.js +22 -22
- package/dist/lib/adapters/content-standards-adapter.js.map +1 -1
- package/dist/lib/adapters/content-standards-adapter.mjs +18 -18
- package/dist/lib/adapters/content-standards-adapter.mjs.map +1 -1
- package/dist/lib/adapters/index.d.mts +2 -2
- package/dist/lib/adapters/index.d.ts +2 -2
- package/dist/lib/adapters/index.d.ts.map +1 -1
- package/dist/lib/adapters/index.js +10 -10
- package/dist/lib/adapters/index.js.map +1 -1
- package/dist/lib/adapters/index.mjs +9 -9
- package/dist/lib/adapters/index.mjs.map +1 -1
- package/dist/lib/auth/oauth/authorization-required.d.mts +3 -0
- package/dist/lib/auth/oauth/authorization-required.d.ts +3 -0
- package/dist/lib/auth/oauth/authorization-required.d.ts.map +1 -1
- package/dist/lib/auth/oauth/authorization-required.js +12 -9
- package/dist/lib/auth/oauth/authorization-required.js.map +1 -1
- package/dist/lib/auth/oauth/authorization-required.mjs +12 -9
- package/dist/lib/auth/oauth/authorization-required.mjs.map +1 -1
- package/dist/lib/auth/oauth/provider-cache.d.mts +7 -0
- package/dist/lib/auth/oauth/provider-cache.d.ts +8 -0
- package/dist/lib/auth/oauth/provider-cache.d.ts.map +1 -0
- package/dist/lib/auth/oauth/provider-cache.js +44 -0
- package/dist/lib/auth/oauth/provider-cache.js.map +1 -0
- package/dist/lib/auth/oauth/provider-cache.mjs +19 -0
- package/dist/lib/auth/oauth/provider-cache.mjs.map +1 -0
- package/dist/lib/conformance/invariants/uniformError.js +1 -1
- package/dist/lib/conformance/invariants/uniformError.js.map +1 -1
- package/dist/lib/conformance/invariants/uniformError.mjs +1 -1
- package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
- package/dist/lib/conformance/runners.js +1 -1
- package/dist/lib/conformance/runners.js.map +1 -1
- package/dist/lib/conformance/runners.mjs +1 -1
- package/dist/lib/conformance/runners.mjs.map +1 -1
- package/dist/lib/conformance/seeder.js +5 -5
- package/dist/lib/conformance/seeder.js.map +1 -1
- package/dist/lib/conformance/seeder.mjs +5 -5
- package/dist/lib/conformance/seeder.mjs.map +1 -1
- package/dist/lib/core/ADCPMultiAgentClient.d.mts +26 -29
- package/dist/lib/core/ADCPMultiAgentClient.d.ts +26 -29
- package/dist/lib/core/ADCPMultiAgentClient.d.ts.map +1 -1
- package/dist/lib/core/ADCPMultiAgentClient.js +27 -19
- package/dist/lib/core/ADCPMultiAgentClient.js.map +1 -1
- package/dist/lib/core/ADCPMultiAgentClient.mjs +27 -19
- package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
- package/dist/lib/core/AgentClient.d.mts +148 -138
- package/dist/lib/core/AgentClient.d.ts +148 -138
- package/dist/lib/core/AgentClient.d.ts.map +1 -1
- package/dist/lib/core/AgentClient.js +174 -85
- package/dist/lib/core/AgentClient.js.map +1 -1
- package/dist/lib/core/AgentClient.mjs +174 -85
- package/dist/lib/core/AgentClient.mjs.map +1 -1
- package/dist/lib/core/AsyncHandler.d.mts +18 -16
- package/dist/lib/core/AsyncHandler.d.ts +18 -16
- package/dist/lib/core/AsyncHandler.d.ts.map +1 -1
- package/dist/lib/core/AsyncHandler.js +22 -1
- package/dist/lib/core/AsyncHandler.js.map +1 -1
- package/dist/lib/core/AsyncHandler.mjs +22 -1
- package/dist/lib/core/AsyncHandler.mjs.map +1 -1
- package/dist/lib/core/ConversationTypes.d.mts +6 -2
- package/dist/lib/core/ConversationTypes.d.ts +6 -2
- package/dist/lib/core/ConversationTypes.d.ts.map +1 -1
- package/dist/lib/core/ConversationTypes.js.map +1 -1
- package/dist/lib/core/CreativeAgentClient.d.mts +41 -17
- package/dist/lib/core/CreativeAgentClient.d.ts +41 -17
- package/dist/lib/core/CreativeAgentClient.d.ts.map +1 -1
- package/dist/lib/core/CreativeAgentClient.js +39 -12
- package/dist/lib/core/CreativeAgentClient.js.map +1 -1
- package/dist/lib/core/CreativeAgentClient.mjs +39 -12
- package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
- package/dist/lib/core/SingleAgentClient.d.mts +129 -52
- package/dist/lib/core/SingleAgentClient.d.ts +129 -52
- package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.js +1748 -218
- package/dist/lib/core/SingleAgentClient.js.map +1 -1
- package/dist/lib/core/SingleAgentClient.mjs +1758 -218
- package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
- package/dist/lib/core/TaskExecutor.d.mts +9 -0
- package/dist/lib/core/TaskExecutor.d.ts +9 -0
- package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
- package/dist/lib/core/TaskExecutor.js +137 -44
- package/dist/lib/core/TaskExecutor.js.map +1 -1
- package/dist/lib/core/TaskExecutor.mjs +137 -44
- package/dist/lib/core/TaskExecutor.mjs.map +1 -1
- package/dist/lib/index.d.mts +111 -17
- package/dist/lib/index.d.ts +111 -17
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +94 -94
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/index.mjs +93 -94
- package/dist/lib/index.mjs.map +1 -1
- package/dist/lib/net/ssrf-fetch.d.mts +13 -1
- package/dist/lib/net/ssrf-fetch.d.ts +13 -1
- package/dist/lib/net/ssrf-fetch.d.ts.map +1 -1
- package/dist/lib/net/ssrf-fetch.js +14 -7
- package/dist/lib/net/ssrf-fetch.js.map +1 -1
- package/dist/lib/net/ssrf-fetch.mjs +14 -7
- package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
- package/dist/lib/protocols/a2a.d.mts +2 -2
- package/dist/lib/protocols/a2a.d.ts +2 -2
- package/dist/lib/protocols/a2a.d.ts.map +1 -1
- package/dist/lib/protocols/a2a.js +14 -9
- package/dist/lib/protocols/a2a.js.map +1 -1
- package/dist/lib/protocols/a2a.mjs +14 -9
- package/dist/lib/protocols/a2a.mjs.map +1 -1
- package/dist/lib/protocols/index.d.mts +20 -3
- package/dist/lib/protocols/index.d.ts +20 -3
- package/dist/lib/protocols/index.d.ts.map +1 -1
- package/dist/lib/protocols/index.js +44 -31
- package/dist/lib/protocols/index.js.map +1 -1
- package/dist/lib/protocols/index.mjs +44 -32
- package/dist/lib/protocols/index.mjs.map +1 -1
- package/dist/lib/protocols/mcp-modern.d.ts.map +1 -1
- package/dist/lib/protocols/mcp-modern.js +87 -12
- package/dist/lib/protocols/mcp-modern.js.map +1 -1
- package/dist/lib/protocols/mcp-modern.mjs +89 -12
- package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
- package/dist/lib/protocols/mcp-tasks.d.mts +3 -0
- package/dist/lib/protocols/mcp-tasks.d.ts +3 -0
- package/dist/lib/protocols/mcp-tasks.d.ts.map +1 -1
- package/dist/lib/protocols/mcp-tasks.js +21 -11
- package/dist/lib/protocols/mcp-tasks.js.map +1 -1
- package/dist/lib/protocols/mcp-tasks.mjs +21 -11
- package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/create-adcp-server.d.mts +6 -0
- package/dist/lib/server/create-adcp-server.d.ts +6 -0
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +295 -48
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/create-adcp-server.mjs +301 -50
- package/dist/lib/server/create-adcp-server.mjs.map +1 -1
- package/dist/lib/server/decisioning/assembly-helpers.d.mts +27 -13
- package/dist/lib/server/decisioning/assembly-helpers.d.ts +27 -13
- package/dist/lib/server/decisioning/assembly-helpers.d.ts.map +1 -1
- package/dist/lib/server/decisioning/assembly-helpers.js +136 -14
- package/dist/lib/server/decisioning/assembly-helpers.js.map +1 -1
- package/dist/lib/server/decisioning/assembly-helpers.mjs +134 -13
- package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/index.d.mts +13 -12
- package/dist/lib/server/decisioning/index.d.ts +13 -12
- package/dist/lib/server/decisioning/index.d.ts.map +1 -1
- package/dist/lib/server/decisioning/index.js +6 -0
- package/dist/lib/server/decisioning/index.js.map +1 -1
- package/dist/lib/server/decisioning/index.mjs +9 -3
- package/dist/lib/server/decisioning/index.mjs.map +1 -1
- package/dist/lib/server/decisioning/list-helpers.d.mts +13 -3
- package/dist/lib/server/decisioning/list-helpers.d.ts +13 -3
- package/dist/lib/server/decisioning/list-helpers.d.ts.map +1 -1
- package/dist/lib/server/decisioning/list-helpers.js +13 -3
- package/dist/lib/server/decisioning/list-helpers.js.map +1 -1
- package/dist/lib/server/decisioning/list-helpers.mjs +11 -2
- package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/manifest-helpers.d.mts +5 -3
- package/dist/lib/server/decisioning/manifest-helpers.d.ts +5 -3
- package/dist/lib/server/decisioning/manifest-helpers.d.ts.map +1 -1
- package/dist/lib/server/decisioning/manifest-helpers.js.map +1 -1
- package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/dispatch.d.mts +2 -2
- package/dist/lib/server/decisioning/proposal/dispatch.d.ts +2 -2
- package/dist/lib/server/decisioning/proposal/dispatch.d.ts.map +1 -1
- package/dist/lib/server/decisioning/proposal/dispatch.js.map +1 -1
- package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/index.d.mts +1 -1
- package/dist/lib/server/decisioning/proposal/index.d.ts +1 -1
- package/dist/lib/server/decisioning/proposal/index.d.ts.map +1 -1
- package/dist/lib/server/decisioning/proposal/index.js.map +1 -1
- package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/lifecycle.d.mts +3 -2
- package/dist/lib/server/decisioning/proposal/lifecycle.d.ts +3 -2
- package/dist/lib/server/decisioning/proposal/lifecycle.d.ts.map +1 -1
- package/dist/lib/server/decisioning/proposal/lifecycle.js.map +1 -1
- package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/mock-manager.d.mts +3 -3
- package/dist/lib/server/decisioning/proposal/mock-manager.d.ts +3 -3
- package/dist/lib/server/decisioning/proposal/mock-manager.d.ts.map +1 -1
- package/dist/lib/server/decisioning/proposal/mock-manager.js.map +1 -1
- package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/types.d.mts +10 -6
- package/dist/lib/server/decisioning/proposal/types.d.ts +10 -6
- package/dist/lib/server/decisioning/proposal/types.d.ts.map +1 -1
- package/dist/lib/server/decisioning/proposal/types.js.map +1 -1
- package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.d.mts +21 -2
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts +21 -2
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.js +754 -81
- package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +763 -81
- package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
- package/dist/lib/server/decisioning/specialisms/brand-rights.d.mts +9 -9
- package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts +9 -9
- package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts.map +1 -1
- package/dist/lib/server/decisioning/specialisms/brand-rights.js.map +1 -1
- package/dist/lib/server/decisioning/specialisms/content-standards.d.mts +16 -16
- package/dist/lib/server/decisioning/specialisms/content-standards.d.ts +16 -16
- package/dist/lib/server/decisioning/specialisms/content-standards.d.ts.map +1 -1
- package/dist/lib/server/decisioning/specialisms/content-standards.js.map +1 -1
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.mts +15 -13
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts +15 -13
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts.map +1 -1
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.js.map +1 -1
- package/dist/lib/server/decisioning/specialisms/creative.d.mts +12 -11
- package/dist/lib/server/decisioning/specialisms/creative.d.ts +12 -11
- package/dist/lib/server/decisioning/specialisms/creative.d.ts.map +1 -1
- package/dist/lib/server/decisioning/specialisms/creative.js.map +1 -1
- package/dist/lib/server/decisioning/specialisms/sales.d.mts +25 -15
- package/dist/lib/server/decisioning/specialisms/sales.d.ts +25 -15
- package/dist/lib/server/decisioning/specialisms/sales.d.ts.map +1 -1
- package/dist/lib/server/decisioning/specialisms/sales.js.map +1 -1
- package/dist/lib/server/index.d.mts +3 -3
- package/dist/lib/server/index.d.ts +3 -3
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +72 -72
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/index.mjs +36 -36
- package/dist/lib/server/index.mjs.map +1 -1
- package/dist/lib/server/legacy/v5/index.d.mts +1 -0
- package/dist/lib/server/legacy/v5/index.d.ts +1 -0
- package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
- package/dist/lib/server/legacy/v5/index.js +74 -1
- package/dist/lib/server/legacy/v5/index.js.map +1 -1
- package/dist/lib/server/legacy/v5/index.mjs +75 -1
- package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
- package/dist/lib/server/responses.d.mts +2 -2
- package/dist/lib/server/responses.d.ts +2 -2
- package/dist/lib/server/responses.js.map +1 -1
- package/dist/lib/server/responses.mjs.map +1 -1
- package/dist/lib/testing/client.d.ts.map +1 -1
- package/dist/lib/testing/client.js +13 -5
- package/dist/lib/testing/client.js.map +1 -1
- package/dist/lib/testing/client.mjs +13 -5
- package/dist/lib/testing/client.mjs.map +1 -1
- package/dist/lib/testing/compliance/comply.d.mts +1 -1
- package/dist/lib/testing/compliance/comply.d.ts +1 -1
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
- package/dist/lib/testing/compliance/comply.js +16 -6
- package/dist/lib/testing/compliance/comply.js.map +1 -1
- package/dist/lib/testing/compliance/comply.mjs +16 -6
- package/dist/lib/testing/compliance/comply.mjs.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.js +6 -6
- package/dist/lib/testing/scenarios/brand-rights.js.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.mjs +6 -6
- package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
- package/dist/lib/testing/scenarios/creative.js +7 -7
- package/dist/lib/testing/scenarios/creative.js.map +1 -1
- package/dist/lib/testing/scenarios/creative.mjs +7 -7
- package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
- package/dist/lib/testing/scenarios/discovery.js +2 -2
- package/dist/lib/testing/scenarios/discovery.js.map +1 -1
- package/dist/lib/testing/scenarios/discovery.mjs +2 -2
- package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
- package/dist/lib/testing/scenarios/edge-cases.js +11 -11
- package/dist/lib/testing/scenarios/edge-cases.js.map +1 -1
- package/dist/lib/testing/scenarios/edge-cases.mjs +11 -11
- package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
- package/dist/lib/testing/scenarios/governance.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/governance.js +16 -22
- package/dist/lib/testing/scenarios/governance.js.map +1 -1
- package/dist/lib/testing/scenarios/governance.mjs +16 -22
- package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.js +5 -5
- package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.mjs +5 -5
- package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.js +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.js.map +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.mjs +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/trusted-match.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/trusted-match.js +4 -3
- package/dist/lib/testing/scenarios/trusted-match.js.map +1 -1
- package/dist/lib/testing/scenarios/trusted-match.mjs +4 -3
- package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
- package/dist/lib/testing/storyboard/probes.d.mts +6 -0
- package/dist/lib/testing/storyboard/probes.d.ts +6 -0
- package/dist/lib/testing/storyboard/probes.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/probes.js +16 -5
- package/dist/lib/testing/storyboard/probes.js.map +1 -1
- package/dist/lib/testing/storyboard/probes.mjs +16 -5
- package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +6 -2
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.mjs +6 -2
- package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
- package/dist/lib/testing/storyboard/shape-drift-hints.d.mts +3 -4
- package/dist/lib/testing/storyboard/shape-drift-hints.d.ts +3 -4
- package/dist/lib/testing/storyboard/shape-drift-hints.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/shape-drift-hints.js +27 -27
- package/dist/lib/testing/storyboard/shape-drift-hints.js.map +1 -1
- package/dist/lib/testing/storyboard/shape-drift-hints.mjs +27 -27
- package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/task-map.js +43 -5
- package/dist/lib/testing/storyboard/task-map.js.map +1 -1
- package/dist/lib/testing/storyboard/task-map.mjs +43 -5
- package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
- package/dist/lib/testing/test-helpers.d.mts +2 -2
- package/dist/lib/testing/test-helpers.d.ts +2 -2
- package/dist/lib/testing/test-helpers.js.map +1 -1
- package/dist/lib/testing/test-helpers.mjs.map +1 -1
- package/dist/lib/testing/types.d.mts +7 -1
- package/dist/lib/testing/types.d.ts +7 -1
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/testing/types.js.map +1 -1
- package/dist/lib/types/adcp.d.mts +14 -14
- package/dist/lib/types/adcp.d.ts +14 -14
- package/dist/lib/types/adcp.d.ts.map +1 -1
- package/dist/lib/types/adcp.js.map +1 -1
- package/dist/lib/types/adcp.mjs.map +1 -1
- package/dist/lib/types/index.d.mts +2 -2
- package/dist/lib/types/index.d.ts +2 -2
- package/dist/lib/types/index.d.ts.map +1 -1
- package/dist/lib/types/index.js.map +1 -1
- package/dist/lib/types/index.mjs.map +1 -1
- package/dist/lib/utils/capabilities.d.mts +6 -0
- package/dist/lib/utils/capabilities.d.ts +6 -0
- package/dist/lib/utils/capabilities.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.js +4 -0
- package/dist/lib/utils/capabilities.js.map +1 -1
- package/dist/lib/utils/capabilities.mjs +4 -0
- package/dist/lib/utils/capabilities.mjs.map +1 -1
- package/dist/lib/utils/creative-delivery.d.mts +52 -10
- package/dist/lib/utils/creative-delivery.d.ts +52 -10
- package/dist/lib/utils/creative-delivery.d.ts.map +1 -1
- package/dist/lib/utils/creative-delivery.js +104 -9
- package/dist/lib/utils/creative-delivery.js.map +1 -1
- package/dist/lib/utils/creative-delivery.mjs +104 -8
- package/dist/lib/utils/creative-delivery.mjs.map +1 -1
- package/dist/lib/utils/format-assets.d.mts +41 -38
- package/dist/lib/utils/format-assets.d.ts +41 -38
- package/dist/lib/utils/format-assets.d.ts.map +1 -1
- package/dist/lib/utils/format-assets.js +3 -1
- package/dist/lib/utils/format-assets.js.map +1 -1
- package/dist/lib/utils/format-assets.mjs +3 -1
- package/dist/lib/utils/format-assets.mjs.map +1 -1
- package/dist/lib/utils/index.d.mts +8 -8
- package/dist/lib/utils/index.d.ts +8 -8
- package/dist/lib/utils/index.d.ts.map +1 -1
- package/dist/lib/utils/index.js +11 -9
- package/dist/lib/utils/index.js.map +1 -1
- package/dist/lib/utils/index.mjs +9 -8
- package/dist/lib/utils/index.mjs.map +1 -1
- package/dist/lib/utils/preview-utils.d.mts +11 -8
- package/dist/lib/utils/preview-utils.d.ts +11 -8
- package/dist/lib/utils/preview-utils.d.ts.map +1 -1
- package/dist/lib/utils/preview-utils.js +4 -4
- package/dist/lib/utils/preview-utils.js.map +1 -1
- package/dist/lib/utils/preview-utils.mjs +3 -3
- package/dist/lib/utils/preview-utils.mjs.map +1 -1
- package/dist/lib/utils/tool-request-schemas.d.mts +2 -2
- package/dist/lib/utils/tool-request-schemas.d.ts +2 -2
- package/dist/lib/v2/projection/aao-reference-formats.json +492 -0
- package/dist/lib/v2/projection/augment-response.d.mts +31 -11
- package/dist/lib/v2/projection/augment-response.d.ts +31 -11
- package/dist/lib/v2/projection/augment-response.d.ts.map +1 -1
- package/dist/lib/v2/projection/augment-response.js +233 -27
- package/dist/lib/v2/projection/augment-response.js.map +1 -1
- package/dist/lib/v2/projection/augment-response.mjs +232 -27
- package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
- package/dist/lib/v2/projection/builders.d.mts +7 -6
- package/dist/lib/v2/projection/builders.d.ts +7 -6
- package/dist/lib/v2/projection/builders.d.ts.map +1 -1
- package/dist/lib/v2/projection/builders.js +11 -8
- package/dist/lib/v2/projection/builders.js.map +1 -1
- package/dist/lib/v2/projection/builders.mjs +9 -6
- package/dist/lib/v2/projection/builders.mjs.map +1 -1
- package/dist/lib/v2/projection/catalog-snapshot.d.mts +47 -0
- package/dist/lib/v2/projection/catalog-snapshot.d.ts +48 -0
- package/dist/lib/v2/projection/catalog-snapshot.d.ts.map +1 -0
- package/dist/lib/v2/projection/catalog-snapshot.js +291 -0
- package/dist/lib/v2/projection/catalog-snapshot.js.map +1 -0
- package/dist/lib/v2/projection/catalog-snapshot.mjs +265 -0
- package/dist/lib/v2/projection/catalog-snapshot.mjs.map +1 -0
- package/dist/lib/v2/projection/catalog.d.mts +23 -2
- package/dist/lib/v2/projection/catalog.d.ts +23 -2
- package/dist/lib/v2/projection/catalog.d.ts.map +1 -1
- package/dist/lib/v2/projection/catalog.js +34 -10
- package/dist/lib/v2/projection/catalog.js.map +1 -1
- package/dist/lib/v2/projection/catalog.mjs +33 -10
- package/dist/lib/v2/projection/catalog.mjs.map +1 -1
- package/dist/lib/v2/projection/creative-delivery.d.mts +157 -0
- package/dist/lib/v2/projection/creative-delivery.d.ts +158 -0
- package/dist/lib/v2/projection/creative-delivery.d.ts.map +1 -0
- package/dist/lib/v2/projection/creative-delivery.js +967 -0
- package/dist/lib/v2/projection/creative-delivery.js.map +1 -0
- package/dist/lib/v2/projection/creative-delivery.mjs +941 -0
- package/dist/lib/v2/projection/creative-delivery.mjs.map +1 -0
- package/dist/lib/v2/projection/index.d.mts +8 -6
- package/dist/lib/v2/projection/index.d.ts +8 -6
- package/dist/lib/v2/projection/index.d.ts.map +1 -1
- package/dist/lib/v2/projection/index.js +26 -4
- package/dist/lib/v2/projection/index.js.map +1 -1
- package/dist/lib/v2/projection/index.mjs +28 -4
- package/dist/lib/v2/projection/index.mjs.map +1 -1
- package/dist/lib/v2/projection/legacy-metadata.d.mts +21 -0
- package/dist/lib/v2/projection/legacy-metadata.d.ts +22 -0
- package/dist/lib/v2/projection/legacy-metadata.d.ts.map +1 -0
- package/dist/lib/v2/projection/legacy-metadata.js +73 -0
- package/dist/lib/v2/projection/legacy-metadata.js.map +1 -0
- package/dist/lib/v2/projection/legacy-metadata.mjs +45 -0
- package/dist/lib/v2/projection/legacy-metadata.mjs.map +1 -0
- package/dist/lib/v2/projection/types.d.mts +29 -23
- package/dist/lib/v2/projection/types.d.ts +29 -23
- package/dist/lib/v2/projection/types.d.ts.map +1 -1
- package/dist/lib/v2/projection/types.js.map +1 -1
- package/dist/lib/v2/projection/v1-to-v2.d.mts +29 -6
- package/dist/lib/v2/projection/v1-to-v2.d.ts +29 -6
- package/dist/lib/v2/projection/v1-to-v2.d.ts.map +1 -1
- package/dist/lib/v2/projection/v1-to-v2.js +218 -9
- package/dist/lib/v2/projection/v1-to-v2.js.map +1 -1
- package/dist/lib/v2/projection/v1-to-v2.mjs +219 -10
- package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
- package/dist/lib/v2/projection/v2-to-v1.d.mts +31 -2
- package/dist/lib/v2/projection/v2-to-v1.d.ts +31 -2
- package/dist/lib/v2/projection/v2-to-v1.d.ts.map +1 -1
- package/dist/lib/v2/projection/v2-to-v1.js +138 -7
- package/dist/lib/v2/projection/v2-to-v1.js.map +1 -1
- package/dist/lib/v2/projection/v2-to-v1.mjs +135 -6
- package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
- package/dist/lib/v2/projection/write-side.d.mts +12 -13
- package/dist/lib/v2/projection/write-side.d.ts +12 -13
- package/dist/lib/v2/projection/write-side.d.ts.map +1 -1
- package/dist/lib/v2/projection/write-side.js +16 -12
- package/dist/lib/v2/projection/write-side.js.map +1 -1
- package/dist/lib/v2/projection/write-side.mjs +16 -12
- package/dist/lib/v2/projection/write-side.mjs.map +1 -1
- package/dist/lib/version.d.mts +3 -3
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/dist/lib/version.mjs +3 -3
- package/dist/lib/version.mjs.map +1 -1
- package/docs/guides/BUILD-AN-AGENT.md +7 -2
- package/docs/guides/PREVIEW-ASSET-DURABILITY.md +6 -2
- package/docs/llms.txt +1 -0
- package/examples/README.md +1 -1
- package/examples/batch-preview-test.ts +3 -3
- package/examples/conversation-client.ts +2 -2
- package/examples/debug-preview-response.ts +1 -1
- package/examples/decisioning-platform-broadcast-tv.ts +10 -4
- package/examples/decisioning-platform-mock-seller.ts +16 -9
- package/examples/decisioning-platform-programmatic.ts +18 -7
- package/examples/error-compliant-server.ts +26 -16
- package/examples/generative-creative-demo.ts +7 -19
- package/examples/hello_creative_adapter_ad_server.ts +37 -16
- package/examples/hello_creative_adapter_template.ts +12 -10
- package/examples/hello_seller_adapter_guaranteed.ts +52 -23
- package/examples/hello_seller_adapter_multi_tenant.ts +6 -3
- package/examples/hello_seller_adapter_non_guaranteed.ts +54 -26
- package/examples/hello_seller_adapter_proposal_mode.ts +40 -14
- package/examples/hello_seller_adapter_social.ts +2 -7
- package/examples/inspect-card-formats.ts +1 -1
- package/examples/simple-getting-started.ts +1 -1
- package/examples/test-helpers-demo.ts +1 -1
- package/package.json +2 -2
- package/skills/build-decisioning-creative-template/SKILL.md +11 -11
- package/skills/build-decisioning-platform/advanced/REFERENCE.md +8 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/testing/scenarios/governance.ts"],"sourcesContent":["/**\n * Governance Protocol Testing Scenarios (v3)\n *\n * Tests governance agent capabilities including:\n * - Property list CRUD operations\n * - Content standards management\n * - Content calibration\n * - Delivery validation\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile } from '../client';\nimport { GOVERNANCE_TOOLS } from '../../utils/capabilities';\nimport { GovernanceAgentStub } from '../stubs';\nimport { callMCPTool } from '../../protocols/mcp';\nimport type {\n CreatePropertyListRequest,\n CreatePropertyListResponse,\n GetPropertyListRequest,\n GetPropertyListResponse,\n UpdatePropertyListRequest,\n UpdatePropertyListResponse,\n ListPropertyListsRequest,\n ListPropertyListsResponse,\n DeletePropertyListRequest,\n DeletePropertyListResponse,\n ListContentStandardsRequest,\n ListContentStandardsResponse,\n GetContentStandardsRequest,\n CalibrateContentRequest,\n ValidateContentDeliveryRequest,\n ContentStandards,\n PropertyList,\n} from '../../types/tools.generated';\nimport { setAtPath } from '../../core/GovernanceMiddleware';\n\n// Property list tools\nconst PROPERTY_LIST_TOOLS = [\n 'create_property_list',\n 'get_property_list',\n 'update_property_list',\n 'list_property_lists',\n 'delete_property_list',\n] as const;\n\n// Content standards tools\nconst CONTENT_STANDARDS_TOOLS = [\n 'list_content_standards',\n 'get_content_standards',\n 'create_content_standards',\n 'update_content_standards',\n 'calibrate_content',\n 'validate_content_delivery',\n] as const;\n\n/**\n * Test: Governance Property Lists\n *\n * Flow: create_property_list -> get_property_list -> update_property_list\n * -> list_property_lists -> delete_property_list -> verify deletion\n */\nexport async function testGovernancePropertyLists(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // Check if agent supports any property list tools\n const hasPropertyListTools = PROPERTY_LIST_TOOLS.some(t => profile.tools.includes(t));\n if (!hasPropertyListTools) {\n steps.push({\n step: 'Property list support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support property list tools (governance protocol)',\n details: `Required tools: ${PROPERTY_LIST_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n let createdListId: string | undefined;\n let authToken: string | undefined;\n\n // Test: create_property_list\n if (profile.tools.includes('create_property_list')) {\n const listName = options.property_list_name || `E2E Test List ${Date.now()}`;\n const { result, step } = await runStep<TaskResult>(\n 'Create property list',\n 'create_property_list',\n async () =>\n client.createPropertyList({\n name: listName,\n description: 'E2E test property list for governance testing',\n base_properties: {\n include: [\n { identifier_type: 'domain', identifier_value: 'example.com' },\n { identifier_type: 'domain', identifier_value: 'test.example' },\n ],\n },\n filters: {\n garm_categories: {\n exclude: ['adult', 'arms'],\n },\n mfa_thresholds: {\n min_score: 0.7,\n },\n },\n brand_manifest: options.brand_manifest || {\n name: 'E2E Test Brand',\n url: 'https://test.example',\n },\n } as unknown as CreatePropertyListRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as CreatePropertyListResponse;\n createdListId = data.list?.list_id;\n authToken = data.auth_token;\n step.created_id = createdListId;\n step.details = `Created list: ${createdListId}`;\n step.response_preview = JSON.stringify(\n {\n list_id: createdListId,\n name: data.list?.name || listName,\n has_auth_token: !!authToken,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'create_property_list failed';\n }\n steps.push(step);\n }\n\n // Test: get_property_list\n if (profile.tools.includes('get_property_list') && createdListId) {\n const { result, step } = await runStep<TaskResult>(\n 'Get property list',\n 'get_property_list',\n async () =>\n client.getPropertyList({\n list_id: createdListId,\n resolve: true,\n max_results: 10,\n } as unknown as GetPropertyListRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as GetPropertyListResponse;\n const dataRecord = result.data as unknown as Record<string, unknown>;\n step.details = `Retrieved list with ${dataRecord.total_count || 0} properties`;\n step.response_preview = JSON.stringify(\n {\n list_id: data.list?.list_id,\n name: data.list?.name,\n property_count: dataRecord.total_count,\n has_identifiers: !!data.identifiers?.length,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'get_property_list failed';\n }\n steps.push(step);\n }\n\n // Test: update_property_list\n if (profile.tools.includes('update_property_list') && createdListId) {\n const { result, step } = await runStep<TaskResult>(\n 'Update property list',\n 'update_property_list',\n async () =>\n client.updatePropertyList({\n list_id: createdListId,\n auth_token: authToken,\n description: 'Updated E2E test property list',\n base_properties: {\n include: [\n { identifier_type: 'domain', identifier_value: 'example.com' },\n { identifier_type: 'domain', identifier_value: 'test.example' },\n { identifier_type: 'domain', identifier_value: 'new.example' },\n ],\n },\n filters: {\n garm_categories: {\n exclude: ['adult', 'arms', 'gambling'],\n },\n mfa_thresholds: {\n min_score: 0.8,\n },\n },\n } as unknown as UpdatePropertyListRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as UpdatePropertyListResponse;\n step.details = 'Property list updated successfully';\n step.response_preview = JSON.stringify(\n {\n list_id: data.list?.list_id,\n updated_at: data.list?.updated_at,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'update_property_list failed';\n }\n steps.push(step);\n }\n\n // Test: list_property_lists\n if (profile.tools.includes('list_property_lists')) {\n const { result, step } = await runStep<TaskResult>(\n 'List property lists',\n 'list_property_lists',\n async () =>\n client.listPropertyLists({\n max_results: 10,\n } as unknown as ListPropertyListsRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as ListPropertyListsResponse;\n const dataRecord = result.data as unknown as Record<string, unknown>;\n const lists: PropertyList[] = data.lists || [];\n step.details = `Found ${lists.length} property list(s)`;\n step.response_preview = JSON.stringify(\n {\n total_count: dataRecord.total_count,\n returned_count: dataRecord.returned_count || lists.length,\n lists: lists.slice(0, 3).map((l: PropertyList) => ({\n list_id: l.list_id,\n name: l.name,\n })),\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'list_property_lists failed';\n }\n steps.push(step);\n }\n\n // Test: delete_property_list\n if (profile.tools.includes('delete_property_list') && createdListId) {\n const { result, step } = await runStep<TaskResult>(\n 'Delete property list',\n 'delete_property_list',\n async () =>\n client.deletePropertyList({\n list_id: createdListId,\n auth_token: authToken,\n } as unknown as DeletePropertyListRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as DeletePropertyListResponse;\n step.details = data.deleted ? 'Property list deleted' : 'Deletion returned but not confirmed';\n step.response_preview = JSON.stringify(\n {\n deleted: data.deleted,\n list_id: data.list_id,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'delete_property_list failed';\n }\n steps.push(step);\n\n // Test: get deleted list (should fail)\n if (profile.tools.includes('get_property_list')) {\n const { result: errorResult, step: errorStep } = await runStep<TaskResult>(\n 'Get deleted list (error expected)',\n 'get_property_list',\n async () =>\n client.getPropertyList({\n list_id: createdListId,\n } as unknown as GetPropertyListRequest) as Promise<TaskResult>\n );\n\n if (errorResult?.success) {\n errorStep.passed = false;\n errorStep.error = 'Expected error for deleted list but got success';\n } else {\n errorStep.passed = true;\n errorStep.details = 'Correctly rejected deleted list access';\n }\n steps.push(errorStep);\n }\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Governance Content Standards\n *\n * Flow: list_content_standards -> get_content_standards -> calibrate_content\n * -> validate_content_delivery\n */\nexport async function testGovernanceContentStandards(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // Check if agent supports any content standards tools\n const hasContentStandardsTools = CONTENT_STANDARDS_TOOLS.some(t => profile.tools.includes(t));\n if (!hasContentStandardsTools) {\n steps.push({\n step: 'Content standards support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support content standards tools (governance protocol)',\n details: `Required tools: ${CONTENT_STANDARDS_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n let discoveredStandardsId: string | undefined;\n\n // Test: list_content_standards\n if (profile.tools.includes('list_content_standards')) {\n const { result, step } = await runStep<TaskResult>(\n 'List content standards',\n 'list_content_standards',\n async () =>\n client.listContentStandards({\n context: 'E2E testing - list available brand safety configurations',\n max_results: 10,\n } as unknown as ListContentStandardsRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as ListContentStandardsResponse;\n const standards: ContentStandards[] = 'standards' in data ? data.standards : [];\n if (standards.length > 0) {\n discoveredStandardsId = standards[0]!.standards_id;\n }\n step.details = `Found ${standards.length} content standard(s)`;\n step.response_preview = JSON.stringify(\n {\n standards_count: standards.length,\n sample_standards: standards.slice(0, 3).map((s: ContentStandards) => ({\n standards_id: s.standards_id,\n name: s.name,\n provider: (s as unknown as Record<string, unknown>).provider,\n })),\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n // Not all agents support content standards, so treat missing support as passing\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'Content standards not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'list_content_standards failed';\n }\n }\n steps.push(step);\n }\n\n // Test: get_content_standards (if we found one)\n const standardsIdToTest = options.content_standards_id || discoveredStandardsId;\n if (profile.tools.includes('get_content_standards') && standardsIdToTest) {\n const { result, step } = await runStep<TaskResult>(\n 'Get content standards',\n 'get_content_standards',\n async () =>\n client.getContentStandards({\n standards_id: standardsIdToTest,\n } as unknown as GetContentStandardsRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as unknown as Record<string, unknown>;\n // Response may be a ContentStandards directly or wrapped in { standards: ... }\n const standards = (data.standards as unknown as Record<string, unknown> | undefined) || data;\n step.details = `Retrieved standards: ${String(standards.name || standardsIdToTest)}`;\n step.response_preview = JSON.stringify(\n {\n standards_id: standards.standards_id,\n name: standards.name,\n features_count: Array.isArray(standards.features) ? standards.features.length : 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'get_content_standards failed';\n }\n steps.push(step);\n }\n\n // Test: calibrate_content\n if (profile.tools.includes('calibrate_content')) {\n const { result, step } = await runStep<TaskResult>(\n 'Calibrate content',\n 'calibrate_content',\n async () =>\n client.calibrateContent({\n context: 'E2E testing - evaluate sample content for brand safety',\n standards_id: standardsIdToTest,\n artifacts: [\n {\n artifact_id: 'test-artifact-1',\n artifact_type: 'webpage',\n url: 'https://example.com/article/safe-content',\n title: 'Safe Test Article',\n },\n {\n artifact_id: 'test-artifact-2',\n artifact_type: 'webpage',\n url: 'https://example.com/article/test-content',\n title: 'Another Test Article',\n },\n ],\n feedback_type: 'binary',\n } as unknown as CalibrateContentRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as unknown as Record<string, unknown>;\n step.details = `Calibration session: ${String(data.session_status || 'completed')}`;\n step.response_preview = JSON.stringify(\n {\n session_id: data.session_id,\n session_status: data.session_status,\n pending_artifacts: Array.isArray(data.pending_artifacts) ? data.pending_artifacts.length : 0,\n evaluated_artifacts: Array.isArray(data.evaluated_artifacts) ? data.evaluated_artifacts.length : 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'Content calibration not supported by this agent';\n } else {\n step.passed = false;\n step.error = result.error || 'calibrate_content failed';\n }\n }\n steps.push(step);\n }\n\n // Test: validate_content_delivery\n if (profile.tools.includes('validate_content_delivery')) {\n const { result, step } = await runStep<TaskResult>(\n 'Validate content delivery',\n 'validate_content_delivery',\n async () =>\n client.validateContentDelivery({\n context: 'E2E testing - validate delivery records against content standards',\n standards_id: standardsIdToTest,\n records: [\n {\n record_id: 'test-record-1',\n artifact: {\n artifact_id: 'test-artifact-1',\n artifact_type: 'webpage',\n url: 'https://example.com/article/delivered-content',\n },\n delivered_at: new Date().toISOString(),\n },\n ],\n } as unknown as ValidateContentDeliveryRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as unknown as Record<string, unknown>;\n const summary = data.summary as unknown as Record<string, unknown> | undefined;\n step.details = `Validated ${summary?.total_records || 0} record(s)`;\n step.response_preview = JSON.stringify(\n {\n total_records: summary?.total_records,\n passed_records: summary?.passed_records,\n failed_records: summary?.failed_records,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'Content delivery validation not supported by this agent';\n } else {\n step.passed = false;\n step.error = result.error || 'validate_content_delivery failed';\n }\n }\n steps.push(step);\n }\n\n // Test: get_content_standards with invalid ID (error expected)\n if (profile.tools.includes('get_content_standards')) {\n const { result: errorResult, step: errorStep } = await runStep<TaskResult>(\n 'Get invalid content standards (error expected)',\n 'get_content_standards',\n async () =>\n client.getContentStandards({\n standards_id: 'INVALID_STANDARDS_ID_DOES_NOT_EXIST_12345',\n }) as Promise<TaskResult>\n );\n\n if (errorResult?.success) {\n errorStep.passed = false;\n errorStep.error = 'Expected error for invalid standards_id but got success';\n } else {\n errorStep.passed = true;\n errorStep.details = 'Correctly rejected invalid standards_id';\n }\n steps.push(errorStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Property List Filters\n *\n * Creates a property list with all filter types populated, retrieves it with\n * resolve:true, and validates the filters round-trip correctly.\n *\n * Filter types tested:\n * - garm_categories (exclude)\n * - mfa_thresholds (min_score)\n * - custom_tags (include/exclude)\n * - feature_requirements (conditional on get_adcp_capabilities)\n */\nexport async function testPropertyListFilters(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n const hasRequired = profile.tools.includes('create_property_list') && profile.tools.includes('get_property_list');\n if (!hasRequired) {\n steps.push({\n step: 'Property list filter support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent requires create_property_list + get_property_list for filter testing',\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n\n // Optionally discover feature IDs from get_adcp_capabilities\n let featureRequirements: unknown[] | undefined;\n if (profile.tools.includes('get_adcp_capabilities')) {\n const { result: capResult, step: capStep } = await runStep<TaskResult>(\n 'Discover available features (for feature_requirements filter)',\n 'get_adcp_capabilities',\n async () => client.getAdcpCapabilities({}) as Promise<TaskResult>\n );\n if (capResult?.success && capResult?.data) {\n const capData = capResult.data as unknown as Record<string, unknown>;\n const mediaBuy = capData.media_buy as unknown as Record<string, unknown> | undefined;\n const rawFeatures = mediaBuy?.features;\n if (rawFeatures && typeof rawFeatures === 'object') {\n // Use boolean feature keys as feature_ids (agents that support dynamic features will have IDs)\n const featuresRecord = rawFeatures as Record<string, unknown>;\n const featureIds = Object.keys(featuresRecord).filter(k => featuresRecord[k] === true);\n if (featureIds.length > 0) {\n featureRequirements = featureIds.map(id => ({\n feature_id: id,\n allowed_values: [true],\n if_not_covered: 'exclude',\n }));\n capStep.details = `Found ${featureIds.length} feature(s) for filter testing: ${featureIds.join(', ')}`;\n } else {\n capStep.details = 'No active features found; skipping feature_requirements filter';\n }\n } else {\n capStep.details = 'get_adcp_capabilities returned no feature data; skipping feature_requirements filter';\n }\n }\n steps.push(capStep);\n }\n\n // Build filter object with all supported types\n const filters: Record<string, unknown> = {\n garm_categories: {\n exclude: ['adult', 'arms', 'gambling', 'hate_speech'],\n },\n mfa_thresholds: {\n min_score: 0.75,\n },\n custom_tags: {\n include: [{ key: 'content_type', value: 'premium' }],\n exclude: [{ key: 'content_type', value: 'user_generated' }],\n },\n };\n\n if (featureRequirements) {\n filters.feature_requirements = featureRequirements;\n }\n\n let createdListId: string | undefined;\n let authToken: string | undefined;\n\n // Create property list with all filters\n const listName = `E2E Filter Test ${Date.now()}`;\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Create property list with all filter types',\n 'create_property_list',\n async () =>\n client.createPropertyList({\n name: listName,\n description: 'E2E filter round-trip test',\n base_properties: {\n include: [{ identifier_type: 'domain', identifier_value: 'example.com' }],\n },\n filters,\n brand_manifest: options.brand_manifest || {\n name: 'E2E Test Brand',\n url: 'https://test.example',\n },\n } as unknown as CreatePropertyListRequest) as Promise<TaskResult>\n );\n\n if (createResult?.success && createResult?.data) {\n const data = createResult.data as CreatePropertyListResponse;\n createdListId = data.list?.list_id;\n authToken = data.auth_token;\n createStep.created_id = createdListId;\n createStep.details = `Created list: ${createdListId} with ${Object.keys(filters).length} filter type(s)`;\n } else if (createResult && !createResult.success) {\n createStep.passed = false;\n createStep.error = createResult.error || 'create_property_list failed';\n }\n steps.push(createStep);\n\n if (!createdListId) {\n return { steps, profile };\n }\n\n // Retrieve with resolve:true and validate filter round-trip\n const { result: getResult, step: getStep } = await runStep<TaskResult>(\n 'Get property list (resolve: true, validate filter round-trip)',\n 'get_property_list',\n async () =>\n client.getPropertyList({\n list_id: createdListId,\n resolve: true,\n max_results: 5,\n } as unknown as GetPropertyListRequest) as Promise<TaskResult>\n );\n\n if (getResult?.success && getResult?.data) {\n const data = getResult.data as GetPropertyListResponse;\n const returnedFilters = data.list?.filters as unknown as Record<string, unknown> | undefined;\n const issues: string[] = [];\n\n if (returnedFilters) {\n const garmCategories = returnedFilters.garm_categories as unknown as Record<string, unknown> | undefined;\n if (!Array.isArray(garmCategories?.exclude) || !garmCategories.exclude.length) {\n issues.push('garm_categories.exclude not preserved');\n }\n const mfaThresholds = returnedFilters.mfa_thresholds as unknown as Record<string, unknown> | undefined;\n if (mfaThresholds?.min_score !== 0.75) {\n issues.push(`mfa_thresholds.min_score mismatch: got ${mfaThresholds?.min_score}, expected 0.75`);\n }\n if (!returnedFilters.custom_tags) {\n issues.push('custom_tags filter not preserved');\n }\n const featureReqs = returnedFilters.feature_requirements;\n if (featureRequirements && !(Array.isArray(featureReqs) && featureReqs.length)) {\n issues.push('feature_requirements filter not preserved');\n }\n } else {\n issues.push('filters object missing from get_property_list response');\n }\n\n getStep.passed = issues.length === 0;\n getStep.details =\n issues.length === 0\n ? `All ${Object.keys(filters).length} filter types round-tripped correctly`\n : `Filter round-trip issues: ${issues.join('; ')}`;\n getStep.error = issues.length > 0 ? issues.join('; ') : undefined;\n getStep.response_preview = JSON.stringify(\n {\n list_id: data.list?.list_id,\n filters_returned: returnedFilters ? Object.keys(returnedFilters) : [],\n round_trip_issues: issues,\n },\n null,\n 2\n );\n } else if (getResult && !getResult.success) {\n getStep.passed = false;\n getStep.error = getResult.error || 'get_property_list failed';\n }\n steps.push(getStep);\n\n // Cleanup\n if (profile.tools.includes('delete_property_list')) {\n const { result: delResult, step: delStep } = await runStep<TaskResult>(\n 'Delete test property list (cleanup)',\n 'delete_property_list',\n async () =>\n client.deletePropertyList({\n list_id: createdListId,\n auth_token: authToken,\n } as unknown as DeletePropertyListRequest) as Promise<TaskResult>\n );\n if (delResult?.success) {\n delStep.details = 'Test list cleaned up';\n }\n steps.push(delStep);\n } else if (!profile.tools.includes('delete_property_list')) {\n steps.push({\n step: 'Delete test property list (cleanup)',\n passed: true,\n duration_ms: 0,\n details: `Skipped — agent does not advertise delete_property_list. Test list ${createdListId} may remain.`,\n warnings: [\n `Test list ${createdListId} was created but cannot be cleaned up (delete_property_list not available)`,\n ],\n });\n }\n\n return { steps, profile };\n}\n\n// Campaign governance tools\nconst CAMPAIGN_GOVERNANCE_TOOLS = [\n 'sync_plans',\n 'check_governance',\n 'report_plan_outcome',\n 'get_plan_audit_logs',\n] as const;\n\n/**\n * Test: Campaign Governance - Full Lifecycle\n *\n * Flow: sync_plans -> check_governance(proposed, approved) -> create_media_buy\n * -> report_plan_outcome(completed)\n *\n * Tests the happy path: buyer syncs a plan, gets approval, executes,\n * and reports the outcome back to the governance agent.\n */\nexport async function testCampaignGovernance(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // Check if agent supports campaign governance tools\n const hasCampaignGovernance = CAMPAIGN_GOVERNANCE_TOOLS.some(t => profile.tools.includes(t));\n if (!hasCampaignGovernance) {\n steps.push({\n step: 'Campaign governance support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support campaign governance tools',\n details: `Required: at least one of ${CAMPAIGN_GOVERNANCE_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n\n const testPlanId = `test-plan-${Date.now()}`;\n const testMediaBuyId = `test-mb-${Date.now()}`;\n const callerUrl = 'https://test-orchestrator.example';\n const flightStart = new Date();\n const flightEnd = new Date(flightStart.getTime() + 30 * 24 * 60 * 60 * 1000); // 30 days\n\n // Step 1: sync_plans\n if (profile.tools.includes('sync_plans')) {\n const { result, step } = await runStep<TaskResult>(\n 'Sync campaign governance plan',\n 'sync_plans',\n async () =>\n client.executeTask('sync_plans', {\n plans: [\n {\n plan_id: testPlanId,\n brand: options.brand || { domain: 'test.example' },\n objectives: 'E2E test campaign for governance protocol validation',\n budget: {\n total: options.budget || 10000,\n currency: 'USD',\n reallocation_unlimited: true,\n },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n channels: {\n allowed: ['display', 'video'],\n },\n delegations: [\n {\n agent_url: callerUrl,\n authority: 'full',\n },\n ],\n },\n ],\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n const plans = data.plans || [];\n const synced = plans.find((p: any) => p.plan_id === testPlanId);\n if (synced?.status === 'active') {\n step.details = `Plan synced: ${testPlanId}, version ${synced.version}, ${(synced.categories || []).length} categories active`;\n step.response_preview = JSON.stringify(\n {\n plan_id: synced.plan_id,\n status: synced.status,\n version: synced.version,\n categories: synced.categories?.map((c: any) => c.category_id),\n resolved_policies: synced.resolved_policies?.length || 0,\n },\n null,\n 2\n );\n } else {\n step.passed = false;\n step.error = synced\n ? `Plan sync returned status '${synced.status}' instead of 'active'`\n : 'Plan not found in sync response';\n }\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'sync_plans failed';\n }\n steps.push(step);\n }\n\n // Step 2: check_governance (proposed, expecting approved)\n let checkId: string | undefined;\n let governanceContext: string | undefined;\n if (profile.tools.includes('check_governance')) {\n const { result, step } = await runStep<TaskResult>(\n 'Check governance (proposed buy)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n binding: 'proposed',\n caller: callerUrl,\n tool: 'create_media_buy',\n payload: {\n channel: 'display',\n budget: { total: 1000, currency: 'USD' },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n checkId = data.check_id;\n governanceContext = data.governance_context;\n const verdict = data.verdict;\n\n step.details = `Governance check: verdict=${verdict}, binding=${data.binding}, mode=${data.mode || 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n check_id: data.check_id,\n verdict: data.verdict,\n binding: data.binding,\n mode: data.mode,\n explanation: data.explanation,\n findings_count: data.findings?.length || 0,\n expires_at: data.expires_at,\n governance_context: data.governance_context ? '(present)' : '(absent)',\n },\n null,\n 2\n );\n step.observation_data = { governance_context: data.governance_context || null };\n\n // Only spec-valid verdicts are accepted — we're testing the protocol, not the policy\n if (!['approved', 'denied', 'conditions'].includes(verdict)) {\n step.passed = false;\n step.error = `Unexpected governance verdict: ${verdict}`;\n }\n\n // Validate governance_context format if present\n if (governanceContext !== undefined) {\n if (typeof governanceContext !== 'string') {\n step.warnings = [...(step.warnings || []), 'governance_context is not a string'];\n } else if (governanceContext.length > 4096) {\n step.warnings = [\n ...(step.warnings || []),\n `governance_context exceeds 4096 chars (${governanceContext.length})`,\n ];\n }\n }\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'check_governance failed';\n }\n steps.push(step);\n }\n\n // Step 3: report_plan_outcome (completed) — thread governance_context\n if (profile.tools.includes('report_plan_outcome') && checkId) {\n const outcomeRequest: Record<string, unknown> = {\n plan_id: testPlanId,\n check_id: checkId,\n outcome: 'completed',\n governance_context: governanceContext || '',\n seller_response: {\n media_buy_id: testMediaBuyId,\n packages: [\n {\n budget: 1000,\n },\n ],\n },\n };\n\n const { result, step } = await runStep<TaskResult>(\n 'Report plan outcome (completed)',\n 'report_plan_outcome',\n async () => client.executeTask('report_plan_outcome', outcomeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n step.details = `Outcome reported with governance_context=${governanceContext ? 'present' : 'absent'}`;\n step.response_preview = JSON.stringify(result.data, null, 2);\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'report_plan_outcome failed';\n }\n steps.push(step);\n }\n\n // Step 4: get_plan_audit_logs — query by media_buy_id\n if (profile.tools.includes('get_plan_audit_logs')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get plan audit logs',\n 'get_plan_audit_logs',\n async () =>\n client.executeTask('get_plan_audit_logs', {\n plan_ids: [testPlanId],\n media_buy_id: testMediaBuyId,\n include_entries: true,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n step.details = 'Audit logs retrieved';\n step.response_preview = JSON.stringify(\n {\n plans_returned: data.plans?.length || 0,\n has_entries: !!data.plans?.[0]?.entries?.length,\n budget: data.plans?.[0]?.budget,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'get_plan_audit_logs failed';\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Campaign Governance - Denied Flow\n *\n * Sends a check_governance request that should be denied (budget exceeds plan,\n * unauthorized market). Validates that the governance agent returns meaningful\n * findings and explanations.\n */\nexport async function testCampaignGovernanceDenied(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n if (!profile.tools.includes('sync_plans') || !profile.tools.includes('check_governance')) {\n steps.push({\n step: 'Campaign governance denied flow support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent requires sync_plans + check_governance for denied flow testing',\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n\n const testPlanId = `test-denied-plan-${Date.now()}`;\n const callerUrl = 'https://test-orchestrator.example';\n const flightStart = new Date();\n const flightEnd = new Date(flightStart.getTime() + 7 * 24 * 60 * 60 * 1000);\n\n // Sync a restrictive plan: small budget, US only\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n 'Sync restrictive plan (small budget, US only)',\n 'sync_plans',\n async () =>\n client.executeTask('sync_plans', {\n plans: [\n {\n plan_id: testPlanId,\n brand: options.brand || { domain: 'test.example' },\n objectives: 'E2E denial test: budget and geo restrictions',\n budget: {\n total: 500,\n currency: 'USD',\n reallocation_threshold: 100,\n },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n channels: {\n allowed: ['display'],\n },\n },\n ],\n }) as Promise<TaskResult>\n );\n steps.push(syncStep);\n\n if (!syncResult?.success) {\n return { steps, profile };\n }\n\n // Check governance with over-budget request\n const { result: overBudgetResult, step: overBudgetStep } = await runStep<TaskResult>(\n 'Check governance (over-budget, expecting denial or conditions)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n binding: 'proposed',\n caller: callerUrl,\n tool: 'create_media_buy',\n payload: {\n channel: 'display',\n budget: { total: 50000, currency: 'USD' },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n },\n }) as Promise<TaskResult>\n );\n\n let overBudgetGovernanceContext: string | undefined;\n if (overBudgetResult?.success && overBudgetResult?.data) {\n const data = overBudgetResult.data;\n overBudgetGovernanceContext = data.governance_context;\n overBudgetStep.details = `Over-budget check: verdict=${data.verdict}, explanation: ${data.explanation}`;\n overBudgetStep.response_preview = JSON.stringify(\n {\n verdict: data.verdict,\n explanation: data.explanation,\n findings: data.findings?.map((f: any) => ({\n category_id: f.category_id,\n severity: f.severity,\n explanation: f.explanation,\n })),\n conditions: data.conditions,\n governance_context: data.governance_context ? '(present)' : '(absent)',\n },\n null,\n 2\n );\n overBudgetStep.observation_data = { governance_context: data.governance_context || null };\n\n if (data.verdict === 'approved' && data.mode !== 'advisory' && data.mode !== 'audit') {\n overBudgetStep.passed = false;\n overBudgetStep.error =\n 'Governance approved a $50,000 buy against a $500 plan in enforce mode — expected denial or conditions';\n } else if (data.verdict === 'approved') {\n overBudgetStep.warnings = [\n 'Governance approved a $50,000 buy against a $500 plan — advisory/audit mode detected',\n ];\n }\n } else if (overBudgetResult && !overBudgetResult.success) {\n overBudgetStep.passed = false;\n overBudgetStep.error = overBudgetResult.error || 'check_governance failed';\n }\n steps.push(overBudgetStep);\n\n // Check governance with unauthorized market\n const { result: geoResult, step: geoStep } = await runStep<TaskResult>(\n 'Check governance (unauthorized market, expecting denial or conditions)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n binding: 'proposed',\n caller: callerUrl,\n tool: 'create_media_buy',\n payload: {\n channel: 'display',\n budget: { total: 100, currency: 'USD' },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['CN', 'RU'],\n },\n }) as Promise<TaskResult>\n );\n\n if (geoResult?.success && geoResult?.data) {\n const data = geoResult.data;\n geoStep.details = `Unauthorized market check: verdict=${data.verdict}`;\n geoStep.response_preview = JSON.stringify(\n {\n verdict: data.verdict,\n explanation: data.explanation,\n findings: data.findings?.map((f: any) => ({\n category_id: f.category_id,\n explanation: f.explanation,\n })),\n },\n null,\n 2\n );\n\n if (data.verdict === 'approved') {\n geoStep.warnings = [\n 'Governance approved targeting CN/RU against US-only plan — may indicate audit/advisory mode',\n ];\n }\n } else if (geoResult && !geoResult.success) {\n geoStep.passed = false;\n geoStep.error = geoResult.error || 'check_governance failed';\n }\n steps.push(geoStep);\n\n // Report failed outcome — thread governance_context\n if (profile.tools.includes('report_plan_outcome') && overBudgetResult?.data?.check_id) {\n const { step: outcomeStep } = await runStep<TaskResult>(\n 'Report failed outcome for denied check',\n 'report_plan_outcome',\n async () =>\n client.executeTask('report_plan_outcome', {\n plan_id: testPlanId,\n check_id: overBudgetResult.data.check_id,\n outcome: 'failed',\n governance_context: overBudgetGovernanceContext || '',\n error: {\n code: 'governance_denied',\n message: 'Action blocked by governance check',\n },\n }) as Promise<TaskResult>\n );\n steps.push(outcomeStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Campaign Governance - Conditions Flow\n *\n * Syncs a plan, sends a check that may trigger conditions (e.g., budget\n * concentration limit), applies machine-actionable conditions, and re-checks.\n */\nexport async function testCampaignGovernanceConditions(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n if (!profile.tools.includes('sync_plans') || !profile.tools.includes('check_governance')) {\n steps.push({\n step: 'Campaign governance conditions flow support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent requires sync_plans + check_governance for conditions flow testing',\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n\n const testPlanId = `test-conditions-plan-${Date.now()}`;\n const callerUrl = 'https://test-orchestrator.example';\n const flightStart = new Date();\n const flightEnd = new Date(flightStart.getTime() + 14 * 24 * 60 * 60 * 1000);\n\n // Sync a plan with per_seller_max_pct constraint\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n 'Sync plan with seller concentration limit',\n 'sync_plans',\n async () =>\n client.executeTask('sync_plans', {\n plans: [\n {\n plan_id: testPlanId,\n brand: options.brand || { domain: 'test.example' },\n objectives: 'E2E conditions test: budget cap per seller',\n budget: {\n total: 5000,\n currency: 'USD',\n per_seller_max_pct: 50,\n reallocation_threshold: 500,\n },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n channels: {\n allowed: ['display', 'video'],\n mix_targets: {\n display: { min_pct: 30, max_pct: 70 },\n video: { min_pct: 30, max_pct: 70 },\n },\n },\n },\n ],\n }) as Promise<TaskResult>\n );\n steps.push(syncStep);\n\n if (!syncResult?.success) {\n return { steps, profile };\n }\n\n // First check: send budget that might trigger conditions\n const { result: checkResult, step: checkStep } = await runStep<TaskResult>(\n 'Check governance (may trigger conditions)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n binding: 'proposed',\n caller: callerUrl,\n tool: 'create_media_buy',\n payload: {\n channel: 'display',\n budget: { total: 4000, currency: 'USD' },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n },\n }) as Promise<TaskResult>\n );\n\n if (checkResult?.success && checkResult?.data) {\n const data = checkResult.data;\n const initialGovernanceContext: string | undefined = data.governance_context;\n checkStep.details = `Initial check: verdict=${data.verdict}`;\n checkStep.response_preview = JSON.stringify(\n {\n check_id: data.check_id,\n verdict: data.verdict,\n explanation: data.explanation,\n conditions: data.conditions,\n findings: data.findings?.map((f: any) => ({\n category_id: f.category_id,\n explanation: f.explanation,\n })),\n governance_context: initialGovernanceContext ? '(present)' : '(absent)',\n },\n null,\n 2\n );\n checkStep.observation_data = { governance_context: initialGovernanceContext || null };\n\n // If we got conditions, apply them and re-check with governance_context round-trip\n if (data.verdict === 'conditions' && data.conditions?.length > 0) {\n const conditions = data.conditions;\n const appliedConditions = conditions\n .filter((c: any) => c.required_value !== undefined)\n .map((c: any) => `${c.field}=${JSON.stringify(c.required_value)}`);\n\n checkStep.details += `. Conditions received: ${conditions.length} (${appliedConditions.length} machine-actionable)`;\n\n // Build adjusted payload by applying conditions\n const adjustedPayload: any = {\n channel: 'display',\n budget: { total: 4000, currency: 'USD' },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n };\n\n for (const condition of conditions) {\n if (condition.required_value !== undefined) {\n setAtPath(adjustedPayload, condition.field, condition.required_value);\n }\n }\n\n // Re-check with adjusted parameters — thread governance_context from initial check\n const { result: recheckResult, step: recheckStep } = await runStep<TaskResult>(\n 'Re-check governance (after applying conditions)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n binding: 'proposed',\n caller: callerUrl,\n tool: 'create_media_buy',\n payload: adjustedPayload,\n governance_context: initialGovernanceContext,\n }) as Promise<TaskResult>\n );\n\n if (recheckResult?.success && recheckResult?.data) {\n const recheckData = recheckResult.data;\n recheckStep.details = `Re-check after conditions: verdict=${recheckData.verdict}`;\n recheckStep.response_preview = JSON.stringify(\n {\n check_id: recheckData.check_id,\n verdict: recheckData.verdict,\n explanation: recheckData.explanation,\n governance_context: recheckData.governance_context ? '(present)' : '(absent)',\n },\n null,\n 2\n );\n recheckStep.observation_data = { governance_context: recheckData.governance_context || null };\n } else if (recheckResult && !recheckResult.success) {\n recheckStep.passed = false;\n recheckStep.error = recheckResult.error || 'Re-check after conditions failed';\n }\n steps.push(recheckStep);\n }\n } else if (checkResult && !checkResult.success) {\n checkStep.passed = false;\n checkStep.error = checkResult.error || 'check_governance failed';\n }\n steps.push(checkStep);\n\n return { steps, profile };\n}\n\n/**\n * Test: Campaign Governance - Delivery Monitoring\n *\n * Tests delivery-phase check_governance with delivery_metrics, including\n * normal pacing and overspend drift detection.\n */\nexport async function testCampaignGovernanceDelivery(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n if (!profile.tools.includes('check_governance')) {\n steps.push({\n step: 'Campaign governance delivery monitoring support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent requires check_governance for delivery monitoring testing',\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n\n const testPlanId = `test-delivery-plan-${Date.now()}`;\n const testMediaBuyId = `test-mb-${Date.now()}`;\n const callerUrl = 'https://test-seller.example';\n const flightStart = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);\n const flightEnd = new Date(Date.now() + 23 * 24 * 60 * 60 * 1000);\n\n // Sync plan if supported\n if (profile.tools.includes('sync_plans')) {\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n 'Sync plan for delivery monitoring',\n 'sync_plans',\n async () =>\n client.executeTask('sync_plans', {\n plans: [\n {\n plan_id: testPlanId,\n brand: options.brand || { domain: 'test.example' },\n objectives: 'E2E delivery monitoring test',\n budget: {\n total: 10000,\n currency: 'USD',\n reallocation_unlimited: true,\n },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n },\n ],\n }) as Promise<TaskResult>\n );\n steps.push(syncStep);\n\n if (!syncResult?.success) {\n return { steps, profile };\n }\n }\n\n // Delivery-phase committed check with metrics\n const reportingStart = new Date(Date.now() - 24 * 60 * 60 * 1000);\n const reportingEnd = new Date();\n\n const { result: deliveryResult, step: deliveryStep } = await runStep<TaskResult>(\n 'Check governance (delivery phase with metrics)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n binding: 'committed',\n caller: callerUrl,\n media_buy_id: testMediaBuyId,\n phase: 'delivery',\n planned_delivery: {\n total_budget: 3000,\n currency: 'USD',\n channels: ['display'],\n geo: { countries: ['US'] },\n },\n delivery_metrics: {\n reporting_period: {\n start: reportingStart.toISOString(),\n end: reportingEnd.toISOString(),\n },\n spend: 450,\n cumulative_spend: 2800,\n impressions: 15000,\n cumulative_impressions: 85000,\n geo_distribution: { US: 100 },\n channel_distribution: { display: 100 },\n pacing: 'on_track',\n },\n }) as Promise<TaskResult>\n );\n\n let deliveryGovernanceContext: string | undefined;\n if (deliveryResult?.success && deliveryResult?.data) {\n const data = deliveryResult.data;\n deliveryGovernanceContext = data.governance_context;\n deliveryStep.details = `Delivery check: verdict=${data.verdict}, next_check=${data.next_check || 'not specified'}`;\n deliveryStep.response_preview = JSON.stringify(\n {\n check_id: data.check_id,\n verdict: data.verdict,\n binding: data.binding,\n explanation: data.explanation,\n findings: data.findings?.map((f: any) => ({\n category_id: f.category_id,\n severity: f.severity,\n explanation: f.explanation,\n })),\n next_check: data.next_check,\n governance_context: data.governance_context ? '(present)' : '(absent)',\n },\n null,\n 2\n );\n deliveryStep.observation_data = { governance_context: data.governance_context || null };\n } else if (deliveryResult && !deliveryResult.success) {\n deliveryStep.passed = false;\n deliveryStep.error = deliveryResult.error || 'Delivery-phase check_governance failed';\n }\n steps.push(deliveryStep);\n\n // Delivery-phase check with drift (overspend) — thread governance_context from first check\n const { result: driftResult, step: driftStep } = await runStep<TaskResult>(\n 'Check governance (delivery phase with overspend drift)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n binding: 'committed',\n caller: callerUrl,\n media_buy_id: testMediaBuyId,\n phase: 'delivery',\n governance_context: deliveryGovernanceContext,\n planned_delivery: {\n total_budget: 3000,\n currency: 'USD',\n channels: ['display'],\n geo: { countries: ['US'] },\n },\n delivery_metrics: {\n reporting_period: {\n start: reportingStart.toISOString(),\n end: reportingEnd.toISOString(),\n },\n spend: 2000,\n cumulative_spend: 9500,\n impressions: 5000,\n cumulative_impressions: 90000,\n pacing: 'ahead',\n },\n }) as Promise<TaskResult>\n );\n\n if (driftResult?.success && driftResult?.data) {\n const data = driftResult.data;\n driftStep.details = `Overspend drift check: verdict=${data.verdict}`;\n driftStep.response_preview = JSON.stringify(\n {\n verdict: data.verdict,\n explanation: data.explanation,\n findings: data.findings?.map((f: any) => ({\n category_id: f.category_id,\n severity: f.severity,\n explanation: f.explanation,\n })),\n },\n null,\n 2\n );\n\n if (data.verdict === 'approved' && !data.findings?.length) {\n driftStep.warnings = ['Governance approved delivery at 95% budget with no findings — verify drift detection'];\n }\n } else if (driftResult && !driftResult.success) {\n driftStep.passed = false;\n driftStep.error = driftResult.error || 'Drift detection check_governance failed';\n }\n steps.push(driftStep);\n\n return { steps, profile };\n}\n\n/**\n * Test: Seller Governance Context Round-Trip\n *\n * Two-tier test:\n * 1. (Active) If seller supports register_governance: starts a stub governance\n * agent, registers it with the seller, creates a media buy, and verifies\n * the seller called check_governance on the stub with the correct\n * governance_context.\n * 2. (Passive) Verifies the seller persists governance_context from\n * create_media_buy and returns it on get_media_buys.\n */\nexport async function testSellerGovernanceContext(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // This scenario requires create_media_buy + get_media_buys (seller tools)\n if (!profile.tools.includes('create_media_buy') || !profile.tools.includes('get_media_buys')) {\n steps.push({\n step: 'Seller governance_context support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent requires create_media_buy + get_media_buys for governance_context persistence testing',\n });\n return { steps, profile };\n }\n\n // Need get_products to create a valid media buy\n if (!profile.tools.includes('get_products')) {\n steps.push({\n step: 'Seller governance_context support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent requires get_products for governance_context persistence testing',\n });\n return { steps, profile };\n }\n\n // Step 1: Get products\n const { result: productsResult, step: productsStep } = await runStep<TaskResult>(\n 'Fetch products for governance context test',\n 'get_products',\n async () =>\n client.executeTask('get_products', {\n buying_mode: 'brief',\n brief: options.brief || 'display advertising',\n brand: options.brand || { domain: 'test.example' },\n }) as Promise<TaskResult>\n );\n steps.push(productsStep);\n\n const products = productsResult?.data?.products as Array<Record<string, unknown>> | undefined;\n if (!products?.length) {\n return { steps, profile };\n }\n\n // Pick first product with pricing\n const product = products[0]!;\n const pricingOptions = product.pricing_options as Array<Record<string, unknown>> | undefined;\n const pricing = pricingOptions?.[0];\n if (!pricing) {\n steps.push({\n step: 'Select product for governance context test',\n passed: false,\n duration_ms: 0,\n error: 'No products with pricing options available',\n });\n return { steps, profile };\n }\n\n // Step 2: Resolve an account to use for the test\n const account = await resolveTestAccount(client, profile, options);\n\n // Step 3: If seller supports register_governance, start stub and register it\n let stub: GovernanceAgentStub | null = null;\n let stubUrl: string | null = null;\n let governanceContext: string | null = null;\n const planId = `plan-comply-gc-${Date.now()}`;\n // register_governance is from AdCP PR #1644 — merged but schemas not yet deployed.\n // Once deployed and synced, sellers that implement it will get the active stub test.\n const hasRegisterGovernance = profile.tools.includes('register_governance');\n\n if (hasRegisterGovernance) {\n stub = new GovernanceAgentStub();\n try {\n const info = await stub.startHttps();\n stubUrl = info.url;\n } catch {\n // HTTPS generation failed (no openssl?) — fall back to HTTP\n try {\n const info = await stub.start();\n stubUrl = info.url;\n } catch (err) {\n steps.push({\n step: 'Start governance agent stub',\n passed: false,\n duration_ms: 0,\n error: `Failed to start governance agent stub: ${(err as Error).message}`,\n });\n return { steps, profile };\n }\n }\n\n steps.push({\n step: 'Start governance agent stub',\n passed: true,\n duration_ms: 0,\n details: `Stub running at ${stubUrl}`,\n });\n\n // Register the stub with the seller\n const { result: registerResult, step: registerStep } = await runStep<TaskResult>(\n 'Register governance agent with seller',\n 'register_governance',\n async () =>\n client.executeTask('register_governance', {\n accounts: [\n {\n account,\n governance_agents: [\n {\n url: stubUrl,\n authentication: {\n schemes: ['Bearer'],\n credentials: stub!.authToken,\n },\n },\n ],\n },\n ],\n }) as Promise<TaskResult>\n );\n steps.push(registerStep);\n\n if (!registerResult?.success) {\n // Registration failed — fall through to passive test\n steps.push({\n step: 'Governance agent registration',\n passed: true,\n duration_ms: 0,\n details: 'register_governance failed — falling back to passive governance_context persistence test',\n warnings: ['Cannot verify seller calls governance agent — register_governance returned an error'],\n });\n } else {\n // Get governance_context from the stub (simulate buyer's proposed check)\n try {\n const checkResult = await callMCPTool(stubUrl!, 'check_governance', {\n plan_id: planId,\n binding: 'proposed',\n caller: 'buyer',\n tool: 'create_media_buy',\n payload: {},\n });\n const parsed = JSON.parse((checkResult as { content: Array<{ text: string }> }).content[0]!.text);\n governanceContext = parsed.governance_context as string;\n\n steps.push({\n step: 'Obtain governance_context from stub (proposed check)',\n passed: true,\n duration_ms: 0,\n details: `governance_context received (${governanceContext?.length ?? 0} chars)`,\n });\n } catch (err) {\n steps.push({\n step: 'Obtain governance_context from stub (proposed check)',\n passed: false,\n duration_ms: 0,\n error: `Failed to call check_governance on stub: ${(err as Error).message}`,\n });\n }\n }\n } else {\n steps.push({\n step: 'Check register_governance support',\n passed: true,\n duration_ms: 0,\n details: 'Seller does not support register_governance — running passive governance_context persistence test only',\n warnings: ['Cannot verify seller calls governance agent — register_governance not supported'],\n });\n }\n\n // Step 4: Create media buy WITH governance_context\n const testGovernanceContext = governanceContext || `test-gc-comply-${Date.now()}`;\n const flightStart = new Date();\n const flightEnd = new Date(flightStart.getTime() + 30 * 24 * 60 * 60 * 1000);\n\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Create media buy with governance_context',\n 'create_media_buy',\n async () =>\n client.executeTask('create_media_buy', {\n account,\n brand: options.brand || { domain: 'test.example' },\n start_time: flightStart.toISOString(),\n end_time: flightEnd.toISOString(),\n plan_id: governanceContext ? planId : undefined,\n packages: [\n {\n product_id: product.product_id,\n pricing_option_id: pricing.pricing_option_id,\n budget: (pricing.min_spend_per_package as number) || 500,\n bid_price: ((pricing.floor_price as number) || (pricing.fixed_price as number) || 10) + 1,\n name: 'Governance context test package',\n },\n ],\n governance_context: testGovernanceContext,\n }) as Promise<TaskResult>\n );\n\n if (!createResult?.success || !createResult?.data) {\n createStep.passed = false;\n createStep.error = createResult?.error || 'create_media_buy failed';\n steps.push(createStep);\n await stopStub(stub);\n return { steps, profile };\n }\n\n const mediaBuyId = createResult.data.media_buy_id as string;\n createStep.details = `Created media buy ${mediaBuyId} with governance_context`;\n steps.push(createStep);\n\n // Step 5: If stub is active, verify seller called check_governance(committed)\n if (stub && governanceContext && stubUrl) {\n // Poll the stub's call log for the committed check (100ms interval, 5s timeout)\n const pollStart = Date.now();\n const pollTimeout = 5000;\n const pollInterval = 100;\n while (Date.now() - pollStart < pollTimeout) {\n const calls = stub.getCallsForTool('check_governance');\n if (calls.some(c => c.params.binding === 'committed')) break;\n await new Promise(r => setTimeout(r, pollInterval));\n }\n\n const committedCalls = stub.getCallsForTool('check_governance').filter(c => c.params.binding === 'committed');\n\n const { step: callbackStep } = await runStep<void>(\n 'Verify seller called check_governance(committed) on governance agent',\n 'check_governance (callback)',\n async () => {\n if (committedCalls.length === 0) {\n throw new Error(\n 'Seller did not call check_governance(committed) on the registered governance agent. ' +\n 'Sellers MUST call check_governance with binding=\"committed\" before executing a media buy.'\n );\n }\n\n const callWithContext = committedCalls.find(c => c.params.governance_context === governanceContext);\n\n if (!callWithContext) {\n throw new Error(\n `Seller called check_governance(committed) but with wrong governance_context. ` +\n `Expected \"${governanceContext}\", got: ${committedCalls.map(c => JSON.stringify(c.params.governance_context)).join(', ')}`\n );\n }\n }\n );\n\n if (committedCalls.length > 0) {\n callbackStep.response_preview = JSON.stringify(committedCalls[0]!.params, null, 2);\n }\n steps.push(callbackStep);\n }\n\n // Step 6: Retrieve the media buy and check for governance_context persistence\n const { result: getResult, step: getStep } = await runStep<TaskResult>(\n 'Verify governance_context persisted on get_media_buys',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n media_buy_ids: [mediaBuyId],\n }) as Promise<TaskResult>\n );\n\n if (getResult?.success && getResult?.data) {\n const buys = (getResult.data.media_buys as Array<Record<string, unknown>>) || [];\n const buy =\n buys.find((b: Record<string, unknown>) => b.media_buy_id === mediaBuyId) ||\n (buys.length === 1 ? buys[0] : undefined);\n\n if (buy) {\n const returnedGC = buy.governance_context as string | undefined;\n if (returnedGC === testGovernanceContext) {\n getStep.details = 'governance_context persisted and returned correctly';\n } else if (returnedGC) {\n getStep.passed = false;\n getStep.error = `governance_context returned but value changed: expected \"${testGovernanceContext}\", got \"${returnedGC}\"`;\n } else {\n getStep.passed = false;\n getStep.error =\n 'Seller did not return governance_context on get_media_buys. ' +\n 'Sellers MUST persist governance_context from create_media_buy and include it on all subsequent responses.';\n }\n getStep.response_preview = JSON.stringify(\n {\n media_buy_id: buy.media_buy_id,\n governance_context: returnedGC ? `(present, ${returnedGC.length} chars)` : '(absent)',\n status: buy.status,\n },\n null,\n 2\n );\n } else if (buys.length === 0) {\n getStep.details =\n 'get_media_buys returned 0 buys — agent may be stateless (test agent). Cannot verify governance_context persistence.';\n getStep.warnings = [\n 'governance_context persistence could not be verified — agent does not persist media buys across requests',\n ];\n } else {\n getStep.passed = false;\n getStep.error = `Media buy ${mediaBuyId} not found among ${buys.length} returned buys`;\n }\n } else if (getResult && !getResult.success) {\n getStep.passed = false;\n getStep.error = getResult.error || 'get_media_buys failed';\n }\n steps.push(getStep);\n\n await stopStub(stub);\n return { steps, profile };\n}\n\n/**\n * Resolve a test account from the seller. Tries list_accounts first,\n * then sync_accounts, then falls back to a static account reference.\n */\nasync function resolveTestAccount(\n client: ReturnType<typeof getOrCreateClient>,\n profile: AgentProfile,\n options: TestOptions\n): Promise<Record<string, unknown>> {\n if (profile.tools.includes('list_accounts')) {\n try {\n const result = (await client.executeTask('list_accounts', {})) as TaskResult;\n const accounts = result?.data?.accounts as Array<Record<string, unknown>> | undefined;\n if (accounts?.length && accounts[0]) {\n return { account_id: accounts[0].account_id };\n }\n } catch {\n // Fall through\n }\n }\n\n if (profile.tools.includes('sync_accounts')) {\n try {\n const result = (await client.executeTask('sync_accounts', {\n accounts: [\n {\n brand: options.brand || { domain: 'test.example' },\n operator: 'comply-test',\n billing: 'operator',\n sandbox: true,\n },\n ],\n })) as TaskResult;\n const accounts = result?.data?.accounts as Array<Record<string, unknown>> | undefined;\n if (accounts?.length && accounts[0] && accounts[0].account_id) {\n return { account_id: accounts[0].account_id };\n }\n } catch {\n // Fall through\n }\n }\n\n return { account_id: 'test-gc-acct' };\n}\n\nasync function stopStub(stub: GovernanceAgentStub | null): Promise<void> {\n if (stub) {\n try {\n await stub.stop();\n } catch {}\n }\n}\n\n/**\n * Check if agent has any governance protocol tools\n */\nexport function hasGovernanceTools(tools: string[]): boolean {\n return GOVERNANCE_TOOLS.some(t => tools.includes(t));\n}\n\n/**\n * Check if agent has campaign governance tools\n */\nexport function hasCampaignGovernanceTools(tools: string[]): boolean {\n return CAMPAIGN_GOVERNANCE_TOOLS.some(t => tools.includes(t));\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/testing/scenarios/governance.ts"],"sourcesContent":["/**\n * Governance Protocol Testing Scenarios (v3)\n *\n * Tests governance agent capabilities including:\n * - Property list CRUD operations\n * - Content standards management\n * - Content calibration\n * - Delivery validation\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile } from '../client';\nimport { GOVERNANCE_TOOLS } from '../../utils/capabilities';\nimport { GovernanceAgentStub } from '../stubs';\nimport { callMCPTool } from '../../protocols/mcp';\nimport type {\n CreatePropertyListRequest,\n CreatePropertyListResponse,\n GetPropertyListRequest,\n GetPropertyListResponse,\n UpdatePropertyListRequest,\n UpdatePropertyListResponse,\n ListPropertyListsRequest,\n ListPropertyListsResponse,\n DeletePropertyListRequest,\n DeletePropertyListResponse,\n ListContentStandardsRequest,\n ListContentStandardsResponse,\n GetContentStandardsRequest,\n CalibrateContentRequest,\n ValidateContentDeliveryRequest,\n ContentStandards,\n PropertyList,\n} from '../../types/tools.generated';\nimport { setAtPath } from '../../core/GovernanceMiddleware';\n\n// Property list tools\nconst PROPERTY_LIST_TOOLS = [\n 'create_property_list',\n 'get_property_list',\n 'update_property_list',\n 'list_property_lists',\n 'delete_property_list',\n] as const;\n\n// Content standards tools\nconst CONTENT_STANDARDS_TOOLS = [\n 'list_content_standards',\n 'get_content_standards',\n 'create_content_standards',\n 'update_content_standards',\n 'calibrate_content',\n 'validate_content_delivery',\n] as const;\n\n/**\n * Test: Governance Property Lists\n *\n * Flow: create_property_list -> get_property_list -> update_property_list\n * -> list_property_lists -> delete_property_list -> verify deletion\n */\nexport async function testGovernancePropertyLists(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // Check if agent supports any property list tools\n const hasPropertyListTools = PROPERTY_LIST_TOOLS.some(t => profile.tools.includes(t));\n if (!hasPropertyListTools) {\n steps.push({\n step: 'Property list support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support property list tools (governance protocol)',\n details: `Required tools: ${PROPERTY_LIST_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n let createdListId: string | undefined;\n let authToken: string | undefined;\n\n // Test: create_property_list\n if (profile.tools.includes('create_property_list')) {\n const listName = options.property_list_name || `E2E Test List ${Date.now()}`;\n const { result, step } = await runStep<TaskResult>(\n 'Create property list',\n 'create_property_list',\n async () =>\n client.createPropertyList({\n name: listName,\n description: 'E2E test property list for governance testing',\n base_properties: {\n include: [\n { identifier_type: 'domain', identifier_value: 'example.com' },\n { identifier_type: 'domain', identifier_value: 'test.example' },\n ],\n },\n filters: {\n garm_categories: {\n exclude: ['adult', 'arms'],\n },\n mfa_thresholds: {\n min_score: 0.7,\n },\n },\n brand_manifest: options.brand_manifest || {\n name: 'E2E Test Brand',\n url: 'https://test.example',\n },\n } as unknown as CreatePropertyListRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as CreatePropertyListResponse;\n createdListId = data.list?.list_id;\n authToken = data.auth_token;\n step.created_id = createdListId;\n step.details = `Created list: ${createdListId}`;\n step.response_preview = JSON.stringify(\n {\n list_id: createdListId,\n name: data.list?.name || listName,\n has_auth_token: !!authToken,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'create_property_list failed';\n }\n steps.push(step);\n }\n\n // Test: get_property_list\n if (profile.tools.includes('get_property_list') && createdListId) {\n const { result, step } = await runStep<TaskResult>(\n 'Get property list',\n 'get_property_list',\n async () =>\n client.getPropertyList({\n list_id: createdListId,\n resolve: true,\n max_results: 10,\n } as unknown as GetPropertyListRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as GetPropertyListResponse;\n const dataRecord = result.data as unknown as Record<string, unknown>;\n step.details = `Retrieved list with ${dataRecord.total_count || 0} properties`;\n step.response_preview = JSON.stringify(\n {\n list_id: data.list?.list_id,\n name: data.list?.name,\n property_count: dataRecord.total_count,\n has_identifiers: !!data.identifiers?.length,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'get_property_list failed';\n }\n steps.push(step);\n }\n\n // Test: update_property_list\n if (profile.tools.includes('update_property_list') && createdListId) {\n const { result, step } = await runStep<TaskResult>(\n 'Update property list',\n 'update_property_list',\n async () =>\n client.updatePropertyList({\n list_id: createdListId,\n auth_token: authToken,\n description: 'Updated E2E test property list',\n base_properties: {\n include: [\n { identifier_type: 'domain', identifier_value: 'example.com' },\n { identifier_type: 'domain', identifier_value: 'test.example' },\n { identifier_type: 'domain', identifier_value: 'new.example' },\n ],\n },\n filters: {\n garm_categories: {\n exclude: ['adult', 'arms', 'gambling'],\n },\n mfa_thresholds: {\n min_score: 0.8,\n },\n },\n } as unknown as UpdatePropertyListRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as UpdatePropertyListResponse;\n step.details = 'Property list updated successfully';\n step.response_preview = JSON.stringify(\n {\n list_id: data.list?.list_id,\n updated_at: data.list?.updated_at,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'update_property_list failed';\n }\n steps.push(step);\n }\n\n // Test: list_property_lists\n if (profile.tools.includes('list_property_lists')) {\n const { result, step } = await runStep<TaskResult>(\n 'List property lists',\n 'list_property_lists',\n async () =>\n client.listPropertyLists({\n max_results: 10,\n } as unknown as ListPropertyListsRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as ListPropertyListsResponse;\n const dataRecord = result.data as unknown as Record<string, unknown>;\n const lists: PropertyList[] = data.lists || [];\n step.details = `Found ${lists.length} property list(s)`;\n step.response_preview = JSON.stringify(\n {\n total_count: dataRecord.total_count,\n returned_count: dataRecord.returned_count || lists.length,\n lists: lists.slice(0, 3).map((l: PropertyList) => ({\n list_id: l.list_id,\n name: l.name,\n })),\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'list_property_lists failed';\n }\n steps.push(step);\n }\n\n // Test: delete_property_list\n if (profile.tools.includes('delete_property_list') && createdListId) {\n const { result, step } = await runStep<TaskResult>(\n 'Delete property list',\n 'delete_property_list',\n async () =>\n client.deletePropertyList({\n list_id: createdListId,\n auth_token: authToken,\n } as unknown as DeletePropertyListRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as DeletePropertyListResponse;\n step.details = data.deleted ? 'Property list deleted' : 'Deletion returned but not confirmed';\n step.response_preview = JSON.stringify(\n {\n deleted: data.deleted,\n list_id: data.list_id,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'delete_property_list failed';\n }\n steps.push(step);\n\n // Test: get deleted list (should fail)\n if (profile.tools.includes('get_property_list')) {\n const { result: errorResult, step: errorStep } = await runStep<TaskResult>(\n 'Get deleted list (error expected)',\n 'get_property_list',\n async () =>\n client.getPropertyList({\n list_id: createdListId,\n } as unknown as GetPropertyListRequest) as Promise<TaskResult>\n );\n\n if (errorResult?.success) {\n errorStep.passed = false;\n errorStep.error = 'Expected error for deleted list but got success';\n } else {\n errorStep.passed = true;\n errorStep.details = 'Correctly rejected deleted list access';\n }\n steps.push(errorStep);\n }\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Governance Content Standards\n *\n * Flow: list_content_standards -> get_content_standards -> calibrate_content\n * -> validate_content_delivery\n */\nexport async function testGovernanceContentStandards(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // Check if agent supports any content standards tools\n const hasContentStandardsTools = CONTENT_STANDARDS_TOOLS.some(t => profile.tools.includes(t));\n if (!hasContentStandardsTools) {\n steps.push({\n step: 'Content standards support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support content standards tools (governance protocol)',\n details: `Required tools: ${CONTENT_STANDARDS_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n let discoveredStandardsId: string | undefined;\n\n // Test: list_content_standards\n if (profile.tools.includes('list_content_standards')) {\n const { result, step } = await runStep<TaskResult>(\n 'List content standards',\n 'list_content_standards',\n async () =>\n client.listContentStandardsLegacy({\n context: 'E2E testing - list available brand safety configurations',\n max_results: 10,\n } as unknown as ListContentStandardsRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as ListContentStandardsResponse;\n const standards: ContentStandards[] = 'standards' in data ? data.standards : [];\n if (standards.length > 0) {\n discoveredStandardsId = standards[0]!.standards_id;\n }\n step.details = `Found ${standards.length} content standard(s)`;\n step.response_preview = JSON.stringify(\n {\n standards_count: standards.length,\n sample_standards: standards.slice(0, 3).map((s: ContentStandards) => ({\n standards_id: s.standards_id,\n name: s.name,\n provider: (s as unknown as Record<string, unknown>).provider,\n })),\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n // Not all agents support content standards, so treat missing support as passing\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'Content standards not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'list_content_standards failed';\n }\n }\n steps.push(step);\n }\n\n // Test: get_content_standards (if we found one)\n const standardsIdToTest = options.content_standards_id || discoveredStandardsId;\n if (profile.tools.includes('get_content_standards') && standardsIdToTest) {\n const { result, step } = await runStep<TaskResult>(\n 'Get content standards',\n 'get_content_standards',\n async () =>\n client.getContentStandardsLegacy({\n standards_id: standardsIdToTest,\n } as unknown as GetContentStandardsRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as unknown as Record<string, unknown>;\n // Response may be a ContentStandards directly or wrapped in { standards: ... }\n const standards = (data.standards as unknown as Record<string, unknown> | undefined) || data;\n step.details = `Retrieved standards: ${String(standards.name || standardsIdToTest)}`;\n step.response_preview = JSON.stringify(\n {\n standards_id: standards.standards_id,\n name: standards.name,\n features_count: Array.isArray(standards.features) ? standards.features.length : 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'get_content_standards failed';\n }\n steps.push(step);\n }\n\n // Test: calibrate_content\n if (profile.tools.includes('calibrate_content')) {\n const { result, step } = await runStep<TaskResult>(\n 'Calibrate content',\n 'calibrate_content',\n async () =>\n client.calibrateContentLegacy({\n context: 'E2E testing - evaluate sample content for brand safety',\n standards_id: standardsIdToTest,\n artifacts: [\n {\n artifact_id: 'test-artifact-1',\n artifact_type: 'webpage',\n url: 'https://example.com/article/safe-content',\n title: 'Safe Test Article',\n },\n {\n artifact_id: 'test-artifact-2',\n artifact_type: 'webpage',\n url: 'https://example.com/article/test-content',\n title: 'Another Test Article',\n },\n ],\n feedback_type: 'binary',\n } as unknown as CalibrateContentRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as unknown as Record<string, unknown>;\n step.details = `Calibration session: ${String(data.session_status || 'completed')}`;\n step.response_preview = JSON.stringify(\n {\n session_id: data.session_id,\n session_status: data.session_status,\n pending_artifacts: Array.isArray(data.pending_artifacts) ? data.pending_artifacts.length : 0,\n evaluated_artifacts: Array.isArray(data.evaluated_artifacts) ? data.evaluated_artifacts.length : 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'Content calibration not supported by this agent';\n } else {\n step.passed = false;\n step.error = result.error || 'calibrate_content failed';\n }\n }\n steps.push(step);\n }\n\n // Test: validate_content_delivery\n if (profile.tools.includes('validate_content_delivery')) {\n const { result, step } = await runStep<TaskResult>(\n 'Validate content delivery',\n 'validate_content_delivery',\n async () =>\n client.validateContentDeliveryLegacy({\n context: 'E2E testing - validate delivery records against content standards',\n standards_id: standardsIdToTest,\n records: [\n {\n record_id: 'test-record-1',\n artifact: {\n artifact_id: 'test-artifact-1',\n artifact_type: 'webpage',\n url: 'https://example.com/article/delivered-content',\n },\n delivered_at: new Date().toISOString(),\n },\n ],\n } as unknown as ValidateContentDeliveryRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as unknown as Record<string, unknown>;\n const summary = data.summary as unknown as Record<string, unknown> | undefined;\n step.details = `Validated ${summary?.total_records || 0} record(s)`;\n step.response_preview = JSON.stringify(\n {\n total_records: summary?.total_records,\n passed_records: summary?.passed_records,\n failed_records: summary?.failed_records,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'Content delivery validation not supported by this agent';\n } else {\n step.passed = false;\n step.error = result.error || 'validate_content_delivery failed';\n }\n }\n steps.push(step);\n }\n\n // Test: get_content_standards with invalid ID (error expected)\n if (profile.tools.includes('get_content_standards')) {\n const { result: errorResult, step: errorStep } = await runStep<TaskResult>(\n 'Get invalid content standards (error expected)',\n 'get_content_standards',\n async () =>\n client.getContentStandardsLegacy({\n standards_id: 'INVALID_STANDARDS_ID_DOES_NOT_EXIST_12345',\n }) as Promise<TaskResult>\n );\n\n if (errorResult?.success) {\n errorStep.passed = false;\n errorStep.error = 'Expected error for invalid standards_id but got success';\n } else {\n errorStep.passed = true;\n errorStep.details = 'Correctly rejected invalid standards_id';\n }\n steps.push(errorStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Property List Filters\n *\n * Creates a property list with all filter types populated, retrieves it with\n * resolve:true, and validates the filters round-trip correctly.\n *\n * Filter types tested:\n * - garm_categories (exclude)\n * - mfa_thresholds (min_score)\n * - custom_tags (include/exclude)\n * - feature_requirements (conditional on get_adcp_capabilities)\n */\nexport async function testPropertyListFilters(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n const hasRequired = profile.tools.includes('create_property_list') && profile.tools.includes('get_property_list');\n if (!hasRequired) {\n steps.push({\n step: 'Property list filter support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent requires create_property_list + get_property_list for filter testing',\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n\n // Optionally discover feature IDs from get_adcp_capabilities\n let featureRequirements: unknown[] | undefined;\n if (profile.tools.includes('get_adcp_capabilities')) {\n const { result: capResult, step: capStep } = await runStep<TaskResult>(\n 'Discover available features (for feature_requirements filter)',\n 'get_adcp_capabilities',\n async () => client.getAdcpCapabilities({}) as Promise<TaskResult>\n );\n if (capResult?.success && capResult?.data) {\n const capData = capResult.data as unknown as Record<string, unknown>;\n const mediaBuy = capData.media_buy as unknown as Record<string, unknown> | undefined;\n const rawFeatures = mediaBuy?.features;\n if (rawFeatures && typeof rawFeatures === 'object') {\n // Use boolean feature keys as feature_ids (agents that support dynamic features will have IDs)\n const featuresRecord = rawFeatures as Record<string, unknown>;\n const featureIds = Object.keys(featuresRecord).filter(k => featuresRecord[k] === true);\n if (featureIds.length > 0) {\n featureRequirements = featureIds.map(id => ({\n feature_id: id,\n allowed_values: [true],\n if_not_covered: 'exclude',\n }));\n capStep.details = `Found ${featureIds.length} feature(s) for filter testing: ${featureIds.join(', ')}`;\n } else {\n capStep.details = 'No active features found; skipping feature_requirements filter';\n }\n } else {\n capStep.details = 'get_adcp_capabilities returned no feature data; skipping feature_requirements filter';\n }\n }\n steps.push(capStep);\n }\n\n // Build filter object with all supported types\n const filters: Record<string, unknown> = {\n garm_categories: {\n exclude: ['adult', 'arms', 'gambling', 'hate_speech'],\n },\n mfa_thresholds: {\n min_score: 0.75,\n },\n custom_tags: {\n include: [{ key: 'content_type', value: 'premium' }],\n exclude: [{ key: 'content_type', value: 'user_generated' }],\n },\n };\n\n if (featureRequirements) {\n filters.feature_requirements = featureRequirements;\n }\n\n let createdListId: string | undefined;\n let authToken: string | undefined;\n\n // Create property list with all filters\n const listName = `E2E Filter Test ${Date.now()}`;\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Create property list with all filter types',\n 'create_property_list',\n async () =>\n client.createPropertyList({\n name: listName,\n description: 'E2E filter round-trip test',\n base_properties: {\n include: [{ identifier_type: 'domain', identifier_value: 'example.com' }],\n },\n filters,\n brand_manifest: options.brand_manifest || {\n name: 'E2E Test Brand',\n url: 'https://test.example',\n },\n } as unknown as CreatePropertyListRequest) as Promise<TaskResult>\n );\n\n if (createResult?.success && createResult?.data) {\n const data = createResult.data as CreatePropertyListResponse;\n createdListId = data.list?.list_id;\n authToken = data.auth_token;\n createStep.created_id = createdListId;\n createStep.details = `Created list: ${createdListId} with ${Object.keys(filters).length} filter type(s)`;\n } else if (createResult && !createResult.success) {\n createStep.passed = false;\n createStep.error = createResult.error || 'create_property_list failed';\n }\n steps.push(createStep);\n\n if (!createdListId) {\n return { steps, profile };\n }\n\n // Retrieve with resolve:true and validate filter round-trip\n const { result: getResult, step: getStep } = await runStep<TaskResult>(\n 'Get property list (resolve: true, validate filter round-trip)',\n 'get_property_list',\n async () =>\n client.getPropertyList({\n list_id: createdListId,\n resolve: true,\n max_results: 5,\n } as unknown as GetPropertyListRequest) as Promise<TaskResult>\n );\n\n if (getResult?.success && getResult?.data) {\n const data = getResult.data as GetPropertyListResponse;\n const returnedFilters = data.list?.filters as unknown as Record<string, unknown> | undefined;\n const issues: string[] = [];\n\n if (returnedFilters) {\n const garmCategories = returnedFilters.garm_categories as unknown as Record<string, unknown> | undefined;\n if (!Array.isArray(garmCategories?.exclude) || !garmCategories.exclude.length) {\n issues.push('garm_categories.exclude not preserved');\n }\n const mfaThresholds = returnedFilters.mfa_thresholds as unknown as Record<string, unknown> | undefined;\n if (mfaThresholds?.min_score !== 0.75) {\n issues.push(`mfa_thresholds.min_score mismatch: got ${mfaThresholds?.min_score}, expected 0.75`);\n }\n if (!returnedFilters.custom_tags) {\n issues.push('custom_tags filter not preserved');\n }\n const featureReqs = returnedFilters.feature_requirements;\n if (featureRequirements && !(Array.isArray(featureReqs) && featureReqs.length)) {\n issues.push('feature_requirements filter not preserved');\n }\n } else {\n issues.push('filters object missing from get_property_list response');\n }\n\n getStep.passed = issues.length === 0;\n getStep.details =\n issues.length === 0\n ? `All ${Object.keys(filters).length} filter types round-tripped correctly`\n : `Filter round-trip issues: ${issues.join('; ')}`;\n getStep.error = issues.length > 0 ? issues.join('; ') : undefined;\n getStep.response_preview = JSON.stringify(\n {\n list_id: data.list?.list_id,\n filters_returned: returnedFilters ? Object.keys(returnedFilters) : [],\n round_trip_issues: issues,\n },\n null,\n 2\n );\n } else if (getResult && !getResult.success) {\n getStep.passed = false;\n getStep.error = getResult.error || 'get_property_list failed';\n }\n steps.push(getStep);\n\n // Cleanup\n if (profile.tools.includes('delete_property_list')) {\n const { result: delResult, step: delStep } = await runStep<TaskResult>(\n 'Delete test property list (cleanup)',\n 'delete_property_list',\n async () =>\n client.deletePropertyList({\n list_id: createdListId,\n auth_token: authToken,\n } as unknown as DeletePropertyListRequest) as Promise<TaskResult>\n );\n if (delResult?.success) {\n delStep.details = 'Test list cleaned up';\n }\n steps.push(delStep);\n } else if (!profile.tools.includes('delete_property_list')) {\n steps.push({\n step: 'Delete test property list (cleanup)',\n passed: true,\n duration_ms: 0,\n details: `Skipped — agent does not advertise delete_property_list. Test list ${createdListId} may remain.`,\n warnings: [\n `Test list ${createdListId} was created but cannot be cleaned up (delete_property_list not available)`,\n ],\n });\n }\n\n return { steps, profile };\n}\n\n// Campaign governance tools\nconst CAMPAIGN_GOVERNANCE_TOOLS = [\n 'sync_plans',\n 'check_governance',\n 'report_plan_outcome',\n 'get_plan_audit_logs',\n] as const;\n\n/**\n * Test: Campaign Governance - Full Lifecycle\n *\n * Flow: sync_plans -> check_governance(proposed, approved) -> create_media_buy\n * -> report_plan_outcome(completed)\n *\n * Tests the happy path: buyer syncs a plan, gets approval, executes,\n * and reports the outcome back to the governance agent.\n */\nexport async function testCampaignGovernance(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // Check if agent supports campaign governance tools\n const hasCampaignGovernance = CAMPAIGN_GOVERNANCE_TOOLS.some(t => profile.tools.includes(t));\n if (!hasCampaignGovernance) {\n steps.push({\n step: 'Campaign governance support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support campaign governance tools',\n details: `Required: at least one of ${CAMPAIGN_GOVERNANCE_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n\n const testPlanId = `test-plan-${Date.now()}`;\n const testMediaBuyId = `test-mb-${Date.now()}`;\n const callerUrl = 'https://test-orchestrator.example';\n const flightStart = new Date();\n const flightEnd = new Date(flightStart.getTime() + 30 * 24 * 60 * 60 * 1000); // 30 days\n\n // Step 1: sync_plans\n if (profile.tools.includes('sync_plans')) {\n const { result, step } = await runStep<TaskResult>(\n 'Sync campaign governance plan',\n 'sync_plans',\n async () =>\n client.executeTask('sync_plans', {\n plans: [\n {\n plan_id: testPlanId,\n brand: options.brand || { domain: 'test.example' },\n objectives: 'E2E test campaign for governance protocol validation',\n budget: {\n total: options.budget || 10000,\n currency: 'USD',\n reallocation_unlimited: true,\n },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n channels: {\n allowed: ['display', 'olv'],\n },\n delegations: [\n {\n agent_url: callerUrl,\n authority: 'full',\n },\n ],\n },\n ],\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n const plans = data.plans || [];\n const synced = plans.find((p: any) => p.plan_id === testPlanId);\n if (synced?.status === 'active') {\n step.details = `Plan synced: ${testPlanId}, version ${synced.version}, ${(synced.categories || []).length} categories active`;\n step.response_preview = JSON.stringify(\n {\n plan_id: synced.plan_id,\n status: synced.status,\n version: synced.version,\n categories: synced.categories?.map((c: any) => c.category_id),\n resolved_policies: synced.resolved_policies?.length || 0,\n },\n null,\n 2\n );\n } else {\n step.passed = false;\n step.error = synced\n ? `Plan sync returned status '${synced.status}' instead of 'active'`\n : 'Plan not found in sync response';\n }\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'sync_plans failed';\n }\n steps.push(step);\n }\n\n // Step 2: check_governance (proposed, expecting approved)\n let checkId: string | undefined;\n let governanceContext: string | undefined;\n if (profile.tools.includes('check_governance')) {\n const { result, step } = await runStep<TaskResult>(\n 'Check governance (proposed buy)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n phase: 'purchase',\n caller: callerUrl,\n tool: 'create_media_buy',\n payload: {\n channel: 'display',\n budget: { total: 1000, currency: 'USD' },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n checkId = data.check_id;\n governanceContext = data.governance_context;\n const verdict = data.verdict;\n\n step.details = `Governance check: verdict=${verdict}, binding=${data.binding}, mode=${data.mode || 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n check_id: data.check_id,\n verdict: data.verdict,\n binding: data.binding,\n mode: data.mode,\n explanation: data.explanation,\n findings_count: data.findings?.length || 0,\n expires_at: data.expires_at,\n governance_context: data.governance_context ? '(present)' : '(absent)',\n },\n null,\n 2\n );\n step.observation_data = { governance_context: data.governance_context || null };\n\n // Only spec-valid verdicts are accepted — we're testing the protocol, not the policy\n if (!['approved', 'denied', 'conditions'].includes(verdict)) {\n step.passed = false;\n step.error = `Unexpected governance verdict: ${verdict}`;\n }\n\n // Validate governance_context format if present\n if (governanceContext !== undefined) {\n if (typeof governanceContext !== 'string') {\n step.warnings = [...(step.warnings || []), 'governance_context is not a string'];\n } else if (governanceContext.length > 4096) {\n step.warnings = [\n ...(step.warnings || []),\n `governance_context exceeds 4096 chars (${governanceContext.length})`,\n ];\n }\n }\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'check_governance failed';\n }\n steps.push(step);\n }\n\n // Step 3: report_plan_outcome (completed) — thread governance_context\n if (profile.tools.includes('report_plan_outcome') && checkId) {\n const outcomeRequest = {\n plan_id: testPlanId,\n check_id: checkId,\n outcome: 'completed' as const,\n governance_context: governanceContext || '',\n seller_response: {\n seller_reference: testMediaBuyId,\n packages: [\n {\n budget: 1000,\n },\n ],\n },\n };\n\n const { result, step } = await runStep<TaskResult>(\n 'Report plan outcome (completed)',\n 'report_plan_outcome',\n async () => client.executeTask('report_plan_outcome', outcomeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n step.details = `Outcome reported with governance_context=${governanceContext ? 'present' : 'absent'}`;\n step.response_preview = JSON.stringify(result.data, null, 2);\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'report_plan_outcome failed';\n }\n steps.push(step);\n }\n\n // Step 4: get_plan_audit_logs — query by media_buy_id\n if (profile.tools.includes('get_plan_audit_logs')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get plan audit logs',\n 'get_plan_audit_logs',\n async () =>\n client.executeTask('get_plan_audit_logs', {\n plan_ids: [testPlanId],\n include_entries: true,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n step.details = 'Audit logs retrieved';\n step.response_preview = JSON.stringify(\n {\n plans_returned: data.plans?.length || 0,\n has_entries: !!data.plans?.[0]?.entries?.length,\n budget: data.plans?.[0]?.budget,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'get_plan_audit_logs failed';\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Campaign Governance - Denied Flow\n *\n * Sends a check_governance request that should be denied (budget exceeds plan,\n * unauthorized market). Validates that the governance agent returns meaningful\n * findings and explanations.\n */\nexport async function testCampaignGovernanceDenied(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n if (!profile.tools.includes('sync_plans') || !profile.tools.includes('check_governance')) {\n steps.push({\n step: 'Campaign governance denied flow support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent requires sync_plans + check_governance for denied flow testing',\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n\n const testPlanId = `test-denied-plan-${Date.now()}`;\n const callerUrl = 'https://test-orchestrator.example';\n const flightStart = new Date();\n const flightEnd = new Date(flightStart.getTime() + 7 * 24 * 60 * 60 * 1000);\n\n // Sync a restrictive plan: small budget, US only\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n 'Sync restrictive plan (small budget, US only)',\n 'sync_plans',\n async () =>\n client.executeTask('sync_plans', {\n plans: [\n {\n plan_id: testPlanId,\n brand: options.brand || { domain: 'test.example' },\n objectives: 'E2E denial test: budget and geo restrictions',\n budget: {\n total: 500,\n currency: 'USD',\n reallocation_threshold: 100,\n },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n channels: {\n allowed: ['display'],\n },\n },\n ],\n }) as Promise<TaskResult>\n );\n steps.push(syncStep);\n\n if (!syncResult?.success) {\n return { steps, profile };\n }\n\n // Check governance with over-budget request\n const { result: overBudgetResult, step: overBudgetStep } = await runStep<TaskResult>(\n 'Check governance (over-budget, expecting denial or conditions)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n phase: 'purchase',\n caller: callerUrl,\n tool: 'create_media_buy',\n payload: {\n channel: 'display',\n budget: { total: 50000, currency: 'USD' },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n },\n }) as Promise<TaskResult>\n );\n\n let overBudgetGovernanceContext: string | undefined;\n if (overBudgetResult?.success && overBudgetResult?.data) {\n const data = overBudgetResult.data;\n overBudgetGovernanceContext = data.governance_context;\n overBudgetStep.details = `Over-budget check: verdict=${data.verdict}, explanation: ${data.explanation}`;\n overBudgetStep.response_preview = JSON.stringify(\n {\n verdict: data.verdict,\n explanation: data.explanation,\n findings: data.findings?.map((f: any) => ({\n category_id: f.category_id,\n severity: f.severity,\n explanation: f.explanation,\n })),\n conditions: data.conditions,\n governance_context: data.governance_context ? '(present)' : '(absent)',\n },\n null,\n 2\n );\n overBudgetStep.observation_data = { governance_context: data.governance_context || null };\n\n if (data.verdict === 'approved' && data.mode !== 'advisory' && data.mode !== 'audit') {\n overBudgetStep.passed = false;\n overBudgetStep.error =\n 'Governance approved a $50,000 buy against a $500 plan in enforce mode — expected denial or conditions';\n } else if (data.verdict === 'approved') {\n overBudgetStep.warnings = [\n 'Governance approved a $50,000 buy against a $500 plan — advisory/audit mode detected',\n ];\n }\n } else if (overBudgetResult && !overBudgetResult.success) {\n overBudgetStep.passed = false;\n overBudgetStep.error = overBudgetResult.error || 'check_governance failed';\n }\n steps.push(overBudgetStep);\n\n // Check governance with unauthorized market\n const { result: geoResult, step: geoStep } = await runStep<TaskResult>(\n 'Check governance (unauthorized market, expecting denial or conditions)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n phase: 'purchase',\n caller: callerUrl,\n tool: 'create_media_buy',\n payload: {\n channel: 'display',\n budget: { total: 100, currency: 'USD' },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['CN', 'RU'],\n },\n }) as Promise<TaskResult>\n );\n\n if (geoResult?.success && geoResult?.data) {\n const data = geoResult.data;\n geoStep.details = `Unauthorized market check: verdict=${data.verdict}`;\n geoStep.response_preview = JSON.stringify(\n {\n verdict: data.verdict,\n explanation: data.explanation,\n findings: data.findings?.map((f: any) => ({\n category_id: f.category_id,\n explanation: f.explanation,\n })),\n },\n null,\n 2\n );\n\n if (data.verdict === 'approved') {\n geoStep.warnings = [\n 'Governance approved targeting CN/RU against US-only plan — may indicate audit/advisory mode',\n ];\n }\n } else if (geoResult && !geoResult.success) {\n geoStep.passed = false;\n geoStep.error = geoResult.error || 'check_governance failed';\n }\n steps.push(geoStep);\n\n // Report failed outcome — thread governance_context\n if (profile.tools.includes('report_plan_outcome') && overBudgetResult?.data?.check_id) {\n const { step: outcomeStep } = await runStep<TaskResult>(\n 'Report failed outcome for denied check',\n 'report_plan_outcome',\n async () =>\n client.executeTask('report_plan_outcome', {\n plan_id: testPlanId,\n check_id: overBudgetResult.data.check_id,\n outcome: 'failed',\n governance_context: overBudgetGovernanceContext || '',\n error: {\n code: 'governance_denied',\n message: 'Action blocked by governance check',\n },\n }) as Promise<TaskResult>\n );\n steps.push(outcomeStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Campaign Governance - Conditions Flow\n *\n * Syncs a plan, sends a check that may trigger conditions (e.g., budget\n * concentration limit), applies machine-actionable conditions, and re-checks.\n */\nexport async function testCampaignGovernanceConditions(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n if (!profile.tools.includes('sync_plans') || !profile.tools.includes('check_governance')) {\n steps.push({\n step: 'Campaign governance conditions flow support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent requires sync_plans + check_governance for conditions flow testing',\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n\n const testPlanId = `test-conditions-plan-${Date.now()}`;\n const callerUrl = 'https://test-orchestrator.example';\n const flightStart = new Date();\n const flightEnd = new Date(flightStart.getTime() + 14 * 24 * 60 * 60 * 1000);\n\n // Sync a plan with per_seller_max_pct constraint\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n 'Sync plan with seller concentration limit',\n 'sync_plans',\n async () =>\n client.executeTask('sync_plans', {\n plans: [\n {\n plan_id: testPlanId,\n brand: options.brand || { domain: 'test.example' },\n objectives: 'E2E conditions test: budget cap per seller',\n budget: {\n total: 5000,\n currency: 'USD',\n per_seller_max_pct: 50,\n reallocation_threshold: 500,\n },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n channels: {\n allowed: ['display', 'olv'],\n mix_targets: {\n display: { min_pct: 30, max_pct: 70 },\n olv: { min_pct: 30, max_pct: 70 },\n },\n },\n },\n ],\n }) as Promise<TaskResult>\n );\n steps.push(syncStep);\n\n if (!syncResult?.success) {\n return { steps, profile };\n }\n\n // First check: send budget that might trigger conditions\n const { result: checkResult, step: checkStep } = await runStep<TaskResult>(\n 'Check governance (may trigger conditions)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n phase: 'purchase',\n caller: callerUrl,\n tool: 'create_media_buy',\n payload: {\n channel: 'display',\n budget: { total: 4000, currency: 'USD' },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n },\n }) as Promise<TaskResult>\n );\n\n if (checkResult?.success && checkResult?.data) {\n const data = checkResult.data;\n const initialGovernanceContext: string | undefined = data.governance_context;\n checkStep.details = `Initial check: verdict=${data.verdict}`;\n checkStep.response_preview = JSON.stringify(\n {\n check_id: data.check_id,\n verdict: data.verdict,\n explanation: data.explanation,\n conditions: data.conditions,\n findings: data.findings?.map((f: any) => ({\n category_id: f.category_id,\n explanation: f.explanation,\n })),\n governance_context: initialGovernanceContext ? '(present)' : '(absent)',\n },\n null,\n 2\n );\n checkStep.observation_data = { governance_context: initialGovernanceContext || null };\n\n // If we got conditions, apply them and re-check with governance_context round-trip\n if (data.verdict === 'conditions' && data.conditions?.length > 0) {\n const conditions = data.conditions;\n const appliedConditions = conditions\n .filter((c: any) => c.required_value !== undefined)\n .map((c: any) => `${c.field}=${JSON.stringify(c.required_value)}`);\n\n checkStep.details += `. Conditions received: ${conditions.length} (${appliedConditions.length} machine-actionable)`;\n\n // Build adjusted payload by applying conditions\n const adjustedPayload: any = {\n channel: 'display',\n budget: { total: 4000, currency: 'USD' },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n };\n\n for (const condition of conditions) {\n if (condition.required_value !== undefined) {\n setAtPath(adjustedPayload, condition.field, condition.required_value);\n }\n }\n\n // Re-check with adjusted parameters — thread governance_context from initial check\n const { result: recheckResult, step: recheckStep } = await runStep<TaskResult>(\n 'Re-check governance (after applying conditions)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n phase: 'purchase',\n caller: callerUrl,\n tool: 'create_media_buy',\n payload: adjustedPayload,\n governance_context: initialGovernanceContext,\n }) as Promise<TaskResult>\n );\n\n if (recheckResult?.success && recheckResult?.data) {\n const recheckData = recheckResult.data;\n recheckStep.details = `Re-check after conditions: verdict=${recheckData.verdict}`;\n recheckStep.response_preview = JSON.stringify(\n {\n check_id: recheckData.check_id,\n verdict: recheckData.verdict,\n explanation: recheckData.explanation,\n governance_context: recheckData.governance_context ? '(present)' : '(absent)',\n },\n null,\n 2\n );\n recheckStep.observation_data = { governance_context: recheckData.governance_context || null };\n } else if (recheckResult && !recheckResult.success) {\n recheckStep.passed = false;\n recheckStep.error = recheckResult.error || 'Re-check after conditions failed';\n }\n steps.push(recheckStep);\n }\n } else if (checkResult && !checkResult.success) {\n checkStep.passed = false;\n checkStep.error = checkResult.error || 'check_governance failed';\n }\n steps.push(checkStep);\n\n return { steps, profile };\n}\n\n/**\n * Test: Campaign Governance - Delivery Monitoring\n *\n * Tests delivery-phase check_governance with delivery_metrics, including\n * normal pacing and overspend drift detection.\n */\nexport async function testCampaignGovernanceDelivery(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n if (!profile.tools.includes('check_governance')) {\n steps.push({\n step: 'Campaign governance delivery monitoring support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent requires check_governance for delivery monitoring testing',\n });\n return { steps, profile };\n }\n\n profile.supports_governance = true;\n\n const testPlanId = `test-delivery-plan-${Date.now()}`;\n const callerUrl = 'https://test-seller.example';\n const flightStart = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);\n const flightEnd = new Date(Date.now() + 23 * 24 * 60 * 60 * 1000);\n\n // Sync plan if supported\n if (profile.tools.includes('sync_plans')) {\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n 'Sync plan for delivery monitoring',\n 'sync_plans',\n async () =>\n client.executeTask('sync_plans', {\n plans: [\n {\n plan_id: testPlanId,\n brand: options.brand || { domain: 'test.example' },\n objectives: 'E2E delivery monitoring test',\n budget: {\n total: 10000,\n currency: 'USD',\n reallocation_unlimited: true,\n },\n flight: {\n start: flightStart.toISOString(),\n end: flightEnd.toISOString(),\n },\n countries: ['US'],\n },\n ],\n }) as Promise<TaskResult>\n );\n steps.push(syncStep);\n\n if (!syncResult?.success) {\n return { steps, profile };\n }\n }\n\n // Delivery-phase committed check with metrics\n const reportingStart = new Date(Date.now() - 24 * 60 * 60 * 1000);\n const reportingEnd = new Date();\n\n const { result: deliveryResult, step: deliveryStep } = await runStep<TaskResult>(\n 'Check governance (delivery phase with metrics)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n caller: callerUrl,\n phase: 'delivery',\n planned_delivery: {\n total_budget: 3000,\n currency: 'USD',\n channels: ['display'],\n geo: { countries: ['US'] },\n },\n delivery_metrics: {\n reporting_period: {\n start: reportingStart.toISOString(),\n end: reportingEnd.toISOString(),\n },\n spend: 450,\n cumulative_spend: 2800,\n impressions: 15000,\n cumulative_impressions: 85000,\n geo_distribution: { US: 100 },\n channel_distribution: { display: 100 },\n pacing: 'on_track',\n },\n }) as Promise<TaskResult>\n );\n\n let deliveryGovernanceContext: string | undefined;\n if (deliveryResult?.success && deliveryResult?.data) {\n const data = deliveryResult.data;\n deliveryGovernanceContext = data.governance_context;\n deliveryStep.details = `Delivery check: verdict=${data.verdict}, next_check=${data.next_check || 'not specified'}`;\n deliveryStep.response_preview = JSON.stringify(\n {\n check_id: data.check_id,\n verdict: data.verdict,\n binding: data.binding,\n explanation: data.explanation,\n findings: data.findings?.map((f: any) => ({\n category_id: f.category_id,\n severity: f.severity,\n explanation: f.explanation,\n })),\n next_check: data.next_check,\n governance_context: data.governance_context ? '(present)' : '(absent)',\n },\n null,\n 2\n );\n deliveryStep.observation_data = { governance_context: data.governance_context || null };\n } else if (deliveryResult && !deliveryResult.success) {\n deliveryStep.passed = false;\n deliveryStep.error = deliveryResult.error || 'Delivery-phase check_governance failed';\n }\n steps.push(deliveryStep);\n\n // Delivery-phase check with drift (overspend) — thread governance_context from first check\n const { result: driftResult, step: driftStep } = await runStep<TaskResult>(\n 'Check governance (delivery phase with overspend drift)',\n 'check_governance',\n async () =>\n client.executeTask('check_governance', {\n plan_id: testPlanId,\n caller: callerUrl,\n phase: 'delivery',\n governance_context: deliveryGovernanceContext,\n planned_delivery: {\n total_budget: 3000,\n currency: 'USD',\n channels: ['display'],\n geo: { countries: ['US'] },\n },\n delivery_metrics: {\n reporting_period: {\n start: reportingStart.toISOString(),\n end: reportingEnd.toISOString(),\n },\n spend: 2000,\n cumulative_spend: 9500,\n impressions: 5000,\n cumulative_impressions: 90000,\n pacing: 'ahead',\n },\n }) as Promise<TaskResult>\n );\n\n if (driftResult?.success && driftResult?.data) {\n const data = driftResult.data;\n driftStep.details = `Overspend drift check: verdict=${data.verdict}`;\n driftStep.response_preview = JSON.stringify(\n {\n verdict: data.verdict,\n explanation: data.explanation,\n findings: data.findings?.map((f: any) => ({\n category_id: f.category_id,\n severity: f.severity,\n explanation: f.explanation,\n })),\n },\n null,\n 2\n );\n\n if (data.verdict === 'approved' && !data.findings?.length) {\n driftStep.warnings = ['Governance approved delivery at 95% budget with no findings — verify drift detection'];\n }\n } else if (driftResult && !driftResult.success) {\n driftStep.passed = false;\n driftStep.error = driftResult.error || 'Drift detection check_governance failed';\n }\n steps.push(driftStep);\n\n return { steps, profile };\n}\n\n/**\n * Test: Seller Governance Context Round-Trip\n *\n * Two-tier test:\n * 1. (Active) If seller supports register_governance: starts a stub governance\n * agent, registers it with the seller, creates a media buy, and verifies\n * the seller called check_governance on the stub with the correct\n * governance_context.\n * 2. (Passive) Verifies the seller persists governance_context from\n * create_media_buy and returns it on get_media_buys.\n */\nexport async function testSellerGovernanceContext(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // This scenario requires create_media_buy + get_media_buys (seller tools)\n if (!profile.tools.includes('create_media_buy') || !profile.tools.includes('get_media_buys')) {\n steps.push({\n step: 'Seller governance_context support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent requires create_media_buy + get_media_buys for governance_context persistence testing',\n });\n return { steps, profile };\n }\n\n // Need get_products to create a valid media buy\n if (!profile.tools.includes('get_products')) {\n steps.push({\n step: 'Seller governance_context support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent requires get_products for governance_context persistence testing',\n });\n return { steps, profile };\n }\n\n // Step 1: Get products\n const { result: productsResult, step: productsStep } = await runStep<TaskResult>(\n 'Fetch products for governance context test',\n 'get_products',\n async () =>\n client.executeTask('get_products', {\n buying_mode: 'brief',\n brief: options.brief || 'display advertising',\n brand: options.brand || { domain: 'test.example' },\n }) as Promise<TaskResult>\n );\n steps.push(productsStep);\n\n const products = productsResult?.data?.products as Array<Record<string, unknown>> | undefined;\n if (!products?.length) {\n return { steps, profile };\n }\n\n // Pick first product with pricing\n const product = products[0]!;\n const pricingOptions = product.pricing_options as Array<Record<string, unknown>> | undefined;\n const pricing = pricingOptions?.[0];\n if (!pricing) {\n steps.push({\n step: 'Select product for governance context test',\n passed: false,\n duration_ms: 0,\n error: 'No products with pricing options available',\n });\n return { steps, profile };\n }\n\n // Step 2: Resolve an account to use for the test\n const account = await resolveTestAccount(client, profile, options);\n\n // Step 3: If seller supports register_governance, start stub and register it\n let stub: GovernanceAgentStub | null = null;\n let stubUrl: string | null = null;\n let governanceContext: string | null = null;\n const planId = `plan-comply-gc-${Date.now()}`;\n // register_governance is from AdCP PR #1644 — merged but schemas not yet deployed.\n // Once deployed and synced, sellers that implement it will get the active stub test.\n const hasRegisterGovernance = profile.tools.includes('register_governance');\n\n if (hasRegisterGovernance) {\n stub = new GovernanceAgentStub();\n try {\n const info = await stub.startHttps();\n stubUrl = info.url;\n } catch {\n // HTTPS generation failed (no openssl?) — fall back to HTTP\n try {\n const info = await stub.start();\n stubUrl = info.url;\n } catch (err) {\n steps.push({\n step: 'Start governance agent stub',\n passed: false,\n duration_ms: 0,\n error: `Failed to start governance agent stub: ${(err as Error).message}`,\n });\n return { steps, profile };\n }\n }\n\n steps.push({\n step: 'Start governance agent stub',\n passed: true,\n duration_ms: 0,\n details: `Stub running at ${stubUrl}`,\n });\n\n // Register the stub with the seller\n const { result: registerResult, step: registerStep } = await runStep<TaskResult>(\n 'Register governance agent with seller',\n 'register_governance',\n async () =>\n client.executeCustomTask('register_governance', {\n accounts: [\n {\n account,\n governance_agents: [\n {\n url: stubUrl,\n authentication: {\n schemes: ['Bearer'],\n credentials: stub!.authToken,\n },\n },\n ],\n },\n ],\n }) as Promise<TaskResult>\n );\n steps.push(registerStep);\n\n if (!registerResult?.success) {\n // Registration failed — fall through to passive test\n steps.push({\n step: 'Governance agent registration',\n passed: true,\n duration_ms: 0,\n details: 'register_governance failed — falling back to passive governance_context persistence test',\n warnings: ['Cannot verify seller calls governance agent — register_governance returned an error'],\n });\n } else {\n // Get governance_context from the stub (simulate buyer's proposed check)\n try {\n const checkResult = await callMCPTool(stubUrl!, 'check_governance', {\n plan_id: planId,\n binding: 'proposed',\n caller: 'buyer',\n tool: 'create_media_buy',\n payload: {},\n });\n const parsed = JSON.parse((checkResult as { content: Array<{ text: string }> }).content[0]!.text);\n governanceContext = parsed.governance_context as string;\n\n steps.push({\n step: 'Obtain governance_context from stub (proposed check)',\n passed: true,\n duration_ms: 0,\n details: `governance_context received (${governanceContext?.length ?? 0} chars)`,\n });\n } catch (err) {\n steps.push({\n step: 'Obtain governance_context from stub (proposed check)',\n passed: false,\n duration_ms: 0,\n error: `Failed to call check_governance on stub: ${(err as Error).message}`,\n });\n }\n }\n } else {\n steps.push({\n step: 'Check register_governance support',\n passed: true,\n duration_ms: 0,\n details: 'Seller does not support register_governance — running passive governance_context persistence test only',\n warnings: ['Cannot verify seller calls governance agent — register_governance not supported'],\n });\n }\n\n // Step 4: Create media buy WITH governance_context\n const testGovernanceContext = governanceContext || `test-gc-comply-${Date.now()}`;\n const flightStart = new Date();\n const flightEnd = new Date(flightStart.getTime() + 30 * 24 * 60 * 60 * 1000);\n\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Create media buy with governance_context',\n 'create_media_buy',\n async () =>\n client.executeTaskLegacy('create_media_buy', {\n account,\n brand: options.brand || { domain: 'test.example' },\n start_time: flightStart.toISOString(),\n end_time: flightEnd.toISOString(),\n plan_id: governanceContext ? planId : undefined,\n packages: [\n {\n product_id: product.product_id,\n pricing_option_id: pricing.pricing_option_id,\n budget: (pricing.min_spend_per_package as number) || 500,\n bid_price: ((pricing.floor_price as number) || (pricing.fixed_price as number) || 10) + 1,\n name: 'Governance context test package',\n },\n ],\n governance_context: testGovernanceContext,\n }) as Promise<TaskResult>\n );\n\n if (!createResult?.success || !createResult?.data) {\n createStep.passed = false;\n createStep.error = createResult?.error || 'create_media_buy failed';\n steps.push(createStep);\n await stopStub(stub);\n return { steps, profile };\n }\n\n const mediaBuyId = createResult.data.media_buy_id as string;\n createStep.details = `Created media buy ${mediaBuyId} with governance_context`;\n steps.push(createStep);\n\n // Step 5: If stub is active, verify seller called check_governance(committed)\n if (stub && governanceContext && stubUrl) {\n // Poll the stub's call log for the committed check (100ms interval, 5s timeout)\n const pollStart = Date.now();\n const pollTimeout = 5000;\n const pollInterval = 100;\n while (Date.now() - pollStart < pollTimeout) {\n const calls = stub.getCallsForTool('check_governance');\n if (calls.some(c => c.params.binding === 'committed')) break;\n await new Promise(r => setTimeout(r, pollInterval));\n }\n\n const committedCalls = stub.getCallsForTool('check_governance').filter(c => c.params.binding === 'committed');\n\n const { step: callbackStep } = await runStep<void>(\n 'Verify seller called check_governance(committed) on governance agent',\n 'check_governance (callback)',\n async () => {\n if (committedCalls.length === 0) {\n throw new Error(\n 'Seller did not call check_governance(committed) on the registered governance agent. ' +\n 'Sellers MUST call check_governance with binding=\"committed\" before executing a media buy.'\n );\n }\n\n const callWithContext = committedCalls.find(c => c.params.governance_context === governanceContext);\n\n if (!callWithContext) {\n throw new Error(\n `Seller called check_governance(committed) but with wrong governance_context. ` +\n `Expected \"${governanceContext}\", got: ${committedCalls.map(c => JSON.stringify(c.params.governance_context)).join(', ')}`\n );\n }\n }\n );\n\n if (committedCalls.length > 0) {\n callbackStep.response_preview = JSON.stringify(committedCalls[0]!.params, null, 2);\n }\n steps.push(callbackStep);\n }\n\n // Step 6: Retrieve the media buy and check for governance_context persistence\n const { result: getResult, step: getStep } = await runStep<TaskResult>(\n 'Verify governance_context persisted on get_media_buys',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n media_buy_ids: [mediaBuyId],\n }) as Promise<TaskResult>\n );\n\n if (getResult?.success && getResult?.data) {\n const buys = (getResult.data.media_buys as Array<Record<string, unknown>>) || [];\n const buy =\n buys.find((b: Record<string, unknown>) => b.media_buy_id === mediaBuyId) ||\n (buys.length === 1 ? buys[0] : undefined);\n\n if (buy) {\n const returnedGC = buy.governance_context as string | undefined;\n if (returnedGC === testGovernanceContext) {\n getStep.details = 'governance_context persisted and returned correctly';\n } else if (returnedGC) {\n getStep.passed = false;\n getStep.error = `governance_context returned but value changed: expected \"${testGovernanceContext}\", got \"${returnedGC}\"`;\n } else {\n getStep.passed = false;\n getStep.error =\n 'Seller did not return governance_context on get_media_buys. ' +\n 'Sellers MUST persist governance_context from create_media_buy and include it on all subsequent responses.';\n }\n getStep.response_preview = JSON.stringify(\n {\n media_buy_id: buy.media_buy_id,\n governance_context: returnedGC ? `(present, ${returnedGC.length} chars)` : '(absent)',\n status: buy.status,\n },\n null,\n 2\n );\n } else if (buys.length === 0) {\n getStep.details =\n 'get_media_buys returned 0 buys — agent may be stateless (test agent). Cannot verify governance_context persistence.';\n getStep.warnings = [\n 'governance_context persistence could not be verified — agent does not persist media buys across requests',\n ];\n } else {\n getStep.passed = false;\n getStep.error = `Media buy ${mediaBuyId} not found among ${buys.length} returned buys`;\n }\n } else if (getResult && !getResult.success) {\n getStep.passed = false;\n getStep.error = getResult.error || 'get_media_buys failed';\n }\n steps.push(getStep);\n\n await stopStub(stub);\n return { steps, profile };\n}\n\n/**\n * Resolve a test account from the seller. Tries list_accounts first,\n * then sync_accounts, then falls back to a static account reference.\n */\nasync function resolveTestAccount(\n client: ReturnType<typeof getOrCreateClient>,\n profile: AgentProfile,\n options: TestOptions\n): Promise<Record<string, unknown>> {\n if (profile.tools.includes('list_accounts')) {\n try {\n const result = (await client.executeTask('list_accounts', {})) as TaskResult;\n const accounts = result?.data?.accounts as Array<Record<string, unknown>> | undefined;\n if (accounts?.length && accounts[0]) {\n return { account_id: accounts[0].account_id };\n }\n } catch {\n // Fall through\n }\n }\n\n if (profile.tools.includes('sync_accounts')) {\n try {\n const result = (await client.executeTask('sync_accounts', {\n accounts: [\n {\n brand: options.brand || { domain: 'test.example' },\n operator: 'comply-test',\n billing: 'operator',\n sandbox: true,\n },\n ],\n })) as TaskResult;\n const accounts = result?.data?.accounts as Array<Record<string, unknown>> | undefined;\n if (accounts?.length && accounts[0] && accounts[0].account_id) {\n return { account_id: accounts[0].account_id };\n }\n } catch {\n // Fall through\n }\n }\n\n return { account_id: 'test-gc-acct' };\n}\n\nasync function stopStub(stub: GovernanceAgentStub | null): Promise<void> {\n if (stub) {\n try {\n await stub.stop();\n } catch {}\n }\n}\n\n/**\n * Check if agent has any governance protocol tools\n */\nexport function hasGovernanceTools(tools: string[]): boolean {\n return GOVERNANCE_TOOLS.some(t => tools.includes(t));\n}\n\n/**\n * Check if agent has campaign governance tools\n */\nexport function hasCampaignGovernanceTools(tools: string[]): boolean {\n return CAMPAIGN_GOVERNANCE_TOOLS.some(t => tools.includes(t));\n}\n"],"mappings":"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","names":[]}
|