@adcp/sdk 13.0.0-rc.3 → 13.0.0-rc.5

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.
Files changed (211) hide show
  1. package/README.md +18 -15
  2. package/bin/adcp.js +7 -1
  3. package/dist/lib/adapters/property-list-adapter.d.mts +5 -1
  4. package/dist/lib/adapters/property-list-adapter.d.ts +5 -1
  5. package/dist/lib/adapters/property-list-adapter.d.ts.map +1 -1
  6. package/dist/lib/adapters/property-list-adapter.js +7 -7
  7. package/dist/lib/adapters/property-list-adapter.js.map +1 -1
  8. package/dist/lib/adapters/property-list-adapter.mjs +7 -7
  9. package/dist/lib/adapters/property-list-adapter.mjs.map +1 -1
  10. package/dist/lib/auth/oauth/CLIFlowHandler.d.mts +10 -3
  11. package/dist/lib/auth/oauth/CLIFlowHandler.d.ts +10 -3
  12. package/dist/lib/auth/oauth/CLIFlowHandler.d.ts.map +1 -1
  13. package/dist/lib/auth/oauth/CLIFlowHandler.js +40 -4
  14. package/dist/lib/auth/oauth/CLIFlowHandler.js.map +1 -1
  15. package/dist/lib/auth/oauth/CLIFlowHandler.mjs +40 -4
  16. package/dist/lib/auth/oauth/CLIFlowHandler.mjs.map +1 -1
  17. package/dist/lib/auth/oauth/index.d.mts +1 -1
  18. package/dist/lib/auth/oauth/index.d.ts +1 -1
  19. package/dist/lib/auth/oauth/index.d.ts.map +1 -1
  20. package/dist/lib/auth/oauth/index.js +2 -0
  21. package/dist/lib/auth/oauth/index.js.map +1 -1
  22. package/dist/lib/auth/oauth/index.mjs +2 -0
  23. package/dist/lib/auth/oauth/index.mjs.map +1 -1
  24. package/dist/lib/auth/oauth/web-flow.d.mts +12 -0
  25. package/dist/lib/auth/oauth/web-flow.d.ts +12 -0
  26. package/dist/lib/auth/oauth/web-flow.d.ts.map +1 -1
  27. package/dist/lib/auth/oauth/web-flow.js +20 -2
  28. package/dist/lib/auth/oauth/web-flow.js.map +1 -1
  29. package/dist/lib/auth/oauth/web-flow.mjs +19 -2
  30. package/dist/lib/auth/oauth/web-flow.mjs.map +1 -1
  31. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  32. package/dist/lib/core/SingleAgentClient.d.mts +27 -1
  33. package/dist/lib/core/SingleAgentClient.d.ts +27 -1
  34. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  35. package/dist/lib/core/SingleAgentClient.js +46 -18
  36. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  37. package/dist/lib/core/SingleAgentClient.mjs +46 -18
  38. package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
  39. package/dist/lib/index.d.mts +1 -1
  40. package/dist/lib/index.d.ts +1 -1
  41. package/dist/lib/index.d.ts.map +1 -1
  42. package/dist/lib/index.js.map +1 -1
  43. package/dist/lib/index.mjs.map +1 -1
  44. package/dist/lib/net/address-guards.d.ts.map +1 -1
  45. package/dist/lib/net/address-guards.js +4 -0
  46. package/dist/lib/net/address-guards.js.map +1 -1
  47. package/dist/lib/net/address-guards.mjs +4 -0
  48. package/dist/lib/net/address-guards.mjs.map +1 -1
  49. package/dist/lib/protocols/a2a.js +2 -2
  50. package/dist/lib/protocols/a2a.js.map +1 -1
  51. package/dist/lib/protocols/a2a.mjs +2 -2
  52. package/dist/lib/protocols/a2a.mjs.map +1 -1
  53. package/dist/lib/protocols/index.d.ts.map +1 -1
  54. package/dist/lib/protocols/index.js +28 -7
  55. package/dist/lib/protocols/index.js.map +1 -1
  56. package/dist/lib/protocols/index.mjs +28 -7
  57. package/dist/lib/protocols/index.mjs.map +1 -1
  58. package/dist/lib/protocols/mcp-modern.d.ts.map +1 -1
  59. package/dist/lib/protocols/mcp-modern.js +24 -8
  60. package/dist/lib/protocols/mcp-modern.js.map +1 -1
  61. package/dist/lib/protocols/mcp-modern.mjs +24 -8
  62. package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
  63. package/dist/lib/protocols/mcp-tasks.d.ts.map +1 -1
  64. package/dist/lib/protocols/mcp-tasks.js +2 -12
  65. package/dist/lib/protocols/mcp-tasks.js.map +1 -1
  66. package/dist/lib/protocols/mcp-tasks.mjs +2 -12
  67. package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
  68. package/dist/lib/protocols/mcp.js +2 -2
  69. package/dist/lib/protocols/mcp.js.map +1 -1
  70. package/dist/lib/protocols/mcp.mjs +2 -2
  71. package/dist/lib/protocols/mcp.mjs.map +1 -1
  72. package/dist/lib/registry/index.d.mts +5 -25
  73. package/dist/lib/registry/index.d.ts +5 -25
  74. package/dist/lib/registry/index.d.ts.map +1 -1
  75. package/dist/lib/registry/index.js +5 -130
  76. package/dist/lib/registry/index.js.map +1 -1
  77. package/dist/lib/registry/index.mjs +5 -130
  78. package/dist/lib/registry/index.mjs.map +1 -1
  79. package/dist/lib/registry/sync.d.mts +8 -2
  80. package/dist/lib/registry/sync.d.ts +8 -2
  81. package/dist/lib/registry/sync.d.ts.map +1 -1
  82. package/dist/lib/registry/sync.js +8 -2
  83. package/dist/lib/registry/sync.js.map +1 -1
  84. package/dist/lib/registry/sync.mjs +8 -2
  85. package/dist/lib/registry/sync.mjs.map +1 -1
  86. package/dist/lib/registry/types.d.mts +15 -29
  87. package/dist/lib/registry/types.d.ts +15 -29
  88. package/dist/lib/registry/types.d.ts.map +1 -1
  89. package/dist/lib/registry/types.generated.d.mts +567 -15
  90. package/dist/lib/registry/types.generated.d.ts +567 -15
  91. package/dist/lib/registry/types.generated.d.ts.map +1 -1
  92. package/dist/lib/registry/types.generated.js.map +1 -1
  93. package/dist/lib/registry/types.js.map +1 -1
  94. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  95. package/dist/lib/server/decisioning/account.d.mts +6 -4
  96. package/dist/lib/server/decisioning/account.d.ts +6 -4
  97. package/dist/lib/server/decisioning/account.d.ts.map +1 -1
  98. package/dist/lib/server/decisioning/account.js.map +1 -1
  99. package/dist/lib/server/decisioning/account.mjs.map +1 -1
  100. package/dist/lib/server/decisioning/manifest-helpers.d.mts +6 -5
  101. package/dist/lib/server/decisioning/manifest-helpers.d.ts +6 -5
  102. package/dist/lib/server/decisioning/manifest-helpers.d.ts.map +1 -1
  103. package/dist/lib/server/decisioning/manifest-helpers.js.map +1 -1
  104. package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
  105. package/dist/lib/server/decisioning/runtime/from-platform.js +4 -2
  106. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
  107. package/dist/lib/server/decisioning/runtime/from-platform.mjs +4 -2
  108. package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
  109. package/dist/lib/server/decisioning/tenant-store.d.mts +26 -14
  110. package/dist/lib/server/decisioning/tenant-store.d.ts +26 -14
  111. package/dist/lib/server/decisioning/tenant-store.d.ts.map +1 -1
  112. package/dist/lib/server/decisioning/tenant-store.js +6 -1
  113. package/dist/lib/server/decisioning/tenant-store.js.map +1 -1
  114. package/dist/lib/server/decisioning/tenant-store.mjs +6 -1
  115. package/dist/lib/server/decisioning/tenant-store.mjs.map +1 -1
  116. package/dist/lib/server/pin-and-bind-fetch.d.mts +2 -0
  117. package/dist/lib/server/pin-and-bind-fetch.d.ts +2 -0
  118. package/dist/lib/server/pin-and-bind-fetch.d.ts.map +1 -1
  119. package/dist/lib/server/pin-and-bind-fetch.js +2 -0
  120. package/dist/lib/server/pin-and-bind-fetch.js.map +1 -1
  121. package/dist/lib/server/pin-and-bind-fetch.mjs +2 -0
  122. package/dist/lib/server/pin-and-bind-fetch.mjs.map +1 -1
  123. package/dist/lib/server/structured-serialize.d.ts.map +1 -1
  124. package/dist/lib/server/structured-serialize.js +10 -2
  125. package/dist/lib/server/structured-serialize.js.map +1 -1
  126. package/dist/lib/server/structured-serialize.mjs +10 -2
  127. package/dist/lib/server/structured-serialize.mjs.map +1 -1
  128. package/dist/lib/server/webhook-emitter.d.ts.map +1 -1
  129. package/dist/lib/server/webhook-emitter.js +4 -2
  130. package/dist/lib/server/webhook-emitter.js.map +1 -1
  131. package/dist/lib/server/webhook-emitter.mjs +4 -2
  132. package/dist/lib/server/webhook-emitter.mjs.map +1 -1
  133. package/dist/lib/signing/middleware.d.mts +2 -1
  134. package/dist/lib/signing/middleware.d.ts +2 -1
  135. package/dist/lib/signing/middleware.d.ts.map +1 -1
  136. package/dist/lib/signing/middleware.js +26 -4
  137. package/dist/lib/signing/middleware.js.map +1 -1
  138. package/dist/lib/signing/middleware.mjs +26 -4
  139. package/dist/lib/signing/middleware.mjs.map +1 -1
  140. package/dist/lib/signing/webhook-verifier.d.ts.map +1 -1
  141. package/dist/lib/signing/webhook-verifier.js +4 -2
  142. package/dist/lib/signing/webhook-verifier.js.map +1 -1
  143. package/dist/lib/signing/webhook-verifier.mjs +4 -2
  144. package/dist/lib/signing/webhook-verifier.mjs.map +1 -1
  145. package/dist/lib/testing/agent-tester.d.ts.map +1 -1
  146. package/dist/lib/testing/agent-tester.js +46 -1
  147. package/dist/lib/testing/agent-tester.js.map +1 -1
  148. package/dist/lib/testing/agent-tester.mjs +46 -1
  149. package/dist/lib/testing/agent-tester.mjs.map +1 -1
  150. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  151. package/dist/lib/testing/storyboard/runner.js +40 -6
  152. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  153. package/dist/lib/testing/storyboard/runner.mjs +40 -6
  154. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  155. package/dist/lib/types/asset-instances.d.mts +8 -6
  156. package/dist/lib/types/asset-instances.d.ts +8 -6
  157. package/dist/lib/types/asset-instances.d.ts.map +1 -1
  158. package/dist/lib/types/asset-instances.js.map +1 -1
  159. package/dist/lib/types/core.generated.d.mts +105 -58
  160. package/dist/lib/types/core.generated.d.ts +105 -58
  161. package/dist/lib/types/core.generated.d.ts.map +1 -1
  162. package/dist/lib/types/core.generated.js.map +1 -1
  163. package/dist/lib/types/index.d.ts.map +1 -1
  164. package/dist/lib/types/index.js.map +1 -1
  165. package/dist/lib/types/index.mjs.map +1 -1
  166. package/dist/lib/types/schemas.generated.d.mts +2352 -473
  167. package/dist/lib/types/schemas.generated.d.ts +2352 -473
  168. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  169. package/dist/lib/types/schemas.generated.js +78 -45
  170. package/dist/lib/types/schemas.generated.js.map +1 -1
  171. package/dist/lib/types/schemas.generated.mjs +71 -45
  172. package/dist/lib/types/schemas.generated.mjs.map +1 -1
  173. package/dist/lib/types/tools.generated.d.mts +48 -44
  174. package/dist/lib/types/tools.generated.d.ts +48 -44
  175. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  176. package/dist/lib/types/tools.generated.js.map +1 -1
  177. package/dist/lib/utils/probe-policy.d.mts +0 -16
  178. package/dist/lib/utils/probe-policy.d.ts +0 -16
  179. package/dist/lib/utils/probe-policy.d.ts.map +1 -1
  180. package/dist/lib/utils/probe-policy.js +15 -1
  181. package/dist/lib/utils/probe-policy.js.map +1 -1
  182. package/dist/lib/utils/probe-policy.mjs +15 -1
  183. package/dist/lib/utils/probe-policy.mjs.map +1 -1
  184. package/dist/lib/utils/redact-args.d.mts +36 -0
  185. package/dist/lib/utils/redact-args.d.ts +37 -0
  186. package/dist/lib/utils/redact-args.d.ts.map +1 -0
  187. package/dist/lib/utils/redact-args.js +46 -0
  188. package/dist/lib/utils/redact-args.js.map +1 -0
  189. package/dist/lib/utils/redact-args.mjs +22 -0
  190. package/dist/lib/utils/redact-args.mjs.map +1 -0
  191. package/dist/lib/v2/projection/creative-delivery.js +1 -5
  192. package/dist/lib/v2/projection/creative-delivery.js.map +1 -1
  193. package/dist/lib/v2/projection/creative-delivery.mjs +1 -5
  194. package/dist/lib/v2/projection/creative-delivery.mjs.map +1 -1
  195. package/dist/lib/validation/index.d.mts +15 -1
  196. package/dist/lib/validation/index.d.ts +15 -1
  197. package/dist/lib/validation/index.d.ts.map +1 -1
  198. package/dist/lib/validation/index.js +4 -8
  199. package/dist/lib/validation/index.js.map +1 -1
  200. package/dist/lib/validation/index.mjs +4 -8
  201. package/dist/lib/validation/index.mjs.map +1 -1
  202. package/dist/lib/version.d.mts +3 -3
  203. package/dist/lib/version.d.ts +3 -3
  204. package/dist/lib/version.js +3 -3
  205. package/dist/lib/version.js.map +1 -1
  206. package/dist/lib/version.mjs +3 -3
  207. package/dist/lib/version.mjs.map +1 -1
  208. package/examples/hello_seller_adapter_multi_tenant.ts +7 -0
  209. package/package.json +6 -5
  210. package/skills/build-holdco-agent/SKILL.md +19 -0
  211. package/skills/cross-cutting.md +3 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/testing/agent-tester.ts"],"sourcesContent":["/**\n * AdCP Agent E2E Tester\n *\n * Provides comprehensive end-to-end testing of AdCP agents (sales, creative, signals).\n *\n * Features:\n * - Channel-aware testing (only tests features the agent supports)\n * - Sandbox mode for safe testing (real testing requires actual media buys)\n * - Comprehensive scenario coverage based on AdCP spec\n * - Schema validation via @adcp/sdk\n *\n * @example\n * ```typescript\n * import { testAgent, formatTestResults } from '@adcp/sdk/testing';\n *\n * const result = await testAgent(\n * 'https://test-agent.adcontextprotocol.org/mcp',\n * 'discovery',\n * { auth: { type: 'bearer', token: 'your-token' } }\n * );\n * console.log(formatTestResults(result));\n * ```\n */\n\n// Re-export types\nexport type {\n TestScenario,\n TestOptions,\n TestStepResult,\n AgentProfile,\n TestResult,\n SuiteResult,\n TaskResult,\n Logger,\n} from './types';\nexport type { TestClient } from './client';\n\n// Re-export client utilities\nexport { setAgentTesterLogger, getLogger, createTestClient, runStep } from './client';\n\n// Re-export formatter\nexport { formatTestResults, formatTestResultsJSON, formatTestResultsSummary } from './formatter';\n\n// Import scenarios\nimport {\n testHealthCheck,\n testDiscovery,\n testCreateMediaBuy,\n testFullSalesFlow,\n testReportingFlow,\n testCreativeSync,\n testCreativeInline,\n testCreativeReference,\n testCreativeFlow,\n testCreativeLifecycle,\n testSignalsFlow,\n testErrorHandling,\n testValidation,\n testPricingEdgeCases,\n testTemporalValidation,\n testBehaviorAnalysis,\n testResponseConsistency,\n // v3 scenarios\n testGovernancePropertyLists,\n testGovernanceContentStandards,\n testPropertyListFilters,\n testCampaignGovernance,\n testCampaignGovernanceDenied,\n testCampaignGovernanceConditions,\n testCampaignGovernanceDelivery,\n testSellerGovernanceContext,\n testSISessionLifecycle,\n testSIAvailability,\n testSIHandoff,\n testCapabilityDiscovery,\n testSyncAudiences,\n testSchemaCompliance,\n testErrorCodes,\n testErrorStructure,\n testErrorTransport,\n // State machine compliance\n testMediaBuyLifecycle,\n testTerminalStateEnforcement,\n testPackageLifecycle,\n // Deterministic state machine testing\n testCreativeStateMachine,\n testMediaBuyStateMachine,\n testAccountStateMachine,\n testSessionStateMachine,\n testDeliverySimulation,\n testBudgetSimulation,\n testControllerValidation,\n // Brand rights\n testBrandIdentity,\n testBrandRightsFlow,\n testCreativeApproval,\n} from './scenarios';\n\n// Import types\nimport type { TestScenario, TestOptions, TestResult, TestStepResult, AgentProfile } from './types';\nimport { getLogger } from './client';\n\n/**\n * Main entry point: Run a test scenario against an agent\n */\nexport async function testAgent(\n agentUrl: string,\n scenario: TestScenario,\n options: TestOptions = {}\n): Promise<TestResult> {\n const startTime = Date.now();\n let steps: TestStepResult[] = [];\n let profile: AgentProfile | undefined;\n const logger = getLogger();\n\n const effectiveOptions: TestOptions = {\n ...options,\n sandbox: options.sandbox !== false,\n test_session_id: options.test_session_id || `addie-test-${Date.now()}`,\n };\n\n logger.info({ agentUrl, scenario, options: effectiveOptions }, 'Starting agent test');\n\n try {\n let result: { steps: TestStepResult[]; profile?: AgentProfile };\n\n switch (scenario) {\n case 'health_check':\n steps = await testHealthCheck(agentUrl, effectiveOptions);\n break;\n\n case 'discovery':\n result = await testDiscovery(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'create_media_buy':\n result = await testCreateMediaBuy(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'full_sales_flow':\n result = await testFullSalesFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'reporting_flow':\n result = await testReportingFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_sync':\n result = await testCreativeSync(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_inline':\n result = await testCreativeInline(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_reference':\n result = await testCreativeReference(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'pricing_models':\n // Re-use pricing edge cases for now\n result = await testPricingEdgeCases(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_flow':\n result = await testCreativeFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_lifecycle':\n result = await testCreativeLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'signals_flow':\n result = await testSignalsFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_handling':\n result = await testErrorHandling(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'validation':\n result = await testValidation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'pricing_edge_cases':\n result = await testPricingEdgeCases(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'temporal_validation':\n result = await testTemporalValidation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'behavior_analysis':\n result = await testBehaviorAnalysis(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'response_consistency':\n result = await testResponseConsistency(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 Governance protocol scenarios\n case 'governance_property_lists':\n result = await testGovernancePropertyLists(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'governance_content_standards':\n result = await testGovernanceContentStandards(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'property_list_filters':\n result = await testPropertyListFilters(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 Campaign governance scenarios\n case 'campaign_governance':\n result = await testCampaignGovernance(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'campaign_governance_denied':\n result = await testCampaignGovernanceDenied(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'campaign_governance_conditions':\n result = await testCampaignGovernanceConditions(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'campaign_governance_delivery':\n result = await testCampaignGovernanceDelivery(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'seller_governance_context':\n result = await testSellerGovernanceContext(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 SI protocol scenarios\n case 'si_session_lifecycle':\n result = await testSISessionLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'si_availability':\n result = await testSIAvailability(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'si_handoff':\n result = await testSIHandoff(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 Capability discovery\n case 'capability_discovery':\n result = await testCapabilityDiscovery(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'sync_audiences':\n result = await testSyncAudiences(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'schema_compliance':\n result = await testSchemaCompliance(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_codes':\n result = await testErrorCodes(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_structure':\n result = await testErrorStructure(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_transport':\n result = await testErrorTransport(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // State machine compliance\n case 'media_buy_lifecycle':\n result = await testMediaBuyLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'terminal_state_enforcement':\n result = await testTerminalStateEnforcement(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'package_lifecycle':\n result = await testPackageLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // Deterministic state machine scenarios (require comply_test_controller)\n case 'deterministic_creative':\n result = await testCreativeStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_media_buy':\n result = await testMediaBuyStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_account':\n result = await testAccountStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_session':\n result = await testSessionStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_delivery':\n result = await testDeliverySimulation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_budget':\n result = await testBudgetSimulation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'controller_validation':\n result = await testControllerValidation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // Brand rights protocol\n case 'brand_identity':\n result = await testBrandIdentity(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'brand_rights_flow':\n result = await testBrandRightsFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_approval':\n result = await testCreativeApproval(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n default:\n steps = [\n {\n step: 'Unknown scenario',\n passed: false,\n duration_ms: 0,\n error: `Unknown test scenario: ${scenario}`,\n },\n ];\n }\n } catch (error) {\n logger.error({ error, agentUrl, scenario }, 'Agent test failed with exception');\n steps.push({\n step: 'Test execution',\n passed: false,\n duration_ms: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const totalDuration = Date.now() - startTime;\n const passedCount = steps.filter(s => s.passed).length;\n const failedCount = steps.filter(s => !s.passed).length;\n const overallPassed = failedCount === 0 && passedCount > 0;\n\n // Generate summary\n let summary: string;\n if (overallPassed) {\n summary = `All ${passedCount} test step(s) passed in ${totalDuration}ms`;\n } else if (passedCount === 0) {\n summary = `All ${failedCount} test step(s) failed`;\n } else {\n summary = `${passedCount} passed, ${failedCount} failed out of ${steps.length} step(s)`;\n }\n\n const testResult: TestResult = {\n agent_url: agentUrl,\n scenario,\n overall_passed: overallPassed,\n steps,\n summary,\n total_duration_ms: totalDuration,\n tested_at: new Date().toISOString(),\n agent_profile: profile,\n };\n\n logger.info({ agentUrl, scenario, overallPassed, passedCount, failedCount, totalDuration }, 'Agent test completed');\n\n return testResult;\n}\n\n// Re-export orchestrator\nexport {\n testAllScenarios,\n getApplicableScenarios,\n SCENARIO_REQUIREMENTS,\n DEFAULT_SCENARIOS,\n formatSuiteResults,\n formatSuiteResultsJSON,\n type OrchestratorOptions,\n} from './orchestrator';\n\n// Re-export individual scenarios for direct use\nexport {\n testHealthCheck,\n testDiscovery,\n testCreateMediaBuy,\n testFullSalesFlow,\n testReportingFlow,\n testCreativeSync,\n testCreativeInline,\n testCreativeFlow,\n testCreativeLifecycle,\n testSignalsFlow,\n testErrorHandling,\n testValidation,\n testPricingEdgeCases,\n testTemporalValidation,\n testBehaviorAnalysis,\n testResponseConsistency,\n // v3 scenarios\n testGovernancePropertyLists,\n testGovernanceContentStandards,\n testPropertyListFilters,\n testCampaignGovernance,\n testCampaignGovernanceDenied,\n testCampaignGovernanceConditions,\n testCampaignGovernanceDelivery,\n testSellerGovernanceContext,\n testSISessionLifecycle,\n testSIAvailability,\n testSIHandoff,\n testCapabilityDiscovery,\n testSyncAudiences,\n resolveAccountForMediaBuy,\n resolveAccountForAudiences,\n testSchemaCompliance,\n testErrorCodes,\n testErrorStructure,\n testErrorTransport,\n // State machine compliance\n testMediaBuyLifecycle,\n testTerminalStateEnforcement,\n testPackageLifecycle,\n // Deterministic state machine testing\n testCreativeStateMachine,\n testMediaBuyStateMachine,\n testAccountStateMachine,\n testSessionStateMachine,\n testDeliverySimulation,\n testBudgetSimulation,\n testControllerValidation,\n // Brand rights\n testBrandIdentity,\n testBrandRightsFlow,\n testCreativeApproval,\n hasBrandRightsTools,\n // v3 helpers\n hasGovernanceTools,\n hasCampaignGovernanceTools,\n hasSITools,\n likelySupportsV3,\n} from './scenarios';\n"],"mappings":"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","names":["import_client","import_scenarios"]}
1
+ {"version":3,"sources":["../../../src/lib/testing/agent-tester.ts"],"sourcesContent":["/**\n * AdCP Agent E2E Tester\n *\n * Provides comprehensive end-to-end testing of AdCP agents (sales, creative, signals).\n *\n * Features:\n * - Channel-aware testing (only tests features the agent supports)\n * - Sandbox mode for safe testing (real testing requires actual media buys)\n * - Comprehensive scenario coverage based on AdCP spec\n * - Schema validation via @adcp/sdk\n *\n * @example\n * ```typescript\n * import { testAgent, formatTestResults } from '@adcp/sdk/testing';\n *\n * const result = await testAgent(\n * 'https://test-agent.adcontextprotocol.org/mcp',\n * 'discovery',\n * { auth: { type: 'bearer', token: 'your-token' } }\n * );\n * console.log(formatTestResults(result));\n * ```\n */\n\n// Re-export types\nexport type {\n TestScenario,\n TestOptions,\n TestStepResult,\n AgentProfile,\n TestResult,\n SuiteResult,\n TaskResult,\n Logger,\n} from './types';\nexport type { TestClient } from './client';\n\n// Re-export client utilities\nexport { setAgentTesterLogger, getLogger, createTestClient, runStep } from './client';\n\n// Re-export formatter\nexport { formatTestResults, formatTestResultsJSON, formatTestResultsSummary } from './formatter';\n\n// Import scenarios\nimport {\n testHealthCheck,\n testDiscovery,\n testCreateMediaBuy,\n testFullSalesFlow,\n testReportingFlow,\n testCreativeSync,\n testCreativeInline,\n testCreativeReference,\n testCreativeFlow,\n testCreativeLifecycle,\n testSignalsFlow,\n testErrorHandling,\n testValidation,\n testPricingEdgeCases,\n testTemporalValidation,\n testBehaviorAnalysis,\n testResponseConsistency,\n // v3 scenarios\n testGovernancePropertyLists,\n testGovernanceContentStandards,\n testPropertyListFilters,\n testCampaignGovernance,\n testCampaignGovernanceDenied,\n testCampaignGovernanceConditions,\n testCampaignGovernanceDelivery,\n testSellerGovernanceContext,\n testSISessionLifecycle,\n testSIAvailability,\n testSIHandoff,\n testCapabilityDiscovery,\n testSyncAudiences,\n testSchemaCompliance,\n testErrorCodes,\n testErrorStructure,\n testErrorTransport,\n // State machine compliance\n testMediaBuyLifecycle,\n testTerminalStateEnforcement,\n testPackageLifecycle,\n // Deterministic state machine testing\n testCreativeStateMachine,\n testMediaBuyStateMachine,\n testAccountStateMachine,\n testSessionStateMachine,\n testDeliverySimulation,\n testBudgetSimulation,\n testControllerValidation,\n // Brand rights\n testBrandIdentity,\n testBrandRightsFlow,\n testCreativeApproval,\n} from './scenarios';\n\n// Import types\nimport type { TestScenario, TestOptions, TestResult, TestStepResult, AgentProfile } from './types';\nimport { getLogger } from './client';\n\nconst REDACTED = '[redacted]';\n\n/**\n * Strip credentials out of `TestOptions` before it reaches a logger.\n *\n * `TestOptions` carries bearer tokens, Basic passwords, OAuth access/refresh\n * tokens, client-credential secrets, test-kit API keys, and caller-supplied\n * headers that may hold any of the above. The default logger serializes its\n * whole context with `JSON.stringify` to `console.log`, so logging the object\n * verbatim puts live credentials into ordinary stdout and CI logs. Shapes are\n * preserved — which auth type and which header names were in play is the useful\n * part for debugging; the values are not.\n */\nfunction redactTestOptions(options: TestOptions): Record<string, unknown> {\n // Allowlist, not `{...options}` minus known secrets.\n //\n // Spreading was the bug: `TestOptions._client` is a live `SingleAgentClient`,\n // set on the primary `comply()` and orchestrator paths, and its `agent` field\n // is an own enumerable property — so `JSON.stringify` walked straight back\n // into the bearer token, OAuth tokens, client secret, custom headers, and\n // `webhookSecret` that the masking above had just removed, three times over\n // via nested client references. A denylist over a graph that holds a\n // reference to the whole client cannot be made safe; only naming what may be\n // logged can.\n const safe: Record<string, unknown> = {};\n\n for (const key of LOGGABLE_OPTION_KEYS) {\n if (options[key] !== undefined) safe[key] = options[key];\n }\n\n if (options.auth) {\n // Keep `type` so the log still shows which scheme was exercised.\n safe.auth = { type: options.auth.type, ...redactedFieldsFor(options.auth) };\n }\n if (options.headers) {\n // Names are the debuggable part; values may be credentials.\n safe.headers = Object.fromEntries(Object.keys(options.headers).map(name => [name, REDACTED]));\n }\n if (options.test_kit) {\n // Test kits come from arbitrary `test-kits/*.yaml` and the type carries an\n // index signature, so a credential can sit at any depth. Log the shape only.\n safe.test_kit = { keys: Object.keys(options.test_kit) };\n }\n\n return safe;\n}\n\n/**\n * Fields of `TestOptions` that may be written to a log verbatim.\n *\n * Anything not named here is dropped — in particular the `_`-prefixed internals\n * (`_client`, `_profile`, `_webhookReceiver`, …), which hold live client objects\n * whose own fields include every credential the caller supplied. `agentUrl` is\n * logged separately by the caller, so the client adds no diagnostic value.\n */\nconst LOGGABLE_OPTION_KEYS = [\n 'protocol',\n 'adcpVersion',\n 'wireAdcpVersion',\n 'versionEnvelope',\n 'schemaRoot',\n 'userAgent',\n 'brand',\n 'brief',\n 'budget',\n 'format_ids',\n 'sandbox',\n 'test_session_id',\n] as const satisfies readonly (keyof TestOptions)[];\n\n/** Every credential-bearing field of the auth union, masked. */\nfunction redactedFieldsFor(auth: NonNullable<TestOptions['auth']>): Record<string, string> {\n switch (auth.type) {\n case 'bearer':\n return { token: REDACTED };\n case 'basic':\n return { username: REDACTED, password: REDACTED };\n case 'oauth':\n return { tokens: REDACTED };\n case 'oauth_client_credentials':\n return { credentials: REDACTED, tokens: REDACTED };\n default:\n // Unreachable for the declared union; masks wholesale if it ever widens.\n return { value: REDACTED };\n }\n}\n\n/**\n * Main entry point: Run a test scenario against an agent\n */\nexport async function testAgent(\n agentUrl: string,\n scenario: TestScenario,\n options: TestOptions = {}\n): Promise<TestResult> {\n const startTime = Date.now();\n let steps: TestStepResult[] = [];\n let profile: AgentProfile | undefined;\n const logger = getLogger();\n\n const effectiveOptions: TestOptions = {\n ...options,\n sandbox: options.sandbox !== false,\n test_session_id: options.test_session_id || `addie-test-${Date.now()}`,\n };\n\n logger.info({ agentUrl, scenario, options: redactTestOptions(effectiveOptions) }, 'Starting agent test');\n\n try {\n let result: { steps: TestStepResult[]; profile?: AgentProfile };\n\n switch (scenario) {\n case 'health_check':\n steps = await testHealthCheck(agentUrl, effectiveOptions);\n break;\n\n case 'discovery':\n result = await testDiscovery(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'create_media_buy':\n result = await testCreateMediaBuy(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'full_sales_flow':\n result = await testFullSalesFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'reporting_flow':\n result = await testReportingFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_sync':\n result = await testCreativeSync(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_inline':\n result = await testCreativeInline(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_reference':\n result = await testCreativeReference(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'pricing_models':\n // Re-use pricing edge cases for now\n result = await testPricingEdgeCases(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_flow':\n result = await testCreativeFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_lifecycle':\n result = await testCreativeLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'signals_flow':\n result = await testSignalsFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_handling':\n result = await testErrorHandling(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'validation':\n result = await testValidation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'pricing_edge_cases':\n result = await testPricingEdgeCases(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'temporal_validation':\n result = await testTemporalValidation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'behavior_analysis':\n result = await testBehaviorAnalysis(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'response_consistency':\n result = await testResponseConsistency(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 Governance protocol scenarios\n case 'governance_property_lists':\n result = await testGovernancePropertyLists(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'governance_content_standards':\n result = await testGovernanceContentStandards(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'property_list_filters':\n result = await testPropertyListFilters(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 Campaign governance scenarios\n case 'campaign_governance':\n result = await testCampaignGovernance(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'campaign_governance_denied':\n result = await testCampaignGovernanceDenied(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'campaign_governance_conditions':\n result = await testCampaignGovernanceConditions(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'campaign_governance_delivery':\n result = await testCampaignGovernanceDelivery(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'seller_governance_context':\n result = await testSellerGovernanceContext(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 SI protocol scenarios\n case 'si_session_lifecycle':\n result = await testSISessionLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'si_availability':\n result = await testSIAvailability(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'si_handoff':\n result = await testSIHandoff(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 Capability discovery\n case 'capability_discovery':\n result = await testCapabilityDiscovery(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'sync_audiences':\n result = await testSyncAudiences(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'schema_compliance':\n result = await testSchemaCompliance(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_codes':\n result = await testErrorCodes(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_structure':\n result = await testErrorStructure(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_transport':\n result = await testErrorTransport(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // State machine compliance\n case 'media_buy_lifecycle':\n result = await testMediaBuyLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'terminal_state_enforcement':\n result = await testTerminalStateEnforcement(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'package_lifecycle':\n result = await testPackageLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // Deterministic state machine scenarios (require comply_test_controller)\n case 'deterministic_creative':\n result = await testCreativeStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_media_buy':\n result = await testMediaBuyStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_account':\n result = await testAccountStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_session':\n result = await testSessionStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_delivery':\n result = await testDeliverySimulation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_budget':\n result = await testBudgetSimulation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'controller_validation':\n result = await testControllerValidation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // Brand rights protocol\n case 'brand_identity':\n result = await testBrandIdentity(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'brand_rights_flow':\n result = await testBrandRightsFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_approval':\n result = await testCreativeApproval(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n default:\n steps = [\n {\n step: 'Unknown scenario',\n passed: false,\n duration_ms: 0,\n error: `Unknown test scenario: ${scenario}`,\n },\n ];\n }\n } catch (error) {\n logger.error({ error, agentUrl, scenario }, 'Agent test failed with exception');\n steps.push({\n step: 'Test execution',\n passed: false,\n duration_ms: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const totalDuration = Date.now() - startTime;\n const passedCount = steps.filter(s => s.passed).length;\n const failedCount = steps.filter(s => !s.passed).length;\n const overallPassed = failedCount === 0 && passedCount > 0;\n\n // Generate summary\n let summary: string;\n if (overallPassed) {\n summary = `All ${passedCount} test step(s) passed in ${totalDuration}ms`;\n } else if (passedCount === 0) {\n summary = `All ${failedCount} test step(s) failed`;\n } else {\n summary = `${passedCount} passed, ${failedCount} failed out of ${steps.length} step(s)`;\n }\n\n const testResult: TestResult = {\n agent_url: agentUrl,\n scenario,\n overall_passed: overallPassed,\n steps,\n summary,\n total_duration_ms: totalDuration,\n tested_at: new Date().toISOString(),\n agent_profile: profile,\n };\n\n logger.info({ agentUrl, scenario, overallPassed, passedCount, failedCount, totalDuration }, 'Agent test completed');\n\n return testResult;\n}\n\n// Re-export orchestrator\nexport {\n testAllScenarios,\n getApplicableScenarios,\n SCENARIO_REQUIREMENTS,\n DEFAULT_SCENARIOS,\n formatSuiteResults,\n formatSuiteResultsJSON,\n type OrchestratorOptions,\n} from './orchestrator';\n\n// Re-export individual scenarios for direct use\nexport {\n testHealthCheck,\n testDiscovery,\n testCreateMediaBuy,\n testFullSalesFlow,\n testReportingFlow,\n testCreativeSync,\n testCreativeInline,\n testCreativeFlow,\n testCreativeLifecycle,\n testSignalsFlow,\n testErrorHandling,\n testValidation,\n testPricingEdgeCases,\n testTemporalValidation,\n testBehaviorAnalysis,\n testResponseConsistency,\n // v3 scenarios\n testGovernancePropertyLists,\n testGovernanceContentStandards,\n testPropertyListFilters,\n testCampaignGovernance,\n testCampaignGovernanceDenied,\n testCampaignGovernanceConditions,\n testCampaignGovernanceDelivery,\n testSellerGovernanceContext,\n testSISessionLifecycle,\n testSIAvailability,\n testSIHandoff,\n testCapabilityDiscovery,\n testSyncAudiences,\n resolveAccountForMediaBuy,\n resolveAccountForAudiences,\n testSchemaCompliance,\n testErrorCodes,\n testErrorStructure,\n testErrorTransport,\n // State machine compliance\n testMediaBuyLifecycle,\n testTerminalStateEnforcement,\n testPackageLifecycle,\n // Deterministic state machine testing\n testCreativeStateMachine,\n testMediaBuyStateMachine,\n testAccountStateMachine,\n testSessionStateMachine,\n testDeliverySimulation,\n testBudgetSimulation,\n testControllerValidation,\n // Brand rights\n testBrandIdentity,\n testBrandRightsFlow,\n testCreativeApproval,\n hasBrandRightsTools,\n // v3 helpers\n hasGovernanceTools,\n hasCampaignGovernanceTools,\n hasSITools,\n likelySupportsV3,\n} from './scenarios';\n"],"mappings":"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","names":["import_client","import_scenarios"]}
@@ -50,6 +50,51 @@ import {
50
50
  testCreativeApproval
51
51
  } from "./scenarios/index.mjs";
52
52
  import { getLogger as getLogger2 } from "./client.mjs";
53
+ const REDACTED = "[redacted]";
54
+ function redactTestOptions(options) {
55
+ const safe = {};
56
+ for (const key of LOGGABLE_OPTION_KEYS) {
57
+ if (options[key] !== void 0) safe[key] = options[key];
58
+ }
59
+ if (options.auth) {
60
+ safe.auth = { type: options.auth.type, ...redactedFieldsFor(options.auth) };
61
+ }
62
+ if (options.headers) {
63
+ safe.headers = Object.fromEntries(Object.keys(options.headers).map((name) => [name, REDACTED]));
64
+ }
65
+ if (options.test_kit) {
66
+ safe.test_kit = { keys: Object.keys(options.test_kit) };
67
+ }
68
+ return safe;
69
+ }
70
+ const LOGGABLE_OPTION_KEYS = [
71
+ "protocol",
72
+ "adcpVersion",
73
+ "wireAdcpVersion",
74
+ "versionEnvelope",
75
+ "schemaRoot",
76
+ "userAgent",
77
+ "brand",
78
+ "brief",
79
+ "budget",
80
+ "format_ids",
81
+ "sandbox",
82
+ "test_session_id"
83
+ ];
84
+ function redactedFieldsFor(auth) {
85
+ switch (auth.type) {
86
+ case "bearer":
87
+ return { token: REDACTED };
88
+ case "basic":
89
+ return { username: REDACTED, password: REDACTED };
90
+ case "oauth":
91
+ return { tokens: REDACTED };
92
+ case "oauth_client_credentials":
93
+ return { credentials: REDACTED, tokens: REDACTED };
94
+ default:
95
+ return { value: REDACTED };
96
+ }
97
+ }
53
98
  async function testAgent(agentUrl, scenario, options = {}) {
54
99
  const startTime = Date.now();
55
100
  let steps = [];
@@ -60,7 +105,7 @@ async function testAgent(agentUrl, scenario, options = {}) {
60
105
  sandbox: options.sandbox !== false,
61
106
  test_session_id: options.test_session_id || `addie-test-${Date.now()}`
62
107
  };
63
- logger.info({ agentUrl, scenario, options: effectiveOptions }, "Starting agent test");
108
+ logger.info({ agentUrl, scenario, options: redactTestOptions(effectiveOptions) }, "Starting agent test");
64
109
  try {
65
110
  let result;
66
111
  switch (scenario) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/testing/agent-tester.ts"],"sourcesContent":["/**\n * AdCP Agent E2E Tester\n *\n * Provides comprehensive end-to-end testing of AdCP agents (sales, creative, signals).\n *\n * Features:\n * - Channel-aware testing (only tests features the agent supports)\n * - Sandbox mode for safe testing (real testing requires actual media buys)\n * - Comprehensive scenario coverage based on AdCP spec\n * - Schema validation via @adcp/sdk\n *\n * @example\n * ```typescript\n * import { testAgent, formatTestResults } from '@adcp/sdk/testing';\n *\n * const result = await testAgent(\n * 'https://test-agent.adcontextprotocol.org/mcp',\n * 'discovery',\n * { auth: { type: 'bearer', token: 'your-token' } }\n * );\n * console.log(formatTestResults(result));\n * ```\n */\n\n// Re-export types\nexport type {\n TestScenario,\n TestOptions,\n TestStepResult,\n AgentProfile,\n TestResult,\n SuiteResult,\n TaskResult,\n Logger,\n} from './types';\nexport type { TestClient } from './client';\n\n// Re-export client utilities\nexport { setAgentTesterLogger, getLogger, createTestClient, runStep } from './client';\n\n// Re-export formatter\nexport { formatTestResults, formatTestResultsJSON, formatTestResultsSummary } from './formatter';\n\n// Import scenarios\nimport {\n testHealthCheck,\n testDiscovery,\n testCreateMediaBuy,\n testFullSalesFlow,\n testReportingFlow,\n testCreativeSync,\n testCreativeInline,\n testCreativeReference,\n testCreativeFlow,\n testCreativeLifecycle,\n testSignalsFlow,\n testErrorHandling,\n testValidation,\n testPricingEdgeCases,\n testTemporalValidation,\n testBehaviorAnalysis,\n testResponseConsistency,\n // v3 scenarios\n testGovernancePropertyLists,\n testGovernanceContentStandards,\n testPropertyListFilters,\n testCampaignGovernance,\n testCampaignGovernanceDenied,\n testCampaignGovernanceConditions,\n testCampaignGovernanceDelivery,\n testSellerGovernanceContext,\n testSISessionLifecycle,\n testSIAvailability,\n testSIHandoff,\n testCapabilityDiscovery,\n testSyncAudiences,\n testSchemaCompliance,\n testErrorCodes,\n testErrorStructure,\n testErrorTransport,\n // State machine compliance\n testMediaBuyLifecycle,\n testTerminalStateEnforcement,\n testPackageLifecycle,\n // Deterministic state machine testing\n testCreativeStateMachine,\n testMediaBuyStateMachine,\n testAccountStateMachine,\n testSessionStateMachine,\n testDeliverySimulation,\n testBudgetSimulation,\n testControllerValidation,\n // Brand rights\n testBrandIdentity,\n testBrandRightsFlow,\n testCreativeApproval,\n} from './scenarios';\n\n// Import types\nimport type { TestScenario, TestOptions, TestResult, TestStepResult, AgentProfile } from './types';\nimport { getLogger } from './client';\n\n/**\n * Main entry point: Run a test scenario against an agent\n */\nexport async function testAgent(\n agentUrl: string,\n scenario: TestScenario,\n options: TestOptions = {}\n): Promise<TestResult> {\n const startTime = Date.now();\n let steps: TestStepResult[] = [];\n let profile: AgentProfile | undefined;\n const logger = getLogger();\n\n const effectiveOptions: TestOptions = {\n ...options,\n sandbox: options.sandbox !== false,\n test_session_id: options.test_session_id || `addie-test-${Date.now()}`,\n };\n\n logger.info({ agentUrl, scenario, options: effectiveOptions }, 'Starting agent test');\n\n try {\n let result: { steps: TestStepResult[]; profile?: AgentProfile };\n\n switch (scenario) {\n case 'health_check':\n steps = await testHealthCheck(agentUrl, effectiveOptions);\n break;\n\n case 'discovery':\n result = await testDiscovery(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'create_media_buy':\n result = await testCreateMediaBuy(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'full_sales_flow':\n result = await testFullSalesFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'reporting_flow':\n result = await testReportingFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_sync':\n result = await testCreativeSync(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_inline':\n result = await testCreativeInline(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_reference':\n result = await testCreativeReference(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'pricing_models':\n // Re-use pricing edge cases for now\n result = await testPricingEdgeCases(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_flow':\n result = await testCreativeFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_lifecycle':\n result = await testCreativeLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'signals_flow':\n result = await testSignalsFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_handling':\n result = await testErrorHandling(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'validation':\n result = await testValidation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'pricing_edge_cases':\n result = await testPricingEdgeCases(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'temporal_validation':\n result = await testTemporalValidation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'behavior_analysis':\n result = await testBehaviorAnalysis(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'response_consistency':\n result = await testResponseConsistency(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 Governance protocol scenarios\n case 'governance_property_lists':\n result = await testGovernancePropertyLists(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'governance_content_standards':\n result = await testGovernanceContentStandards(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'property_list_filters':\n result = await testPropertyListFilters(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 Campaign governance scenarios\n case 'campaign_governance':\n result = await testCampaignGovernance(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'campaign_governance_denied':\n result = await testCampaignGovernanceDenied(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'campaign_governance_conditions':\n result = await testCampaignGovernanceConditions(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'campaign_governance_delivery':\n result = await testCampaignGovernanceDelivery(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'seller_governance_context':\n result = await testSellerGovernanceContext(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 SI protocol scenarios\n case 'si_session_lifecycle':\n result = await testSISessionLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'si_availability':\n result = await testSIAvailability(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'si_handoff':\n result = await testSIHandoff(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 Capability discovery\n case 'capability_discovery':\n result = await testCapabilityDiscovery(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'sync_audiences':\n result = await testSyncAudiences(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'schema_compliance':\n result = await testSchemaCompliance(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_codes':\n result = await testErrorCodes(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_structure':\n result = await testErrorStructure(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_transport':\n result = await testErrorTransport(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // State machine compliance\n case 'media_buy_lifecycle':\n result = await testMediaBuyLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'terminal_state_enforcement':\n result = await testTerminalStateEnforcement(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'package_lifecycle':\n result = await testPackageLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // Deterministic state machine scenarios (require comply_test_controller)\n case 'deterministic_creative':\n result = await testCreativeStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_media_buy':\n result = await testMediaBuyStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_account':\n result = await testAccountStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_session':\n result = await testSessionStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_delivery':\n result = await testDeliverySimulation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_budget':\n result = await testBudgetSimulation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'controller_validation':\n result = await testControllerValidation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // Brand rights protocol\n case 'brand_identity':\n result = await testBrandIdentity(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'brand_rights_flow':\n result = await testBrandRightsFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_approval':\n result = await testCreativeApproval(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n default:\n steps = [\n {\n step: 'Unknown scenario',\n passed: false,\n duration_ms: 0,\n error: `Unknown test scenario: ${scenario}`,\n },\n ];\n }\n } catch (error) {\n logger.error({ error, agentUrl, scenario }, 'Agent test failed with exception');\n steps.push({\n step: 'Test execution',\n passed: false,\n duration_ms: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const totalDuration = Date.now() - startTime;\n const passedCount = steps.filter(s => s.passed).length;\n const failedCount = steps.filter(s => !s.passed).length;\n const overallPassed = failedCount === 0 && passedCount > 0;\n\n // Generate summary\n let summary: string;\n if (overallPassed) {\n summary = `All ${passedCount} test step(s) passed in ${totalDuration}ms`;\n } else if (passedCount === 0) {\n summary = `All ${failedCount} test step(s) failed`;\n } else {\n summary = `${passedCount} passed, ${failedCount} failed out of ${steps.length} step(s)`;\n }\n\n const testResult: TestResult = {\n agent_url: agentUrl,\n scenario,\n overall_passed: overallPassed,\n steps,\n summary,\n total_duration_ms: totalDuration,\n tested_at: new Date().toISOString(),\n agent_profile: profile,\n };\n\n logger.info({ agentUrl, scenario, overallPassed, passedCount, failedCount, totalDuration }, 'Agent test completed');\n\n return testResult;\n}\n\n// Re-export orchestrator\nexport {\n testAllScenarios,\n getApplicableScenarios,\n SCENARIO_REQUIREMENTS,\n DEFAULT_SCENARIOS,\n formatSuiteResults,\n formatSuiteResultsJSON,\n type OrchestratorOptions,\n} from './orchestrator';\n\n// Re-export individual scenarios for direct use\nexport {\n testHealthCheck,\n testDiscovery,\n testCreateMediaBuy,\n testFullSalesFlow,\n testReportingFlow,\n testCreativeSync,\n testCreativeInline,\n testCreativeFlow,\n testCreativeLifecycle,\n testSignalsFlow,\n testErrorHandling,\n testValidation,\n testPricingEdgeCases,\n testTemporalValidation,\n testBehaviorAnalysis,\n testResponseConsistency,\n // v3 scenarios\n testGovernancePropertyLists,\n testGovernanceContentStandards,\n testPropertyListFilters,\n testCampaignGovernance,\n testCampaignGovernanceDenied,\n testCampaignGovernanceConditions,\n testCampaignGovernanceDelivery,\n testSellerGovernanceContext,\n testSISessionLifecycle,\n testSIAvailability,\n testSIHandoff,\n testCapabilityDiscovery,\n testSyncAudiences,\n resolveAccountForMediaBuy,\n resolveAccountForAudiences,\n testSchemaCompliance,\n testErrorCodes,\n testErrorStructure,\n testErrorTransport,\n // State machine compliance\n testMediaBuyLifecycle,\n testTerminalStateEnforcement,\n testPackageLifecycle,\n // Deterministic state machine testing\n testCreativeStateMachine,\n testMediaBuyStateMachine,\n testAccountStateMachine,\n testSessionStateMachine,\n testDeliverySimulation,\n testBudgetSimulation,\n testControllerValidation,\n // Brand rights\n testBrandIdentity,\n testBrandRightsFlow,\n testCreativeApproval,\n hasBrandRightsTools,\n // v3 helpers\n hasGovernanceTools,\n hasCampaignGovernanceTools,\n hasSITools,\n likelySupportsV3,\n} from './scenarios';\n"],"mappings":"AAsCA,SAAS,sBAAsB,WAAW,kBAAkB,eAAe;AAG3E,SAAS,mBAAmB,uBAAuB,gCAAgC;AAGnF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAIP,SAAS,aAAAA,kBAAiB;AAK1B,eAAsB,UACpB,UACA,UACA,UAAuB,CAAC,GACH;AACrB,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI,QAA0B,CAAC;AAC/B,MAAI;AACJ,QAAM,SAASA,WAAU;AAEzB,QAAM,mBAAgC;AAAA,IACpC,GAAG;AAAA,IACH,SAAS,QAAQ,YAAY;AAAA,IAC7B,iBAAiB,QAAQ,mBAAmB,cAAc,KAAK,IAAI,CAAC;AAAA,EACtE;AAEA,SAAO,KAAK,EAAE,UAAU,UAAU,SAAS,iBAAiB,GAAG,qBAAqB;AAEpF,MAAI;AACF,QAAI;AAEJ,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,gBAAQ,MAAM,gBAAgB,UAAU,gBAAgB;AACxD;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,cAAc,UAAU,gBAAgB;AACvD,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,mBAAmB,UAAU,gBAAgB;AAC5D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,kBAAkB,UAAU,gBAAgB;AAC3D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,kBAAkB,UAAU,gBAAgB;AAC3D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,iBAAiB,UAAU,gBAAgB;AAC1D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,mBAAmB,UAAU,gBAAgB;AAC5D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,sBAAsB,UAAU,gBAAgB;AAC/D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AAEH,iBAAS,MAAM,qBAAqB,UAAU,gBAAgB;AAC9D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,iBAAiB,UAAU,gBAAgB;AAC1D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,sBAAsB,UAAU,gBAAgB;AAC/D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,gBAAgB,UAAU,gBAAgB;AACzD,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,kBAAkB,UAAU,gBAAgB;AAC3D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,eAAe,UAAU,gBAAgB;AACxD,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,qBAAqB,UAAU,gBAAgB;AAC9D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,uBAAuB,UAAU,gBAAgB;AAChE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,qBAAqB,UAAU,gBAAgB;AAC9D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,wBAAwB,UAAU,gBAAgB;AACjE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA;AAAA,MAGF,KAAK;AACH,iBAAS,MAAM,4BAA4B,UAAU,gBAAgB;AACrE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,+BAA+B,UAAU,gBAAgB;AACxE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,wBAAwB,UAAU,gBAAgB;AACjE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA;AAAA,MAGF,KAAK;AACH,iBAAS,MAAM,uBAAuB,UAAU,gBAAgB;AAChE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,6BAA6B,UAAU,gBAAgB;AACtE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,iCAAiC,UAAU,gBAAgB;AAC1E,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,+BAA+B,UAAU,gBAAgB;AACxE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,4BAA4B,UAAU,gBAAgB;AACrE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA;AAAA,MAGF,KAAK;AACH,iBAAS,MAAM,uBAAuB,UAAU,gBAAgB;AAChE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,mBAAmB,UAAU,gBAAgB;AAC5D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,cAAc,UAAU,gBAAgB;AACvD,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA;AAAA,MAGF,KAAK;AACH,iBAAS,MAAM,wBAAwB,UAAU,gBAAgB;AACjE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,kBAAkB,UAAU,gBAAgB;AAC3D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,qBAAqB,UAAU,gBAAgB;AAC9D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,eAAe,UAAU,gBAAgB;AACxD,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,mBAAmB,UAAU,gBAAgB;AAC5D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,mBAAmB,UAAU,gBAAgB;AAC5D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA;AAAA,MAGF,KAAK;AACH,iBAAS,MAAM,sBAAsB,UAAU,gBAAgB;AAC/D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,6BAA6B,UAAU,gBAAgB;AACtE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,qBAAqB,UAAU,gBAAgB;AAC9D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA;AAAA,MAGF,KAAK;AACH,iBAAS,MAAM,yBAAyB,UAAU,gBAAgB;AAClE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,yBAAyB,UAAU,gBAAgB;AAClE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,wBAAwB,UAAU,gBAAgB;AACjE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,wBAAwB,UAAU,gBAAgB;AACjE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,uBAAuB,UAAU,gBAAgB;AAChE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,qBAAqB,UAAU,gBAAgB;AAC9D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,yBAAyB,UAAU,gBAAgB;AAClE,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA;AAAA,MAGF,KAAK;AACH,iBAAS,MAAM,kBAAkB,UAAU,gBAAgB;AAC3D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,oBAAoB,UAAU,gBAAgB;AAC7D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,qBAAqB,UAAU,gBAAgB;AAC9D,gBAAQ,OAAO;AACf,kBAAU,OAAO;AACjB;AAAA,MAEF;AACE,gBAAQ;AAAA,UACN;AAAA,YACE,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,OAAO,0BAA0B,QAAQ;AAAA,UAC3C;AAAA,QACF;AAAA,IACJ;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,EAAE,OAAO,UAAU,SAAS,GAAG,kCAAkC;AAC9E,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aAAa,KAAK,IAAI,IAAI;AAAA,MAC1B,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,KAAK,IAAI,IAAI;AACnC,QAAM,cAAc,MAAM,OAAO,OAAK,EAAE,MAAM,EAAE;AAChD,QAAM,cAAc,MAAM,OAAO,OAAK,CAAC,EAAE,MAAM,EAAE;AACjD,QAAM,gBAAgB,gBAAgB,KAAK,cAAc;AAGzD,MAAI;AACJ,MAAI,eAAe;AACjB,cAAU,OAAO,WAAW,2BAA2B,aAAa;AAAA,EACtE,WAAW,gBAAgB,GAAG;AAC5B,cAAU,OAAO,WAAW;AAAA,EAC9B,OAAO;AACL,cAAU,GAAG,WAAW,YAAY,WAAW,kBAAkB,MAAM,MAAM;AAAA,EAC/E;AAEA,QAAM,aAAyB;AAAA,IAC7B,WAAW;AAAA,IACX;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,IACnB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,eAAe;AAAA,EACjB;AAEA,SAAO,KAAK,EAAE,UAAU,UAAU,eAAe,aAAa,aAAa,cAAc,GAAG,sBAAsB;AAElH,SAAO;AACT;AAGA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAGP;AAAA,EACE,mBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,yBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,2BAAAC;AAAA,EAEA,+BAAAC;AAAA,EACA,kCAAAC;AAAA,EACA,2BAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,gCAAAC;AAAA,EACA,oCAAAC;AAAA,EACA,kCAAAC;AAAA,EACA,+BAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,2BAAAC;AAAA,EACA,qBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,wBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,sBAAAC;AAAA,EAEA,yBAAAC;AAAA,EACA,gCAAAC;AAAA,EACA,wBAAAC;AAAA,EAEA,4BAAAC;AAAA,EACA,4BAAAC;AAAA,EACA,2BAAAC;AAAA,EACA,2BAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,4BAAAC;AAAA,EAEA,qBAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,wBAAAC;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":["getLogger","testHealthCheck","testDiscovery","testCreateMediaBuy","testFullSalesFlow","testReportingFlow","testCreativeSync","testCreativeInline","testCreativeFlow","testCreativeLifecycle","testSignalsFlow","testErrorHandling","testValidation","testPricingEdgeCases","testTemporalValidation","testBehaviorAnalysis","testResponseConsistency","testGovernancePropertyLists","testGovernanceContentStandards","testPropertyListFilters","testCampaignGovernance","testCampaignGovernanceDenied","testCampaignGovernanceConditions","testCampaignGovernanceDelivery","testSellerGovernanceContext","testSISessionLifecycle","testSIAvailability","testSIHandoff","testCapabilityDiscovery","testSyncAudiences","testSchemaCompliance","testErrorCodes","testErrorStructure","testErrorTransport","testMediaBuyLifecycle","testTerminalStateEnforcement","testPackageLifecycle","testCreativeStateMachine","testMediaBuyStateMachine","testAccountStateMachine","testSessionStateMachine","testDeliverySimulation","testBudgetSimulation","testControllerValidation","testBrandIdentity","testBrandRightsFlow","testCreativeApproval"]}
1
+ {"version":3,"sources":["../../../src/lib/testing/agent-tester.ts"],"sourcesContent":["/**\n * AdCP Agent E2E Tester\n *\n * Provides comprehensive end-to-end testing of AdCP agents (sales, creative, signals).\n *\n * Features:\n * - Channel-aware testing (only tests features the agent supports)\n * - Sandbox mode for safe testing (real testing requires actual media buys)\n * - Comprehensive scenario coverage based on AdCP spec\n * - Schema validation via @adcp/sdk\n *\n * @example\n * ```typescript\n * import { testAgent, formatTestResults } from '@adcp/sdk/testing';\n *\n * const result = await testAgent(\n * 'https://test-agent.adcontextprotocol.org/mcp',\n * 'discovery',\n * { auth: { type: 'bearer', token: 'your-token' } }\n * );\n * console.log(formatTestResults(result));\n * ```\n */\n\n// Re-export types\nexport type {\n TestScenario,\n TestOptions,\n TestStepResult,\n AgentProfile,\n TestResult,\n SuiteResult,\n TaskResult,\n Logger,\n} from './types';\nexport type { TestClient } from './client';\n\n// Re-export client utilities\nexport { setAgentTesterLogger, getLogger, createTestClient, runStep } from './client';\n\n// Re-export formatter\nexport { formatTestResults, formatTestResultsJSON, formatTestResultsSummary } from './formatter';\n\n// Import scenarios\nimport {\n testHealthCheck,\n testDiscovery,\n testCreateMediaBuy,\n testFullSalesFlow,\n testReportingFlow,\n testCreativeSync,\n testCreativeInline,\n testCreativeReference,\n testCreativeFlow,\n testCreativeLifecycle,\n testSignalsFlow,\n testErrorHandling,\n testValidation,\n testPricingEdgeCases,\n testTemporalValidation,\n testBehaviorAnalysis,\n testResponseConsistency,\n // v3 scenarios\n testGovernancePropertyLists,\n testGovernanceContentStandards,\n testPropertyListFilters,\n testCampaignGovernance,\n testCampaignGovernanceDenied,\n testCampaignGovernanceConditions,\n testCampaignGovernanceDelivery,\n testSellerGovernanceContext,\n testSISessionLifecycle,\n testSIAvailability,\n testSIHandoff,\n testCapabilityDiscovery,\n testSyncAudiences,\n testSchemaCompliance,\n testErrorCodes,\n testErrorStructure,\n testErrorTransport,\n // State machine compliance\n testMediaBuyLifecycle,\n testTerminalStateEnforcement,\n testPackageLifecycle,\n // Deterministic state machine testing\n testCreativeStateMachine,\n testMediaBuyStateMachine,\n testAccountStateMachine,\n testSessionStateMachine,\n testDeliverySimulation,\n testBudgetSimulation,\n testControllerValidation,\n // Brand rights\n testBrandIdentity,\n testBrandRightsFlow,\n testCreativeApproval,\n} from './scenarios';\n\n// Import types\nimport type { TestScenario, TestOptions, TestResult, TestStepResult, AgentProfile } from './types';\nimport { getLogger } from './client';\n\nconst REDACTED = '[redacted]';\n\n/**\n * Strip credentials out of `TestOptions` before it reaches a logger.\n *\n * `TestOptions` carries bearer tokens, Basic passwords, OAuth access/refresh\n * tokens, client-credential secrets, test-kit API keys, and caller-supplied\n * headers that may hold any of the above. The default logger serializes its\n * whole context with `JSON.stringify` to `console.log`, so logging the object\n * verbatim puts live credentials into ordinary stdout and CI logs. Shapes are\n * preserved — which auth type and which header names were in play is the useful\n * part for debugging; the values are not.\n */\nfunction redactTestOptions(options: TestOptions): Record<string, unknown> {\n // Allowlist, not `{...options}` minus known secrets.\n //\n // Spreading was the bug: `TestOptions._client` is a live `SingleAgentClient`,\n // set on the primary `comply()` and orchestrator paths, and its `agent` field\n // is an own enumerable property — so `JSON.stringify` walked straight back\n // into the bearer token, OAuth tokens, client secret, custom headers, and\n // `webhookSecret` that the masking above had just removed, three times over\n // via nested client references. A denylist over a graph that holds a\n // reference to the whole client cannot be made safe; only naming what may be\n // logged can.\n const safe: Record<string, unknown> = {};\n\n for (const key of LOGGABLE_OPTION_KEYS) {\n if (options[key] !== undefined) safe[key] = options[key];\n }\n\n if (options.auth) {\n // Keep `type` so the log still shows which scheme was exercised.\n safe.auth = { type: options.auth.type, ...redactedFieldsFor(options.auth) };\n }\n if (options.headers) {\n // Names are the debuggable part; values may be credentials.\n safe.headers = Object.fromEntries(Object.keys(options.headers).map(name => [name, REDACTED]));\n }\n if (options.test_kit) {\n // Test kits come from arbitrary `test-kits/*.yaml` and the type carries an\n // index signature, so a credential can sit at any depth. Log the shape only.\n safe.test_kit = { keys: Object.keys(options.test_kit) };\n }\n\n return safe;\n}\n\n/**\n * Fields of `TestOptions` that may be written to a log verbatim.\n *\n * Anything not named here is dropped — in particular the `_`-prefixed internals\n * (`_client`, `_profile`, `_webhookReceiver`, …), which hold live client objects\n * whose own fields include every credential the caller supplied. `agentUrl` is\n * logged separately by the caller, so the client adds no diagnostic value.\n */\nconst LOGGABLE_OPTION_KEYS = [\n 'protocol',\n 'adcpVersion',\n 'wireAdcpVersion',\n 'versionEnvelope',\n 'schemaRoot',\n 'userAgent',\n 'brand',\n 'brief',\n 'budget',\n 'format_ids',\n 'sandbox',\n 'test_session_id',\n] as const satisfies readonly (keyof TestOptions)[];\n\n/** Every credential-bearing field of the auth union, masked. */\nfunction redactedFieldsFor(auth: NonNullable<TestOptions['auth']>): Record<string, string> {\n switch (auth.type) {\n case 'bearer':\n return { token: REDACTED };\n case 'basic':\n return { username: REDACTED, password: REDACTED };\n case 'oauth':\n return { tokens: REDACTED };\n case 'oauth_client_credentials':\n return { credentials: REDACTED, tokens: REDACTED };\n default:\n // Unreachable for the declared union; masks wholesale if it ever widens.\n return { value: REDACTED };\n }\n}\n\n/**\n * Main entry point: Run a test scenario against an agent\n */\nexport async function testAgent(\n agentUrl: string,\n scenario: TestScenario,\n options: TestOptions = {}\n): Promise<TestResult> {\n const startTime = Date.now();\n let steps: TestStepResult[] = [];\n let profile: AgentProfile | undefined;\n const logger = getLogger();\n\n const effectiveOptions: TestOptions = {\n ...options,\n sandbox: options.sandbox !== false,\n test_session_id: options.test_session_id || `addie-test-${Date.now()}`,\n };\n\n logger.info({ agentUrl, scenario, options: redactTestOptions(effectiveOptions) }, 'Starting agent test');\n\n try {\n let result: { steps: TestStepResult[]; profile?: AgentProfile };\n\n switch (scenario) {\n case 'health_check':\n steps = await testHealthCheck(agentUrl, effectiveOptions);\n break;\n\n case 'discovery':\n result = await testDiscovery(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'create_media_buy':\n result = await testCreateMediaBuy(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'full_sales_flow':\n result = await testFullSalesFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'reporting_flow':\n result = await testReportingFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_sync':\n result = await testCreativeSync(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_inline':\n result = await testCreativeInline(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_reference':\n result = await testCreativeReference(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'pricing_models':\n // Re-use pricing edge cases for now\n result = await testPricingEdgeCases(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_flow':\n result = await testCreativeFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_lifecycle':\n result = await testCreativeLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'signals_flow':\n result = await testSignalsFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_handling':\n result = await testErrorHandling(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'validation':\n result = await testValidation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'pricing_edge_cases':\n result = await testPricingEdgeCases(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'temporal_validation':\n result = await testTemporalValidation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'behavior_analysis':\n result = await testBehaviorAnalysis(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'response_consistency':\n result = await testResponseConsistency(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 Governance protocol scenarios\n case 'governance_property_lists':\n result = await testGovernancePropertyLists(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'governance_content_standards':\n result = await testGovernanceContentStandards(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'property_list_filters':\n result = await testPropertyListFilters(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 Campaign governance scenarios\n case 'campaign_governance':\n result = await testCampaignGovernance(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'campaign_governance_denied':\n result = await testCampaignGovernanceDenied(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'campaign_governance_conditions':\n result = await testCampaignGovernanceConditions(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'campaign_governance_delivery':\n result = await testCampaignGovernanceDelivery(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'seller_governance_context':\n result = await testSellerGovernanceContext(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 SI protocol scenarios\n case 'si_session_lifecycle':\n result = await testSISessionLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'si_availability':\n result = await testSIAvailability(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'si_handoff':\n result = await testSIHandoff(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // v3 Capability discovery\n case 'capability_discovery':\n result = await testCapabilityDiscovery(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'sync_audiences':\n result = await testSyncAudiences(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'schema_compliance':\n result = await testSchemaCompliance(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_codes':\n result = await testErrorCodes(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_structure':\n result = await testErrorStructure(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'error_transport':\n result = await testErrorTransport(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // State machine compliance\n case 'media_buy_lifecycle':\n result = await testMediaBuyLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'terminal_state_enforcement':\n result = await testTerminalStateEnforcement(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'package_lifecycle':\n result = await testPackageLifecycle(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // Deterministic state machine scenarios (require comply_test_controller)\n case 'deterministic_creative':\n result = await testCreativeStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_media_buy':\n result = await testMediaBuyStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_account':\n result = await testAccountStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_session':\n result = await testSessionStateMachine(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_delivery':\n result = await testDeliverySimulation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'deterministic_budget':\n result = await testBudgetSimulation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'controller_validation':\n result = await testControllerValidation(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n // Brand rights protocol\n case 'brand_identity':\n result = await testBrandIdentity(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'brand_rights_flow':\n result = await testBrandRightsFlow(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n case 'creative_approval':\n result = await testCreativeApproval(agentUrl, effectiveOptions);\n steps = result.steps;\n profile = result.profile;\n break;\n\n default:\n steps = [\n {\n step: 'Unknown scenario',\n passed: false,\n duration_ms: 0,\n error: `Unknown test scenario: ${scenario}`,\n },\n ];\n }\n } catch (error) {\n logger.error({ error, agentUrl, scenario }, 'Agent test failed with exception');\n steps.push({\n step: 'Test execution',\n passed: false,\n duration_ms: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const totalDuration = Date.now() - startTime;\n const passedCount = steps.filter(s => s.passed).length;\n const failedCount = steps.filter(s => !s.passed).length;\n const overallPassed = failedCount === 0 && passedCount > 0;\n\n // Generate summary\n let summary: string;\n if (overallPassed) {\n summary = `All ${passedCount} test step(s) passed in ${totalDuration}ms`;\n } else if (passedCount === 0) {\n summary = `All ${failedCount} test step(s) failed`;\n } else {\n summary = `${passedCount} passed, ${failedCount} failed out of ${steps.length} step(s)`;\n }\n\n const testResult: TestResult = {\n agent_url: agentUrl,\n scenario,\n overall_passed: overallPassed,\n steps,\n summary,\n total_duration_ms: totalDuration,\n tested_at: new Date().toISOString(),\n agent_profile: profile,\n };\n\n logger.info({ agentUrl, scenario, overallPassed, passedCount, failedCount, totalDuration }, 'Agent test completed');\n\n return testResult;\n}\n\n// Re-export orchestrator\nexport {\n testAllScenarios,\n getApplicableScenarios,\n SCENARIO_REQUIREMENTS,\n DEFAULT_SCENARIOS,\n formatSuiteResults,\n formatSuiteResultsJSON,\n type OrchestratorOptions,\n} from './orchestrator';\n\n// Re-export individual scenarios for direct use\nexport {\n testHealthCheck,\n testDiscovery,\n testCreateMediaBuy,\n testFullSalesFlow,\n testReportingFlow,\n testCreativeSync,\n testCreativeInline,\n testCreativeFlow,\n testCreativeLifecycle,\n testSignalsFlow,\n testErrorHandling,\n testValidation,\n testPricingEdgeCases,\n testTemporalValidation,\n testBehaviorAnalysis,\n testResponseConsistency,\n // v3 scenarios\n testGovernancePropertyLists,\n testGovernanceContentStandards,\n testPropertyListFilters,\n testCampaignGovernance,\n testCampaignGovernanceDenied,\n testCampaignGovernanceConditions,\n testCampaignGovernanceDelivery,\n testSellerGovernanceContext,\n testSISessionLifecycle,\n testSIAvailability,\n testSIHandoff,\n testCapabilityDiscovery,\n testSyncAudiences,\n resolveAccountForMediaBuy,\n resolveAccountForAudiences,\n testSchemaCompliance,\n testErrorCodes,\n testErrorStructure,\n testErrorTransport,\n // State machine compliance\n testMediaBuyLifecycle,\n testTerminalStateEnforcement,\n testPackageLifecycle,\n // Deterministic state machine testing\n testCreativeStateMachine,\n testMediaBuyStateMachine,\n testAccountStateMachine,\n testSessionStateMachine,\n testDeliverySimulation,\n testBudgetSimulation,\n testControllerValidation,\n // Brand rights\n testBrandIdentity,\n testBrandRightsFlow,\n testCreativeApproval,\n hasBrandRightsTools,\n // v3 helpers\n hasGovernanceTools,\n hasCampaignGovernanceTools,\n hasSITools,\n likelySupportsV3,\n} from './scenarios';\n"],"mappings":"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","names":["getLogger","testHealthCheck","testDiscovery","testCreateMediaBuy","testFullSalesFlow","testReportingFlow","testCreativeSync","testCreativeInline","testCreativeFlow","testCreativeLifecycle","testSignalsFlow","testErrorHandling","testValidation","testPricingEdgeCases","testTemporalValidation","testBehaviorAnalysis","testResponseConsistency","testGovernancePropertyLists","testGovernanceContentStandards","testPropertyListFilters","testCampaignGovernance","testCampaignGovernanceDenied","testCampaignGovernanceConditions","testCampaignGovernanceDelivery","testSellerGovernanceContext","testSISessionLifecycle","testSIAvailability","testSIHandoff","testCapabilityDiscovery","testSyncAudiences","testSchemaCompliance","testErrorCodes","testErrorStructure","testErrorTransport","testMediaBuyLifecycle","testTerminalStateEnforcement","testPackageLifecycle","testCreativeStateMachine","testMediaBuyStateMachine","testAccountStateMachine","testSessionStateMachine","testDeliverySimulation","testBudgetSimulation","testControllerValidation","testBrandIdentity","testBrandRightsFlow","testCreativeApproval"]}
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/runner.ts"],"names":[],"mappings":"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"}
@@ -1302,7 +1302,7 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
1302
1302
  });
1303
1303
  if (webhookReceiver) (0, import_webhook_assertions.armWebhookAssertions)(storyboard, runnerVars, webhookReceiver);
1304
1304
  const allSteps = flattenSteps(storyboard);
1305
- const dispatch = routingContext && options.agents ? createRoutingDispatcher(routingContext, options, options.agents) : createDispatcher(agentUrls, clients, "round-robin", dispatchOffset);
1305
+ const dispatch = routingContext && options.agents ? createRoutingDispatcher(routingContext, options, options.agents) : createDispatcher(agentUrls, clients, "round-robin", dispatchOffset, profile);
1306
1306
  const assertions = (0, import_assertions.resolveAssertions)(storyboard.invariants);
1307
1307
  (0, import_assertions.validateStepInvariants)(storyboard, assertions);
1308
1308
  const assertionContexts = /* @__PURE__ */ new Map();
@@ -1588,7 +1588,9 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
1588
1588
  priorA2aEnvelopes,
1589
1589
  stepRequestStarts,
1590
1590
  responseDerivedNotApplicableContextKeys,
1591
- agentLibraryVersion: profile?.library_version
1591
+ agentProfile: assignment.profile,
1592
+ agentLibraryVersion: assignment.profile?.library_version,
1593
+ storyboardRequiresRequestSigner: allRequires.includes("request_signer")
1592
1594
  }
1593
1595
  );
1594
1596
  const result2 = { ...rawResult, storyboard_id: storyboard.id };
@@ -2054,7 +2056,9 @@ async function runStoryboardStepBody(agentUrl, storyboard, stepId, options) {
2054
2056
  priorA2aEnvelopes: /* @__PURE__ */ new Map(),
2055
2057
  stepRequestStarts: /* @__PURE__ */ new Map(),
2056
2058
  responseDerivedNotApplicableContextKeys,
2057
- agentLibraryVersion: profile?.library_version
2059
+ agentProfile: profile,
2060
+ agentLibraryVersion: profile?.library_version,
2061
+ storyboardRequiresRequestSigner: resolveStoryboardRequires(storyboard, options).includes("request_signer")
2058
2062
  });
2059
2063
  if (!result.skipped && result.passed && found.step.contributes_to) {
2060
2064
  if (evalContributesIf(found.step.contributes_if, /* @__PURE__ */ new Map())) {
@@ -2454,6 +2458,33 @@ async function executeStep(client, step, storyboardId, phaseId, context, allStep
2454
2458
  taskResult?.debug_logs,
2455
2459
  storyboardId
2456
2460
  );
2461
+ const requiredForSigning = resolveCapabilityPath(
2462
+ runState.agentProfile?.raw_capabilities,
2463
+ "request_signing.required_for"
2464
+ );
2465
+ if (taskResult?.adcp_error?.code === "request_signature_required" && Array.isArray(requiredForSigning) && requiredForSigning.includes(effectiveStep.task) && runState.storyboardRequiresRequestSigner !== true) {
2466
+ const next2 = getNextStepPreview(step.id, allSteps, context, runState.runnerVars);
2467
+ const detail = `Agent declared request_signing.required_for includes "${effectiveStep.task}" and rejected the unsigned request with request_signature_required; storyboard "${storyboardId}" does not require request_signer.`;
2468
+ return {
2469
+ step_id: step.id,
2470
+ phase_id: phaseId,
2471
+ title: step.title,
2472
+ task: step.task,
2473
+ passed: true,
2474
+ skipped: true,
2475
+ skip_reason: "not_applicable",
2476
+ skip: buildSkip("not_applicable", detail),
2477
+ duration_ms: stepResult.duration_ms,
2478
+ validations: [],
2479
+ context,
2480
+ response: (0, import_redact_secrets.redactSecrets)(taskResult.data),
2481
+ next: next2,
2482
+ request: requestRecord,
2483
+ ...responseRecord && { response_record: responseRecord },
2484
+ extraction: extractionFromTaskResult(taskResult),
2485
+ ...inputSchemaStripNotices.length > 0 && { notices: inputSchemaStripNotices }
2486
+ };
2487
+ }
2457
2488
  {
2458
2489
  const controllerData = taskResult?.data;
2459
2490
  const requestScenario = request.scenario;
@@ -3995,7 +4026,7 @@ function getNextStepPreview(currentStepId, allSteps, context, runnerVars) {
3995
4026
  sample_request: previewRequest
3996
4027
  };
3997
4028
  }
3998
- function createDispatcher(agentUrls, clients, _strategy, startOffset = 0) {
4029
+ function createDispatcher(agentUrls, clients, _strategy, startOffset = 0, profile) {
3999
4030
  let counter = startOffset;
4000
4031
  return {
4001
4032
  nextFor(_step) {
@@ -4004,7 +4035,8 @@ function createDispatcher(agentUrls, clients, _strategy, startOffset = 0) {
4004
4035
  return {
4005
4036
  client: clients[idx],
4006
4037
  agentUrl: agentUrls[idx],
4007
- instanceIndex: idx
4038
+ instanceIndex: idx,
4039
+ profile
4008
4040
  };
4009
4041
  }
4010
4042
  };
@@ -4016,6 +4048,7 @@ function createRoutingDispatcher(ctx, options, agents) {
4016
4048
  nextFor(step) {
4017
4049
  const key = (0, import_agent_routing.resolveAgentForStep)(step, options, ctx);
4018
4050
  const client = ctx.clients.get(key);
4051
+ const profile = ctx.profiles.get(key);
4019
4052
  const url = agents[key]?.url;
4020
4053
  if (!client || !url) {
4021
4054
  throw new import_agent_routing.RoutingError(
@@ -4027,7 +4060,8 @@ function createRoutingDispatcher(ctx, options, agents) {
4027
4060
  return {
4028
4061
  client,
4029
4062
  agentUrl: url,
4030
- instanceIndex: keyToIndex.get(key) ?? 0
4063
+ instanceIndex: keyToIndex.get(key) ?? 0,
4064
+ profile
4031
4065
  };
4032
4066
  }
4033
4067
  };