@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.
- package/README.md +18 -15
- package/bin/adcp.js +7 -1
- package/dist/lib/adapters/property-list-adapter.d.mts +5 -1
- package/dist/lib/adapters/property-list-adapter.d.ts +5 -1
- package/dist/lib/adapters/property-list-adapter.d.ts.map +1 -1
- package/dist/lib/adapters/property-list-adapter.js +7 -7
- package/dist/lib/adapters/property-list-adapter.js.map +1 -1
- package/dist/lib/adapters/property-list-adapter.mjs +7 -7
- package/dist/lib/adapters/property-list-adapter.mjs.map +1 -1
- package/dist/lib/auth/oauth/CLIFlowHandler.d.mts +10 -3
- package/dist/lib/auth/oauth/CLIFlowHandler.d.ts +10 -3
- package/dist/lib/auth/oauth/CLIFlowHandler.d.ts.map +1 -1
- package/dist/lib/auth/oauth/CLIFlowHandler.js +40 -4
- package/dist/lib/auth/oauth/CLIFlowHandler.js.map +1 -1
- package/dist/lib/auth/oauth/CLIFlowHandler.mjs +40 -4
- package/dist/lib/auth/oauth/CLIFlowHandler.mjs.map +1 -1
- package/dist/lib/auth/oauth/index.d.mts +1 -1
- package/dist/lib/auth/oauth/index.d.ts +1 -1
- package/dist/lib/auth/oauth/index.d.ts.map +1 -1
- package/dist/lib/auth/oauth/index.js +2 -0
- package/dist/lib/auth/oauth/index.js.map +1 -1
- package/dist/lib/auth/oauth/index.mjs +2 -0
- package/dist/lib/auth/oauth/index.mjs.map +1 -1
- package/dist/lib/auth/oauth/web-flow.d.mts +12 -0
- package/dist/lib/auth/oauth/web-flow.d.ts +12 -0
- package/dist/lib/auth/oauth/web-flow.d.ts.map +1 -1
- package/dist/lib/auth/oauth/web-flow.js +20 -2
- package/dist/lib/auth/oauth/web-flow.js.map +1 -1
- package/dist/lib/auth/oauth/web-flow.mjs +19 -2
- package/dist/lib/auth/oauth/web-flow.mjs.map +1 -1
- package/dist/lib/core/AgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.d.mts +27 -1
- package/dist/lib/core/SingleAgentClient.d.ts +27 -1
- package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.js +46 -18
- package/dist/lib/core/SingleAgentClient.js.map +1 -1
- package/dist/lib/core/SingleAgentClient.mjs +46 -18
- package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
- package/dist/lib/index.d.mts +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/index.mjs.map +1 -1
- package/dist/lib/net/address-guards.d.ts.map +1 -1
- package/dist/lib/net/address-guards.js +4 -0
- package/dist/lib/net/address-guards.js.map +1 -1
- package/dist/lib/net/address-guards.mjs +4 -0
- package/dist/lib/net/address-guards.mjs.map +1 -1
- package/dist/lib/protocols/a2a.js +2 -2
- package/dist/lib/protocols/a2a.js.map +1 -1
- package/dist/lib/protocols/a2a.mjs +2 -2
- package/dist/lib/protocols/a2a.mjs.map +1 -1
- package/dist/lib/protocols/index.d.ts.map +1 -1
- package/dist/lib/protocols/index.js +28 -7
- package/dist/lib/protocols/index.js.map +1 -1
- package/dist/lib/protocols/index.mjs +28 -7
- package/dist/lib/protocols/index.mjs.map +1 -1
- package/dist/lib/protocols/mcp-modern.d.ts.map +1 -1
- package/dist/lib/protocols/mcp-modern.js +24 -8
- package/dist/lib/protocols/mcp-modern.js.map +1 -1
- package/dist/lib/protocols/mcp-modern.mjs +24 -8
- package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
- package/dist/lib/protocols/mcp-tasks.d.ts.map +1 -1
- package/dist/lib/protocols/mcp-tasks.js +2 -12
- package/dist/lib/protocols/mcp-tasks.js.map +1 -1
- package/dist/lib/protocols/mcp-tasks.mjs +2 -12
- package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
- package/dist/lib/protocols/mcp.js +2 -2
- package/dist/lib/protocols/mcp.js.map +1 -1
- package/dist/lib/protocols/mcp.mjs +2 -2
- package/dist/lib/protocols/mcp.mjs.map +1 -1
- package/dist/lib/registry/index.d.mts +5 -25
- package/dist/lib/registry/index.d.ts +5 -25
- package/dist/lib/registry/index.d.ts.map +1 -1
- package/dist/lib/registry/index.js +5 -130
- package/dist/lib/registry/index.js.map +1 -1
- package/dist/lib/registry/index.mjs +5 -130
- package/dist/lib/registry/index.mjs.map +1 -1
- package/dist/lib/registry/sync.d.mts +8 -2
- package/dist/lib/registry/sync.d.ts +8 -2
- package/dist/lib/registry/sync.d.ts.map +1 -1
- package/dist/lib/registry/sync.js +8 -2
- package/dist/lib/registry/sync.js.map +1 -1
- package/dist/lib/registry/sync.mjs +8 -2
- package/dist/lib/registry/sync.mjs.map +1 -1
- package/dist/lib/registry/types.d.mts +15 -29
- package/dist/lib/registry/types.d.ts +15 -29
- package/dist/lib/registry/types.d.ts.map +1 -1
- package/dist/lib/registry/types.generated.d.mts +567 -15
- package/dist/lib/registry/types.generated.d.ts +567 -15
- package/dist/lib/registry/types.generated.d.ts.map +1 -1
- package/dist/lib/registry/types.generated.js.map +1 -1
- package/dist/lib/registry/types.js.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/decisioning/account.d.mts +6 -4
- package/dist/lib/server/decisioning/account.d.ts +6 -4
- package/dist/lib/server/decisioning/account.d.ts.map +1 -1
- package/dist/lib/server/decisioning/account.js.map +1 -1
- package/dist/lib/server/decisioning/account.mjs.map +1 -1
- package/dist/lib/server/decisioning/manifest-helpers.d.mts +6 -5
- package/dist/lib/server/decisioning/manifest-helpers.d.ts +6 -5
- package/dist/lib/server/decisioning/manifest-helpers.d.ts.map +1 -1
- package/dist/lib/server/decisioning/manifest-helpers.js.map +1 -1
- package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.js +4 -2
- package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +4 -2
- package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
- package/dist/lib/server/decisioning/tenant-store.d.mts +26 -14
- package/dist/lib/server/decisioning/tenant-store.d.ts +26 -14
- package/dist/lib/server/decisioning/tenant-store.d.ts.map +1 -1
- package/dist/lib/server/decisioning/tenant-store.js +6 -1
- package/dist/lib/server/decisioning/tenant-store.js.map +1 -1
- package/dist/lib/server/decisioning/tenant-store.mjs +6 -1
- package/dist/lib/server/decisioning/tenant-store.mjs.map +1 -1
- package/dist/lib/server/pin-and-bind-fetch.d.mts +2 -0
- package/dist/lib/server/pin-and-bind-fetch.d.ts +2 -0
- package/dist/lib/server/pin-and-bind-fetch.d.ts.map +1 -1
- package/dist/lib/server/pin-and-bind-fetch.js +2 -0
- package/dist/lib/server/pin-and-bind-fetch.js.map +1 -1
- package/dist/lib/server/pin-and-bind-fetch.mjs +2 -0
- package/dist/lib/server/pin-and-bind-fetch.mjs.map +1 -1
- package/dist/lib/server/structured-serialize.d.ts.map +1 -1
- package/dist/lib/server/structured-serialize.js +10 -2
- package/dist/lib/server/structured-serialize.js.map +1 -1
- package/dist/lib/server/structured-serialize.mjs +10 -2
- package/dist/lib/server/structured-serialize.mjs.map +1 -1
- package/dist/lib/server/webhook-emitter.d.ts.map +1 -1
- package/dist/lib/server/webhook-emitter.js +4 -2
- package/dist/lib/server/webhook-emitter.js.map +1 -1
- package/dist/lib/server/webhook-emitter.mjs +4 -2
- package/dist/lib/server/webhook-emitter.mjs.map +1 -1
- package/dist/lib/signing/middleware.d.mts +2 -1
- package/dist/lib/signing/middleware.d.ts +2 -1
- package/dist/lib/signing/middleware.d.ts.map +1 -1
- package/dist/lib/signing/middleware.js +26 -4
- package/dist/lib/signing/middleware.js.map +1 -1
- package/dist/lib/signing/middleware.mjs +26 -4
- package/dist/lib/signing/middleware.mjs.map +1 -1
- package/dist/lib/signing/webhook-verifier.d.ts.map +1 -1
- package/dist/lib/signing/webhook-verifier.js +4 -2
- package/dist/lib/signing/webhook-verifier.js.map +1 -1
- package/dist/lib/signing/webhook-verifier.mjs +4 -2
- package/dist/lib/signing/webhook-verifier.mjs.map +1 -1
- package/dist/lib/testing/agent-tester.d.ts.map +1 -1
- package/dist/lib/testing/agent-tester.js +46 -1
- package/dist/lib/testing/agent-tester.js.map +1 -1
- package/dist/lib/testing/agent-tester.mjs +46 -1
- package/dist/lib/testing/agent-tester.mjs.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +40 -6
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.mjs +40 -6
- package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
- package/dist/lib/types/asset-instances.d.mts +8 -6
- package/dist/lib/types/asset-instances.d.ts +8 -6
- package/dist/lib/types/asset-instances.d.ts.map +1 -1
- package/dist/lib/types/asset-instances.js.map +1 -1
- package/dist/lib/types/core.generated.d.mts +105 -58
- package/dist/lib/types/core.generated.d.ts +105 -58
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js.map +1 -1
- package/dist/lib/types/index.d.ts.map +1 -1
- package/dist/lib/types/index.js.map +1 -1
- package/dist/lib/types/index.mjs.map +1 -1
- package/dist/lib/types/schemas.generated.d.mts +2352 -473
- package/dist/lib/types/schemas.generated.d.ts +2352 -473
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +78 -45
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/schemas.generated.mjs +71 -45
- package/dist/lib/types/schemas.generated.mjs.map +1 -1
- package/dist/lib/types/tools.generated.d.mts +48 -44
- package/dist/lib/types/tools.generated.d.ts +48 -44
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/types/tools.generated.js.map +1 -1
- package/dist/lib/utils/probe-policy.d.mts +0 -16
- package/dist/lib/utils/probe-policy.d.ts +0 -16
- package/dist/lib/utils/probe-policy.d.ts.map +1 -1
- package/dist/lib/utils/probe-policy.js +15 -1
- package/dist/lib/utils/probe-policy.js.map +1 -1
- package/dist/lib/utils/probe-policy.mjs +15 -1
- package/dist/lib/utils/probe-policy.mjs.map +1 -1
- package/dist/lib/utils/redact-args.d.mts +36 -0
- package/dist/lib/utils/redact-args.d.ts +37 -0
- package/dist/lib/utils/redact-args.d.ts.map +1 -0
- package/dist/lib/utils/redact-args.js +46 -0
- package/dist/lib/utils/redact-args.js.map +1 -0
- package/dist/lib/utils/redact-args.mjs +22 -0
- package/dist/lib/utils/redact-args.mjs.map +1 -0
- package/dist/lib/v2/projection/creative-delivery.js +1 -5
- package/dist/lib/v2/projection/creative-delivery.js.map +1 -1
- package/dist/lib/v2/projection/creative-delivery.mjs +1 -5
- package/dist/lib/v2/projection/creative-delivery.mjs.map +1 -1
- package/dist/lib/validation/index.d.mts +15 -1
- package/dist/lib/validation/index.d.ts +15 -1
- package/dist/lib/validation/index.d.ts.map +1 -1
- package/dist/lib/validation/index.js +4 -8
- package/dist/lib/validation/index.js.map +1 -1
- package/dist/lib/validation/index.mjs +4 -8
- package/dist/lib/validation/index.mjs.map +1 -1
- package/dist/lib/version.d.mts +3 -3
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/dist/lib/version.mjs +3 -3
- package/dist/lib/version.mjs.map +1 -1
- package/examples/hello_seller_adapter_multi_tenant.ts +7 -0
- package/package.json +6 -5
- package/skills/build-holdco-agent/SKILL.md +19 -0
- 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":"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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
|
+
{"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":"AAAA;;;;;;GAMG;AA+EH,OAAO,KAAK,EAeV,2BAA2B,EAG3B,UAAU,EACV,cAAc,EAEd,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAEhB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EAErB,uBAAuB,EACvB,qBAAqB,EAGtB,MAAM,SAAS,CAAC;AASjB,OAAO,KAAK,EAA4B,cAAc,EAAE,MAAM,UAAU,CAAC;AAoCzE,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,oBAAoB,GAC5B,oBAAoB,CAEtB;AAED,wBAAgB,0BAA0B,CACxC,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,OAAO,EAAE,oBAAoB,GAC5B,oBAAoB,CAUtB;AAsED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAS/E;AAoCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,2BAA2B,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CA2ClH;AA+kBD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE9D;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEpC;AAED,wBAAgB,sCAAsC,CACpD,OAAO,EAAE,oBAAoB,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEpC;AAiCD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,EACjC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAS3B;AAiqBD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,cAAc,GAC5B,gBAAgB,CA8ClB;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
};
|