@adcp/sdk 12.1.1 → 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/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 +127 -50
- package/dist/lib/core/SingleAgentClient.d.ts +127 -50
- package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.js +1617 -177
- package/dist/lib/core/SingleAgentClient.js.map +1 -1
- package/dist/lib/core/SingleAgentClient.mjs +1627 -177
- 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 +136 -43
- package/dist/lib/core/TaskExecutor.js.map +1 -1
- package/dist/lib/core/TaskExecutor.mjs +136 -43
- 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/protocols/index.d.ts.map +1 -1
- package/dist/lib/protocols/index.js +6 -15
- package/dist/lib/protocols/index.js.map +1 -1
- package/dist/lib/protocols/index.mjs +6 -16
- 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/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.js +1 -1
- package/dist/lib/testing/client.js.map +1 -1
- package/dist/lib/testing/client.mjs +1 -1
- package/dist/lib/testing/client.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/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/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/brand-rights.ts"],"sourcesContent":["/**\n * Brand Rights Protocol Testing Scenarios (v3)\n *\n * Tests brand rights agent capabilities including:\n * - get_brand_identity -- retrieves brand identity information\n * - get_rights -- queries current rights associated with a brand\n * - acquire_rights -- initiates acquisition of brand rights\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile } from '../client';\nimport { BRAND_RIGHTS_TOOLS } from '../../utils/capabilities';\n\n/**\n * Test: Brand Rights Flow\n *\n * Flow: discover profile -> check brand rights tools -> get_rights -> acquire_rights\n */\nexport async function testBrandRightsFlow(\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 brand rights tools\n const hasBrandRights = BRAND_RIGHTS_TOOLS.some(t => profile.tools.includes(t));\n if (!hasBrandRights) {\n steps.push({\n step: 'Brand rights support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support Brand Rights Protocol tools',\n details: `Required tools: ${BRAND_RIGHTS_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n // Test: get_brand_identity\n if (profile.tools.includes('get_brand_identity')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get brand identity: retrieve brand identity information',\n 'get_brand_identity',\n async () =>\n client.executeTask('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-id-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Brand identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_guidelines: !!data['guidelines'],\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 = 'get_brand_identity not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_brand_identity failed';\n }\n }\n steps.push(step);\n }\n\n // Test: get_rights\n if (profile.tools.includes('get_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get rights: query current brand rights',\n 'get_rights',\n async () =>\n client.executeTask('get_rights', {\n type: 'get_rights_request',\n request_id: `e2e-rights-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n const rights = Array.isArray(data['rights']) ? data['rights'] : [];\n step.details = `Get rights returned ${rights.length} right(s)`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n rights_count: rights.length,\n has_expiration: rights.some((r: Record<string, unknown>) => !!r['expires_at']),\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 = 'get_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_rights failed';\n }\n }\n steps.push(step);\n }\n\n // Test: acquire_rights\n if (profile.tools.includes('acquire_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Acquire rights: initiate brand rights acquisition',\n 'acquire_rights',\n async () =>\n client.executeTask('acquire_rights', {\n type: 'acquire_rights_request',\n request_id: `e2e-acquire-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n rights_type: 'usage',\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Acquire rights returned status: ${data['status'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n status: data['status'],\n rights_id: data['rights_id'],\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 = 'acquire_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'acquire_rights failed';\n }\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Brand Identity\n *\n * Tests get_brand_identity at public and authorized access tiers.\n */\nexport async function testBrandIdentity(\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('get_brand_identity')) {\n steps.push({\n step: 'Brand identity support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support get_brand_identity',\n });\n return { steps, profile };\n }\n\n // Public access tier\n const { result: publicResult, step: publicStep } = await runStep<TaskResult>(\n 'Get brand identity (public access)',\n 'get_brand_identity',\n async () =>\n client.executeTask('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-pub-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n }) as Promise<TaskResult>\n );\n\n if (publicResult?.success && publicResult?.data) {\n const data = publicResult.data as Record<string, unknown>;\n publicStep.details = `Public identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n publicStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_logos: Array.isArray(data['logos']) && (data['logos'] as unknown[]).length > 0,\n has_colors: !!data['colors'],\n has_tone: !!data['tone'],\n },\n null,\n 2\n );\n } else if (publicResult && !publicResult.success) {\n publicStep.passed = false;\n publicStep.error = publicResult.error || 'get_brand_identity (public) failed';\n }\n steps.push(publicStep);\n\n // Authorized access tier (with brand_id if available)\n if (options.brand?.brand_id) {\n const { result: authResult, step: authStep } = await runStep<TaskResult>(\n 'Get brand identity (authorized access)',\n 'get_brand_identity',\n async () =>\n client.executeTask('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-auth-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (authResult?.success && authResult?.data) {\n const data = authResult.data as Record<string, unknown>;\n authStep.details = `Authorized identity returned for ${data['brand_name'] ?? 'unknown'}`;\n authStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n access_tier: data['access_tier'],\n has_guidelines: !!data['guidelines'],\n },\n null,\n 2\n );\n } else if (authResult && !authResult.success) {\n authStep.passed = false;\n authStep.error = authResult.error || 'get_brand_identity (authorized) failed';\n }\n steps.push(authStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Approval\n *\n * Tests the creative_approval workflow for brand compliance review.\n */\nexport async function testCreativeApproval(\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('creative_approval')) {\n steps.push({\n step: 'Creative approval support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support creative_approval',\n });\n return { steps, profile };\n }\n\n // Submit a creative for brand approval\n const { result, step } = await runStep<TaskResult>(\n 'Submit creative for brand approval',\n 'creative_approval',\n async () =>\n client.executeTask('creative_approval', {\n type: 'creative_approval_request',\n request_id: `e2e-approval-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n creative: {\n creative_id: `e2e-creative-${Date.now()}`,\n format: 'display_300x250',\n assets: [\n {\n asset_type: 'image',\n url: 'https://example.com/test-creative-300x250.png',\n },\n ],\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Creative approval decision: ${data['decision'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n decision: data['decision'],\n feedback: data['feedback'],\n has_issues: Array.isArray(data['issues']) && (data['issues'] as unknown[]).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 = 'creative_approval not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'creative_approval failed';\n }\n }\n steps.push(step);\n\n return { steps, profile };\n}\n\n/**\n * Check if agent has any brand rights tools\n */\nexport function hasBrandRightsTools(tools: string[]): boolean {\n return BRAND_RIGHTS_TOOLS.some(t => tools.includes(t));\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/testing/scenarios/brand-rights.ts"],"sourcesContent":["/**\n * Brand Rights Protocol Testing Scenarios (v3)\n *\n * Tests brand rights agent capabilities including:\n * - get_brand_identity -- retrieves brand identity information\n * - get_rights -- queries current rights associated with a brand\n * - acquire_rights -- initiates acquisition of brand rights\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile } from '../client';\nimport { BRAND_RIGHTS_TOOLS } from '../../utils/capabilities';\n\n/**\n * Test: Brand Rights Flow\n *\n * Flow: discover profile -> check brand rights tools -> get_rights -> acquire_rights\n */\nexport async function testBrandRightsFlow(\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 brand rights tools\n const hasBrandRights = BRAND_RIGHTS_TOOLS.some(t => profile.tools.includes(t));\n if (!hasBrandRights) {\n steps.push({\n step: 'Brand rights support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support Brand Rights Protocol tools',\n details: `Required tools: ${BRAND_RIGHTS_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n // Test: get_brand_identity\n if (profile.tools.includes('get_brand_identity')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get brand identity: retrieve brand identity information',\n 'get_brand_identity',\n async () =>\n client.executeTaskLegacy('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-id-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Brand identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_guidelines: !!data['guidelines'],\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 = 'get_brand_identity not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_brand_identity failed';\n }\n }\n steps.push(step);\n }\n\n // Test: get_rights\n if (profile.tools.includes('get_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get rights: query current brand rights',\n 'get_rights',\n async () =>\n client.executeTaskLegacy('get_rights', {\n type: 'get_rights_request',\n request_id: `e2e-rights-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n const rights = Array.isArray(data['rights']) ? data['rights'] : [];\n step.details = `Get rights returned ${rights.length} right(s)`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n rights_count: rights.length,\n has_expiration: rights.some((r: Record<string, unknown>) => !!r['expires_at']),\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 = 'get_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_rights failed';\n }\n }\n steps.push(step);\n }\n\n // Test: acquire_rights\n if (profile.tools.includes('acquire_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Acquire rights: initiate brand rights acquisition',\n 'acquire_rights',\n async () =>\n client.executeTaskLegacy('acquire_rights', {\n type: 'acquire_rights_request',\n request_id: `e2e-acquire-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n rights_type: 'usage',\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Acquire rights returned status: ${data['status'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n status: data['status'],\n rights_id: data['rights_id'],\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 = 'acquire_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'acquire_rights failed';\n }\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Brand Identity\n *\n * Tests get_brand_identity at public and authorized access tiers.\n */\nexport async function testBrandIdentity(\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('get_brand_identity')) {\n steps.push({\n step: 'Brand identity support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support get_brand_identity',\n });\n return { steps, profile };\n }\n\n // Public access tier\n const { result: publicResult, step: publicStep } = await runStep<TaskResult>(\n 'Get brand identity (public access)',\n 'get_brand_identity',\n async () =>\n client.executeTaskLegacy('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-pub-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n }) as Promise<TaskResult>\n );\n\n if (publicResult?.success && publicResult?.data) {\n const data = publicResult.data as Record<string, unknown>;\n publicStep.details = `Public identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n publicStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_logos: Array.isArray(data['logos']) && (data['logos'] as unknown[]).length > 0,\n has_colors: !!data['colors'],\n has_tone: !!data['tone'],\n },\n null,\n 2\n );\n } else if (publicResult && !publicResult.success) {\n publicStep.passed = false;\n publicStep.error = publicResult.error || 'get_brand_identity (public) failed';\n }\n steps.push(publicStep);\n\n // Authorized access tier (with brand_id if available)\n if (options.brand?.brand_id) {\n const { result: authResult, step: authStep } = await runStep<TaskResult>(\n 'Get brand identity (authorized access)',\n 'get_brand_identity',\n async () =>\n client.executeTaskLegacy('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-auth-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (authResult?.success && authResult?.data) {\n const data = authResult.data as Record<string, unknown>;\n authStep.details = `Authorized identity returned for ${data['brand_name'] ?? 'unknown'}`;\n authStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n access_tier: data['access_tier'],\n has_guidelines: !!data['guidelines'],\n },\n null,\n 2\n );\n } else if (authResult && !authResult.success) {\n authStep.passed = false;\n authStep.error = authResult.error || 'get_brand_identity (authorized) failed';\n }\n steps.push(authStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Approval\n *\n * Tests the creative_approval workflow for brand compliance review.\n */\nexport async function testCreativeApproval(\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('creative_approval')) {\n steps.push({\n step: 'Creative approval support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support creative_approval',\n });\n return { steps, profile };\n }\n\n // Submit a creative for brand approval\n const { result, step } = await runStep<TaskResult>(\n 'Submit creative for brand approval',\n 'creative_approval',\n async () =>\n client.executeCustomTask('creative_approval', {\n type: 'creative_approval_request',\n request_id: `e2e-approval-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n creative: {\n creative_id: `e2e-creative-${Date.now()}`,\n format: 'display_300x250',\n assets: [\n {\n asset_type: 'image',\n url: 'https://example.com/test-creative-300x250.png',\n },\n ],\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Creative approval decision: ${data['decision'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n decision: data['decision'],\n feedback: data['feedback'],\n has_issues: Array.isArray(data['issues']) && (data['issues'] as unknown[]).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 = 'creative_approval not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'creative_approval failed';\n }\n }\n steps.push(step);\n\n return { steps, profile };\n}\n\n/**\n * Check if agent has any brand rights tools\n */\nexport function hasBrandRightsTools(tools: string[]): boolean {\n return BRAND_RIGHTS_TOOLS.some(t => tools.includes(t));\n}\n"],"mappings":"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","names":[]}
|
|
@@ -23,7 +23,7 @@ async function testBrandRightsFlow(agentUrl, options) {
|
|
|
23
23
|
const { result, step } = await runStep(
|
|
24
24
|
"Get brand identity: retrieve brand identity information",
|
|
25
25
|
"get_brand_identity",
|
|
26
|
-
async () => client.
|
|
26
|
+
async () => client.executeTaskLegacy("get_brand_identity", {
|
|
27
27
|
type: "get_brand_identity_request",
|
|
28
28
|
request_id: `e2e-brand-id-${Date.now()}`,
|
|
29
29
|
brand_domain: options.brand?.domain ?? "example.com",
|
|
@@ -59,7 +59,7 @@ async function testBrandRightsFlow(agentUrl, options) {
|
|
|
59
59
|
const { result, step } = await runStep(
|
|
60
60
|
"Get rights: query current brand rights",
|
|
61
61
|
"get_rights",
|
|
62
|
-
async () => client.
|
|
62
|
+
async () => client.executeTaskLegacy("get_rights", {
|
|
63
63
|
type: "get_rights_request",
|
|
64
64
|
request_id: `e2e-rights-${Date.now()}`,
|
|
65
65
|
brand_domain: options.brand?.domain ?? "example.com",
|
|
@@ -95,7 +95,7 @@ async function testBrandRightsFlow(agentUrl, options) {
|
|
|
95
95
|
const { result, step } = await runStep(
|
|
96
96
|
"Acquire rights: initiate brand rights acquisition",
|
|
97
97
|
"acquire_rights",
|
|
98
|
-
async () => client.
|
|
98
|
+
async () => client.executeTaskLegacy("acquire_rights", {
|
|
99
99
|
type: "acquire_rights_request",
|
|
100
100
|
request_id: `e2e-acquire-${Date.now()}`,
|
|
101
101
|
brand_domain: options.brand?.domain ?? "example.com",
|
|
@@ -149,7 +149,7 @@ async function testBrandIdentity(agentUrl, options) {
|
|
|
149
149
|
const { result: publicResult, step: publicStep } = await runStep(
|
|
150
150
|
"Get brand identity (public access)",
|
|
151
151
|
"get_brand_identity",
|
|
152
|
-
async () => client.
|
|
152
|
+
async () => client.executeTaskLegacy("get_brand_identity", {
|
|
153
153
|
type: "get_brand_identity_request",
|
|
154
154
|
request_id: `e2e-brand-pub-${Date.now()}`,
|
|
155
155
|
brand_domain: options.brand?.domain ?? "example.com"
|
|
@@ -179,7 +179,7 @@ async function testBrandIdentity(agentUrl, options) {
|
|
|
179
179
|
const { result: authResult, step: authStep } = await runStep(
|
|
180
180
|
"Get brand identity (authorized access)",
|
|
181
181
|
"get_brand_identity",
|
|
182
|
-
async () => client.
|
|
182
|
+
async () => client.executeTaskLegacy("get_brand_identity", {
|
|
183
183
|
type: "get_brand_identity_request",
|
|
184
184
|
request_id: `e2e-brand-auth-${Date.now()}`,
|
|
185
185
|
brand_domain: options.brand?.domain ?? "example.com",
|
|
@@ -227,7 +227,7 @@ async function testCreativeApproval(agentUrl, options) {
|
|
|
227
227
|
const { result, step } = await runStep(
|
|
228
228
|
"Submit creative for brand approval",
|
|
229
229
|
"creative_approval",
|
|
230
|
-
async () => client.
|
|
230
|
+
async () => client.executeCustomTask("creative_approval", {
|
|
231
231
|
type: "creative_approval_request",
|
|
232
232
|
request_id: `e2e-approval-${Date.now()}`,
|
|
233
233
|
brand_domain: options.brand?.domain ?? "example.com",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/testing/scenarios/brand-rights.ts"],"sourcesContent":["/**\n * Brand Rights Protocol Testing Scenarios (v3)\n *\n * Tests brand rights agent capabilities including:\n * - get_brand_identity -- retrieves brand identity information\n * - get_rights -- queries current rights associated with a brand\n * - acquire_rights -- initiates acquisition of brand rights\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile } from '../client';\nimport { BRAND_RIGHTS_TOOLS } from '../../utils/capabilities';\n\n/**\n * Test: Brand Rights Flow\n *\n * Flow: discover profile -> check brand rights tools -> get_rights -> acquire_rights\n */\nexport async function testBrandRightsFlow(\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 brand rights tools\n const hasBrandRights = BRAND_RIGHTS_TOOLS.some(t => profile.tools.includes(t));\n if (!hasBrandRights) {\n steps.push({\n step: 'Brand rights support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support Brand Rights Protocol tools',\n details: `Required tools: ${BRAND_RIGHTS_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n // Test: get_brand_identity\n if (profile.tools.includes('get_brand_identity')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get brand identity: retrieve brand identity information',\n 'get_brand_identity',\n async () =>\n client.executeTask('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-id-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Brand identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_guidelines: !!data['guidelines'],\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 = 'get_brand_identity not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_brand_identity failed';\n }\n }\n steps.push(step);\n }\n\n // Test: get_rights\n if (profile.tools.includes('get_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get rights: query current brand rights',\n 'get_rights',\n async () =>\n client.executeTask('get_rights', {\n type: 'get_rights_request',\n request_id: `e2e-rights-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n const rights = Array.isArray(data['rights']) ? data['rights'] : [];\n step.details = `Get rights returned ${rights.length} right(s)`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n rights_count: rights.length,\n has_expiration: rights.some((r: Record<string, unknown>) => !!r['expires_at']),\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 = 'get_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_rights failed';\n }\n }\n steps.push(step);\n }\n\n // Test: acquire_rights\n if (profile.tools.includes('acquire_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Acquire rights: initiate brand rights acquisition',\n 'acquire_rights',\n async () =>\n client.executeTask('acquire_rights', {\n type: 'acquire_rights_request',\n request_id: `e2e-acquire-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n rights_type: 'usage',\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Acquire rights returned status: ${data['status'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n status: data['status'],\n rights_id: data['rights_id'],\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 = 'acquire_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'acquire_rights failed';\n }\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Brand Identity\n *\n * Tests get_brand_identity at public and authorized access tiers.\n */\nexport async function testBrandIdentity(\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('get_brand_identity')) {\n steps.push({\n step: 'Brand identity support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support get_brand_identity',\n });\n return { steps, profile };\n }\n\n // Public access tier\n const { result: publicResult, step: publicStep } = await runStep<TaskResult>(\n 'Get brand identity (public access)',\n 'get_brand_identity',\n async () =>\n client.executeTask('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-pub-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n }) as Promise<TaskResult>\n );\n\n if (publicResult?.success && publicResult?.data) {\n const data = publicResult.data as Record<string, unknown>;\n publicStep.details = `Public identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n publicStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_logos: Array.isArray(data['logos']) && (data['logos'] as unknown[]).length > 0,\n has_colors: !!data['colors'],\n has_tone: !!data['tone'],\n },\n null,\n 2\n );\n } else if (publicResult && !publicResult.success) {\n publicStep.passed = false;\n publicStep.error = publicResult.error || 'get_brand_identity (public) failed';\n }\n steps.push(publicStep);\n\n // Authorized access tier (with brand_id if available)\n if (options.brand?.brand_id) {\n const { result: authResult, step: authStep } = await runStep<TaskResult>(\n 'Get brand identity (authorized access)',\n 'get_brand_identity',\n async () =>\n client.executeTask('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-auth-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (authResult?.success && authResult?.data) {\n const data = authResult.data as Record<string, unknown>;\n authStep.details = `Authorized identity returned for ${data['brand_name'] ?? 'unknown'}`;\n authStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n access_tier: data['access_tier'],\n has_guidelines: !!data['guidelines'],\n },\n null,\n 2\n );\n } else if (authResult && !authResult.success) {\n authStep.passed = false;\n authStep.error = authResult.error || 'get_brand_identity (authorized) failed';\n }\n steps.push(authStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Approval\n *\n * Tests the creative_approval workflow for brand compliance review.\n */\nexport async function testCreativeApproval(\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('creative_approval')) {\n steps.push({\n step: 'Creative approval support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support creative_approval',\n });\n return { steps, profile };\n }\n\n // Submit a creative for brand approval\n const { result, step } = await runStep<TaskResult>(\n 'Submit creative for brand approval',\n 'creative_approval',\n async () =>\n client.executeTask('creative_approval', {\n type: 'creative_approval_request',\n request_id: `e2e-approval-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n creative: {\n creative_id: `e2e-creative-${Date.now()}`,\n format: 'display_300x250',\n assets: [\n {\n asset_type: 'image',\n url: 'https://example.com/test-creative-300x250.png',\n },\n ],\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Creative approval decision: ${data['decision'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n decision: data['decision'],\n feedback: data['feedback'],\n has_issues: Array.isArray(data['issues']) && (data['issues'] as unknown[]).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 = 'creative_approval not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'creative_approval failed';\n }\n }\n steps.push(step);\n\n return { steps, profile };\n}\n\n/**\n * Check if agent has any brand rights tools\n */\nexport function hasBrandRightsTools(tools: string[]): boolean {\n return BRAND_RIGHTS_TOOLS.some(t => tools.includes(t));\n}\n"],"mappings":"AAUA,SAAS,mBAAmB,SAAS,4BAA4B;AACjE,SAAS,0BAA0B;AAOnC,eAAsB,oBACpB,UACA,SAC8D;AAC9D,QAAM,QAA0B,CAAC;AACjC,QAAM,SAAS,kBAAkB,UAAU,OAAO;AAGlD,QAAM,EAAE,SAAS,MAAM,YAAY,IAAI,MAAM,qBAAqB,QAAQ,OAAO;AACjF,QAAM,KAAK,WAAW;AAEtB,MAAI,CAAC,YAAY,QAAQ;AACvB,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAGA,QAAM,iBAAiB,mBAAmB,KAAK,OAAK,QAAQ,MAAM,SAAS,CAAC,CAAC;AAC7E,MAAI,CAAC,gBAAgB;AACnB,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,OAAO;AAAA,MACP,SAAS,mBAAmB,mBAAmB,KAAK,IAAI,CAAC,gBAAgB,QAAQ,MAAM,KAAK,IAAI,CAAC;AAAA,IACnG,CAAC;AACD,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAGA,MAAI,QAAQ,MAAM,SAAS,oBAAoB,GAAG;AAChD,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YACE,OAAO,YAAY,sBAAsB;AAAA,QACvC,MAAM;AAAA,QACN,YAAY,gBAAgB,KAAK,IAAI,CAAC;AAAA,QACtC,cAAc,QAAQ,OAAO,UAAU;AAAA,QACvC,UAAU,QAAQ,OAAO;AAAA,MAC3B,CAAC;AAAA,IACL;AAEA,QAAI,QAAQ,WAAW,QAAQ,MAAM;AACnC,YAAM,OAAO,OAAO;AACpB,WAAK,UAAU,+BAA+B,KAAK,YAAY,KAAK,KAAK,cAAc,KAAK,SAAS;AACrG,WAAK,mBAAmB,KAAK;AAAA,QAC3B;AAAA,UACE,YAAY,KAAK,YAAY;AAAA,UAC7B,YAAY,KAAK,YAAY;AAAA,UAC7B,cAAc,KAAK,cAAc;AAAA,UACjC,gBAAgB,CAAC,CAAC,KAAK,YAAY;AAAA,QACrC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,UAAU,CAAC,OAAO,SAAS;AACpC,YAAM,QAAQ,OAAO,SAAS;AAC9B,UAAI,MAAM,SAAS,eAAe,KAAK,MAAM,SAAS,iBAAiB,GAAG;AACxE,aAAK,SAAS;AACd,aAAK,UAAU;AAAA,MACjB,OAAO;AACL,aAAK,SAAS;AACd,aAAK,QAAQ,OAAO,SAAS;AAAA,MAC/B;AAAA,IACF;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,MAAI,QAAQ,MAAM,SAAS,YAAY,GAAG;AACxC,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YACE,OAAO,YAAY,cAAc;AAAA,QAC/B,MAAM;AAAA,QACN,YAAY,cAAc,KAAK,IAAI,CAAC;AAAA,QACpC,cAAc,QAAQ,OAAO,UAAU;AAAA,QACvC,UAAU,QAAQ,OAAO;AAAA,MAC3B,CAAC;AAAA,IACL;AAEA,QAAI,QAAQ,WAAW,QAAQ,MAAM;AACnC,YAAM,OAAO,OAAO;AACpB,YAAM,SAAS,MAAM,QAAQ,KAAK,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC;AACjE,WAAK,UAAU,uBAAuB,OAAO,MAAM;AACnD,WAAK,mBAAmB,KAAK;AAAA,QAC3B;AAAA,UACE,YAAY,KAAK,YAAY;AAAA,UAC7B,cAAc,OAAO;AAAA,UACrB,gBAAgB,OAAO,KAAK,CAAC,MAA+B,CAAC,CAAC,EAAE,YAAY,CAAC;AAAA,QAC/E;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,UAAU,CAAC,OAAO,SAAS;AACpC,YAAM,QAAQ,OAAO,SAAS;AAC9B,UAAI,MAAM,SAAS,eAAe,KAAK,MAAM,SAAS,iBAAiB,GAAG;AACxE,aAAK,SAAS;AACd,aAAK,UAAU;AAAA,MACjB,OAAO;AACL,aAAK,SAAS;AACd,aAAK,QAAQ,OAAO,SAAS;AAAA,MAC/B;AAAA,IACF;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,MAAI,QAAQ,MAAM,SAAS,gBAAgB,GAAG;AAC5C,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YACE,OAAO,YAAY,kBAAkB;AAAA,QACnC,MAAM;AAAA,QACN,YAAY,eAAe,KAAK,IAAI,CAAC;AAAA,QACrC,cAAc,QAAQ,OAAO,UAAU;AAAA,QACvC,UAAU,QAAQ,OAAO;AAAA,QACzB,aAAa;AAAA,MACf,CAAC;AAAA,IACL;AAEA,QAAI,QAAQ,WAAW,QAAQ,MAAM;AACnC,YAAM,OAAO,OAAO;AACpB,WAAK,UAAU,mCAAmC,KAAK,QAAQ,KAAK,SAAS;AAC7E,WAAK,mBAAmB,KAAK;AAAA,QAC3B;AAAA,UACE,YAAY,KAAK,YAAY;AAAA,UAC7B,QAAQ,KAAK,QAAQ;AAAA,UACrB,WAAW,KAAK,WAAW;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,UAAU,CAAC,OAAO,SAAS;AACpC,YAAM,QAAQ,OAAO,SAAS;AAC9B,UAAI,MAAM,SAAS,eAAe,KAAK,MAAM,SAAS,iBAAiB,GAAG;AACxE,aAAK,SAAS;AACd,aAAK,UAAU;AAAA,MACjB,OAAO;AACL,aAAK,SAAS;AACd,aAAK,QAAQ,OAAO,SAAS;AAAA,MAC/B;AAAA,IACF;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAOA,eAAsB,kBACpB,UACA,SAC8D;AAC9D,QAAM,QAA0B,CAAC;AACjC,QAAM,SAAS,kBAAkB,UAAU,OAAO;AAElD,QAAM,EAAE,SAAS,MAAM,YAAY,IAAI,MAAM,qBAAqB,QAAQ,OAAO;AACjF,QAAM,KAAK,WAAW;AAEtB,MAAI,CAAC,YAAY,QAAQ;AACvB,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAEA,MAAI,CAAC,QAAQ,MAAM,SAAS,oBAAoB,GAAG;AACjD,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,OAAO;AAAA,IACT,CAAC;AACD,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAGA,QAAM,EAAE,QAAQ,cAAc,MAAM,WAAW,IAAI,MAAM;AAAA,IACvD;AAAA,IACA;AAAA,IACA,YACE,OAAO,YAAY,sBAAsB;AAAA,MACvC,MAAM;AAAA,MACN,YAAY,iBAAiB,KAAK,IAAI,CAAC;AAAA,MACvC,cAAc,QAAQ,OAAO,UAAU;AAAA,IACzC,CAAC;AAAA,EACL;AAEA,MAAI,cAAc,WAAW,cAAc,MAAM;AAC/C,UAAM,OAAO,aAAa;AAC1B,eAAW,UAAU,gCAAgC,KAAK,YAAY,KAAK,KAAK,cAAc,KAAK,SAAS;AAC5G,eAAW,mBAAmB,KAAK;AAAA,MACjC;AAAA,QACE,YAAY,KAAK,YAAY;AAAA,QAC7B,YAAY,KAAK,YAAY;AAAA,QAC7B,cAAc,KAAK,cAAc;AAAA,QACjC,WAAW,MAAM,QAAQ,KAAK,OAAO,CAAC,KAAM,KAAK,OAAO,EAAgB,SAAS;AAAA,QACjF,YAAY,CAAC,CAAC,KAAK,QAAQ;AAAA,QAC3B,UAAU,CAAC,CAAC,KAAK,MAAM;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,gBAAgB,CAAC,aAAa,SAAS;AAChD,eAAW,SAAS;AACpB,eAAW,QAAQ,aAAa,SAAS;AAAA,EAC3C;AACA,QAAM,KAAK,UAAU;AAGrB,MAAI,QAAQ,OAAO,UAAU;AAC3B,UAAM,EAAE,QAAQ,YAAY,MAAM,SAAS,IAAI,MAAM;AAAA,MACnD;AAAA,MACA;AAAA,MACA,YACE,OAAO,YAAY,sBAAsB;AAAA,QACvC,MAAM;AAAA,QACN,YAAY,kBAAkB,KAAK,IAAI,CAAC;AAAA,QACxC,cAAc,QAAQ,OAAO,UAAU;AAAA,QACvC,UAAU,QAAQ,OAAO;AAAA,MAC3B,CAAC;AAAA,IACL;AAEA,QAAI,YAAY,WAAW,YAAY,MAAM;AAC3C,YAAM,OAAO,WAAW;AACxB,eAAS,UAAU,oCAAoC,KAAK,YAAY,KAAK,SAAS;AACtF,eAAS,mBAAmB,KAAK;AAAA,QAC/B;AAAA,UACE,YAAY,KAAK,YAAY;AAAA,UAC7B,YAAY,KAAK,YAAY;AAAA,UAC7B,aAAa,KAAK,aAAa;AAAA,UAC/B,gBAAgB,CAAC,CAAC,KAAK,YAAY;AAAA,QACrC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,cAAc,CAAC,WAAW,SAAS;AAC5C,eAAS,SAAS;AAClB,eAAS,QAAQ,WAAW,SAAS;AAAA,IACvC;AACA,UAAM,KAAK,QAAQ;AAAA,EACrB;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAOA,eAAsB,qBACpB,UACA,SAC8D;AAC9D,QAAM,QAA0B,CAAC;AACjC,QAAM,SAAS,kBAAkB,UAAU,OAAO;AAElD,QAAM,EAAE,SAAS,MAAM,YAAY,IAAI,MAAM,qBAAqB,QAAQ,OAAO;AACjF,QAAM,KAAK,WAAW;AAEtB,MAAI,CAAC,YAAY,QAAQ;AACvB,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAEA,MAAI,CAAC,QAAQ,MAAM,SAAS,mBAAmB,GAAG;AAChD,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,OAAO;AAAA,IACT,CAAC;AACD,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAGA,QAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,YACE,OAAO,YAAY,qBAAqB;AAAA,MACtC,MAAM;AAAA,MACN,YAAY,gBAAgB,KAAK,IAAI,CAAC;AAAA,MACtC,cAAc,QAAQ,OAAO,UAAU;AAAA,MACvC,UAAU,QAAQ,OAAO;AAAA,MACzB,UAAU;AAAA,QACR,aAAa,gBAAgB,KAAK,IAAI,CAAC;AAAA,QACvC,QAAQ;AAAA,QACR,QAAQ;AAAA,UACN;AAAA,YACE,YAAY;AAAA,YACZ,KAAK;AAAA,UACP;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACL;AAEA,MAAI,QAAQ,WAAW,QAAQ,MAAM;AACnC,UAAM,OAAO,OAAO;AACpB,SAAK,UAAU,+BAA+B,KAAK,UAAU,KAAK,SAAS;AAC3E,SAAK,mBAAmB,KAAK;AAAA,MAC3B;AAAA,QACE,YAAY,KAAK,YAAY;AAAA,QAC7B,UAAU,KAAK,UAAU;AAAA,QACzB,UAAU,KAAK,UAAU;AAAA,QACzB,YAAY,MAAM,QAAQ,KAAK,QAAQ,CAAC,KAAM,KAAK,QAAQ,EAAgB,SAAS;AAAA,MACtF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,UAAU,CAAC,OAAO,SAAS;AACpC,UAAM,QAAQ,OAAO,SAAS;AAC9B,QAAI,MAAM,SAAS,eAAe,KAAK,MAAM,SAAS,iBAAiB,GAAG;AACxE,WAAK,SAAS;AACd,WAAK,UAAU;AAAA,IACjB,OAAO;AACL,WAAK,SAAS;AACd,WAAK,QAAQ,OAAO,SAAS;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,KAAK,IAAI;AAEf,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAKO,SAAS,oBAAoB,OAA0B;AAC5D,SAAO,mBAAmB,KAAK,OAAK,MAAM,SAAS,CAAC,CAAC;AACvD;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/testing/scenarios/brand-rights.ts"],"sourcesContent":["/**\n * Brand Rights Protocol Testing Scenarios (v3)\n *\n * Tests brand rights agent capabilities including:\n * - get_brand_identity -- retrieves brand identity information\n * - get_rights -- queries current rights associated with a brand\n * - acquire_rights -- initiates acquisition of brand rights\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile } from '../client';\nimport { BRAND_RIGHTS_TOOLS } from '../../utils/capabilities';\n\n/**\n * Test: Brand Rights Flow\n *\n * Flow: discover profile -> check brand rights tools -> get_rights -> acquire_rights\n */\nexport async function testBrandRightsFlow(\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 brand rights tools\n const hasBrandRights = BRAND_RIGHTS_TOOLS.some(t => profile.tools.includes(t));\n if (!hasBrandRights) {\n steps.push({\n step: 'Brand rights support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support Brand Rights Protocol tools',\n details: `Required tools: ${BRAND_RIGHTS_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n // Test: get_brand_identity\n if (profile.tools.includes('get_brand_identity')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get brand identity: retrieve brand identity information',\n 'get_brand_identity',\n async () =>\n client.executeTaskLegacy('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-id-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Brand identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_guidelines: !!data['guidelines'],\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 = 'get_brand_identity not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_brand_identity failed';\n }\n }\n steps.push(step);\n }\n\n // Test: get_rights\n if (profile.tools.includes('get_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get rights: query current brand rights',\n 'get_rights',\n async () =>\n client.executeTaskLegacy('get_rights', {\n type: 'get_rights_request',\n request_id: `e2e-rights-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n const rights = Array.isArray(data['rights']) ? data['rights'] : [];\n step.details = `Get rights returned ${rights.length} right(s)`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n rights_count: rights.length,\n has_expiration: rights.some((r: Record<string, unknown>) => !!r['expires_at']),\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 = 'get_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_rights failed';\n }\n }\n steps.push(step);\n }\n\n // Test: acquire_rights\n if (profile.tools.includes('acquire_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Acquire rights: initiate brand rights acquisition',\n 'acquire_rights',\n async () =>\n client.executeTaskLegacy('acquire_rights', {\n type: 'acquire_rights_request',\n request_id: `e2e-acquire-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n rights_type: 'usage',\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Acquire rights returned status: ${data['status'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n status: data['status'],\n rights_id: data['rights_id'],\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 = 'acquire_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'acquire_rights failed';\n }\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Brand Identity\n *\n * Tests get_brand_identity at public and authorized access tiers.\n */\nexport async function testBrandIdentity(\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('get_brand_identity')) {\n steps.push({\n step: 'Brand identity support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support get_brand_identity',\n });\n return { steps, profile };\n }\n\n // Public access tier\n const { result: publicResult, step: publicStep } = await runStep<TaskResult>(\n 'Get brand identity (public access)',\n 'get_brand_identity',\n async () =>\n client.executeTaskLegacy('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-pub-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n }) as Promise<TaskResult>\n );\n\n if (publicResult?.success && publicResult?.data) {\n const data = publicResult.data as Record<string, unknown>;\n publicStep.details = `Public identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n publicStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_logos: Array.isArray(data['logos']) && (data['logos'] as unknown[]).length > 0,\n has_colors: !!data['colors'],\n has_tone: !!data['tone'],\n },\n null,\n 2\n );\n } else if (publicResult && !publicResult.success) {\n publicStep.passed = false;\n publicStep.error = publicResult.error || 'get_brand_identity (public) failed';\n }\n steps.push(publicStep);\n\n // Authorized access tier (with brand_id if available)\n if (options.brand?.brand_id) {\n const { result: authResult, step: authStep } = await runStep<TaskResult>(\n 'Get brand identity (authorized access)',\n 'get_brand_identity',\n async () =>\n client.executeTaskLegacy('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-auth-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (authResult?.success && authResult?.data) {\n const data = authResult.data as Record<string, unknown>;\n authStep.details = `Authorized identity returned for ${data['brand_name'] ?? 'unknown'}`;\n authStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n access_tier: data['access_tier'],\n has_guidelines: !!data['guidelines'],\n },\n null,\n 2\n );\n } else if (authResult && !authResult.success) {\n authStep.passed = false;\n authStep.error = authResult.error || 'get_brand_identity (authorized) failed';\n }\n steps.push(authStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Approval\n *\n * Tests the creative_approval workflow for brand compliance review.\n */\nexport async function testCreativeApproval(\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('creative_approval')) {\n steps.push({\n step: 'Creative approval support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support creative_approval',\n });\n return { steps, profile };\n }\n\n // Submit a creative for brand approval\n const { result, step } = await runStep<TaskResult>(\n 'Submit creative for brand approval',\n 'creative_approval',\n async () =>\n client.executeCustomTask('creative_approval', {\n type: 'creative_approval_request',\n request_id: `e2e-approval-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n creative: {\n creative_id: `e2e-creative-${Date.now()}`,\n format: 'display_300x250',\n assets: [\n {\n asset_type: 'image',\n url: 'https://example.com/test-creative-300x250.png',\n },\n ],\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Creative approval decision: ${data['decision'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n decision: data['decision'],\n feedback: data['feedback'],\n has_issues: Array.isArray(data['issues']) && (data['issues'] as unknown[]).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 = 'creative_approval not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'creative_approval failed';\n }\n }\n steps.push(step);\n\n return { steps, profile };\n}\n\n/**\n * Check if agent has any brand rights tools\n */\nexport function hasBrandRightsTools(tools: string[]): boolean {\n return BRAND_RIGHTS_TOOLS.some(t => tools.includes(t));\n}\n"],"mappings":"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","names":[]}
|
|
@@ -44,7 +44,7 @@ async function testCreativeFlow(agentUrl, options) {
|
|
|
44
44
|
const { result, step } = await (0, import_client.runStep)(
|
|
45
45
|
`Build creative: ${formatDisplayName}`,
|
|
46
46
|
"build_creative",
|
|
47
|
-
async () => client.
|
|
47
|
+
async () => client.buildCreativeLegacy({
|
|
48
48
|
target_format_id: format.format_id,
|
|
49
49
|
brand: (0, import_client.resolveBrand)(options),
|
|
50
50
|
message: `Create an ad for an e-commerce brand promoting summer sale`,
|
|
@@ -77,7 +77,7 @@ async function testCreativeFlow(agentUrl, options) {
|
|
|
77
77
|
const { step: minimalStep } = await (0, import_client.runStep)(
|
|
78
78
|
"Preview creative: minimal assets",
|
|
79
79
|
"preview_creative",
|
|
80
|
-
async () => client.
|
|
80
|
+
async () => client.previewCreativeLegacy({
|
|
81
81
|
request_type: "single",
|
|
82
82
|
creative_manifest: {
|
|
83
83
|
format_id: formatsToTest[0]?.format_id || {
|
|
@@ -95,7 +95,7 @@ async function testCreativeFlow(agentUrl, options) {
|
|
|
95
95
|
const { result, step } = await (0, import_client.runStep)(
|
|
96
96
|
`Preview creative: with assets (${sampleFormat.format_id.id})`,
|
|
97
97
|
"preview_creative",
|
|
98
|
-
async () => client.
|
|
98
|
+
async () => client.previewCreativeLegacy({
|
|
99
99
|
request_type: "single",
|
|
100
100
|
creative_manifest: {
|
|
101
101
|
format_id: sampleFormat.format_id,
|
|
@@ -128,7 +128,7 @@ async function testCreativeFlow(agentUrl, options) {
|
|
|
128
128
|
const { result: errorResult, step: errorStep } = await (0, import_client.runStep)(
|
|
129
129
|
"Preview creative: invalid format (error expected)",
|
|
130
130
|
"preview_creative",
|
|
131
|
-
async () => client.
|
|
131
|
+
async () => client.previewCreativeLegacy({
|
|
132
132
|
request_type: "single",
|
|
133
133
|
creative_manifest: {
|
|
134
134
|
format_id: { agent_url: "https://creative.adcontextprotocol.org", id: "INVALID_FORMAT_ID_12345" },
|
|
@@ -209,7 +209,7 @@ async function testCreativeLifecycle(agentUrl, options) {
|
|
|
209
209
|
const { result: syncResult, step: syncStep } = await (0, import_client.runStep)(
|
|
210
210
|
`Sync ${creativesToSync.length} creative(s) to library`,
|
|
211
211
|
"sync_creatives",
|
|
212
|
-
async () => client.
|
|
212
|
+
async () => client.executeTaskLegacy("sync_creatives", {
|
|
213
213
|
creatives: creativesToSync
|
|
214
214
|
})
|
|
215
215
|
);
|
|
@@ -321,7 +321,7 @@ async function testCreativeLifecycle(agentUrl, options) {
|
|
|
321
321
|
const { result, step } = await (0, import_client.runStep)(
|
|
322
322
|
`Build creative for lifecycle (${targetFormat.format_id})`,
|
|
323
323
|
"build_creative",
|
|
324
|
-
async () => client.
|
|
324
|
+
async () => client.executeTaskLegacy("build_creative", {
|
|
325
325
|
target_format_id: targetFormat.format_id,
|
|
326
326
|
brand: (0, import_client.resolveBrand)(options),
|
|
327
327
|
message: `Create an ad for lifecycle testing`,
|
|
@@ -352,7 +352,7 @@ async function testCreativeLifecycle(agentUrl, options) {
|
|
|
352
352
|
const { result, step } = await (0, import_client.runStep)(
|
|
353
353
|
`Preview creative for lifecycle (${targetFormat.format_id})`,
|
|
354
354
|
"preview_creative",
|
|
355
|
-
async () => client.
|
|
355
|
+
async () => client.executeTaskLegacy("preview_creative", {
|
|
356
356
|
request_type: "single",
|
|
357
357
|
creative_manifest: {
|
|
358
358
|
format_id: targetFormat.format_id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/testing/scenarios/creative.ts"],"sourcesContent":["/**\n * Creative Agent Testing Scenarios\n *\n * Tests creative agent capabilities including:\n * - list_creative_formats / list_formats\n * - build_creative\n * - preview_creative\n *\n * Enhanced to:\n * - Test multiple formats from the agent's actual catalog\n * - Test with both required and optional assets\n * - Validate preview renders\n */\n\nimport type { BuildCreativeRequest, PreviewCreativeRequest } from '../../types/tools.generated';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile, discoverCreativeFormats, resolveBrand } from '../client';\n\n/**\n * Test: Creative Flow (for creative agents)\n *\n * Flow: list_formats -> build_creative (multiple formats) -> preview_creative (with assets)\n */\nexport async function testCreativeFlow(\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 // Discover creative formats with full details\n const { formats, step: formatStep } = await discoverCreativeFormats(client, profile);\n steps.push(formatStep);\n\n if (!formatStep.passed || !formats || formats.length === 0) {\n return { steps, profile: { ...profile, supported_formats: formats || [] } };\n }\n\n // Store discovered formats in profile\n profile.supported_formats = formats;\n\n // Determine which formats to test\n const formatsToTest = selectFormatsToTest(formats || [], options);\n\n // Build creative for each selected format\n if (profile.tools.includes('build_creative')) {\n for (const format of formatsToTest) {\n const formatDisplayName = format.name || format.format_id.id;\n const { result, step } = await runStep<TaskResult>(\n `Build creative: ${formatDisplayName}`,\n 'build_creative',\n async () =>\n client.buildCreative({\n target_format_id: format.format_id,\n brand: resolveBrand(options),\n message: `Create an ad for an e-commerce brand promoting summer sale`,\n quality: 'draft',\n include_preview: true,\n } as unknown as BuildCreativeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as {\n creative_manifest?: { format_id?: unknown; assets?: Record<string, unknown> };\n creative_manifests?: Array<{ format_id?: unknown; assets?: Record<string, unknown> }>;\n preview?: { previews?: unknown[] };\n };\n const manifest = data.creative_manifest || data.creative_manifests?.[0];\n step.details = `Built creative manifest for format ${formatDisplayName}`;\n step.response_preview = JSON.stringify(\n {\n format_id: manifest?.format_id || format.format_id,\n asset_keys: Object.keys(manifest?.assets || {}),\n has_preview: !!data.preview,\n preview_count: data.preview?.previews?.length || 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'build_creative failed';\n }\n steps.push(step);\n }\n }\n\n // Preview creative with various asset configurations\n if (profile.tools.includes('preview_creative')) {\n // Test 1: Preview with minimal assets (empty)\n const { step: minimalStep } = await runStep<TaskResult>(\n 'Preview creative: minimal assets',\n 'preview_creative',\n async () =>\n client.previewCreative({\n request_type: 'single',\n creative_manifest: {\n format_id: formatsToTest[0]?.format_id || {\n agent_url: 'https://creative.adcontextprotocol.org',\n id: 'display_300x250',\n },\n name: 'Minimal Test Creative',\n assets: {},\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n steps.push(minimalStep);\n\n // Test 2: Preview with sample assets\n const sampleFormat = formatsToTest[0];\n if (sampleFormat) {\n const { result, step } = await runStep<TaskResult>(\n `Preview creative: with assets (${sampleFormat.format_id.id})`,\n 'preview_creative',\n async () =>\n client.previewCreative({\n request_type: 'single',\n creative_manifest: {\n format_id: sampleFormat.format_id,\n name: 'Full Test Creative',\n assets: buildTestAssets(sampleFormat) as unknown as Record<string, unknown>,\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as {\n previews?: Array<{ renders?: unknown[] }>;\n interactive_url?: string;\n };\n const previews = data.previews || [];\n const renderCount = previews.reduce((count, preview) => count + (preview.renders?.length || 0), 0);\n step.details = `Generated preview with ${previews.length} variant(s)`;\n step.response_preview = JSON.stringify(\n {\n has_renders: renderCount > 0,\n preview_count: previews.length,\n render_count: renderCount,\n interactive_url: data.interactive_url,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'preview_creative failed';\n }\n steps.push(step);\n }\n\n // Test 3: Preview with invalid format_id (error case)\n const { result: errorResult, step: errorStep } = await runStep<TaskResult>(\n 'Preview creative: invalid format (error expected)',\n 'preview_creative',\n async () =>\n client.previewCreative({\n request_type: 'single',\n creative_manifest: {\n format_id: { agent_url: 'https://creative.adcontextprotocol.org', id: 'INVALID_FORMAT_ID_12345' },\n name: 'Error Test Creative',\n assets: {},\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n\n // This should fail - if it succeeds with invalid format, that's a bug\n if (errorResult?.success) {\n errorStep.passed = false;\n errorStep.error = 'Expected error for invalid format_id but got success';\n } else {\n errorStep.passed = true;\n errorStep.details = 'Correctly rejected invalid format_id';\n }\n steps.push(errorStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Lifecycle\n *\n * Chains creative protocol operations end-to-end:\n * 1. list_creative_formats → verify format schema\n * 2. sync_creatives with multiple creatives → verify per-creative status\n * 3. list_creatives (no snapshot) → verify basic fields\n * 4. list_creatives (include_snapshot: true) → verify snapshot or snapshot_unavailable_reason\n * 5. build_creative or preview_creative on synced creative → adapt to agent capabilities\n */\nexport async function testCreativeLifecycle(\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 // Step 1: Discover creative formats\n const { formats, step: formatStep } = await discoverCreativeFormats(client, profile);\n steps.push(formatStep);\n\n if (!formatStep.passed || !formats || formats.length === 0) {\n return { steps, profile };\n }\n\n profile.supported_formats = formats;\n\n // Validate format schema: each format should have format_id\n const formatSchemaIssues: string[] = [];\n for (const format of formats) {\n if (!format.format_id) formatSchemaIssues.push('Missing format_id');\n }\n\n steps.push({\n step: 'Validate format schema',\n passed: formatSchemaIssues.length === 0,\n duration_ms: 0,\n details:\n formatSchemaIssues.length === 0\n ? `All ${formats.length} format(s) have required fields`\n : formatSchemaIssues.join('; '),\n warnings: formatSchemaIssues.length > 0 ? formatSchemaIssues : undefined,\n });\n\n // Step 2: Sync multiple creatives (image + video if formats allow)\n if (profile.tools.includes('sync_creatives')) {\n const imageFormat = formats[0]!;\n const videoFormat = formats.length > 1 ? formats[1] : undefined;\n\n const creativesToSync = [\n {\n creative_id: `lifecycle-img-${Date.now()}`,\n name: 'Lifecycle Test Image Creative',\n format_id: imageFormat.format_id,\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250.png?text=Lifecycle+Image',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n },\n ];\n\n if (videoFormat) {\n creativesToSync.push({\n creative_id: `lifecycle-vid-${Date.now()}`,\n name: 'Lifecycle Test Video Creative',\n format_id: videoFormat.format_id,\n assets: {\n primary: {\n url: 'https://storage.googleapis.com/webfundamentals-assets/videos/chrome.mp4',\n width: 1920,\n height: 1080,\n format: 'mp4',\n },\n },\n });\n }\n\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n `Sync ${creativesToSync.length} creative(s) to library`,\n 'sync_creatives',\n async () =>\n client.executeTask('sync_creatives', {\n creatives: creativesToSync,\n }) as Promise<TaskResult>\n );\n\n if (syncResult?.success && syncResult?.data) {\n const data = syncResult.data;\n const creatives = data.creatives || [];\n const actions = creatives.map((c: any) => c.action);\n const failed = creatives.filter((c: any) => c.action === 'failed');\n\n syncStep.details = `Synced ${creatives.length} creative(s), actions: ${actions.join(', ')}`;\n syncStep.response_preview = JSON.stringify(\n {\n synced_count: creatives.length,\n actions,\n creative_ids: creatives.map((c: any) => c.creative_id),\n failed_count: failed.length,\n failed_errors: failed.map((c: any) => ({ creative_id: c.creative_id, errors: c.errors })),\n },\n null,\n 2\n );\n } else if (syncResult && !syncResult.success) {\n syncStep.passed = false;\n syncStep.error = syncResult.error || 'sync_creatives returned unsuccessful result';\n }\n steps.push(syncStep);\n\n // Step 3: list_creatives without snapshot\n if (profile.tools.includes('list_creatives')) {\n const { result: listResult, step: listStep } = await runStep<TaskResult>(\n 'List creatives (no snapshot)',\n 'list_creatives',\n async () => client.executeTask('list_creatives', {}) as Promise<TaskResult>\n );\n\n if (listResult?.success && listResult?.data) {\n const data = listResult.data;\n const creatives = data.creatives || [];\n\n // Validate basic fields on each creative\n const fieldIssues: string[] = [];\n for (const creative of creatives.slice(0, 5)) {\n if (!creative.creative_id) fieldIssues.push('Creative missing creative_id');\n if (!creative.name) fieldIssues.push(`Creative ${creative.creative_id}: missing name`);\n if (!creative.format_id) fieldIssues.push(`Creative ${creative.creative_id}: missing format_id`);\n }\n\n // Verify snapshot is absent when not requested\n const hasUnexpectedSnapshot = creatives.some((c: any) => c.snapshot !== undefined);\n\n if (fieldIssues.length > 0) {\n listStep.passed = false;\n listStep.error = `Creative field validation: ${fieldIssues.join('; ')}`;\n } else {\n listStep.details = `Found ${creatives.length} creative(s) with valid fields`;\n }\n\n listStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n statuses: Array.from(new Set(creatives.map((c: any) => c.status))),\n has_unexpected_snapshot: hasUnexpectedSnapshot,\n query_summary: data.query_summary,\n },\n null,\n 2\n );\n\n if (hasUnexpectedSnapshot) {\n listStep.warnings = ['snapshot field present on creatives without include_snapshot=true'];\n }\n } else if (listResult && !listResult.success) {\n listStep.passed = false;\n listStep.error = listResult.error || 'list_creatives returned unsuccessful result';\n }\n steps.push(listStep);\n\n // Step 4: list_creatives with include_snapshot: true\n const { result: snapshotResult, step: snapshotStep } = await runStep<TaskResult>(\n 'List creatives (include_snapshot: true)',\n 'list_creatives',\n async () => client.executeTask('list_creatives', { include_snapshot: true }) as Promise<TaskResult>\n );\n\n if (snapshotResult?.success && snapshotResult?.data) {\n const data = snapshotResult.data;\n const creatives = data.creatives || [];\n\n // Each creative should have either snapshot data or snapshot_unavailable_reason\n const invalidCreatives = creatives.filter((c: any) => {\n if (c.snapshot) {\n return !c.snapshot.as_of || c.snapshot.staleness_seconds === undefined;\n }\n return !c.snapshot_unavailable_reason;\n });\n\n if (invalidCreatives.length > 0) {\n snapshotStep.passed = false;\n snapshotStep.error = `${invalidCreatives.length} creative(s) missing both snapshot and snapshot_unavailable_reason`;\n } else {\n const withSnapshot = creatives.filter((c: any) => !!c.snapshot).length;\n const withReason = creatives.filter((c: any) => !!c.snapshot_unavailable_reason).length;\n snapshotStep.details = `${creatives.length} creative(s): ${withSnapshot} with snapshot, ${withReason} with unavailable_reason`;\n }\n\n snapshotStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n with_snapshot: creatives.filter((c: any) => !!c.snapshot).length,\n with_unavailable_reason: creatives.filter((c: any) => !!c.snapshot_unavailable_reason).length,\n snapshot_reasons: Array.from(\n new Set(creatives.map((c: any) => c.snapshot_unavailable_reason).filter(Boolean))\n ),\n },\n null,\n 2\n );\n } else if (snapshotResult && !snapshotResult.success) {\n snapshotStep.passed = false;\n snapshotStep.error = snapshotResult.error || 'list_creatives with snapshot returned unsuccessful result';\n }\n steps.push(snapshotStep);\n }\n }\n\n // Step 5: build_creative or preview_creative (adapt to agent capabilities)\n if (profile.tools.includes('build_creative')) {\n const targetFormat = formats[0]!;\n const { result, step } = await runStep<TaskResult>(\n `Build creative for lifecycle (${targetFormat.format_id})`,\n 'build_creative',\n async () =>\n client.executeTask('build_creative', {\n target_format_id: targetFormat.format_id,\n brand: resolveBrand(options),\n message: `Create an ad for lifecycle testing`,\n quality: 'draft',\n include_preview: true,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n const manifest = data.creative_manifest || data.creative_manifests?.[0];\n step.details = `Built creative manifest for format ${manifest?.format_id || targetFormat.format_id}`;\n step.response_preview = JSON.stringify(\n {\n format_id: manifest?.format_id || targetFormat.format_id,\n asset_keys: Object.keys(manifest?.assets || {}),\n has_preview: !!data.preview,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'build_creative failed';\n }\n steps.push(step);\n } else if (profile.tools.includes('preview_creative')) {\n // Tag-serving agents may only support preview, not build\n const targetFormat = formats[0]!;\n const { result, step } = await runStep<TaskResult>(\n `Preview creative for lifecycle (${targetFormat.format_id})`,\n 'preview_creative',\n async () =>\n client.executeTask('preview_creative', {\n request_type: 'single',\n creative_manifest: {\n format_id: targetFormat.format_id,\n name: 'Lifecycle Test Preview',\n assets: buildTestAssets(targetFormat),\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n step.details = `Generated preview with ${data.renders?.length || 0} render(s)`;\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'preview_creative failed';\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Select which formats to test based on options\n */\nfunction selectFormatsToTest(\n formats: NonNullable<AgentProfile['supported_formats']>,\n options: TestOptions\n): NonNullable<AgentProfile['supported_formats']> {\n // If specific format_ids provided, use those\n if (options.format_ids?.length) {\n return formats.filter(f => options.format_ids!.includes(f.format_id.id));\n }\n\n // If test_all_formats, test up to max_formats_to_test\n if (options.test_all_formats) {\n const maxFormats = options.max_formats_to_test || 5;\n return formats.slice(0, maxFormats);\n }\n\n // Default: test up to 3 formats\n return formats.slice(0, 3);\n}\n\n/**\n * Build test assets for a format based on its requirements\n */\nfunction buildTestAssets(\n format: NonNullable<AgentProfile['supported_formats']>[0]\n): Array<{ asset_id: string; asset_type: string; url: string }> {\n const assets: Array<{ asset_id: string; asset_type: string; url: string }> = [];\n\n // Add required assets\n if (format.required_assets?.length) {\n for (const assetName of format.required_assets) {\n assets.push({\n asset_id: assetName,\n asset_type: guessAssetType(assetName),\n url: getTestAssetUrl(assetName),\n });\n }\n }\n\n // If no required assets, add a default image\n if (assets.length === 0) {\n assets.push({\n asset_id: 'primary_image',\n asset_type: 'image',\n url: 'https://via.placeholder.com/300x250.png?text=Test+Creative',\n });\n }\n\n return assets;\n}\n\n/**\n * Guess asset type from asset name\n */\nfunction guessAssetType(assetName: string): string {\n const lower = assetName.toLowerCase();\n if (lower.includes('video') || lower.includes('clip')) return 'video';\n if (lower.includes('audio') || lower.includes('sound')) return 'audio';\n if (lower.includes('logo')) return 'image';\n if (lower.includes('text') || lower.includes('headline') || lower.includes('copy')) return 'text';\n return 'image';\n}\n\n/**\n * Get a test asset URL for testing\n */\nfunction getTestAssetUrl(assetName: string): string {\n const type = guessAssetType(assetName);\n switch (type) {\n case 'video':\n return 'https://storage.googleapis.com/webfundamentals-assets/videos/chrome.mp4';\n case 'audio':\n return 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3';\n default:\n return 'https://via.placeholder.com/300x250.png?text=Test+Asset';\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,oBAAwG;AAOxG,eAAsB,iBACpB,UACA,SAC8D;AAC9D,QAAM,QAA0B,CAAC;AACjC,QAAM,aAAS,iCAAkB,UAAU,OAAO;AAGlD,QAAM,EAAE,SAAS,MAAM,YAAY,IAAI,UAAM,oCAAqB,QAAQ,OAAO;AACjF,QAAM,KAAK,WAAW;AAEtB,MAAI,CAAC,YAAY,QAAQ;AACvB,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAGA,QAAM,EAAE,SAAS,MAAM,WAAW,IAAI,UAAM,uCAAwB,QAAQ,OAAO;AACnF,QAAM,KAAK,UAAU;AAErB,MAAI,CAAC,WAAW,UAAU,CAAC,WAAW,QAAQ,WAAW,GAAG;AAC1D,WAAO,EAAE,OAAO,SAAS,EAAE,GAAG,SAAS,mBAAmB,WAAW,CAAC,EAAE,EAAE;AAAA,EAC5E;AAGA,UAAQ,oBAAoB;AAG5B,QAAM,gBAAgB,oBAAoB,WAAW,CAAC,GAAG,OAAO;AAGhE,MAAI,QAAQ,MAAM,SAAS,gBAAgB,GAAG;AAC5C,eAAW,UAAU,eAAe;AAClC,YAAM,oBAAoB,OAAO,QAAQ,OAAO,UAAU;AAC1D,YAAM,EAAE,QAAQ,KAAK,IAAI,UAAM;AAAA,QAC7B,mBAAmB,iBAAiB;AAAA,QACpC;AAAA,QACA,YACE,OAAO,cAAc;AAAA,UACnB,kBAAkB,OAAO;AAAA,UACzB,WAAO,4BAAa,OAAO;AAAA,UAC3B,SAAS;AAAA,UACT,SAAS;AAAA,UACT,iBAAiB;AAAA,QACnB,CAAoC;AAAA,MACxC;AAEA,UAAI,QAAQ,WAAW,QAAQ,MAAM;AACnC,cAAM,OAAO,OAAO;AAKpB,cAAM,WAAW,KAAK,qBAAqB,KAAK,qBAAqB,CAAC;AACtE,aAAK,UAAU,sCAAsC,iBAAiB;AACtE,aAAK,mBAAmB,KAAK;AAAA,UAC3B;AAAA,YACE,WAAW,UAAU,aAAa,OAAO;AAAA,YACzC,YAAY,OAAO,KAAK,UAAU,UAAU,CAAC,CAAC;AAAA,YAC9C,aAAa,CAAC,CAAC,KAAK;AAAA,YACpB,eAAe,KAAK,SAAS,UAAU,UAAU;AAAA,UACnD;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,WAAW,UAAU,CAAC,OAAO,SAAS;AACpC,aAAK,SAAS;AACd,aAAK,QAAQ,OAAO,SAAS;AAAA,MAC/B;AACA,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AAGA,MAAI,QAAQ,MAAM,SAAS,kBAAkB,GAAG;AAE9C,UAAM,EAAE,MAAM,YAAY,IAAI,UAAM;AAAA,MAClC;AAAA,MACA;AAAA,MACA,YACE,OAAO,gBAAgB;AAAA,QACrB,cAAc;AAAA,QACd,mBAAmB;AAAA,UACjB,WAAW,cAAc,CAAC,GAAG,aAAa;AAAA,YACxC,WAAW;AAAA,YACX,IAAI;AAAA,UACN;AAAA,UACA,MAAM;AAAA,UACN,QAAQ,CAAC;AAAA,QACX;AAAA,MACF,CAAsC;AAAA,IAC1C;AACA,UAAM,KAAK,WAAW;AAGtB,UAAM,eAAe,cAAc,CAAC;AACpC,QAAI,cAAc;AAChB,YAAM,EAAE,QAAQ,KAAK,IAAI,UAAM;AAAA,QAC7B,kCAAkC,aAAa,UAAU,EAAE;AAAA,QAC3D;AAAA,QACA,YACE,OAAO,gBAAgB;AAAA,UACrB,cAAc;AAAA,UACd,mBAAmB;AAAA,YACjB,WAAW,aAAa;AAAA,YACxB,MAAM;AAAA,YACN,QAAQ,gBAAgB,YAAY;AAAA,UACtC;AAAA,QACF,CAAsC;AAAA,MAC1C;AAEA,UAAI,QAAQ,WAAW,QAAQ,MAAM;AACnC,cAAM,OAAO,OAAO;AAIpB,cAAM,WAAW,KAAK,YAAY,CAAC;AACnC,cAAM,cAAc,SAAS,OAAO,CAAC,OAAO,YAAY,SAAS,QAAQ,SAAS,UAAU,IAAI,CAAC;AACjG,aAAK,UAAU,0BAA0B,SAAS,MAAM;AACxD,aAAK,mBAAmB,KAAK;AAAA,UAC3B;AAAA,YACE,aAAa,cAAc;AAAA,YAC3B,eAAe,SAAS;AAAA,YACxB,cAAc;AAAA,YACd,iBAAiB,KAAK;AAAA,UACxB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,WAAW,UAAU,CAAC,OAAO,SAAS;AACpC,aAAK,SAAS;AACd,aAAK,QAAQ,OAAO,SAAS;AAAA,MAC/B;AACA,YAAM,KAAK,IAAI;AAAA,IACjB;AAGA,UAAM,EAAE,QAAQ,aAAa,MAAM,UAAU,IAAI,UAAM;AAAA,MACrD;AAAA,MACA;AAAA,MACA,YACE,OAAO,gBAAgB;AAAA,QACrB,cAAc;AAAA,QACd,mBAAmB;AAAA,UACjB,WAAW,EAAE,WAAW,0CAA0C,IAAI,0BAA0B;AAAA,UAChG,MAAM;AAAA,UACN,QAAQ,CAAC;AAAA,QACX;AAAA,MACF,CAAsC;AAAA,IAC1C;AAGA,QAAI,aAAa,SAAS;AACxB,gBAAU,SAAS;AACnB,gBAAU,QAAQ;AAAA,IACpB,OAAO;AACL,gBAAU,SAAS;AACnB,gBAAU,UAAU;AAAA,IACtB;AACA,UAAM,KAAK,SAAS;AAAA,EACtB;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAYA,eAAsB,sBACpB,UACA,SAC8D;AAC9D,QAAM,QAA0B,CAAC;AACjC,QAAM,aAAS,iCAAkB,UAAU,OAAO;AAGlD,QAAM,EAAE,SAAS,MAAM,YAAY,IAAI,UAAM,oCAAqB,QAAQ,OAAO;AACjF,QAAM,KAAK,WAAW;AAEtB,MAAI,CAAC,YAAY,QAAQ;AACvB,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAGA,QAAM,EAAE,SAAS,MAAM,WAAW,IAAI,UAAM,uCAAwB,QAAQ,OAAO;AACnF,QAAM,KAAK,UAAU;AAErB,MAAI,CAAC,WAAW,UAAU,CAAC,WAAW,QAAQ,WAAW,GAAG;AAC1D,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAEA,UAAQ,oBAAoB;AAG5B,QAAM,qBAA+B,CAAC;AACtC,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,UAAW,oBAAmB,KAAK,mBAAmB;AAAA,EACpE;AAEA,QAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,QAAQ,mBAAmB,WAAW;AAAA,IACtC,aAAa;AAAA,IACb,SACE,mBAAmB,WAAW,IAC1B,OAAO,QAAQ,MAAM,oCACrB,mBAAmB,KAAK,IAAI;AAAA,IAClC,UAAU,mBAAmB,SAAS,IAAI,qBAAqB;AAAA,EACjE,CAAC;AAGD,MAAI,QAAQ,MAAM,SAAS,gBAAgB,GAAG;AAC5C,UAAM,cAAc,QAAQ,CAAC;AAC7B,UAAM,cAAc,QAAQ,SAAS,IAAI,QAAQ,CAAC,IAAI;AAEtD,UAAM,kBAAkB;AAAA,MACtB;AAAA,QACE,aAAa,iBAAiB,KAAK,IAAI,CAAC;AAAA,QACxC,MAAM;AAAA,QACN,WAAW,YAAY;AAAA,QACvB,QAAQ;AAAA,UACN,SAAS;AAAA,YACP,KAAK;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa;AACf,sBAAgB,KAAK;AAAA,QACnB,aAAa,iBAAiB,KAAK,IAAI,CAAC;AAAA,QACxC,MAAM;AAAA,QACN,WAAW,YAAY;AAAA,QACvB,QAAQ;AAAA,UACN,SAAS;AAAA,YACP,KAAK;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,EAAE,QAAQ,YAAY,MAAM,SAAS,IAAI,UAAM;AAAA,MACnD,QAAQ,gBAAgB,MAAM;AAAA,MAC9B;AAAA,MACA,YACE,OAAO,YAAY,kBAAkB;AAAA,QACnC,WAAW;AAAA,MACb,CAAC;AAAA,IACL;AAEA,QAAI,YAAY,WAAW,YAAY,MAAM;AAC3C,YAAM,OAAO,WAAW;AACxB,YAAM,YAAY,KAAK,aAAa,CAAC;AACrC,YAAM,UAAU,UAAU,IAAI,CAAC,MAAW,EAAE,MAAM;AAClD,YAAM,SAAS,UAAU,OAAO,CAAC,MAAW,EAAE,WAAW,QAAQ;AAEjE,eAAS,UAAU,UAAU,UAAU,MAAM,0BAA0B,QAAQ,KAAK,IAAI,CAAC;AACzF,eAAS,mBAAmB,KAAK;AAAA,QAC/B;AAAA,UACE,cAAc,UAAU;AAAA,UACxB;AAAA,UACA,cAAc,UAAU,IAAI,CAAC,MAAW,EAAE,WAAW;AAAA,UACrD,cAAc,OAAO;AAAA,UACrB,eAAe,OAAO,IAAI,CAAC,OAAY,EAAE,aAAa,EAAE,aAAa,QAAQ,EAAE,OAAO,EAAE;AAAA,QAC1F;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,cAAc,CAAC,WAAW,SAAS;AAC5C,eAAS,SAAS;AAClB,eAAS,QAAQ,WAAW,SAAS;AAAA,IACvC;AACA,UAAM,KAAK,QAAQ;AAGnB,QAAI,QAAQ,MAAM,SAAS,gBAAgB,GAAG;AAC5C,YAAM,EAAE,QAAQ,YAAY,MAAM,SAAS,IAAI,UAAM;AAAA,QACnD;AAAA,QACA;AAAA,QACA,YAAY,OAAO,YAAY,kBAAkB,CAAC,CAAC;AAAA,MACrD;AAEA,UAAI,YAAY,WAAW,YAAY,MAAM;AAC3C,cAAM,OAAO,WAAW;AACxB,cAAM,YAAY,KAAK,aAAa,CAAC;AAGrC,cAAM,cAAwB,CAAC;AAC/B,mBAAW,YAAY,UAAU,MAAM,GAAG,CAAC,GAAG;AAC5C,cAAI,CAAC,SAAS,YAAa,aAAY,KAAK,8BAA8B;AAC1E,cAAI,CAAC,SAAS,KAAM,aAAY,KAAK,YAAY,SAAS,WAAW,gBAAgB;AACrF,cAAI,CAAC,SAAS,UAAW,aAAY,KAAK,YAAY,SAAS,WAAW,qBAAqB;AAAA,QACjG;AAGA,cAAM,wBAAwB,UAAU,KAAK,CAAC,MAAW,EAAE,aAAa,MAAS;AAEjF,YAAI,YAAY,SAAS,GAAG;AAC1B,mBAAS,SAAS;AAClB,mBAAS,QAAQ,8BAA8B,YAAY,KAAK,IAAI,CAAC;AAAA,QACvE,OAAO;AACL,mBAAS,UAAU,SAAS,UAAU,MAAM;AAAA,QAC9C;AAEA,iBAAS,mBAAmB,KAAK;AAAA,UAC/B;AAAA,YACE,iBAAiB,UAAU;AAAA,YAC3B,UAAU,MAAM,KAAK,IAAI,IAAI,UAAU,IAAI,CAAC,MAAW,EAAE,MAAM,CAAC,CAAC;AAAA,YACjE,yBAAyB;AAAA,YACzB,eAAe,KAAK;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,YAAI,uBAAuB;AACzB,mBAAS,WAAW,CAAC,mEAAmE;AAAA,QAC1F;AAAA,MACF,WAAW,cAAc,CAAC,WAAW,SAAS;AAC5C,iBAAS,SAAS;AAClB,iBAAS,QAAQ,WAAW,SAAS;AAAA,MACvC;AACA,YAAM,KAAK,QAAQ;AAGnB,YAAM,EAAE,QAAQ,gBAAgB,MAAM,aAAa,IAAI,UAAM;AAAA,QAC3D;AAAA,QACA;AAAA,QACA,YAAY,OAAO,YAAY,kBAAkB,EAAE,kBAAkB,KAAK,CAAC;AAAA,MAC7E;AAEA,UAAI,gBAAgB,WAAW,gBAAgB,MAAM;AACnD,cAAM,OAAO,eAAe;AAC5B,cAAM,YAAY,KAAK,aAAa,CAAC;AAGrC,cAAM,mBAAmB,UAAU,OAAO,CAAC,MAAW;AACpD,cAAI,EAAE,UAAU;AACd,mBAAO,CAAC,EAAE,SAAS,SAAS,EAAE,SAAS,sBAAsB;AAAA,UAC/D;AACA,iBAAO,CAAC,EAAE;AAAA,QACZ,CAAC;AAED,YAAI,iBAAiB,SAAS,GAAG;AAC/B,uBAAa,SAAS;AACtB,uBAAa,QAAQ,GAAG,iBAAiB,MAAM;AAAA,QACjD,OAAO;AACL,gBAAM,eAAe,UAAU,OAAO,CAAC,MAAW,CAAC,CAAC,EAAE,QAAQ,EAAE;AAChE,gBAAM,aAAa,UAAU,OAAO,CAAC,MAAW,CAAC,CAAC,EAAE,2BAA2B,EAAE;AACjF,uBAAa,UAAU,GAAG,UAAU,MAAM,iBAAiB,YAAY,mBAAmB,UAAU;AAAA,QACtG;AAEA,qBAAa,mBAAmB,KAAK;AAAA,UACnC;AAAA,YACE,iBAAiB,UAAU;AAAA,YAC3B,eAAe,UAAU,OAAO,CAAC,MAAW,CAAC,CAAC,EAAE,QAAQ,EAAE;AAAA,YAC1D,yBAAyB,UAAU,OAAO,CAAC,MAAW,CAAC,CAAC,EAAE,2BAA2B,EAAE;AAAA,YACvF,kBAAkB,MAAM;AAAA,cACtB,IAAI,IAAI,UAAU,IAAI,CAAC,MAAW,EAAE,2BAA2B,EAAE,OAAO,OAAO,CAAC;AAAA,YAClF;AAAA,UACF;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,WAAW,kBAAkB,CAAC,eAAe,SAAS;AACpD,qBAAa,SAAS;AACtB,qBAAa,QAAQ,eAAe,SAAS;AAAA,MAC/C;AACA,YAAM,KAAK,YAAY;AAAA,IACzB;AAAA,EACF;AAGA,MAAI,QAAQ,MAAM,SAAS,gBAAgB,GAAG;AAC5C,UAAM,eAAe,QAAQ,CAAC;AAC9B,UAAM,EAAE,QAAQ,KAAK,IAAI,UAAM;AAAA,MAC7B,iCAAiC,aAAa,SAAS;AAAA,MACvD;AAAA,MACA,YACE,OAAO,YAAY,kBAAkB;AAAA,QACnC,kBAAkB,aAAa;AAAA,QAC/B,WAAO,4BAAa,OAAO;AAAA,QAC3B,SAAS;AAAA,QACT,SAAS;AAAA,QACT,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACL;AAEA,QAAI,QAAQ,WAAW,QAAQ,MAAM;AACnC,YAAM,OAAO,OAAO;AACpB,YAAM,WAAW,KAAK,qBAAqB,KAAK,qBAAqB,CAAC;AACtE,WAAK,UAAU,sCAAsC,UAAU,aAAa,aAAa,SAAS;AAClG,WAAK,mBAAmB,KAAK;AAAA,QAC3B;AAAA,UACE,WAAW,UAAU,aAAa,aAAa;AAAA,UAC/C,YAAY,OAAO,KAAK,UAAU,UAAU,CAAC,CAAC;AAAA,UAC9C,aAAa,CAAC,CAAC,KAAK;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,UAAU,CAAC,OAAO,SAAS;AACpC,WAAK,SAAS;AACd,WAAK,QAAQ,OAAO,SAAS;AAAA,IAC/B;AACA,UAAM,KAAK,IAAI;AAAA,EACjB,WAAW,QAAQ,MAAM,SAAS,kBAAkB,GAAG;AAErD,UAAM,eAAe,QAAQ,CAAC;AAC9B,UAAM,EAAE,QAAQ,KAAK,IAAI,UAAM;AAAA,MAC7B,mCAAmC,aAAa,SAAS;AAAA,MACzD;AAAA,MACA,YACE,OAAO,YAAY,oBAAoB;AAAA,QACrC,cAAc;AAAA,QACd,mBAAmB;AAAA,UACjB,WAAW,aAAa;AAAA,UACxB,MAAM;AAAA,UACN,QAAQ,gBAAgB,YAAY;AAAA,QACtC;AAAA,MACF,CAAC;AAAA,IACL;AAEA,QAAI,QAAQ,WAAW,QAAQ,MAAM;AACnC,YAAM,OAAO,OAAO;AACpB,WAAK,UAAU,0BAA0B,KAAK,SAAS,UAAU,CAAC;AAAA,IACpE,WAAW,UAAU,CAAC,OAAO,SAAS;AACpC,WAAK,SAAS;AACd,WAAK,QAAQ,OAAO,SAAS;AAAA,IAC/B;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAKA,SAAS,oBACP,SACA,SACgD;AAEhD,MAAI,QAAQ,YAAY,QAAQ;AAC9B,WAAO,QAAQ,OAAO,OAAK,QAAQ,WAAY,SAAS,EAAE,UAAU,EAAE,CAAC;AAAA,EACzE;AAGA,MAAI,QAAQ,kBAAkB;AAC5B,UAAM,aAAa,QAAQ,uBAAuB;AAClD,WAAO,QAAQ,MAAM,GAAG,UAAU;AAAA,EACpC;AAGA,SAAO,QAAQ,MAAM,GAAG,CAAC;AAC3B;AAKA,SAAS,gBACP,QAC8D;AAC9D,QAAM,SAAuE,CAAC;AAG9E,MAAI,OAAO,iBAAiB,QAAQ;AAClC,eAAW,aAAa,OAAO,iBAAiB;AAC9C,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,YAAY,eAAe,SAAS;AAAA,QACpC,KAAK,gBAAgB,SAAS;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,KAAK;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKA,SAAS,eAAe,WAA2B;AACjD,QAAM,QAAQ,UAAU,YAAY;AACpC,MAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC9D,MAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,OAAO,EAAG,QAAO;AAC/D,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,UAAU,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC3F,SAAO;AACT;AAKA,SAAS,gBAAgB,WAA2B;AAClD,QAAM,OAAO,eAAe,SAAS;AACrC,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/testing/scenarios/creative.ts"],"sourcesContent":["/**\n * Creative Agent Testing Scenarios\n *\n * Tests creative agent capabilities including:\n * - list_creative_formats / list_formats\n * - build_creative\n * - preview_creative\n *\n * Enhanced to:\n * - Test multiple formats from the agent's actual catalog\n * - Test with both required and optional assets\n * - Validate preview renders\n */\n\nimport type { BuildCreativeRequest, PreviewCreativeRequest } from '../../types/tools.generated';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile, discoverCreativeFormats, resolveBrand } from '../client';\n\n/**\n * Test: Creative Flow (for creative agents)\n *\n * Flow: list_formats -> build_creative (multiple formats) -> preview_creative (with assets)\n */\nexport async function testCreativeFlow(\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 // Discover creative formats with full details\n const { formats, step: formatStep } = await discoverCreativeFormats(client, profile);\n steps.push(formatStep);\n\n if (!formatStep.passed || !formats || formats.length === 0) {\n return { steps, profile: { ...profile, supported_formats: formats || [] } };\n }\n\n // Store discovered formats in profile\n profile.supported_formats = formats;\n\n // Determine which formats to test\n const formatsToTest = selectFormatsToTest(formats || [], options);\n\n // Build creative for each selected format\n if (profile.tools.includes('build_creative')) {\n for (const format of formatsToTest) {\n const formatDisplayName = format.name || format.format_id.id;\n const { result, step } = await runStep<TaskResult>(\n `Build creative: ${formatDisplayName}`,\n 'build_creative',\n async () =>\n client.buildCreativeLegacy({\n target_format_id: format.format_id,\n brand: resolveBrand(options),\n message: `Create an ad for an e-commerce brand promoting summer sale`,\n quality: 'draft',\n include_preview: true,\n } as unknown as BuildCreativeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as {\n creative_manifest?: { format_id?: unknown; assets?: Record<string, unknown> };\n creative_manifests?: Array<{ format_id?: unknown; assets?: Record<string, unknown> }>;\n preview?: { previews?: unknown[] };\n };\n const manifest = data.creative_manifest || data.creative_manifests?.[0];\n step.details = `Built creative manifest for format ${formatDisplayName}`;\n step.response_preview = JSON.stringify(\n {\n format_id: manifest?.format_id || format.format_id,\n asset_keys: Object.keys(manifest?.assets || {}),\n has_preview: !!data.preview,\n preview_count: data.preview?.previews?.length || 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'build_creative failed';\n }\n steps.push(step);\n }\n }\n\n // Preview creative with various asset configurations\n if (profile.tools.includes('preview_creative')) {\n // Test 1: Preview with minimal assets (empty)\n const { step: minimalStep } = await runStep<TaskResult>(\n 'Preview creative: minimal assets',\n 'preview_creative',\n async () =>\n client.previewCreativeLegacy({\n request_type: 'single',\n creative_manifest: {\n format_id: formatsToTest[0]?.format_id || {\n agent_url: 'https://creative.adcontextprotocol.org',\n id: 'display_300x250',\n },\n name: 'Minimal Test Creative',\n assets: {},\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n steps.push(minimalStep);\n\n // Test 2: Preview with sample assets\n const sampleFormat = formatsToTest[0];\n if (sampleFormat) {\n const { result, step } = await runStep<TaskResult>(\n `Preview creative: with assets (${sampleFormat.format_id.id})`,\n 'preview_creative',\n async () =>\n client.previewCreativeLegacy({\n request_type: 'single',\n creative_manifest: {\n format_id: sampleFormat.format_id,\n name: 'Full Test Creative',\n assets: buildTestAssets(sampleFormat) as unknown as Record<string, unknown>,\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as {\n previews?: Array<{ renders?: unknown[] }>;\n interactive_url?: string;\n };\n const previews = data.previews || [];\n const renderCount = previews.reduce((count, preview) => count + (preview.renders?.length || 0), 0);\n step.details = `Generated preview with ${previews.length} variant(s)`;\n step.response_preview = JSON.stringify(\n {\n has_renders: renderCount > 0,\n preview_count: previews.length,\n render_count: renderCount,\n interactive_url: data.interactive_url,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'preview_creative failed';\n }\n steps.push(step);\n }\n\n // Test 3: Preview with invalid format_id (error case)\n const { result: errorResult, step: errorStep } = await runStep<TaskResult>(\n 'Preview creative: invalid format (error expected)',\n 'preview_creative',\n async () =>\n client.previewCreativeLegacy({\n request_type: 'single',\n creative_manifest: {\n format_id: { agent_url: 'https://creative.adcontextprotocol.org', id: 'INVALID_FORMAT_ID_12345' },\n name: 'Error Test Creative',\n assets: {},\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n\n // This should fail - if it succeeds with invalid format, that's a bug\n if (errorResult?.success) {\n errorStep.passed = false;\n errorStep.error = 'Expected error for invalid format_id but got success';\n } else {\n errorStep.passed = true;\n errorStep.details = 'Correctly rejected invalid format_id';\n }\n steps.push(errorStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Lifecycle\n *\n * Chains creative protocol operations end-to-end:\n * 1. list_creative_formats → verify format schema\n * 2. sync_creatives with multiple creatives → verify per-creative status\n * 3. list_creatives (no snapshot) → verify basic fields\n * 4. list_creatives (include_snapshot: true) → verify snapshot or snapshot_unavailable_reason\n * 5. build_creative or preview_creative on synced creative → adapt to agent capabilities\n */\nexport async function testCreativeLifecycle(\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 // Step 1: Discover creative formats\n const { formats, step: formatStep } = await discoverCreativeFormats(client, profile);\n steps.push(formatStep);\n\n if (!formatStep.passed || !formats || formats.length === 0) {\n return { steps, profile };\n }\n\n profile.supported_formats = formats;\n\n // Validate format schema: each format should have format_id\n const formatSchemaIssues: string[] = [];\n for (const format of formats) {\n if (!format.format_id) formatSchemaIssues.push('Missing format_id');\n }\n\n steps.push({\n step: 'Validate format schema',\n passed: formatSchemaIssues.length === 0,\n duration_ms: 0,\n details:\n formatSchemaIssues.length === 0\n ? `All ${formats.length} format(s) have required fields`\n : formatSchemaIssues.join('; '),\n warnings: formatSchemaIssues.length > 0 ? formatSchemaIssues : undefined,\n });\n\n // Step 2: Sync multiple creatives (image + video if formats allow)\n if (profile.tools.includes('sync_creatives')) {\n const imageFormat = formats[0]!;\n const videoFormat = formats.length > 1 ? formats[1] : undefined;\n\n const creativesToSync = [\n {\n creative_id: `lifecycle-img-${Date.now()}`,\n name: 'Lifecycle Test Image Creative',\n format_id: imageFormat.format_id,\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250.png?text=Lifecycle+Image',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n },\n ];\n\n if (videoFormat) {\n creativesToSync.push({\n creative_id: `lifecycle-vid-${Date.now()}`,\n name: 'Lifecycle Test Video Creative',\n format_id: videoFormat.format_id,\n assets: {\n primary: {\n url: 'https://storage.googleapis.com/webfundamentals-assets/videos/chrome.mp4',\n width: 1920,\n height: 1080,\n format: 'mp4',\n },\n },\n });\n }\n\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n `Sync ${creativesToSync.length} creative(s) to library`,\n 'sync_creatives',\n async () =>\n client.executeTaskLegacy('sync_creatives', {\n creatives: creativesToSync,\n }) as Promise<TaskResult>\n );\n\n if (syncResult?.success && syncResult?.data) {\n const data = syncResult.data;\n const creatives = data.creatives || [];\n const actions = creatives.map((c: any) => c.action);\n const failed = creatives.filter((c: any) => c.action === 'failed');\n\n syncStep.details = `Synced ${creatives.length} creative(s), actions: ${actions.join(', ')}`;\n syncStep.response_preview = JSON.stringify(\n {\n synced_count: creatives.length,\n actions,\n creative_ids: creatives.map((c: any) => c.creative_id),\n failed_count: failed.length,\n failed_errors: failed.map((c: any) => ({ creative_id: c.creative_id, errors: c.errors })),\n },\n null,\n 2\n );\n } else if (syncResult && !syncResult.success) {\n syncStep.passed = false;\n syncStep.error = syncResult.error || 'sync_creatives returned unsuccessful result';\n }\n steps.push(syncStep);\n\n // Step 3: list_creatives without snapshot\n if (profile.tools.includes('list_creatives')) {\n const { result: listResult, step: listStep } = await runStep<TaskResult>(\n 'List creatives (no snapshot)',\n 'list_creatives',\n async () => client.executeTask('list_creatives', {}) as Promise<TaskResult>\n );\n\n if (listResult?.success && listResult?.data) {\n const data = listResult.data;\n const creatives = data.creatives || [];\n\n // Validate basic fields on each creative\n const fieldIssues: string[] = [];\n for (const creative of creatives.slice(0, 5)) {\n if (!creative.creative_id) fieldIssues.push('Creative missing creative_id');\n if (!creative.name) fieldIssues.push(`Creative ${creative.creative_id}: missing name`);\n if (!creative.format_id) fieldIssues.push(`Creative ${creative.creative_id}: missing format_id`);\n }\n\n // Verify snapshot is absent when not requested\n const hasUnexpectedSnapshot = creatives.some((c: any) => c.snapshot !== undefined);\n\n if (fieldIssues.length > 0) {\n listStep.passed = false;\n listStep.error = `Creative field validation: ${fieldIssues.join('; ')}`;\n } else {\n listStep.details = `Found ${creatives.length} creative(s) with valid fields`;\n }\n\n listStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n statuses: Array.from(new Set(creatives.map((c: any) => c.status))),\n has_unexpected_snapshot: hasUnexpectedSnapshot,\n query_summary: data.query_summary,\n },\n null,\n 2\n );\n\n if (hasUnexpectedSnapshot) {\n listStep.warnings = ['snapshot field present on creatives without include_snapshot=true'];\n }\n } else if (listResult && !listResult.success) {\n listStep.passed = false;\n listStep.error = listResult.error || 'list_creatives returned unsuccessful result';\n }\n steps.push(listStep);\n\n // Step 4: list_creatives with include_snapshot: true\n const { result: snapshotResult, step: snapshotStep } = await runStep<TaskResult>(\n 'List creatives (include_snapshot: true)',\n 'list_creatives',\n async () => client.executeTask('list_creatives', { include_snapshot: true }) as Promise<TaskResult>\n );\n\n if (snapshotResult?.success && snapshotResult?.data) {\n const data = snapshotResult.data;\n const creatives = data.creatives || [];\n\n // Each creative should have either snapshot data or snapshot_unavailable_reason\n const invalidCreatives = creatives.filter((c: any) => {\n if (c.snapshot) {\n return !c.snapshot.as_of || c.snapshot.staleness_seconds === undefined;\n }\n return !c.snapshot_unavailable_reason;\n });\n\n if (invalidCreatives.length > 0) {\n snapshotStep.passed = false;\n snapshotStep.error = `${invalidCreatives.length} creative(s) missing both snapshot and snapshot_unavailable_reason`;\n } else {\n const withSnapshot = creatives.filter((c: any) => !!c.snapshot).length;\n const withReason = creatives.filter((c: any) => !!c.snapshot_unavailable_reason).length;\n snapshotStep.details = `${creatives.length} creative(s): ${withSnapshot} with snapshot, ${withReason} with unavailable_reason`;\n }\n\n snapshotStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n with_snapshot: creatives.filter((c: any) => !!c.snapshot).length,\n with_unavailable_reason: creatives.filter((c: any) => !!c.snapshot_unavailable_reason).length,\n snapshot_reasons: Array.from(\n new Set(creatives.map((c: any) => c.snapshot_unavailable_reason).filter(Boolean))\n ),\n },\n null,\n 2\n );\n } else if (snapshotResult && !snapshotResult.success) {\n snapshotStep.passed = false;\n snapshotStep.error = snapshotResult.error || 'list_creatives with snapshot returned unsuccessful result';\n }\n steps.push(snapshotStep);\n }\n }\n\n // Step 5: build_creative or preview_creative (adapt to agent capabilities)\n if (profile.tools.includes('build_creative')) {\n const targetFormat = formats[0]!;\n const { result, step } = await runStep<TaskResult>(\n `Build creative for lifecycle (${targetFormat.format_id})`,\n 'build_creative',\n async () =>\n client.executeTaskLegacy('build_creative', {\n target_format_id: targetFormat.format_id,\n brand: resolveBrand(options),\n message: `Create an ad for lifecycle testing`,\n quality: 'draft',\n include_preview: true,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n const manifest = data.creative_manifest || data.creative_manifests?.[0];\n step.details = `Built creative manifest for format ${manifest?.format_id || targetFormat.format_id}`;\n step.response_preview = JSON.stringify(\n {\n format_id: manifest?.format_id || targetFormat.format_id,\n asset_keys: Object.keys(manifest?.assets || {}),\n has_preview: !!data.preview,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'build_creative failed';\n }\n steps.push(step);\n } else if (profile.tools.includes('preview_creative')) {\n // Tag-serving agents may only support preview, not build\n const targetFormat = formats[0]!;\n const { result, step } = await runStep<TaskResult>(\n `Preview creative for lifecycle (${targetFormat.format_id})`,\n 'preview_creative',\n async () =>\n client.executeTaskLegacy('preview_creative', {\n request_type: 'single',\n creative_manifest: {\n format_id: targetFormat.format_id,\n name: 'Lifecycle Test Preview',\n assets: buildTestAssets(targetFormat),\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n step.details = `Generated preview with ${data.renders?.length || 0} render(s)`;\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'preview_creative failed';\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Select which formats to test based on options\n */\nfunction selectFormatsToTest(\n formats: NonNullable<AgentProfile['supported_formats']>,\n options: TestOptions\n): NonNullable<AgentProfile['supported_formats']> {\n // If specific format_ids provided, use those\n if (options.format_ids?.length) {\n return formats.filter(f => options.format_ids!.includes(f.format_id.id));\n }\n\n // If test_all_formats, test up to max_formats_to_test\n if (options.test_all_formats) {\n const maxFormats = options.max_formats_to_test || 5;\n return formats.slice(0, maxFormats);\n }\n\n // Default: test up to 3 formats\n return formats.slice(0, 3);\n}\n\n/**\n * Build test assets for a format based on its requirements\n */\nfunction buildTestAssets(\n format: NonNullable<AgentProfile['supported_formats']>[0]\n): Array<{ asset_id: string; asset_type: string; url: string }> {\n const assets: Array<{ asset_id: string; asset_type: string; url: string }> = [];\n\n // Add required assets\n if (format.required_assets?.length) {\n for (const assetName of format.required_assets) {\n assets.push({\n asset_id: assetName,\n asset_type: guessAssetType(assetName),\n url: getTestAssetUrl(assetName),\n });\n }\n }\n\n // If no required assets, add a default image\n if (assets.length === 0) {\n assets.push({\n asset_id: 'primary_image',\n asset_type: 'image',\n url: 'https://via.placeholder.com/300x250.png?text=Test+Creative',\n });\n }\n\n return assets;\n}\n\n/**\n * Guess asset type from asset name\n */\nfunction guessAssetType(assetName: string): string {\n const lower = assetName.toLowerCase();\n if (lower.includes('video') || lower.includes('clip')) return 'video';\n if (lower.includes('audio') || lower.includes('sound')) return 'audio';\n if (lower.includes('logo')) return 'image';\n if (lower.includes('text') || lower.includes('headline') || lower.includes('copy')) return 'text';\n return 'image';\n}\n\n/**\n * Get a test asset URL for testing\n */\nfunction getTestAssetUrl(assetName: string): string {\n const type = guessAssetType(assetName);\n switch (type) {\n case 'video':\n return 'https://storage.googleapis.com/webfundamentals-assets/videos/chrome.mp4';\n case 'audio':\n return 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3';\n default:\n return 'https://via.placeholder.com/300x250.png?text=Test+Asset';\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -20,7 +20,7 @@ async function testCreativeFlow(agentUrl, options) {
|
|
|
20
20
|
const { result, step } = await runStep(
|
|
21
21
|
`Build creative: ${formatDisplayName}`,
|
|
22
22
|
"build_creative",
|
|
23
|
-
async () => client.
|
|
23
|
+
async () => client.buildCreativeLegacy({
|
|
24
24
|
target_format_id: format.format_id,
|
|
25
25
|
brand: resolveBrand(options),
|
|
26
26
|
message: `Create an ad for an e-commerce brand promoting summer sale`,
|
|
@@ -53,7 +53,7 @@ async function testCreativeFlow(agentUrl, options) {
|
|
|
53
53
|
const { step: minimalStep } = await runStep(
|
|
54
54
|
"Preview creative: minimal assets",
|
|
55
55
|
"preview_creative",
|
|
56
|
-
async () => client.
|
|
56
|
+
async () => client.previewCreativeLegacy({
|
|
57
57
|
request_type: "single",
|
|
58
58
|
creative_manifest: {
|
|
59
59
|
format_id: formatsToTest[0]?.format_id || {
|
|
@@ -71,7 +71,7 @@ async function testCreativeFlow(agentUrl, options) {
|
|
|
71
71
|
const { result, step } = await runStep(
|
|
72
72
|
`Preview creative: with assets (${sampleFormat.format_id.id})`,
|
|
73
73
|
"preview_creative",
|
|
74
|
-
async () => client.
|
|
74
|
+
async () => client.previewCreativeLegacy({
|
|
75
75
|
request_type: "single",
|
|
76
76
|
creative_manifest: {
|
|
77
77
|
format_id: sampleFormat.format_id,
|
|
@@ -104,7 +104,7 @@ async function testCreativeFlow(agentUrl, options) {
|
|
|
104
104
|
const { result: errorResult, step: errorStep } = await runStep(
|
|
105
105
|
"Preview creative: invalid format (error expected)",
|
|
106
106
|
"preview_creative",
|
|
107
|
-
async () => client.
|
|
107
|
+
async () => client.previewCreativeLegacy({
|
|
108
108
|
request_type: "single",
|
|
109
109
|
creative_manifest: {
|
|
110
110
|
format_id: { agent_url: "https://creative.adcontextprotocol.org", id: "INVALID_FORMAT_ID_12345" },
|
|
@@ -185,7 +185,7 @@ async function testCreativeLifecycle(agentUrl, options) {
|
|
|
185
185
|
const { result: syncResult, step: syncStep } = await runStep(
|
|
186
186
|
`Sync ${creativesToSync.length} creative(s) to library`,
|
|
187
187
|
"sync_creatives",
|
|
188
|
-
async () => client.
|
|
188
|
+
async () => client.executeTaskLegacy("sync_creatives", {
|
|
189
189
|
creatives: creativesToSync
|
|
190
190
|
})
|
|
191
191
|
);
|
|
@@ -297,7 +297,7 @@ async function testCreativeLifecycle(agentUrl, options) {
|
|
|
297
297
|
const { result, step } = await runStep(
|
|
298
298
|
`Build creative for lifecycle (${targetFormat.format_id})`,
|
|
299
299
|
"build_creative",
|
|
300
|
-
async () => client.
|
|
300
|
+
async () => client.executeTaskLegacy("build_creative", {
|
|
301
301
|
target_format_id: targetFormat.format_id,
|
|
302
302
|
brand: resolveBrand(options),
|
|
303
303
|
message: `Create an ad for lifecycle testing`,
|
|
@@ -328,7 +328,7 @@ async function testCreativeLifecycle(agentUrl, options) {
|
|
|
328
328
|
const { result, step } = await runStep(
|
|
329
329
|
`Preview creative for lifecycle (${targetFormat.format_id})`,
|
|
330
330
|
"preview_creative",
|
|
331
|
-
async () => client.
|
|
331
|
+
async () => client.executeTaskLegacy("preview_creative", {
|
|
332
332
|
request_type: "single",
|
|
333
333
|
creative_manifest: {
|
|
334
334
|
format_id: targetFormat.format_id,
|