@adcp/sdk 14.0.0-beta.8 → 14.0.0-beta.9

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 (150) hide show
  1. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  2. package/dist/lib/core/ConversationTypes.d.mts +8 -0
  3. package/dist/lib/core/ConversationTypes.d.ts +8 -0
  4. package/dist/lib/core/ConversationTypes.d.ts.map +1 -1
  5. package/dist/lib/core/ConversationTypes.js.map +1 -1
  6. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  7. package/dist/lib/core/SingleAgentClient.js +30 -3
  8. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  9. package/dist/lib/core/SingleAgentClient.mjs +30 -3
  10. package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
  11. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  12. package/dist/lib/core/TaskExecutor.js +32 -5
  13. package/dist/lib/core/TaskExecutor.js.map +1 -1
  14. package/dist/lib/core/TaskExecutor.mjs +32 -5
  15. package/dist/lib/core/TaskExecutor.mjs.map +1 -1
  16. package/dist/lib/index.d.mts +2 -2
  17. package/dist/lib/index.d.ts +2 -2
  18. package/dist/lib/index.d.ts.map +1 -1
  19. package/dist/lib/index.js +2 -0
  20. package/dist/lib/index.js.map +1 -1
  21. package/dist/lib/index.mjs +2 -1
  22. package/dist/lib/index.mjs.map +1 -1
  23. package/dist/lib/schemas/index.d.mts +14 -0
  24. package/dist/lib/schemas/index.d.ts +14 -0
  25. package/dist/lib/schemas/index.d.ts.map +1 -1
  26. package/dist/lib/schemas/index.js +13 -1
  27. package/dist/lib/schemas/index.js.map +1 -1
  28. package/dist/lib/schemas/index.mjs +13 -1
  29. package/dist/lib/schemas/index.mjs.map +1 -1
  30. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  31. package/dist/lib/server/adcp-server.d.mts +1 -0
  32. package/dist/lib/server/adcp-server.d.ts +1 -0
  33. package/dist/lib/server/adcp-server.d.ts.map +1 -1
  34. package/dist/lib/server/adcp-server.js +1 -1
  35. package/dist/lib/server/adcp-server.js.map +1 -1
  36. package/dist/lib/server/adcp-server.mjs +1 -1
  37. package/dist/lib/server/adcp-server.mjs.map +1 -1
  38. package/dist/lib/server/create-adcp-server.d.mts +10 -2
  39. package/dist/lib/server/create-adcp-server.d.ts +10 -2
  40. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  41. package/dist/lib/server/create-adcp-server.js +26 -19
  42. package/dist/lib/server/create-adcp-server.js.map +1 -1
  43. package/dist/lib/server/create-adcp-server.mjs +26 -26
  44. package/dist/lib/server/create-adcp-server.mjs.map +1 -1
  45. package/dist/lib/server/decisioning/capabilities.d.mts +15 -1
  46. package/dist/lib/server/decisioning/capabilities.d.ts +15 -1
  47. package/dist/lib/server/decisioning/capabilities.d.ts.map +1 -1
  48. package/dist/lib/server/decisioning/capabilities.js.map +1 -1
  49. package/dist/lib/server/decisioning/capabilities.mjs.map +1 -1
  50. package/dist/lib/server/decisioning/index.d.mts +2 -2
  51. package/dist/lib/server/decisioning/index.d.ts +2 -2
  52. package/dist/lib/server/decisioning/index.d.ts.map +1 -1
  53. package/dist/lib/server/decisioning/index.js +2 -0
  54. package/dist/lib/server/decisioning/index.js.map +1 -1
  55. package/dist/lib/server/decisioning/index.mjs +2 -0
  56. package/dist/lib/server/decisioning/index.mjs.map +1 -1
  57. package/dist/lib/server/decisioning/proposal/types.d.mts +3 -2
  58. package/dist/lib/server/decisioning/proposal/types.d.ts +3 -2
  59. package/dist/lib/server/decisioning/proposal/types.d.ts.map +1 -1
  60. package/dist/lib/server/decisioning/proposal/types.js.map +1 -1
  61. package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
  62. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +14 -1
  63. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +14 -1
  64. package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
  65. package/dist/lib/server/decisioning/runtime/from-platform.js +402 -9
  66. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
  67. package/dist/lib/server/decisioning/runtime/from-platform.mjs +405 -9
  68. package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
  69. package/dist/lib/server/decisioning/runtime/validate-platform.d.mts +1 -1
  70. package/dist/lib/server/decisioning/runtime/validate-platform.d.ts +1 -1
  71. package/dist/lib/server/decisioning/runtime/validate-platform.d.ts.map +1 -1
  72. package/dist/lib/server/decisioning/runtime/validate-platform.js +2 -2
  73. package/dist/lib/server/decisioning/runtime/validate-platform.js.map +1 -1
  74. package/dist/lib/server/decisioning/runtime/validate-platform.mjs +2 -2
  75. package/dist/lib/server/decisioning/runtime/validate-platform.mjs.map +1 -1
  76. package/dist/lib/server/decisioning/specialisms/sales.d.mts +7 -1
  77. package/dist/lib/server/decisioning/specialisms/sales.d.ts +7 -1
  78. package/dist/lib/server/decisioning/specialisms/sales.d.ts.map +1 -1
  79. package/dist/lib/server/decisioning/specialisms/sales.js.map +1 -1
  80. package/dist/lib/storage/interfaces.d.mts +2 -0
  81. package/dist/lib/storage/interfaces.d.ts +2 -0
  82. package/dist/lib/storage/interfaces.d.ts.map +1 -1
  83. package/dist/lib/storage/interfaces.js.map +1 -1
  84. package/dist/lib/testing/compliance/comply.d.mts +18 -0
  85. package/dist/lib/testing/compliance/comply.d.ts +18 -0
  86. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  87. package/dist/lib/testing/compliance/comply.js +30 -5
  88. package/dist/lib/testing/compliance/comply.js.map +1 -1
  89. package/dist/lib/testing/compliance/comply.mjs +28 -4
  90. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  91. package/dist/lib/testing/compliance/index.d.mts +1 -1
  92. package/dist/lib/testing/compliance/index.d.ts +1 -1
  93. package/dist/lib/testing/compliance/index.d.ts.map +1 -1
  94. package/dist/lib/testing/compliance/index.js +4 -2
  95. package/dist/lib/testing/compliance/index.js.map +1 -1
  96. package/dist/lib/testing/compliance/index.mjs +4 -2
  97. package/dist/lib/testing/compliance/index.mjs.map +1 -1
  98. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  99. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  100. package/dist/lib/types/list-creatives.d.ts +129 -6
  101. package/dist/lib/types/schemas.generated.d.ts +411 -16
  102. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  103. package/dist/lib/types/schemas.generated.js +22 -6
  104. package/dist/lib/types/schemas.generated.js.map +1 -1
  105. package/dist/lib/types/schemas.generated.mjs +22 -6
  106. package/dist/lib/types/schemas.generated.mjs.map +1 -1
  107. package/dist/lib/types/tools.generated.d.mts +80 -6
  108. package/dist/lib/types/tools.generated.d.ts +80 -6
  109. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  110. package/dist/lib/types/tools.generated.js.map +1 -1
  111. package/dist/lib/utils/adcp-version-config.d.mts +12 -0
  112. package/dist/lib/utils/adcp-version-config.d.ts +12 -0
  113. package/dist/lib/utils/adcp-version-config.d.ts.map +1 -1
  114. package/dist/lib/utils/adcp-version-config.js +5 -3
  115. package/dist/lib/utils/adcp-version-config.js.map +1 -1
  116. package/dist/lib/utils/adcp-version-config.mjs +4 -3
  117. package/dist/lib/utils/adcp-version-config.mjs.map +1 -1
  118. package/dist/lib/utils/pricing-adapter.d.mts +2 -0
  119. package/dist/lib/utils/pricing-adapter.d.ts +2 -0
  120. package/dist/lib/utils/pricing-adapter.d.ts.map +1 -1
  121. package/dist/lib/utils/pricing-adapter.js +68 -1
  122. package/dist/lib/utils/pricing-adapter.js.map +1 -1
  123. package/dist/lib/utils/pricing-adapter.mjs +67 -1
  124. package/dist/lib/utils/pricing-adapter.mjs.map +1 -1
  125. package/dist/lib/v2/projection/index.d.mts +1 -1
  126. package/dist/lib/v2/projection/index.d.ts +1 -1
  127. package/dist/lib/v2/projection/index.d.ts.map +1 -1
  128. package/dist/lib/v2/projection/index.js.map +1 -1
  129. package/dist/lib/v2/projection/index.mjs.map +1 -1
  130. package/dist/lib/v2/projection/v1-to-v2.d.mts +17 -3
  131. package/dist/lib/v2/projection/v1-to-v2.d.ts +17 -3
  132. package/dist/lib/v2/projection/v1-to-v2.d.ts.map +1 -1
  133. package/dist/lib/v2/projection/v1-to-v2.js.map +1 -1
  134. package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
  135. package/dist/lib/validation/schema-loader.d.mts +17 -0
  136. package/dist/lib/validation/schema-loader.d.ts +17 -0
  137. package/dist/lib/validation/schema-loader.d.ts.map +1 -1
  138. package/dist/lib/validation/schema-loader.js +24 -0
  139. package/dist/lib/validation/schema-loader.js.map +1 -1
  140. package/dist/lib/validation/schema-loader.mjs +23 -0
  141. package/dist/lib/validation/schema-loader.mjs.map +1 -1
  142. package/dist/lib/version.d.mts +3 -3
  143. package/dist/lib/version.d.ts +3 -3
  144. package/dist/lib/version.js +3 -3
  145. package/dist/lib/version.js.map +1 -1
  146. package/dist/lib/version.mjs +3 -3
  147. package/dist/lib/version.mjs.map +1 -1
  148. package/docs/llms.txt +2 -2
  149. package/docs/migration-13-to-14.md +59 -0
  150. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/core/SingleAgentClient.ts"],"sourcesContent":["// Main ADCP Client - Type-safe conversation-aware client for AdCP agents\n\nimport { z } from 'zod';\nimport * as schemas from '../types/schemas.generated';\nimport type { AgentConfig } from '../types';\nimport { ADCP_ENVELOPE_FIELDS } from '../types/adcp';\nimport { parseAdcpMajorVersion, type AdcpVersion } from '../version';\nimport {\n isAdcpVersionSupported,\n isAdcpVersionAtLeast,\n isPre31AdcpVersion,\n isPre32AdcpVersion,\n resolveAdcpVersion,\n} from '../utils/adcp-version-config';\nimport { beta6ReportingRequestIssue, type Beta6DeliveryRequestIssue } from '../media-buy/reporting-version';\nimport { getVersionAdapter, resolveAdapterKey } from '../adapters/version';\nimport { isExternalSchemaRootActive, schemaAllowsTopLevelField } from '../validation/schema-loader';\nimport type {\n GetProductsRequest,\n GetProductsResponse,\n PropertyListReference,\n ListCreativeFormatsRequest,\n ListCreativeFormatsResponse,\n ListTransformersRequest,\n ListTransformersResponse,\n CreateMediaBuyRequest,\n CreateMediaBuyResponse,\n UpdateMediaBuyRequest,\n UpdateMediaBuyResponse,\n SyncCreativesRequest,\n SyncCreativesResponse,\n ListCreativesRequest,\n ListCreativesResponse,\n GetMediaBuysRequest,\n GetMediaBuysResponse,\n GetMediaBuyDeliveryRequest,\n GetMediaBuyDeliveryResponse,\n GetCreativeDeliveryRequest,\n GetCreativeDeliveryResponse,\n ProvidePerformanceFeedbackRequest,\n ProvidePerformanceFeedbackResponse,\n GetSignalsRequest,\n GetSignalsResponse,\n ActivateSignalRequest,\n ActivateSignalResponse,\n PreviewCreativeRequest,\n PreviewCreativeResponse,\n BuildCreativeRequest,\n BuildCreativeResponse,\n Format,\n GetAdCPCapabilitiesRequest,\n GetAdCPCapabilitiesResponse,\n ListAccountsRequest,\n ListAccountsResponse,\n SyncAccountsRequest,\n SyncAccountsResponse,\n SyncAudiencesRequest,\n SyncAudiencesResponse,\n CreatePropertyListRequest,\n CreatePropertyListResponse,\n GetPropertyListRequest,\n GetPropertyListResponse,\n UpdatePropertyListRequest,\n UpdatePropertyListResponse,\n ListPropertyListsRequest,\n ListPropertyListsResponse,\n DeletePropertyListRequest,\n DeletePropertyListResponse,\n ListContentStandardsRequest,\n ListContentStandardsResponse,\n GetContentStandardsRequest,\n GetContentStandardsResponse,\n CalibrateContentRequest,\n CalibrateContentResponse,\n ValidateContentDeliveryRequest,\n ValidateContentDeliveryResponse,\n SIGetOfferingRequest,\n SIGetOfferingResponse,\n SIInitiateSessionRequest,\n SIInitiateSessionResponse,\n SISendMessageRequest,\n SISendMessageResponse,\n SITerminateSessionRequest,\n SITerminateSessionResponse,\n SyncPlansRequest,\n SyncPlansResponse,\n GetPlanAuditLogsRequest,\n GetPlanAuditLogsResponse,\n OutcomeType,\n} from '../types/tools.generated';\nimport { type MutatingRequestInput, generateIdempotencyKey, requestUsesIdempotency } from '../utils/idempotency';\n\nimport type { MCPWebhookPayload, AdCPAsyncResponseData, TaskStatus } from '../types/core.generated';\nimport type { Task as A2ATask, TaskStatusUpdateEvent } from '@a2a-js/sdk';\nimport { A2AClient as A2AClientImpl } from '@a2a-js/sdk/client';\n// A2A SDK client used untyped — wire shapes are validated at runtime, matching\n// the prior CommonJS `require('@a2a-js/sdk/client')` behaviour.\nconst A2AClient: any = A2AClientImpl;\n\nimport {\n TaskExecutor,\n DEFERRED_SETTLEMENT_ACK,\n acknowledgeDeferredSettlement,\n rejectDeferredSettlement,\n hasCompletionHandlerAlreadyPublished,\n markCompletionHandlerAlreadyPublished,\n AfterProtocolDispatchHookError,\n BeforeProtocolDispatchHookError,\n type BeforeProtocolDispatchHook,\n type ExternalTaskSettlementObservation,\n type ExternalTaskStatusResult,\n} from './TaskExecutor';\nimport { attachMatch } from './match';\nimport {\n assertNativeRequestProposalsResult,\n assertNativeRequestProposalsTask,\n guardNativeRequestProposalsCompletion,\n} from './request-proposals-guard';\nimport { withTaskDeadline } from './task-deadline';\nimport { createMCPRequestHeaders } from '../auth';\nimport { isAbortOrTimeoutError } from '../protocols/abort';\nimport { ProtocolClient, normalizeTransportOptions } from '../protocols';\nimport {\n AuthenticationRequiredError,\n ConfigurationError,\n FeatureUnsupportedError,\n ProtocolFeatureUnsupportedError,\n TaskTimeoutError,\n VersionUnsupportedError,\n is401Error,\n} from '../errors';\nimport { createAgentTransportFetch, isLikelyPrivateUrl } from '../net';\nimport {\n discoverAuthorizationRequirements,\n NeedsAuthorizationError,\n probeAuthChallenge,\n} from '../auth/oauth/authorization-required';\nimport { discoverOAuthMetadata } from '../auth/oauth/discovery';\nimport type {\n InputHandler,\n Message,\n TaskOptions,\n TaskResult,\n ConversationConfig,\n TaskInfo,\n TaskState,\n WebhookUrlTemplate,\n} from './ConversationTypes';\nimport type { AdcpTaskName, TaskRequestFor, TaskResponseTypeMap } from './AgentClient';\nimport type { DeferredTaskStorage } from '../storage/interfaces';\nimport type { Activity, AsyncHandlerConfig, WebhookMetadata } from './AsyncHandler';\nimport {\n AsyncHandler,\n WebhookDedupClaimRetentionError,\n WebhookDedupConflictError,\n WebhookDedupInputError,\n} from './AsyncHandler';\nimport { verifyWebhookRequest, type WebhookHeaderValue, type WebhookHeadersLike } from '../webhooks';\nimport {\n InMemoryWebhookRegistrationStore,\n type WebhookRegistration,\n type WebhookRegistrationStore,\n} from './webhook-registration';\nimport {\n InMemoryReplayStore,\n type ReplayStore,\n InMemoryRevocationStore,\n type RevocationStore,\n type JwksResolver,\n WebhookSignatureError,\n type WebhookSignatureErrorCode,\n verifyWebhookSignature as verifyRfc9421WebhookSignature,\n ResolvedAgentJwksResolver,\n type ResolvedAgentJwksResolverOptions,\n canonicalTargetUri,\n} from '../signing/server';\nimport { unwrapProtocolResponse } from '../utils/response-unwrapper';\nimport { getLatestA2ADataPartFromTask } from '../utils/a2a-artifacts';\nimport { extractAdcpTaskStatusFromPayload, isAdcpStatus } from './task-status';\nimport { responseParser } from './ProtocolResponseParser';\nimport {\n isWellKnownAgentCardUrl as isWellKnownCardUrl,\n buildCardUrls,\n stripAgentCardPath,\n stripTransportSuffix,\n} from '../utils/a2a-discovery';\nimport * as crypto from 'crypto';\nimport {\n DEFAULT_REQUEST_TIMEOUT_MS,\n createTimeoutError,\n resolveClientRequestTimeoutMs,\n resolveRequestTimeoutMs,\n throwIfAborted,\n withAbortSignal,\n} from '../protocols/abort';\n\n// v3.0 compatibility utilities\nimport type { AdcpCapabilities, AdcpMajorVersion, ToolInfo, FeatureName } from '../utils/capabilities';\nimport {\n buildSyntheticCapabilities,\n buildSyntheticV3Capabilities,\n augmentCapabilitiesFromTools,\n looksLikeV3Capabilities,\n parseCapabilitiesResponse,\n resolveFeature,\n listDeclaredFeatures,\n TASK_FEATURE_MAP,\n assertValidIdempotencyReplayTtlSeconds,\n} from '../utils/capabilities';\n\nimport { normalizeRequestParams } from '../utils/request-normalizer';\nimport { globalAsyncLocalStorage } from '../utils/global-async-local-storage';\nimport { validateUserAgent } from '../utils/validate-user-agent';\nimport { resolveWebhookUrl, selectWebhookTemplate } from './webhook-url';\nimport { getV25Adapter } from '../adapters/legacy/v2-5';\nimport {\n ProductPropertyPolicyError,\n validateProductsAgainstPropertyPolicy,\n type BuyerPropertyPolicy,\n type ProductPolicyProductLike,\n type ProductPropertyPolicyDiagnostic,\n type ProductPropertyPolicyMode,\n type ProductPropertyPolicyValidationResult,\n} from '../media-buy/property-policy';\nimport { resolvePropertyList, type ResolveListOptions } from '../server/targeting-helpers';\nimport {\n CreativeFormatCapabilityError,\n CreativeFormatProjectionError,\n projectMediaBuyCreativesForDelivery,\n projectCreativeForDelivery,\n projectSyncCreativesForDelivery,\n resolveCreativeFormatWireMode,\n stripLegacyCreativeIdentity,\n type CanonicalCreateMediaBuyRequest,\n type CanonicalCreativeResponse,\n type CanonicalGetProductsRequest,\n type CanonicalGetProductsResponse,\n type CanonicalListCreativesRequest,\n type CanonicalListCreativesResponse,\n type CanonicalPreviewCreativeRequest,\n type CanonicalPreviewCreativeResponse,\n type CanonicalSyncCreativesRequest,\n type CanonicalUpdateMediaBuyRequest,\n type CreativeFormatWireMode,\n type CreativeFormatSelectorContainer,\n type SyncCreativeFormatProjection,\n} from '../v2/projection/creative-delivery';\nimport type { LegacyFormatConverter } from '../v2/projection/v1-to-v2';\nimport {\n legacyFormatConverterFromCatalogSnapshots,\n type ProjectionCatalogSnapshot,\n} from '../v2/projection/catalog-snapshot';\nimport type { CanonicalFormatLegacyResolutionContext, CanonicalFormatLegacyResolver } from '../v2/projection/v2-to-v1';\nimport { toCanonicalOnlyResponse } from '../v2/projection/augment-response';\nimport {\n legacyFormatRefsForDeclaration,\n structuredCloneWithLegacyCreativeMetadata,\n} from '../v2/projection/legacy-metadata';\nimport { isProjectionProductInput, type V1FormatId, type V1Product } from '../v2/projection/types';\nimport { canonicalize as canonicalizeJson } from '../utils/jcs';\n\ntype ReadRequestOptions = Pick<TaskOptions, 'signal' | 'transport'>;\ntype ToolSchemaMap = Map<string, Record<string, unknown>>;\ntype CapabilityDiscoveryContext = {\n toolSchemas?: ToolSchemaMap;\n capabilities?: AdcpCapabilities;\n};\nconst CAPABILITY_DISCOVERY_CONTEXT = Symbol('capabilityDiscoveryContext');\ntype InternalReadRequestOptions = ReadRequestOptions & {\n [CAPABILITY_DISCOVERY_CONTEXT]?: CapabilityDiscoveryContext;\n};\ntype UnprojectedPreDispatchHook<T> = BeforeProtocolDispatchHook<T>;\n\nfunction creativeSchemaSupport(value: unknown, depth = 0): CreativeFormatWireMode {\n if (depth > 24 || value === null || typeof value !== 'object') return 'unknown';\n if (Array.isArray(value)) {\n let legacy = false;\n for (const item of value) {\n const support = creativeSchemaSupport(item, depth + 1);\n if (support === 'canonical') return support;\n if (support === 'legacy') legacy = true;\n }\n return legacy ? 'legacy' : 'unknown';\n }\n const object = value as Record<string, unknown>;\n const properties = object.properties;\n if (properties !== null && typeof properties === 'object' && !Array.isArray(properties)) {\n const keys = properties as Record<string, unknown>;\n if ('creative_id' in keys && 'format_kind' in keys) return 'canonical';\n if ('creative_id' in keys && 'format_id' in keys) return 'legacy';\n }\n let legacy = false;\n for (const child of Object.values(object)) {\n const support = creativeSchemaSupport(child, depth + 1);\n if (support === 'canonical') return support;\n if (support === 'legacy') legacy = true;\n }\n return legacy ? 'legacy' : 'unknown';\n}\n\nfunction hasMediaBuyCreativeFormatData(request: unknown): boolean {\n if (request === null || typeof request !== 'object' || Array.isArray(request)) return false;\n const record = request as Record<string, unknown>;\n return ['packages', 'new_packages'].some(key => {\n const packages = record[key];\n return (\n Array.isArray(packages) &&\n packages.some(pkg => {\n if (pkg === null || typeof pkg !== 'object' || Array.isArray(pkg)) return false;\n const packageRecord = pkg as Record<string, unknown>;\n return (\n Array.isArray(packageRecord.creatives) ||\n Array.isArray(packageRecord.format_option_refs) ||\n Array.isArray(packageRecord.format_ids) ||\n typeof packageRecord.format_kind === 'string' ||\n Object.getOwnPropertySymbols(packageRecord).length > 0\n );\n })\n );\n });\n}\n\nfunction legacyCreativeIdentityPath(value: unknown, path = '$', seen = new WeakSet<object>()): string | undefined {\n if (value === null || typeof value !== 'object') return undefined;\n if (seen.has(value)) return `${path} (cycle)`;\n seen.add(value);\n try {\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== 'string' || (Array.isArray(value) && key === 'length')) continue;\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!descriptor || !descriptor.enumerable) continue;\n const childPath = Array.isArray(value) ? `${path}[${key}]` : `${path}.${key}`;\n if (/(^|_)(?:format_ids?|v1_format_ref)($|_)/.test(key)) return childPath;\n if (!('value' in descriptor)) return `${childPath} (accessor)`;\n const nested = legacyCreativeIdentityPath(descriptor.value, childPath, seen);\n if (nested) return nested;\n }\n return undefined;\n } finally {\n seen.delete(value);\n }\n}\n\nconst CANONICAL_CREATIVE_ACTIVITY_TASKS = new Set([\n 'get_products',\n 'create_media_buy',\n 'update_media_buy',\n 'sync_creatives',\n 'list_creatives',\n 'get_media_buys',\n 'get_media_buy_delivery',\n 'get_creative_delivery',\n]);\n\n// Missing legacy-HMAC registrations are safe only for tools that cannot\n// mutate seller state. `get_products` is intentionally absent because its\n// legacy proposal-finalization variant is state-changing.\nconst RECORDLESS_HMAC_READ_ONLY_TASKS = new Set([\n 'get_adcp_capabilities',\n 'list_products',\n 'list_creative_formats',\n 'preview_creative',\n 'list_transformers',\n 'list_creatives',\n 'get_media_buys',\n 'get_media_buy_delivery',\n 'media_buy_delivery',\n 'get_creative_delivery',\n 'get_signals',\n 'list_accounts',\n 'get_property_list',\n 'list_property_lists',\n 'list_content_standards',\n 'get_content_standards',\n 'si_get_offering',\n 'get_plan_audit_logs',\n]);\n\n/**\n * Bound task/context state retained for async creative projection and policy.\n *\n * A creative task can contribute several aliases (operation, client task,\n * server task, and conversation context IDs). Ten thousand aliases covers\n * thousands of concurrent tasks while keeping abandoned tasks from growing a\n * long-lived client without limit. Associations retain only converters and a\n * frozen account/package routing projection—never creative assets or webhook\n * credentials. Map insertion order provides LRU eviction.\n */\nconst TASK_SCOPED_STATE_LIMIT = 10_000;\n\ninterface CanonicalCreativeTaskAssociation {\n taskType: string;\n legacyFormatConverter?: LegacyFormatConverter;\n routingSnapshot?: CanonicalCreativeRoutingSnapshot;\n}\n\ninterface ProductPolicyRequestState {\n request?: Readonly<Record<string, unknown>>;\n}\n\ntype CanonicalLegacyOptionRef =\n | { scope: 'product'; format_option_id: string }\n | { scope: 'publisher'; publisher_domain: string; format_option_id: string };\n\ntype CanonicalLegacyRoute =\n | {\n kind: 'product';\n accountScope: string;\n productId: string;\n optionRef: CanonicalLegacyOptionRef;\n refs: readonly V1FormatId[];\n }\n | {\n kind: 'package';\n accountScope: string;\n packageId: string;\n refs: readonly V1FormatId[];\n };\n\ninterface CanonicalPackageRouteSelectorSnapshot {\n readonly package_id?: string;\n readonly product_id?: string;\n readonly format_option_refs?: readonly CanonicalLegacyOptionRef[];\n}\n\ninterface CanonicalCreativeRoutingSnapshot {\n readonly account: Readonly<Record<string, unknown>>;\n readonly packages?: readonly CanonicalPackageRouteSelectorSnapshot[];\n readonly new_packages?: readonly CanonicalPackageRouteSelectorSnapshot[];\n}\n\ninterface DeferredClientFinalizationContext {\n readonly kind: 'single-agent';\n readonly taskType: string;\n readonly handlerName?: keyof AsyncHandlerConfig;\n readonly canonical: boolean;\n readonly productPolicyRequest: Readonly<Record<string, unknown>>;\n readonly projectionCatalogs?: readonly ProjectionCatalogSnapshot[];\n readonly routingSnapshot?: CanonicalCreativeRoutingSnapshot;\n readonly optionTaskId?: string;\n readonly optionContextId?: string;\n}\n\nfunction isDeferredClientFinalizationContext(value: unknown): value is DeferredClientFinalizationContext {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const context = value as Record<string, unknown>;\n return (\n context.kind === 'single-agent' &&\n typeof context.taskType === 'string' &&\n typeof context.canonical === 'boolean' &&\n !!context.productPolicyRequest &&\n typeof context.productPolicyRequest === 'object' &&\n !Array.isArray(context.productPolicyRequest) &&\n (context.projectionCatalogs === undefined || Array.isArray(context.projectionCatalogs)) &&\n (context.handlerName === undefined || typeof context.handlerName === 'string')\n );\n}\n\nconst CANONICAL_PACKAGE_ROUTE_TASKS = new Set(['create_media_buy', 'update_media_buy', 'get_media_buys']);\nconst canonicalCreativeRoutingSnapshots = new WeakSet<object>();\n\nfunction canonicalAccountRoutingSnapshot(value: unknown): Readonly<Record<string, unknown>> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const account = value as Record<string, unknown>;\n if (typeof account.account_id === 'string') return Object.freeze({ account_id: account.account_id });\n if (\n !account.brand ||\n typeof account.brand !== 'object' ||\n Array.isArray(account.brand) ||\n typeof account.operator !== 'string'\n ) {\n return undefined;\n }\n const sourceBrand = account.brand as Record<string, unknown>;\n if (typeof sourceBrand.domain !== 'string') return undefined;\n const brand = Object.freeze({\n domain: sourceBrand.domain,\n ...(typeof sourceBrand.brand_id === 'string' ? { brand_id: sourceBrand.brand_id } : {}),\n });\n return Object.freeze({\n brand,\n operator: account.operator,\n ...(typeof account.sandbox === 'boolean' ? { sandbox: account.sandbox } : {}),\n });\n}\n\nfunction canonicalOptionRefRoutingSnapshot(value: unknown): CanonicalLegacyOptionRef | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const ref = value as Record<string, unknown>;\n if (typeof ref.format_option_id !== 'string') return undefined;\n if (ref.scope === 'publisher' || typeof ref.publisher_domain === 'string') {\n if (typeof ref.publisher_domain !== 'string') return undefined;\n return Object.freeze({\n scope: 'publisher' as const,\n publisher_domain: ref.publisher_domain,\n format_option_id: ref.format_option_id,\n });\n }\n return Object.freeze({ scope: 'product' as const, format_option_id: ref.format_option_id });\n}\n\nfunction canonicalPackageRouteSelectorSnapshot(value: unknown): CanonicalPackageRouteSelectorSnapshot | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const selector = value as Record<string, unknown>;\n const formatOptionRefs = Array.isArray(selector.format_option_refs)\n ? selector.format_option_refs\n .map(canonicalOptionRefRoutingSnapshot)\n .filter((ref): ref is CanonicalLegacyOptionRef => ref !== undefined)\n : [];\n const snapshot = {\n ...(typeof selector.package_id === 'string' ? { package_id: selector.package_id } : {}),\n ...(typeof selector.product_id === 'string' ? { product_id: selector.product_id } : {}),\n ...(formatOptionRefs.length > 0 ? { format_option_refs: Object.freeze(formatOptionRefs) } : {}),\n };\n return Object.keys(snapshot).length > 0 ? Object.freeze(snapshot) : undefined;\n}\n\nfunction canonicalCreativeRoutingSnapshot(\n taskType: string,\n request: unknown\n): CanonicalCreativeRoutingSnapshot | undefined {\n if (\n !CANONICAL_PACKAGE_ROUTE_TASKS.has(taskType) ||\n !request ||\n typeof request !== 'object' ||\n Array.isArray(request)\n ) {\n return undefined;\n }\n if (canonicalCreativeRoutingSnapshots.has(request)) {\n return request as CanonicalCreativeRoutingSnapshot;\n }\n const record = request as Record<string, unknown>;\n const account = canonicalAccountRoutingSnapshot(record.account);\n if (!account) return undefined;\n const packageSnapshots = (key: 'packages' | 'new_packages'): readonly CanonicalPackageRouteSelectorSnapshot[] =>\n Object.freeze(\n (Array.isArray(record[key]) ? record[key] : [])\n .map(canonicalPackageRouteSelectorSnapshot)\n .filter((selector): selector is CanonicalPackageRouteSelectorSnapshot => selector !== undefined)\n );\n const packages = packageSnapshots('packages');\n const newPackages = packageSnapshots('new_packages');\n const snapshot = Object.freeze({\n account,\n ...(packages.length > 0 ? { packages } : {}),\n ...(newPackages.length > 0 ? { new_packages: newPackages } : {}),\n });\n canonicalCreativeRoutingSnapshots.add(snapshot);\n return snapshot;\n}\n\nconst canonicalCreativeExecutionStorage = globalAsyncLocalStorage<{\n taskType: string;\n canonical: boolean;\n legacyFormatConverter?: LegacyFormatConverter;\n canonicalRequest?: unknown;\n}>('canonicalCreativeExecution');\n\nfunction isCanonicalCreativeExecution(taskType: string | undefined): boolean {\n if (!taskType) return false;\n if (CANONICAL_CREATIVE_ACTIVITY_TASKS.has(taskType)) return true;\n const active = canonicalCreativeExecutionStorage.getStore();\n return active?.canonical === true && active.taskType === taskType;\n}\n\n/**\n * Snapshot semantic payloads without executing adopter-controlled behavior.\n * Plain data retains identity when unchanged (including private WeakMap format\n * metadata); class instances are flattened to enumerable own data.\n */\nfunction prepareCanonicalCreativePayload(\n value: unknown,\n taskType: string,\n active = new WeakSet<object>(),\n prepared = new WeakMap<object, unknown>()\n): unknown {\n if (value === null || typeof value !== 'object') return value;\n for (let owner: object | null = value; owner !== null; owner = Object.getPrototypeOf(owner)) {\n const toJSON = Object.getOwnPropertyDescriptor(owner, 'toJSON');\n if (toJSON && (!('value' in toJSON) || typeof toJSON.value === 'function')) {\n throw new CreativeFormatProjectionError(\n taskType,\n '(response:toJSON)',\n 'custom or accessor toJSON hooks cannot cross the canonical creative boundary safely'\n );\n }\n }\n if (active.has(value)) {\n throw new CreativeFormatProjectionError(\n taskType,\n '(response:cycle)',\n 'cyclic values cannot cross the canonical creative boundary'\n );\n }\n const cached = prepared.get(value);\n if (cached !== undefined) return cached;\n\n active.add(value);\n try {\n const isArray = Array.isArray(value);\n const prototype = Object.getPrototypeOf(value);\n const plain = isArray ? prototype === Array.prototype : prototype === Object.prototype || prototype === null;\n const output: Record<string | symbol, unknown> | unknown[] = isArray\n ? []\n : Object.create(prototype === null ? null : Object.prototype);\n prepared.set(value, output);\n let changed = !plain;\n for (const key of Reflect.ownKeys(value)) {\n if (isArray && key === 'length') continue;\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!descriptor) continue;\n if (!('value' in descriptor)) {\n throw new CreativeFormatProjectionError(\n taskType,\n `(response:${String(key)})`,\n 'accessors cannot cross the canonical creative boundary safely'\n );\n }\n if (!descriptor.enumerable) continue;\n const safe = prepareCanonicalCreativePayload(descriptor.value, taskType, active, prepared);\n if (safe !== descriptor.value) changed = true;\n Object.defineProperty(output, key, { ...descriptor, value: safe });\n }\n if (!changed) {\n prepared.set(value, value);\n return value;\n }\n return output;\n } finally {\n active.delete(value);\n }\n}\n\nfunction projectPreparedCanonicalCreativeResponseValue(\n value: unknown,\n taskType: string,\n legacyFormatConverter: LegacyFormatConverter | undefined,\n selectorContainer: CreativeFormatSelectorContainer = {}\n): unknown {\n if (Array.isArray(value)) {\n return value.map(item =>\n projectPreparedCanonicalCreativeResponseValue(item, taskType, legacyFormatConverter, selectorContainer)\n );\n }\n if (!value || typeof value !== 'object') return value;\n\n let projected = value as Record<string, unknown>;\n if (isProjectionProductInput(projected)) {\n const canonical = toCanonicalOnlyResponse({ products: [projected] }, { legacyFormatConverter });\n if (canonical.diagnostics.length > 0 || canonical.response.products.length !== 1) {\n throw new CreativeFormatProjectionError(\n taskType,\n `(product:${String(projected.product_id)})`,\n 'legacy product formats in the response have no complete canonical representation'\n );\n }\n projected = canonical.response.products[0] as unknown as Record<string, unknown>;\n } else if (\n (typeof projected.package_id === 'string' || typeof projected.product_id === 'string') &&\n Array.isArray(projected.format_ids)\n ) {\n projected = (\n projectMediaBuyCreativesForDelivery(\n { packages: [projected] },\n 'canonical',\n taskType === 'update_media_buy' ? 'update_media_buy' : 'create_media_buy',\n legacyFormatConverter\n ) as { packages: Record<string, unknown>[] }\n ).packages[0]!;\n }\n\n if (\n typeof projected.creative_id === 'string' &&\n (projected.format_id !== undefined || typeof projected.format_kind === 'string')\n ) {\n projected = projectCreativeForDelivery(\n projected as unknown as import('../types/tools.generated').CreativeAsset,\n selectorContainer,\n 'canonical',\n taskType,\n legacyFormatConverter\n ) as unknown as Record<string, unknown>;\n }\n\n const nextSelector =\n Array.isArray(projected.format_ids) ||\n Array.isArray(projected.format_options) ||\n Array.isArray(projected.format_option_refs)\n ? (projected as CreativeFormatSelectorContainer)\n : selectorContainer;\n let changed = projected !== value;\n const next: Record<string, unknown> = { ...projected };\n for (const [key, child] of Object.entries(projected)) {\n const childProjected = projectPreparedCanonicalCreativeResponseValue(\n child,\n taskType,\n legacyFormatConverter,\n nextSelector\n );\n if (childProjected !== child) {\n next[key] = childProjected;\n changed = true;\n }\n }\n return changed ? next : projected;\n}\n\nfunction projectCanonicalCreativeResponseValue(\n value: unknown,\n taskType: string,\n legacyFormatConverter: LegacyFormatConverter | undefined,\n selectorContainer: CreativeFormatSelectorContainer = {}\n): unknown {\n return projectPreparedCanonicalCreativeResponseValue(\n prepareCanonicalCreativePayload(value, taskType),\n taskType,\n legacyFormatConverter,\n selectorContainer\n );\n}\n\nfunction projectCanonicalCreativeAncillaryValue(\n value: unknown,\n taskType: string,\n legacyFormatConverter: LegacyFormatConverter | undefined\n): unknown {\n try {\n return stripLegacyCreativeIdentity(projectCanonicalCreativeResponseValue(value, taskType, legacyFormatConverter));\n } catch (error) {\n if (!(error instanceof CreativeFormatProjectionError)) throw error;\n return { omitted: true, reason: 'canonical creative payload unavailable' };\n }\n}\n\n/** Keep legacy creative identity confined to the transport adapter. */\nfunction canonicalCreativeActivity(activity: Activity): Activity {\n const active = canonicalCreativeExecutionStorage.getStore();\n const effectiveTaskType = active?.taskType && active.canonical ? active.taskType : activity.task_type;\n if (!isCanonicalCreativeExecution(effectiveTaskType) || activity.payload === undefined) {\n return activity;\n }\n const converter = active?.taskType === effectiveTaskType ? active.legacyFormatConverter : undefined;\n const source =\n activity.type === 'protocol_request' &&\n active?.taskType === effectiveTaskType &&\n active.canonicalRequest !== undefined\n ? { params: active.canonicalRequest }\n : activity.payload;\n try {\n return {\n ...activity,\n payload: stripLegacyCreativeIdentity(projectCanonicalCreativeResponseValue(source, effectiveTaskType, converter)),\n };\n } catch (error) {\n if (!(error instanceof CreativeFormatProjectionError)) throw error;\n return { ...activity, payload: { omitted: true, reason: 'canonical creative payload unavailable' } };\n }\n}\n\nfunction canonicalCreativeDiagnosticBody(body: string | undefined, taskType: string): string | undefined {\n if (body === undefined) return undefined;\n try {\n const active = canonicalCreativeExecutionStorage.getStore();\n const converter = active?.taskType === taskType ? active.legacyFormatConverter : undefined;\n return JSON.stringify(\n stripLegacyCreativeIdentity(projectCanonicalCreativeResponseValue(JSON.parse(body), taskType, converter))\n );\n } catch {\n // Truncated JSON and streaming envelopes cannot be projected reliably.\n // Omitting them keeps the canonical public boundary deterministic.\n return '[canonical creative payload omitted]';\n }\n}\n\n/** Prevent transport observability from becoming a backdoor to legacy creative identity. */\nfunction canonicalCreativeTransportActivity(\n event: import('../protocols').TransportActivity\n): import('../protocols').TransportActivity {\n const active = canonicalCreativeExecutionStorage.getStore();\n const taskType = active?.taskType && active.canonical ? active.taskType : (event.taskType ?? event.tool);\n if (!taskType || !isCanonicalCreativeExecution(taskType)) return event;\n return {\n ...event,\n ...(event.requestBody !== undefined && {\n requestBody: canonicalCreativeDiagnosticBody(event.requestBody, taskType),\n }),\n ...(event.responseBody !== undefined && {\n responseBody: canonicalCreativeDiagnosticBody(event.responseBody, taskType),\n }),\n };\n}\n\n/** Clone a typed error without retaining legacy identity in reflective own fields. */\nfunction canonicalCreativeErrorInstance<T extends Error>(error: T, legacySource?: unknown): T {\n const own: Record<string, unknown> = {};\n const descriptors = Object.getOwnPropertyDescriptors(error);\n for (const [key, descriptor] of Object.entries(descriptors)) {\n // Invoking an adopter-defined accessor while sanitizing is unsafe. Prototype\n // accessors remain available; reflective own accessors are omitted.\n if ('value' in descriptor) own[key] = descriptor.value;\n }\n const { legacySource: _dropLegacySource, own: safeOwn } = stripLegacyCreativeIdentity({ own, legacySource }) as {\n own: Record<string, unknown>;\n legacySource?: unknown;\n };\n void _dropLegacySource;\n\n const clone = Object.create(Object.getPrototypeOf(error)) as T;\n for (const [key, value] of Object.entries(safeOwn)) {\n const descriptor = descriptors[key];\n if (!descriptor || !('value' in descriptor)) continue;\n Object.defineProperty(clone, key, { ...descriptor, value });\n }\n // Symbol-keyed data is not traversed by JSON projection, but it is visible\n // through reflection. Sanitize its value independently and omit accessors.\n for (const symbol of Object.getOwnPropertySymbols(error)) {\n const descriptor = Object.getOwnPropertyDescriptor(error, symbol);\n if (!descriptor || !('value' in descriptor)) continue;\n const safe = stripLegacyCreativeIdentity({ value: descriptor.value, legacySource }) as {\n value: unknown;\n };\n Object.defineProperty(clone, symbol, { ...descriptor, value: safe.value });\n }\n return stripLegacyCreativeIdentity(clone) as T;\n}\n\nexport type CreativeDeliveryTaskOptions = TaskOptions & {\n legacyFormatConverter?: LegacyFormatConverter;\n /** Pre-resolved exact-owner publisher/community catalogs, highest precedence first. */\n projectionCatalogs?: readonly ProjectionCatalogSnapshot[];\n /** Resolver for persisted canonical selections that need a seller-specific legacy wire identity. */\n canonicalFormatLegacyResolver?: CanonicalFormatLegacyResolver;\n};\n\nexport type CanonicalReadTaskOptions = TaskOptions & {\n legacyFormatConverter?: LegacyFormatConverter;\n /** Pre-resolved exact-owner publisher/community catalogs, highest precedence first. */\n projectionCatalogs?: readonly ProjectionCatalogSnapshot[];\n};\n\nexport type SyncCreativesTaskOptions = CreativeDeliveryTaskOptions & {\n creativeFormatProjection?: SyncCreativeFormatProjection;\n};\n\nfunction snapshotTaskOptions<T extends TaskOptions | undefined>(options: T): T {\n if (!options) return options;\n return {\n ...options,\n ...(options.transport !== undefined && { transport: { ...options.transport } }),\n ...(options.metadata !== undefined && { metadata: structuredClone(options.metadata) }),\n } as T;\n}\n\nconst PRIMARY_ADCP_TASK_NAMES = {\n get_products: true,\n list_products: true,\n request_proposals: true,\n refine_proposals: true,\n decline_proposals: true,\n buy_products: true,\n accept_proposal: true,\n control_media_buy: true,\n create_media_buy: true,\n update_media_buy: true,\n sync_creatives: true,\n list_creatives: true,\n get_media_buys: true,\n get_media_buy_delivery: true,\n get_creative_delivery: true,\n provide_performance_feedback: true,\n get_signals: true,\n activate_signal: true,\n get_adcp_capabilities: true,\n list_accounts: true,\n sync_accounts: true,\n sync_audiences: true,\n create_property_list: true,\n get_property_list: true,\n update_property_list: true,\n list_property_lists: true,\n delete_property_list: true,\n si_get_offering: true,\n si_initiate_session: true,\n si_send_message: true,\n si_terminate_session: true,\n get_brand_identity: true,\n sync_plans: true,\n check_governance: true,\n report_plan_outcome: true,\n report_plan_adjustment: true,\n get_plan_audit_logs: true,\n sync_agent_notification_configs: true,\n context_match: true,\n identity_match: true,\n} satisfies Record<AdcpTaskName, true>;\n\nconst STANDARD_ADCP_TASK_NAMES = new Set<string>([\n ...Object.keys(PRIMARY_ADCP_TASK_NAMES),\n 'list_creative_formats',\n 'list_transformers',\n 'preview_creative',\n 'build_creative',\n // These standard protocol tools still carry legacy creative `format_id`\n // identity through artifacts, manifests, standards, or rights constraints.\n // They are available only through explicitly named *Legacy APIs until a\n // lossless canonical projection exists.\n 'list_content_standards',\n 'get_content_standards',\n 'create_content_standards',\n 'update_content_standards',\n 'calibrate_content',\n 'validate_content_delivery',\n 'get_media_buy_artifacts',\n 'get_creative_features',\n 'get_rights',\n 'acquire_rights',\n 'update_rights',\n]);\n\n/**\n * Error class for v3 feature compatibility issues\n *\n * Note: The library no longer throws this error for get_products calls with\n * unsupported v3 features. Instead, it returns an empty result (semantically\n * \"no products match this filter\"). This error class is exported for use in\n * custom validation logic or other scenarios.\n *\n * @example\n * ```typescript\n * // Custom validation before making requests\n * const capabilities = await client.getCapabilities();\n * if (params.property_list && !capabilities.features.propertyListFiltering) {\n * throw new UnsupportedFeatureError('property_list', capabilities.version);\n * }\n * ```\n */\nexport class UnsupportedFeatureError extends Error {\n constructor(\n public readonly feature: string,\n public readonly serverVersion: 'v2' | 'v3',\n message?: string\n ) {\n super(message || `Feature '${feature}' requires AdCP v3 but server is ${serverVersion}`);\n this.name = 'UnsupportedFeatureError';\n }\n}\n\n/** AgentConfig with internal flags for lazy discovery */\ntype InternalAgentConfig = AgentConfig & {\n _needsDiscovery?: boolean;\n _needsCanonicalUrl?: boolean;\n};\n\ntype NormalizedWebhookPayload = {\n operation_id: string;\n task_id: string;\n task_type: string;\n status: TaskStatus;\n context_id?: string;\n result?: AdCPAsyncResponseData;\n message?: string;\n timestamp?: string;\n idempotency_key?: string;\n notification_id?: string;\n protocol?: 'mcp' | 'a2a';\n};\n\nexport interface ClientProductPropertyPolicy extends BuyerPropertyPolicy {\n /**\n * Enforcement mode for completed `get_products` responses.\n *\n * - `filter` (default): remove rejected products before handlers/callers see them\n * - `reject_response`: fail the task when any product violates the policy\n * - `audit`: keep products but attach diagnostics\n */\n mode?: ProductPropertyPolicyMode;\n /**\n * When true, a `get_products` request carrying `property_list` is resolved\n * and used as an allow-list for the returned products. Defaults to true.\n */\n enforceRequestPropertyList?: boolean;\n /**\n * Resolver options for request-derived property-list validation. The default\n * uses the SDK's process-local resolved-list cache.\n */\n propertyListResolveOptions?: ResolveListOptions;\n /**\n * Message surfaced in debug logs and failed results when the policy rejects\n * products.\n *\n * @default 'Property list not adhered to'\n */\n message?: string;\n}\n\nexport type WebhookParseErrorCode =\n | WebhookSignatureErrorCode\n | 'webhook_signature_invalid'\n | 'webhook_timestamp_invalid'\n | 'webhook_unsupported_payload'\n | 'webhook_envelope_invalid'\n | 'webhook_result_invalid'\n /**\n * The receiver has no trusted registration or legacy HMAC configuration, so\n * no authentication check can be selected safely.\n */\n | 'webhook_unverifiable'\n | 'webhook_registration_not_found'\n | 'webhook_registration_mismatch'\n | 'webhook_verification_context_missing'\n | 'webhook_registration_store_unavailable'\n | 'webhook_durable_settlement_unavailable'\n | 'webhook_publication_in_progress'\n | 'webhook_idempotency_conflict'\n | 'webhook_verification_unavailable';\n\nexport interface WebhookVerificationConfig {\n /** Deterministic/custom key source. Defaults to resolveAgent brand.json discovery. */\n jwks?: JwksResolver;\n /** Shared nonce replay store. Defaults to one process-local store per client. */\n replayStore?: ReplayStore;\n /** Key revocation source. Defaults to one process-local store per client. */\n revocationStore?: RevocationStore;\n /** Clock in epoch seconds. */\n now?: () => number;\n /** Safe discovery/cache tuning for the default seller-pinned JWK resolver. */\n resolverOptions?: Omit<ResolvedAgentJwksResolverOptions, 'fetchCapabilities'>;\n /**\n * Fetch capabilities for seller key discovery. The callback must authenticate\n * only to the supplied, already-pinned seller URL and protocol.\n */\n fetchCapabilities?: (agentUrl: string, protocol: 'mcp' | 'a2a') => Promise<unknown>;\n}\n\nexport interface VerifyAndParseWebhookOptions {\n /** Raw HTTP body bytes captured before JSON parsing. Required when `webhookSecret` is configured. */\n rawBody?: string | Buffer | Uint8Array;\n /** Parsed payload or raw body. When HMAC is configured, verified raw bytes are parsed instead of `payload`. */\n body?: string | Buffer | Uint8Array | unknown;\n /** Parsed protocol payload. */\n payload?: unknown;\n /** Header bag from the receiver framework. Used for HMAC verification when configured. */\n headers?: WebhookHeadersLike;\n /** Task type from trusted routing context. Used as an A2A fallback. */\n taskType?: string;\n /** Operation id from trusted routing context. Used as an A2A fallback. */\n operationId?: string;\n /** Actual HTTP method from trusted server context. Required for RFC 9421. */\n requestMethod?: string;\n /** Externally visible absolute request URL from trusted server/proxy configuration. Required for RFC 9421. */\n requestUrl?: string;\n /** Explicit legacy HMAC signature header value. */\n signature?: WebhookHeaderValue;\n /** Explicit legacy HMAC timestamp header value. */\n timestamp?: WebhookHeaderValue;\n}\n\nexport interface WebhookHandlerRequest {\n headers: Record<string, WebhookHeaderValue>;\n body: unknown;\n rawBody?: string | Buffer | Uint8Array;\n params?: Record<string, string>;\n method?: string;\n /** Trusted externally visible absolute URL supplied by the application. */\n publicUrl?: string;\n}\n\nexport interface WebhookHandlerAdapter {\n getOperationId?: (request: WebhookHandlerRequest) => string | undefined | Promise<string | undefined>;\n getTaskType?: (request: WebhookHandlerRequest) => string | undefined | Promise<string | undefined>;\n getRequestMethod?: (request: WebhookHandlerRequest) => string | undefined | Promise<string | undefined>;\n /** Must return a trusted externally visible URL; never derive it from untrusted forwarding headers. */\n getRequestUrl?: (request: WebhookHandlerRequest) => string | undefined | Promise<string | undefined>;\n}\n\nexport type WebhookParseResult = WebhookParseSuccess | WebhookParseFailure;\n\nexport interface WebhookParseSuccess {\n ok: true;\n protocol: 'mcp' | 'a2a';\n envelope: MCPWebhookPayload | A2ATask | TaskStatusUpdateEvent;\n result: unknown;\n metadata: {\n taskId: string;\n taskType: string;\n operationId: string;\n contextId?: string;\n idempotencyKey?: string;\n notificationId?: string;\n status: TaskStatus;\n timestamp?: string;\n message?: string;\n previewHandler?: 'canonical' | 'legacy';\n requiresDurableSettlement?: boolean;\n };\n}\n\nexport interface WebhookParseFailure {\n ok: false;\n code: WebhookParseErrorCode;\n message: string;\n cause?: unknown;\n}\n\nexport class WebhookDispatchError extends Error {\n readonly code: WebhookParseErrorCode;\n readonly cause?: unknown;\n\n constructor(code: WebhookParseErrorCode, message: string, cause?: unknown) {\n super(message);\n this.name = 'WebhookDispatchError';\n this.code = code;\n this.cause = cause;\n }\n}\n\nconst WEBHOOK_TASK_STATUSES = new Set<string>([\n 'submitted',\n 'working',\n 'input-required',\n 'completed',\n 'canceled',\n 'failed',\n 'rejected',\n 'auth-required',\n 'unknown',\n]);\nconst DURABLE_SETTLEMENT_TERMINAL_STATUSES = new Set<import('./ConversationTypes').TaskStatus>([\n 'completed',\n 'failed',\n 'rejected',\n 'canceled',\n 'governance-denied',\n 'aborted',\n]);\n\n// Top-level fields that every MCP webhook envelope must carry, regardless of\n// negotiated AdCP version. `operation_id` is intentionally NOT here: it became\n// a required webhook field in AdCP 3.1, but 3.0 senders are spec-compliant\n// without it. The receiver can't reliably know the sender's negotiated version\n// from the POST body alone, so requiring `operation_id` here broke 3.0\n// interop. When absent we fall back to the routing-context operationId (see\n// normalizeWebhookPayload), so its omission is non-fatal for dispatch.\nconst MCP_WEBHOOK_REQUIRED_FIELDS = ['idempotency_key', 'task_id', 'task_type', 'status', 'timestamp'] as const;\n\n/**\n * Configuration for SingleAgentClient (and multi-agent client)\n */\nexport interface SingleAgentClientConfig extends ConversationConfig {\n /** Durable storage for restart-safe A2A human continuations. */\n deferredStorage?: DeferredTaskStorage;\n /** Resolve current trusted agent configuration for a persisted continuation. */\n resolveDeferredAgent?: (agentId: string) => AgentConfig | undefined | Promise<AgentConfig | undefined>;\n /** Lifetime of a persisted continuation token in seconds. Defaults to seven days. */\n deferredTaskTtlSeconds?: number;\n /** Converter for seller-specific legacy creative formats at canonical read, write, and webhook boundaries. */\n legacyFormatConverter?: LegacyFormatConverter;\n /** Pre-resolved exact-owner publisher/community catalogs used at every projection boundary. */\n projectionCatalogs?: readonly ProjectionCatalogSnapshot[];\n /** Resolver for persisted canonical selections when a negotiated legacy wire is required. */\n canonicalFormatLegacyResolver?: CanonicalFormatLegacyResolver;\n /**\n * AdCP protocol version this client speaks to agents. Defaults to\n * {@link ADCP_VERSION} — the GA version the SDK ships against. Override\n * to pin to an older stable (e.g., `'3.0.0'`) or opt into a beta channel\n * (`'3.1.0-beta.1'`) once that registry ships.\n *\n * Stage 2 plumbs the option through and validates it at construction\n * time; cross-major pins (e.g. `'4.0.0-beta.1'` while the SDK ships\n * against major 3) throw `ConfigurationError`. Stage 3 wires per-instance\n * schema/validator selection off this field.\n *\n * Typed as `AdcpVersion | (string & {})` so editors autocomplete\n * canonical values from {@link COMPATIBLE_ADCP_VERSIONS} while still\n * accepting forward-compatible strings.\n */\n adcpVersion?: AdcpVersion | (string & {});\n /**\n * Optional wire-only AdCP version envelope override. Request/response\n * validation still uses `adcpVersion`; protocol envelopes use this value.\n */\n wireAdcpVersion?: AdcpVersion | (string & {});\n /**\n * Controls emission of AdCP version envelope fields. Defaults to `auto`.\n * `none` is primarily for conformance harnesses that need to send a\n * request exactly as authored, without SDK-managed version fields.\n */\n versionEnvelope?: import('../protocols').VersionEnvelopeMode;\n /** Enable debug logging */\n debug?: boolean;\n /** Custom User-Agent header sent with all outbound protocol requests.\n * Overridden by per-agent `headers['User-Agent']` if set. */\n userAgent?: string;\n /** Additional headers to include in requests */\n headers?: Record<string, string>;\n /** Activity callback for observability (logging, UI updates, etc) */\n onActivity?: (activity: Activity) => void | Promise<void>;\n /**\n * Transport-level diagnostics callback for outbound HTTP requests.\n *\n * Receives sanitized request/response/failure events from the SDK's\n * protocol fetch layer. Header maps are allowlisted/redacted and URLs have\n * credentials, query strings, and fragments stripped before emission.\n */\n onTransportActivity?: import('../protocols').TransportActivityHandler;\n /**\n * Task completion handlers — called for both sync responses and webhook\n * completions.\n *\n * For at-least-once webhook delivery, set `handlers.webhookDedup` to\n * drop duplicate retries by `idempotency_key`. See\n * `docs/guides/PUSH-NOTIFICATION-CONFIG.md#deduplication`.\n */\n handlers?: AsyncHandlerConfig;\n /** Select legacy HMAC-SHA256 push verification. Omit to use RFC 9421. */\n webhookSecret?: string;\n /** Durable provenance for outbound push registrations. Defaults to process-local memory. */\n webhookRegistrationStore?: WebhookRegistrationStore;\n /** Registration retention in seconds. Defaults to seven days. */\n webhookRegistrationTtlSeconds?: number;\n /** RFC 9421 key, replay, revocation, and discovery configuration. */\n webhookVerification?: WebhookVerificationConfig;\n /**\n * Accept inbound webhooks that carry no verifiable authenticity at all.\n *\n * This bypass applies only when no trusted push registration exists and no\n * HMAC secret is configured. It never bypasses a failed RFC 9421 or HMAC\n * verification for a known registration.\n *\n * Set this only when the receiver is genuinely unreachable from outside your\n * network (in-process test harnesses, a route bound to loopback). It is not a\n * substitute for a secret on any route an agent can reach over the internet.\n *\n * @default false\n */\n allowUnauthenticatedWebhooks?: boolean;\n /**\n * Webhook URL template with macro substitution\n *\n * Available macros:\n * - {agent_id} - Agent ID\n * - {task_type} - Task type (e.g., sync_creatives, media_buy_delivery)\n * - {operation_id} - Operation ID\n *\n * @example\n * Path-based: \"https://myapp.com/webhook/{task_type}/{agent_id}/{operation_id}\"\n * Query string: \"https://myapp.com/webhook?agent={agent_id}&op={operation_id}&type={task_type}\"\n * Custom: \"https://myapp.com/api/v1/adcp/{agent_id}?operation={operation_id}\"\n */\n webhookUrlTemplate?: WebhookUrlTemplate;\n /**\n * Reporting webhook frequency\n *\n * @default 'daily'\n */\n reportingWebhookFrequency?: 'hourly' | 'daily' | 'monthly';\n /**\n * Validate that the seller supports required features before each task call.\n * When true, tasks like syncAudiences will fail fast with FeatureUnsupportedError\n * if the seller hasn't declared audience_targeting support.\n *\n * @default true\n */\n validateFeatures?: boolean;\n /**\n * Gate mutating-task dispatch on the seller's declared major version.\n * When the seller returns an authoritative `get_adcp_capabilities`\n * response, the guard requires:\n * 1. `major_versions` includes 3\n * 2. `adcp.idempotency.replay_ttl_seconds` is declared (spec-required)\n *\n * Sellers whose capabilities are synthesized from `tools/list` (no\n * authoritative `get_adcp_capabilities` response) route through the\n * v2 adapter with a one-time warning — a compliant v3 seller would\n * declare itself, so absence of a declaration is read as v2. Adopters\n * who need a hard \"definitely-v3\" gate should validate\n * `(await client.getCapabilities())._synthetic === false` directly.\n *\n * Throws `VersionUnsupportedError` before the request is sent when\n * the guard rejects. Bypass with `allowV2` or — process-wide as a\n * fallback — `ADCP_ALLOW_V2=1`.\n *\n * @default false\n */\n requireV3ForMutations?: boolean;\n /**\n * Per-client bypass for the v3 guard. When `true`, the guard is off\n * regardless of the `ADCP_ALLOW_V2` env var. When `undefined`, the env\n * var is consulted as a fallback. Set explicitly in multi-tenant\n * deployments so one tenant's override can't silently disable safety\n * for another.\n */\n allowV2?: boolean;\n /**\n * Runtime schema validation options\n */\n validation?: {\n /**\n * Validate outgoing requests against the bundled AdCP JSON schema before\n * dispatch. Catches field-name drift at call-time instead of at\n * storyboard-time.\n *\n * - `strict`: throw `ValidationError` with a JSON Pointer to the bad field\n * - `warn`: log to debug logs and continue\n * - `off`: skip the validator entirely (no overhead)\n *\n * @default `strict` in dev/test, `warn` in production\n */\n requests?: import('../validation/client-hooks').ValidationMode;\n /**\n * Validate incoming responses against the bundled AdCP JSON schema.\n *\n * - `strict`: fail the task with `VALIDATION_ERROR`\n * - `warn`: log to debug logs and surface the task as successful\n * - `off`: skip the validator entirely\n *\n * Overrides `strictSchemaValidation` when set.\n *\n * @default `strict` in dev/test, `warn` in production\n */\n responses?: import('../validation/client-hooks').ValidationMode;\n /**\n * Legacy: fail tasks when response schema validation fails (default: true).\n * Superseded by `responses` above — retained for backward compat.\n * `false` maps to `responses: 'warn'` when `responses` isn't set.\n *\n * @default true\n */\n strictSchemaValidation?: boolean;\n /**\n * Emit schema validation violations to debug logs and the console (default: true).\n * Set false when violations are surfaced through another structured channel.\n *\n * @default true\n */\n logSchemaViolations?: boolean;\n /**\n * Filter out invalid products from get_products responses instead of rejecting the entire response (default: false)\n *\n * When true: Each product in a get_products response is validated individually.\n * Valid products are kept, invalid products are dropped, and the response is\n * returned as long as it passes full schema validation after filtering.\n * When false: The entire response is rejected if any product fails validation.\n *\n * Only applies to get_products — all other tool responses use standard validation.\n *\n * @default false\n */\n filterInvalidProducts?: boolean;\n /**\n * Reject products that arrive without a usable `pricing_options[]` array\n * from completed `get_products` responses (default: true).\n *\n * `pricing_options` is a required, non-empty field in AdCP 3.1 — a product\n * that advertises no pricing model is non-transactable, so the SDK drops it\n * from the product list before callers and completion handlers see it. This\n * runs on every completion path (sync, polling, `track`, webhook) and is\n * independent of the response `validation` mode, so unpriced products are\n * removed even under `responses: 'warn' | 'off'`. The rejection is recorded\n * in `result.metadata.productPricingPolicy` and a\n * `product_missing_pricing_options` debug-log notice.\n *\n * Set to `false` to pass products through untouched (e.g. when the caller\n * deliberately inspects malformed seller responses).\n *\n * @default true\n */\n rejectProductsWithoutPricingOptions?: boolean;\n /**\n * Buyer-side property policy applied to completed `get_products`\n * responses before completion handlers and callers receive the product\n * list. A request-level `property_list` is enforced automatically by\n * default; set this to `false` only when the caller deliberately wants to\n * trust seller-side filtering without SDK verification.\n *\n * Use this for brand/block-list rules such as excluding `ladbible.com`;\n * domain matching normalizes `www.` aliases, so `www.ladbible.com`\n * violates an exclusion for `ladbible.com`.\n */\n productPropertyPolicy?: ClientProductPropertyPolicy | false;\n };\n /** Governance configuration for buyer-side campaign governance */\n governance?: import('./GovernanceTypes').GovernanceConfig;\n /**\n * Transport-level safeguards. Applies to every call this client dispatches\n * unless overridden at call time.\n *\n * Set `maxResponseBytes` when crawling untrusted agents (registries,\n * federated discovery layers) to prevent a hostile vendor from buffering\n * a large reply before any application-layer schema validation runs. Set\n * `requestTimeoutMs` to override the default 60s cap on A2A agent-card\n * discovery; use `0` to disable the SDK-imposed discovery timeout.\n */\n transport?: import('../protocols').TransportOptions;\n}\n\n/**\n * Internal single-agent client implementation\n *\n * This is an internal implementation detail used by AgentClient and ADCPMultiAgentClient.\n * External users should use AdCPClient (alias for ADCPMultiAgentClient) instead.\n *\n * Key features:\n * - 🔒 Full type safety for all ADCP tasks\n * - 💬 Conversation management with context preservation\n * - 🔄 Input handler pattern for clarifications\n * - ⏱️ Timeout and retry support\n * - 🐛 Debug logging and observability\n * - 🎯 Works with both MCP and A2A protocols\n */\n/**\n * Does a JS runtime value's type plausibly match a JSON Schema's declared\n * shape? Used by the v2 adapter aliasing path to avoid moving a string\n * into a slot the agent's tool schema declared as an object (e.g.,\n * Wonderstruck's `brand: BrandReference` slot vs our adapter's\n * `brand_manifest: 'https://...'` URL string).\n *\n * Recurses into `anyOf` / `oneOf`: the move is safe iff at least one\n * variant accepts the value's runtime type. `$ref` we can't introspect\n * locally — return true and let the seller's own validation catch.\n *\n * The empty schema `{}` is treated as \"doesn't accept this type\" so\n * Pydantic-generated tool schemas with `anyOf: [{}, {type: null}]` —\n * which technically allow anything but in practice mask a stricter\n * Pydantic union — don't pull the buyer into the broken alias.\n */\nfunction valueMatchesSchemaType(value: unknown, propSchema: unknown): boolean {\n if (!propSchema || typeof propSchema !== 'object') return false;\n const schema = propSchema as { type?: unknown; oneOf?: unknown; anyOf?: unknown; $ref?: unknown };\n if (schema.$ref) return true;\n\n const valueType: string = Array.isArray(value)\n ? 'array'\n : value === null\n ? 'null'\n : typeof value === 'object'\n ? 'object'\n : typeof value;\n\n // anyOf / oneOf: any variant matching = safe.\n for (const key of ['anyOf', 'oneOf'] as const) {\n const variants = (schema as { [k: string]: unknown })[key];\n if (Array.isArray(variants)) {\n return variants.some(v => valueMatchesSchemaType(value, v));\n }\n }\n\n const declared = schema.type;\n if (declared === undefined) return false;\n if (typeof declared === 'string') return declared === valueType;\n if (Array.isArray(declared)) return declared.includes(valueType);\n return false;\n}\n\nfunction productHasPricingOptions(product: unknown): boolean {\n if (!product || typeof product !== 'object') return false;\n const options = (product as { pricing_options?: unknown }).pricing_options;\n return Array.isArray(options) && options.length > 0;\n}\n\nfunction productIdForPricingDiagnostics(product: unknown): string | undefined {\n if (!product || typeof product !== 'object') return undefined;\n const id = (product as { product_id?: unknown }).product_id;\n return typeof id === 'string' ? id : undefined;\n}\n\nfunction propertyListReferenceFromRequest(params: Record<string, unknown>): PropertyListReference | undefined {\n const value = params.property_list;\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const ref = value as Partial<PropertyListReference>;\n if (typeof ref.agent_url !== 'string' || typeof ref.list_id !== 'string') return undefined;\n return {\n agent_url: ref.agent_url,\n list_id: ref.list_id,\n ...(typeof ref.auth_token === 'string' ? { auth_token: ref.auth_token } : {}),\n };\n}\n\nfunction productPolicyRequestSnapshot(requestParams: Record<string, unknown>): Readonly<Record<string, unknown>> {\n const account = canonicalAccountRoutingSnapshot(requestParams.account);\n const propertyList = propertyListReferenceFromRequest(requestParams);\n return Object.freeze({\n ...(account ? { account } : {}),\n ...(propertyList ? { property_list: Object.freeze(propertyList) } : {}),\n });\n}\n\nfunction hasProductPropertyPolicyRules(policy: BuyerPropertyPolicy): boolean {\n return Boolean(\n policy.allowedDomains?.length ||\n policy.allowedPropertyIdentifiers?.length ||\n policy.requireAllowedPropertyMatch ||\n policy.excludedDomains?.length ||\n policy.excludedPropertyIds?.length ||\n policy.strict ||\n policy.unknownSelectorBehavior ||\n policy.missingPublisherPropertiesBehavior\n );\n}\n\nfunction comparablePropertyIdentifiers(\n identifiers: readonly { type: string; value: string }[]\n): Array<{ type: string; value: string }> {\n return identifiers\n .filter(identifier => identifier.type === 'domain' || identifier.type === 'subdomain')\n .map(identifier => ({ type: identifier.type, value: identifier.value }));\n}\n\nfunction unsupportedPropertyIdentifiers(\n identifiers: readonly { type: string; value: string }[]\n): Array<{ type: string }> {\n return identifiers\n .filter(identifier => identifier.type !== 'domain' && identifier.type !== 'subdomain')\n .map(identifier => ({ type: identifier.type }));\n}\n\nfunction sanitizeDiagnosticUrl(value: string): string {\n try {\n const url = new URL(value);\n url.username = '';\n url.password = '';\n url.search = '';\n url.hash = '';\n return url.toString();\n } catch {\n return 'invalid_url';\n }\n}\n\nfunction propertyListResolutionErrorCode(err: unknown): string {\n const message = err instanceof Error ? err.message : '';\n if (/^property_list_[a-z_]+$/.test(message)) return message;\n if (/^list_agent_url_[a-z_]+$/.test(message)) return message;\n return 'property_list_resolution_failed';\n}\n\nexport class SingleAgentClient {\n private executor: TaskExecutor;\n private asyncHandler?: AsyncHandler;\n private normalizedAgent: InternalAgentConfig;\n private discoveredEndpoint?: string; // Cache discovered MCP endpoint\n private discoveredAgent?: AgentConfig; // Stable post-discovery config for protocol/provider caches\n private discoveredMcpEra?: 'legacy' | 'modern';\n private discoveredMcpEraAt = 0;\n private canonicalBaseUrl?: string; // Cache canonical base URL (from agent card or stripped /mcp)\n private cachedCapabilities?: AdcpCapabilities; // Cache detected server capabilities\n private cachedToolSchemas?: Map<string, Record<string, unknown>>; // inputSchema.properties per tool name\n private _v2WarningFired = false; // Gate: emit the v2-sunset warning once per client instance\n private _syntheticV3WarningFired = false; // Gate: emit the synthetic-v3 warning once per client instance\n private _syntheticV2WarningFired = false; // Gate: emit the synthetic-v2 warning once per client instance\n private readonly productPolicyRequestParamsByTask = new Map<string, ProductPolicyRequestState>();\n private readonly canonicalCreativeTaskAssociations = new Map<string, CanonicalCreativeTaskAssociation>();\n private readonly previewCreativeHandlersByTask = new Map<string, 'canonical' | 'legacy'>();\n private readonly canonicalLegacyRoutes = new Map<string, CanonicalLegacyRoute>();\n private readonly resolvedAdcpVersion: string;\n private readonly webhookRegistrationStore: WebhookRegistrationStore;\n private readonly webhookReplayStore: ReplayStore;\n private readonly webhookRevocationStore: RevocationStore;\n private readonly webhookJwksResolvers = new Map<string, JwksResolver>();\n private readonly durableSettlementRecoverers = new Set<\n (\n operationId: string,\n observation: ExternalTaskSettlementObservation\n ) => Promise<ExternalTaskStatusResult | undefined>\n >();\n private readonly durableDeferredResumeAuthorizers = new Set<\n (operationId: string, token: string) => boolean | undefined | Promise<boolean | undefined>\n >();\n private readonly durableDeferredOperationRecoveryAuthorizers = new Set<\n (\n operationId: string,\n recoveryKey: string,\n purpose: 'pause-recovery' | 'callback-checkpoint'\n ) => boolean | undefined | Promise<boolean | undefined>\n >();\n private readonly durableDeferredResumeTokenReplacers = new Set<\n (\n operationId: string,\n currentToken: string,\n replacementToken: string\n ) => boolean | undefined | Promise<boolean | undefined>\n >();\n\n constructor(\n private agent: AgentConfig,\n private config: SingleAgentClientConfig = {}\n ) {\n // Own the nested trust-boundary object at construction. Normalization\n // historically returns the input object unchanged for the preferred\n // `trustedFetchFn` spelling, so clone first while retaining function identity.\n const configuredTransport = config.transport === undefined ? undefined : { ...config.transport };\n this.config = { ...config, transport: normalizeTransportOptions(configuredTransport) };\n config = this.config;\n // Validate the configured adcpVersion at construction time. Throws\n // ConfigurationError if the pin's major differs from ADCP_MAJOR_VERSION\n // — cross-major support lands in Stage 3 of the multi-version refactor.\n this.resolvedAdcpVersion = resolveAdcpVersion(config.adcpVersion);\n this.webhookRegistrationStore = config.webhookRegistrationStore ?? new InMemoryWebhookRegistrationStore();\n this.webhookReplayStore = config.webhookVerification?.replayStore ?? new InMemoryReplayStore();\n this.webhookRevocationStore = config.webhookVerification?.revocationStore ?? new InMemoryRevocationStore();\n const registrationTtl = config.webhookRegistrationTtlSeconds ?? 7 * 24 * 60 * 60;\n if (!Number.isSafeInteger(registrationTtl) || registrationTtl < 1) {\n throw new ConfigurationError('webhookRegistrationTtlSeconds must be a positive safe integer.');\n }\n\n // Inject userAgent into agent headers so it flows through both MCP and A2A transports\n if (config.userAgent) {\n validateUserAgent(config.userAgent);\n this.agent = {\n ...this.agent,\n headers: { 'User-Agent': config.userAgent, ...this.agent.headers },\n };\n }\n\n // Normalize agent URL for MCP protocol\n this.normalizedAgent = this.normalizeAgentConfig(this.agent);\n\n this.executor = new TaskExecutor({\n workingTimeout: config.workingTimeout || 120000, // Max 120s for working status\n defaultMaxClarifications: config.defaultMaxClarifications || 3,\n enableConversationStorage: config.persistConversations !== false,\n deferredStorage: config.deferredStorage,\n resolveDeferredAgent:\n config.resolveDeferredAgent ??\n (async agentId => {\n if (agentId !== this.normalizedAgent.id) return undefined;\n return this.normalizedAgent.protocol === 'a2a'\n ? this.ensureCanonicalUrlResolved()\n : this.ensureEndpointDiscovered();\n }),\n deferredTaskTtlSeconds: config.deferredTaskTtlSeconds,\n canRecoverDeferredSettlement: () => this.durableSettlementRecoverers.size > 0,\n authorizeDeferredSettlementResume: async (operationId, token) => {\n for (const authorize of this.durableDeferredResumeAuthorizers) {\n if ((await authorize(operationId, token)) === true) return true;\n }\n return false;\n },\n authorizeDeferredSettlementOperationRecovery: async (operationId, recoveryKey, purpose) => {\n for (const authorize of this.durableDeferredOperationRecoveryAuthorizers) {\n if ((await authorize(operationId, recoveryKey, purpose)) === true) return true;\n }\n return false;\n },\n replaceDeferredSettlementResumeToken: async (operationId, currentToken, replacementToken) => {\n for (const replace of this.durableDeferredResumeTokenReplacers) {\n if ((await replace(operationId, currentToken, replacementToken)) === true) return true;\n }\n return false;\n },\n recoverDeferredSettlement: async (result, operationId, serverTaskId) => {\n const settlement = await this.wrapPersistedDeferredSettlement(result, operationId, serverTaskId);\n return {\n result: settlement.result,\n ...(settlement.afterDispatch !== undefined && { afterFinalize: settlement.afterDispatch }),\n };\n },\n webhookUrlTemplate: config.webhookUrlTemplate,\n agentId: agent.id,\n webhookSecret: config.webhookSecret,\n onWebhookRegistration: registration => this.persistWebhookRegistration(registration),\n onDurableSettlementRequired: operationId => this.markWebhookDurableSettlementRequired(operationId),\n externalTaskSettlementRetentionMs: registrationTtl * 1000,\n strictSchemaValidation: config.validation?.strictSchemaValidation !== false, // Default: true\n logSchemaViolations: config.validation?.logSchemaViolations !== false, // Default: true\n filterInvalidProducts: config.validation?.filterInvalidProducts === true, // Default: false\n validation: {\n ...(config.validation?.requests != null && { requests: config.validation.requests }),\n ...(config.validation?.responses != null && { responses: config.validation.responses }),\n },\n onActivity: config.onActivity ? activity => config.onActivity!(canonicalCreativeActivity(activity)) : undefined,\n onTransportActivity: config.onTransportActivity\n ? event => config.onTransportActivity!(canonicalCreativeTransportActivity(event))\n : undefined,\n governance: config.governance,\n adcpVersion: this.resolvedAdcpVersion,\n ...(config.wireAdcpVersion !== undefined && { wireAdcpVersion: config.wireAdcpVersion }),\n ...(config.versionEnvelope !== undefined && { versionEnvelope: config.versionEnvelope }),\n transport: config.transport,\n });\n\n // Create async handler if handlers are provided\n if (config.handlers) {\n this.asyncHandler = new AsyncHandler(config.handlers);\n }\n }\n\n private async persistWebhookRegistration(args: {\n agent: AgentConfig;\n taskType: string;\n operationId: string;\n callbackUrl: string;\n mode: WebhookRegistration['mode'];\n }): Promise<void> {\n const nowMs = this.config.webhookVerification?.now\n ? Math.floor(this.config.webhookVerification.now() * 1000)\n : Date.now();\n const ttlSeconds = this.config.webhookRegistrationTtlSeconds ?? 7 * 24 * 60 * 60;\n const activeCreativeExecution = canonicalCreativeExecutionStorage.getStore();\n const previewMode =\n args.taskType === 'preview_creative' && activeCreativeExecution?.taskType === args.taskType\n ? activeCreativeExecution.canonical\n ? 'canonical'\n : 'legacy'\n : undefined;\n // Keep an operation-scoped fallback before awaiting durable persistence.\n // This preserves preview callback identity for immediate HMAC callbacks and\n // for the legacy HMAC compatibility path when the registration store is\n // temporarily unavailable.\n if (previewMode) {\n this.rememberPreviewCreativeHandlerKey(args.operationId, previewMode);\n if (previewMode === 'canonical') {\n this.rememberCanonicalCreativeTaskAssociation(args.operationId, args.taskType);\n } else {\n this.canonicalCreativeTaskAssociations.delete(args.operationId);\n }\n }\n const persistedAgentUrl = new URL(args.agent.agent_uri);\n persistedAgentUrl.username = '';\n persistedAgentUrl.password = '';\n persistedAgentUrl.hash = '';\n try {\n await this.webhookRegistrationStore.putIfAbsent({\n agentId: args.agent.id,\n agentUrl: persistedAgentUrl.toString(),\n protocol: args.agent.protocol,\n operationId: args.operationId,\n taskType: args.taskType,\n callbackUrl: args.callbackUrl,\n method: 'POST',\n mode: args.mode,\n ...(previewMode && { previewMode }),\n createdAt: nowMs,\n expiresAt: nowMs + ttlSeconds * 1000,\n });\n } catch (cause) {\n // RFC 9421 has no safe fallback without seller-pinned provenance. Legacy\n // HMAC remains verifiable from the configured global secret only for the\n // explicit recordless read-only allowlist. Mutation and unknown-task\n // receivers require registration provenance, so dispatch must fail too.\n if (args.mode === 'rfc9421' || !RECORDLESS_HMAC_READ_ONLY_TASKS.has(args.taskType)) {\n const error = new ConfigurationError('Could not persist trusted webhook registration for this operation.');\n Object.defineProperty(error, 'cause', { value: cause, configurable: true });\n throw error;\n }\n }\n }\n\n private async markWebhookDurableSettlementRequired(operationId: string): Promise<void> {\n const mark = this.webhookRegistrationStore.markRequiresDurableSettlement;\n if (!mark) {\n throw new ConfigurationError(\n 'A custom webhookRegistrationStore must implement markRequiresDurableSettlement for durable mutation callbacks.'\n );\n }\n await mark.call(this.webhookRegistrationStore, this.agent.id, operationId);\n }\n\n private webhookJwksFor(registration: Readonly<WebhookRegistration>): JwksResolver {\n const configured = this.config.webhookVerification?.jwks;\n if (configured) return configured;\n const key = `${registration.protocol}\\x00${registration.agentUrl}`;\n const existing = this.webhookJwksResolvers.get(key);\n if (existing) return existing;\n\n const resolver = new ResolvedAgentJwksResolver(registration.agentUrl, registration.protocol, {\n ...this.config.webhookVerification?.resolverOptions,\n fetchCapabilities: agentUrl => {\n const configuredFetch = this.config.webhookVerification?.fetchCapabilities;\n if (configuredFetch) return configuredFetch(agentUrl, registration.protocol);\n return ProtocolClient.callTool(\n {\n id: registration.agentId,\n name: registration.agentId,\n agent_uri: agentUrl,\n protocol: registration.protocol,\n },\n 'get_adcp_capabilities',\n {},\n {\n adcpVersion: this.resolvedAdcpVersion,\n ...(this.config.wireAdcpVersion !== undefined && { wireAdcpVersion: this.config.wireAdcpVersion }),\n ...(this.config.versionEnvelope !== undefined && { versionEnvelope: this.config.versionEnvelope }),\n transport: {\n ...this.config.transport,\n requestTimeoutMs:\n this.config.transport?.requestTimeoutMs ??\n this.config.webhookVerification?.resolverOptions?.timeoutMs ??\n 10_000,\n },\n }\n );\n },\n });\n this.webhookJwksResolvers.set(key, resolver);\n return resolver;\n }\n\n private resolveLegacyFormatConverter(\n override?: LegacyFormatConverter,\n projectionCatalogs: readonly ProjectionCatalogSnapshot[] | undefined = this.config.projectionCatalogs\n ): LegacyFormatConverter | undefined {\n return legacyFormatConverterFromCatalogSnapshots(projectionCatalogs, override ?? this.config.legacyFormatConverter);\n }\n\n /** Use an already-composed per-call converter without reapplying configured catalog precedence. */\n private finalLegacyFormatConverter(composed?: LegacyFormatConverter): LegacyFormatConverter | undefined {\n return composed ?? this.resolveLegacyFormatConverter();\n }\n\n private assertDurableProjectionOverrideSupported(override: LegacyFormatConverter | undefined): void {\n if (!override || !this.config.deferredStorage) return;\n throw new TypeError(\n 'Per-call legacyFormatConverter functions cannot be used with durable deferredStorage because functions ' +\n 'cannot be persisted for restart recovery. Configure legacyFormatConverter on the client, or pass ' +\n 'serializable projectionCatalogs for this call.'\n );\n }\n\n private assertDurablePropertyListCredentialSupported(taskType: string, requestParams: Record<string, unknown>): void {\n if (!this.config.deferredStorage || taskType !== 'get_products') return;\n const propertyList = propertyListReferenceFromRequest(requestParams);\n if (!propertyList?.auth_token) return;\n const policyConfig = this.config.validation?.productPropertyPolicy;\n if (policyConfig === false || policyConfig?.enforceRequestPropertyList === false) return;\n throw new ConfigurationError(\n 'Durable deferred recovery cannot persist property_list.auth_token for buyer-side property-list ' +\n 'verification. Configure validation.productPropertyPolicy.enforceRequestPropertyList as false, ' +\n 'or use a client without deferredStorage for this request.'\n );\n }\n\n private canonicalAccountScope(account: unknown): string {\n if (account === undefined) return 'none';\n // Account-scoped route identity is the account id or the protocol's\n // natural key (brand + operator + sandbox). Per-call BrandReference\n // overrides are not identity and must not make a live request differ from\n // the minimal snapshot retained for an async completion.\n return canonicalizeJson(canonicalAccountRoutingSnapshot(account) ?? account);\n }\n\n private canonicalLegacyRouteKey(\n account: unknown,\n productId: string,\n ref:\n | { scope: 'product'; format_option_id: string }\n | {\n scope: 'publisher';\n publisher_domain: string;\n format_option_id: string;\n }\n ): string {\n return canonicalizeJson([\n this.canonicalAccountScope(account),\n productId,\n ref.scope,\n ref.scope === 'publisher' ? ref.publisher_domain.toLowerCase() : '',\n ref.format_option_id,\n ]);\n }\n\n private canonicalLegacyPackageRouteKey(account: unknown, packageId: string): string {\n return canonicalizeJson([this.canonicalAccountScope(account), 'package', packageId]);\n }\n\n private sameCanonicalOptionRef(left: CanonicalLegacyOptionRef, right: CanonicalLegacyOptionRef): boolean {\n return (\n left.scope === right.scope &&\n left.format_option_id === right.format_option_id &&\n (left.scope !== 'publisher' ||\n (right.scope === 'publisher' && left.publisher_domain.toLowerCase() === right.publisher_domain.toLowerCase()))\n );\n }\n\n private rememberCanonicalLegacyRoute(key: string, route: CanonicalLegacyRoute): void {\n this.canonicalLegacyRoutes.delete(key);\n this.canonicalLegacyRoutes.set(key, {\n ...route,\n refs: Object.freeze(route.refs.map(ref => Object.freeze({ ...ref }))),\n });\n while (this.canonicalLegacyRoutes.size > TASK_SCOPED_STATE_LIMIT) {\n const oldest = this.canonicalLegacyRoutes.keys().next().value;\n if (oldest === undefined) break;\n this.canonicalLegacyRoutes.delete(oldest);\n }\n }\n\n private invalidateCanonicalProductRoutes(products: readonly unknown[], account: unknown): void {\n const accountScope = this.canonicalAccountScope(account);\n const productIds = new Set<string>();\n for (const value of products) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) continue;\n const productId = (value as Record<string, unknown>).product_id;\n if (typeof productId === 'string') productIds.add(productId);\n }\n if (productIds.size === 0) return;\n for (const [key, route] of this.canonicalLegacyRoutes) {\n if (route.kind === 'product' && route.accountScope === accountScope && productIds.has(route.productId)) {\n this.canonicalLegacyRoutes.delete(key);\n }\n }\n }\n\n private rememberCanonicalProductRoutes(\n products: readonly unknown[],\n account: unknown,\n authoritativeProducts: readonly unknown[] = products\n ): void {\n this.invalidateCanonicalProductRoutes(authoritativeProducts, account);\n const accountScope = this.canonicalAccountScope(account);\n for (const value of products) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) continue;\n const product = value as Record<string, unknown>;\n if (typeof product.product_id !== 'string' || !Array.isArray(product.format_options)) continue;\n for (const optionValue of product.format_options) {\n if (!optionValue || typeof optionValue !== 'object' || Array.isArray(optionValue)) continue;\n const option = optionValue as Record<string, unknown>;\n if (typeof option.format_option_id !== 'string') continue;\n const ref =\n typeof option.publisher_domain === 'string'\n ? {\n scope: 'publisher' as const,\n publisher_domain: option.publisher_domain,\n format_option_id: option.format_option_id,\n }\n : { scope: 'product' as const, format_option_id: option.format_option_id };\n const refs = legacyFormatRefsForDeclaration(option);\n if (refs.length === 0) continue;\n this.rememberCanonicalLegacyRoute(this.canonicalLegacyRouteKey(account, product.product_id, ref), {\n kind: 'product',\n accountScope,\n productId: product.product_id,\n optionRef: ref,\n refs,\n });\n }\n }\n }\n\n private rememberCanonicalProductRoutesForCompletion(\n taskType: string,\n data: unknown,\n legacyFormatConverter: LegacyFormatConverter | undefined,\n account: unknown\n ): void {\n if (taskType !== 'get_products' || !data || typeof data !== 'object' || Array.isArray(data)) return;\n const authoritativeProducts = Array.isArray((data as { products?: unknown[] }).products)\n ? (data as { products: unknown[] }).products\n : [];\n const { response } = toCanonicalOnlyResponse(data as { products?: V1Product[] }, {\n legacyFormatConverter,\n });\n this.rememberCanonicalProductRoutes(\n response.products,\n account,\n authoritativeProducts.length > 0 ? authoritativeProducts : response.products\n );\n }\n\n private routeForOption(\n account: unknown,\n productId: string,\n optionRef: CanonicalLegacyOptionRef\n ): CanonicalLegacyRoute | undefined {\n const accountScope = this.canonicalAccountScope(account);\n const exactKey = this.canonicalLegacyRouteKey(account, productId, optionRef);\n const exact = this.canonicalLegacyRoutes.get(exactKey);\n if (exact) {\n this.canonicalLegacyRoutes.delete(exactKey);\n this.canonicalLegacyRoutes.set(exactKey, exact);\n return exact;\n }\n const candidates = [...this.canonicalLegacyRoutes.entries()].filter(\n ([, route]) =>\n route.kind === 'product' &&\n route.productId === productId &&\n this.sameCanonicalOptionRef(route.optionRef, optionRef)\n );\n // A scoped write may consume one uniquely known accountless discovery\n // route. The inverse is unsafe: absence of an account is not proof that a\n // sole tenant-scoped route belongs to this request.\n if (candidates.length !== 1) return undefined;\n const [key, candidate] = candidates[0]!;\n if (accountScope === 'none' || candidate.accountScope !== 'none') return undefined;\n this.canonicalLegacyRoutes.delete(key);\n this.canonicalLegacyRoutes.set(key, candidate);\n return candidate;\n }\n\n private routeForPackage(account: unknown, packageId: string): CanonicalLegacyRoute | undefined {\n const exactKey = this.canonicalLegacyPackageRouteKey(account, packageId);\n const exact = this.canonicalLegacyRoutes.get(exactKey);\n if (exact) {\n this.canonicalLegacyRoutes.delete(exactKey);\n this.canonicalLegacyRoutes.set(exactKey, exact);\n return exact;\n }\n // Package routes are tenant resources, never public discovery data. Cache\n // uniqueness is not tenant identity, so only the exact account key above\n // may resolve one.\n return undefined;\n }\n\n private packageIdsFromSelector(selector: Readonly<Record<string, unknown>>): string[] {\n const ids = new Set<string>();\n if (typeof selector.package_id === 'string') ids.add(selector.package_id);\n if (Array.isArray(selector.selector_containers)) {\n for (const value of selector.selector_containers) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) continue;\n for (const id of this.packageIdsFromSelector(value as Readonly<Record<string, unknown>>)) ids.add(id);\n }\n }\n return [...ids];\n }\n\n private cachedCanonicalLegacyRefs(\n context: CanonicalFormatLegacyResolutionContext,\n account: unknown\n ): readonly V1FormatId[] | undefined {\n const selector: Readonly<Record<string, unknown>> =\n context.source === 'product'\n ? (context.declaration as unknown as Readonly<Record<string, unknown>>)\n : context.source === 'creative'\n ? context.selector\n : context.selector;\n const productId =\n context.source === 'product'\n ? context.productId\n : typeof selector.product_id === 'string'\n ? selector.product_id\n : undefined;\n if (!productId) {\n const packageIds = this.packageIdsFromSelector(selector);\n if (packageIds.length === 0) return undefined;\n const routes = packageIds.map(packageId => this.routeForPackage(account, packageId));\n if (routes.some(route => route === undefined)) return undefined;\n const normalized = routes.map(route =>\n canonicalizeJson(\n route!.refs\n .map(ref => ({ ...ref }))\n .sort((left, right) => canonicalizeJson(left).localeCompare(canonicalizeJson(right)))\n )\n );\n if (!normalized.every(value => value === normalized[0])) return undefined;\n return routes[0]!.refs.map(value => ({ ...value }));\n }\n\n const rawRefs: unknown[] = [];\n if (context.source === 'product') rawRefs.push(context.declaration);\n if (context.source === 'creative' && context.creative.format_option_ref !== undefined) {\n rawRefs.push(context.creative.format_option_ref);\n } else if (Array.isArray(selector.format_option_refs)) {\n rawRefs.push(...selector.format_option_refs);\n }\n const optionRefs: Array<\n | { scope: 'product'; format_option_id: string }\n | { scope: 'publisher'; publisher_domain: string; format_option_id: string }\n > = [];\n for (const value of rawRefs) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) continue;\n const record = value as Record<string, unknown>;\n if (typeof record.format_option_id !== 'string') continue;\n if (record.scope === 'publisher' || typeof record.publisher_domain === 'string') {\n if (typeof record.publisher_domain !== 'string') continue;\n optionRefs.push({\n scope: 'publisher',\n publisher_domain: record.publisher_domain,\n format_option_id: record.format_option_id,\n });\n } else {\n optionRefs.push({ scope: 'product', format_option_id: record.format_option_id });\n }\n }\n if (optionRefs.length === 0) return undefined;\n\n const resolved: V1FormatId[] = [];\n for (const ref of optionRefs) {\n const route = this.routeForOption(account, productId, ref);\n if (!route) return undefined;\n resolved.push(...route.refs.map(value => ({ ...value })));\n }\n return resolved;\n }\n\n private rememberCanonicalPackageRoutes(response: unknown, request: unknown): void {\n if (!response || typeof response !== 'object' || Array.isArray(response)) return;\n const requestRecord =\n request && typeof request === 'object' && !Array.isArray(request)\n ? (request as Record<string, unknown>)\n : undefined;\n const account = requestRecord?.account;\n // A package_id alone is not a tenant identity. Without an account (or a\n // future media_buy_id-bound key) retaining this route could cross tenants.\n if (account === undefined) return;\n const accountScope = this.canonicalAccountScope(account);\n const requestPackages = ['packages', 'new_packages'].flatMap(key =>\n Array.isArray(requestRecord?.[key])\n ? requestRecord[key].filter((value): value is Record<string, unknown> =>\n Boolean(value && typeof value === 'object' && !Array.isArray(value))\n )\n : []\n );\n const responsePackages: Record<string, unknown>[] = [];\n const visit = (value: unknown, depth = 0): void => {\n if (depth > 8 || !value || typeof value !== 'object') return;\n if (Array.isArray(value)) {\n for (const item of value) visit(item, depth + 1);\n return;\n }\n const record = value as Record<string, unknown>;\n if (typeof record.package_id === 'string') responsePackages.push(record);\n for (const key of ['packages', 'affected_packages', 'media_buys']) {\n if (record[key] !== undefined) visit(record[key], depth + 1);\n }\n };\n visit(response);\n\n for (const pkg of responsePackages) {\n const packageId = pkg.package_id as string;\n let selector: Record<string, unknown> | undefined = pkg;\n let refs = this.cachedCanonicalLegacyRefs(\n { source: 'selector', selector, operation: 'package_route', field: packageId },\n account\n );\n if (!refs) {\n const byPackageId = requestPackages.filter(value => value.package_id === packageId);\n const productId = typeof pkg.product_id === 'string' ? pkg.product_id : undefined;\n const byProduct = productId ? requestPackages.filter(value => value.product_id === productId) : [];\n const matches = byPackageId.length === 1 ? byPackageId : byProduct.length === 1 ? byProduct : [];\n selector = matches[0];\n if (selector) {\n refs = this.cachedCanonicalLegacyRefs(\n { source: 'selector', selector, operation: 'package_route', field: packageId },\n account\n );\n }\n }\n if (!refs || refs.length === 0) continue;\n this.rememberCanonicalLegacyRoute(this.canonicalLegacyPackageRouteKey(account, packageId), {\n kind: 'package',\n accountScope,\n packageId,\n refs,\n });\n }\n }\n\n private rememberCanonicalPackageRoutesForTask(taskType: string, response: unknown, request: unknown): void {\n if (taskType === 'create_media_buy' || taskType === 'update_media_buy' || taskType === 'get_media_buys') {\n this.rememberCanonicalPackageRoutes(response, request);\n }\n }\n\n private resolveCanonicalFormatLegacyResolver(\n override: CanonicalFormatLegacyResolver | undefined,\n account: unknown\n ): CanonicalFormatLegacyResolver {\n const configured = this.config.canonicalFormatLegacyResolver;\n return context => override?.(context) ?? this.cachedCanonicalLegacyRefs(context, account) ?? configured?.(context);\n }\n\n /**\n * Returns the AdCP protocol version this client is configured to speak.\n *\n * Defaults to {@link ADCP_VERSION} (the GA version the SDK ships against)\n * unless overridden via `new SingleAgentClient(agent, { adcpVersion })`.\n *\n * Plumbing surface — Stage 2 of the multi-version refactor exposes the\n * configured value but does not yet vary validator/schema selection by\n * version. Wire-shape adapters key off this method in subsequent stages.\n */\n getAdcpVersion(): string {\n return this.resolvedAdcpVersion;\n }\n\n /** Poll through the same discovered/canonical protocol endpoint used for dispatch. @internal */\n async getTaskStatus(\n taskId: string,\n transport?: import('../protocols').TransportOptions,\n signal?: AbortSignal\n ): Promise<TaskInfo> {\n // Transport options define the outbound trust boundary. Own them before\n // endpoint discovery yields so caller mutation cannot change the fetch or\n // private-address policy between discovery and tasks/get.\n const transportSnapshot = transport === undefined ? undefined : { ...transport };\n const options = { transport: transportSnapshot, signal };\n const agent =\n this.normalizedAgent.protocol === 'a2a'\n ? await this.ensureCanonicalUrlResolved(options)\n : await this.ensureEndpointDiscovered(options);\n return this.executor.getTaskStatus(agent, taskId, transportSnapshot, signal);\n }\n\n /** Register durable restart/replica settlement recovery for an SDK coordinator. @internal */\n registerDurableSettlementRecovery(\n recoverer: (\n operationId: string,\n observation: ExternalTaskSettlementObservation\n ) => Promise<ExternalTaskStatusResult | undefined>\n ): () => void {\n this.durableSettlementRecoverers.add(recoverer);\n return () => this.durableSettlementRecoverers.delete(recoverer);\n }\n\n /** Register exact-token authorization for committed deferred continuation recovery. @internal */\n registerDurableDeferredResumeAuthorization(\n authorizer: (operationId: string, token: string) => boolean | undefined | Promise<boolean | undefined>\n ): () => void {\n this.durableDeferredResumeAuthorizers.add(authorizer);\n return () => this.durableDeferredResumeAuthorizers.delete(authorizer);\n }\n\n /** Register owner-capability authorization for committed operation route discovery. @internal */\n registerDurableDeferredOperationRecoveryAuthorization(\n authorizer: (\n operationId: string,\n recoveryKey: string,\n purpose: 'pause-recovery' | 'callback-checkpoint'\n ) => boolean | undefined | Promise<boolean | undefined>\n ): () => void {\n this.durableDeferredOperationRecoveryAuthorizers.add(authorizer);\n return () => this.durableDeferredOperationRecoveryAuthorizers.delete(authorizer);\n }\n\n /** Register an atomic committed-route handoff for a nested durable pause. @internal */\n registerDurableDeferredResumeTokenReplacement(\n replacer: (\n operationId: string,\n currentToken: string,\n replacementToken: string\n ) => boolean | undefined | Promise<boolean | undefined>\n ): () => void {\n this.durableDeferredResumeTokenReplacers.add(replacer);\n return () => this.durableDeferredResumeTokenReplacers.delete(replacer);\n }\n\n /** Whether this exact continuation currently has a durable SDK checkpoint. @internal */\n hasDurablyStoredDeferredTask(token: string): Promise<boolean> {\n return this.executor.hasDurablyStoredDeferredTask(token);\n }\n\n /** Recover the current committed pause when its opaque token handoff was interrupted. @internal */\n recoverDeferredTaskForOperation<T>(\n operationId: string,\n recoveryKey: string,\n publishTerminalTaskStatus = true\n ): Promise<{ token: string; result: TaskResult<T> } | undefined> {\n return this.executor.recoverDeferredTaskForOperation(operationId, recoveryKey, publishTerminalTaskStatus);\n }\n\n /** Bridge a store-recovered callback into the deferred terminal checkpoint. @internal */\n checkpointExternalDeferredSettlement<T>(\n token: string,\n operationId: string,\n terminalResult: TaskResult<T>\n ): Promise<TaskResult<T> | undefined> {\n return this.executor.checkpointExternalDeferredSettlement(token, operationId, terminalResult);\n }\n\n /** Resolve and checkpoint the current generation using a separate owner capability. @internal */\n checkpointExternalDeferredSettlementForOperation<T>(\n operationId: string,\n recoveryKey: string,\n terminalResult: TaskResult<T>\n ): Promise<{ token: string; result?: TaskResult<T> } | undefined> {\n return this.executor.checkpointExternalDeferredSettlementForOperation(operationId, recoveryKey, terminalResult);\n }\n\n /** Publish a callback only after an external durable inbox has bound and settled it. @internal */\n async publishDurablySettledWebhook(args: {\n operationId: string;\n serverTaskId: string;\n taskType: string;\n status: import('./ConversationTypes').TaskStatus;\n result?: unknown;\n error?: string;\n idempotencyKey?: string;\n }): Promise<void> {\n const metadata: WebhookMetadata = {\n operation_id: args.operationId,\n task_id: args.serverTaskId,\n agent_id: this.agent.id,\n task_type: args.taskType,\n status: args.status,\n ...(args.error !== undefined && { message: args.error }),\n ...(args.idempotencyKey !== undefined && { idempotency_key: args.idempotencyKey }),\n timestamp: new Date().toISOString(),\n protocol: this.normalizedAgent.protocol,\n };\n await this.config.onActivity?.({\n type: 'webhook_received',\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n payload: args.result,\n timestamp: metadata.timestamp,\n });\n await this.asyncHandler?.handleDurablySettledResult({\n result: args.result as AdCPAsyncResponseData | undefined,\n metadata,\n });\n }\n\n private async recoverDurableSettlement(\n operationId: string,\n observation: ExternalTaskSettlementObservation\n ): Promise<ExternalTaskStatusResult | undefined> {\n for (const recoverer of this.durableSettlementRecoverers) {\n const recovered = await recoverer(operationId, observation);\n if (recovered) return recovered;\n }\n return undefined;\n }\n\n private async recoverPersistedDeferredTerminal(\n operationId: string,\n status: import('./ConversationTypes').TaskStatus,\n result: unknown,\n serverTaskId: string | undefined,\n taskType: string,\n idempotencyKey?: string\n ): Promise<ExternalTaskStatusResult> {\n if (!serverTaskId) {\n throw new Error('A committed deferred continuation completed without its trusted seller task identity.');\n }\n const recovered = await this.recoverDurableSettlement(operationId, {\n status,\n result,\n serverTaskId,\n taskType,\n ...(idempotencyKey !== undefined && { idempotencyKey }),\n deferredCheckpointOwned: true,\n });\n if (\n !recovered ||\n recovered.queued === true ||\n recovered.settled !== true ||\n recovered.status === undefined ||\n !DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(recovered.status)\n ) {\n throw new Error(\n 'The committed deferred continuation reached a terminal seller result, but durable settlement recovery was unavailable.'\n );\n }\n return recovered;\n }\n\n private taskResultFromRecoveredSettlement<T>(\n original: TaskResult<T>,\n recovered: ExternalTaskStatusResult\n ): TaskResult<T> {\n const status = recovered.status!;\n const settled = {\n ...original,\n success: status === 'completed',\n status,\n metadata: { ...original.metadata, status },\n } as TaskResult<T> & { data?: T; error?: string };\n if (recovered.result === undefined) delete settled.data;\n else settled.data = recovered.result as T;\n if (recovered.error === undefined) delete settled.error;\n else settled.error = recovered.error;\n const recoveredResult = attachMatch(settled as TaskResult<T>) as TaskResult<T>;\n if (hasCompletionHandlerAlreadyPublished(recovered)) {\n markCompletionHandlerAlreadyPublished(recoveredResult);\n }\n return recoveredResult;\n }\n\n private async wrapPersistedDeferredSettlement<T>(\n result: TaskResult<T>,\n operationId: string,\n persistedServerTaskId?: string\n ): Promise<{ result: TaskResult<T>; afterDispatch?: () => Promise<void> }> {\n if (DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(result.status)) {\n const recovered = await this.recoverPersistedDeferredTerminal(\n operationId,\n result.status,\n result.data,\n result.metadata.serverTaskId ?? persistedServerTaskId,\n result.metadata.taskName,\n result.metadata.idempotency_key\n );\n return {\n result: this.taskResultFromRecoveredSettlement(result, recovered),\n ...(recovered.afterDispatch !== undefined && { afterDispatch: recovered.afterDispatch }),\n };\n }\n if (result.deferred) {\n const deferred = result.deferred;\n result = attachMatch({\n ...result,\n deferred: {\n ...deferred,\n resume: input => this.resumeDeferredTask<T>(deferred.token, input),\n },\n } as TaskResult<T>);\n }\n if (!result.submitted) return { result };\n\n const submitted = result.submitted;\n return {\n result: attachMatch({\n ...result,\n submitted: {\n ...submitted,\n track: async transport => {\n const task = await submitted.track(transport);\n if (!DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(task.status as import('./ConversationTypes').TaskStatus)) {\n return task;\n }\n const recovered = await this.recoverPersistedDeferredTerminal(\n operationId,\n task.status as import('./ConversationTypes').TaskStatus,\n task.result,\n task.taskId ?? persistedServerTaskId,\n task.taskType\n );\n await recovered.afterDispatch?.();\n return {\n ...task,\n status: recovered.status!,\n ...(recovered.result === undefined ? { result: undefined } : { result: recovered.result }),\n ...(recovered.error === undefined ? { error: undefined } : { error: recovered.error }),\n };\n },\n waitForCompletion: async (pollInterval, signal) => {\n const completion = await submitted.waitForCompletion(pollInterval, signal);\n if (!DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(completion.status)) return completion;\n const recovered = await this.recoverPersistedDeferredTerminal(\n operationId,\n completion.status,\n completion.data,\n completion.metadata.serverTaskId ?? submitted.taskId ?? persistedServerTaskId,\n completion.metadata.taskName,\n completion.metadata.idempotency_key\n );\n const settled = this.taskResultFromRecoveredSettlement(completion, recovered);\n await recovered.afterDispatch?.();\n return settled;\n },\n },\n } as TaskResult<T>),\n };\n }\n\n /** Effective release pin emitted in protocol envelopes. @internal */\n getWireAdcpVersion(): string {\n return this.config.wireAdcpVersion ?? this.resolvedAdcpVersion;\n }\n\n /**\n * Ensure MCP endpoint is discovered (lazy initialization)\n *\n * If the agent needs discovery, perform it now and cache the result.\n * Returns the agent config with the discovered endpoint.\n * Also computes the canonical base URL by stripping /mcp suffix.\n */\n private async ensureEndpointDiscovered(options?: ReadRequestOptions): Promise<AgentConfig> {\n throwIfAborted(options?.signal);\n const needsDiscovery = this.normalizedAgent._needsDiscovery;\n const transport = normalizeTransportOptions(options?.transport ?? this.config.transport);\n const usesScopedFetch = transport?.trustedFetchFn !== undefined;\n\n if (!needsDiscovery) {\n return this.normalizedAgent;\n }\n\n // Already discovered? Use cached value\n if (!usesScopedFetch && this.discoveredAgent) {\n return this.discoveredAgent;\n }\n if (!usesScopedFetch && this.discoveredEndpoint) {\n this.discoveredAgent = {\n ...this.normalizedAgent,\n agent_uri: this.discoveredEndpoint,\n };\n if (this.normalizedAgent.oauth_tokens && !this.normalizedAgent.oauth_client_credentials) {\n const { shareNonInteractiveOAuthProvider } = await import('../auth/oauth/provider-cache');\n shareNonInteractiveOAuthProvider(this.normalizedAgent, this.discoveredAgent);\n }\n return this.discoveredAgent;\n }\n\n if (this.normalizedAgent.oauth_client_credentials) {\n const { ensureClientCredentialsTokens, getAgentStorage } = await import('../auth/oauth');\n await ensureClientCredentialsTokens(this.normalizedAgent, {\n storage: getAgentStorage(this.normalizedAgent),\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(this.normalizedAgent.agent_uri),\n fetch: transport?.trustedFetchFn,\n signal: options?.signal,\n });\n }\n\n // Perform discovery\n const discoveredEndpoint = await this.discoverMCPEndpoint(this.normalizedAgent.agent_uri, options);\n\n if (usesScopedFetch) {\n const discoveredAgent = { ...this.normalizedAgent, agent_uri: discoveredEndpoint };\n if (this.normalizedAgent.oauth_tokens && !this.normalizedAgent.oauth_client_credentials) {\n const { shareNonInteractiveOAuthProvider } = await import('../auth/oauth/provider-cache');\n shareNonInteractiveOAuthProvider(this.normalizedAgent, discoveredAgent);\n }\n return discoveredAgent;\n }\n\n this.discoveredEndpoint = discoveredEndpoint;\n\n // Compute canonical base URL by stripping /mcp suffix\n this.canonicalBaseUrl = this.computeBaseUrl(this.discoveredEndpoint);\n\n this.discoveredAgent = {\n ...this.normalizedAgent,\n agent_uri: this.discoveredEndpoint,\n };\n if (this.normalizedAgent.oauth_tokens && !this.normalizedAgent.oauth_client_credentials) {\n const { shareNonInteractiveOAuthProvider } = await import('../auth/oauth/provider-cache');\n shareNonInteractiveOAuthProvider(this.normalizedAgent, this.discoveredAgent);\n }\n return this.discoveredAgent;\n }\n\n /**\n * Ensure A2A canonical URL is resolved (lazy initialization)\n *\n * Fetches the agent card and extracts the canonical URL.\n * Returns the agent config with the canonical URL.\n */\n private async ensureCanonicalUrlResolved(options?: ReadRequestOptions): Promise<AgentConfig> {\n throwIfAborted(options?.signal);\n const needsCanonicalUrl = this.normalizedAgent._needsCanonicalUrl;\n const transport = normalizeTransportOptions(options?.transport ?? this.config.transport);\n const usesScopedFetch = transport?.trustedFetchFn !== undefined;\n\n if (!needsCanonicalUrl) {\n return this.normalizedAgent;\n }\n\n // Already resolved? Use cached value\n if (!usesScopedFetch && this.canonicalBaseUrl) {\n return {\n ...this.normalizedAgent,\n agent_uri: this.canonicalBaseUrl,\n };\n }\n\n if (this.normalizedAgent.oauth_client_credentials) {\n const { ensureClientCredentialsTokens, getAgentStorage } = await import('../auth/oauth');\n await ensureClientCredentialsTokens(this.normalizedAgent, {\n storage: getAgentStorage(this.normalizedAgent),\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(this.normalizedAgent.agent_uri),\n fetch: transport?.trustedFetchFn,\n signal: options?.signal,\n });\n }\n\n // Fetch agent card to get canonical URL\n const canonicalUrl = await this.fetchA2ACanonicalUrl(this.normalizedAgent.agent_uri, options);\n if (!usesScopedFetch) this.canonicalBaseUrl = canonicalUrl;\n\n return {\n ...this.normalizedAgent,\n agent_uri: canonicalUrl,\n };\n }\n\n /**\n * Fetch the canonical URL from an A2A agent card\n *\n * Special handling for authentication errors (401):\n * - If the agent card fetch returns 401, throw AuthenticationRequiredError\n * - Check for OAuth metadata to provide helpful guidance\n */\n private async fetchA2ACanonicalUrl(agentUri: string, readOptions?: ReadRequestOptions): Promise<string> {\n // adcp-client#1804 — wrap A2A card discovery in withResponseSizeLimit so\n // `transport.maxResponseBytes` applies to every agent-card fetch. The\n // auth-stamping fetchImpl composes through wrapFetchWithSizeLimit so the\n // active ALS slot enforces the cap on the wire call. Matches the same\n // pattern in `getAgentInfo` (closed #1799 via PR #1802).\n const { withResponseSizeLimit, wrapFetchWithSizeLimit } = await import('../protocols/responseSizeLimit');\n const transport = normalizeTransportOptions(readOptions?.transport ?? this.config.transport);\n const maxResponseBytes = transport?.maxResponseBytes;\n const requestTimeoutMs = resolveRequestTimeoutMs(transport?.requestTimeoutMs, DEFAULT_REQUEST_TIMEOUT_MS);\n const sizeLimitedFetch = wrapFetchWithSizeLimit(\n createAgentTransportFetch(agentUri, {\n trustedFetchFn: transport?.trustedFetchFn,\n allowPrivateIp: transport?.allowPrivateIp,\n })\n );\n\n const authToken = this.normalizedAgent.oauth_client_credentials\n ? this.normalizedAgent.oauth_tokens?.access_token\n : this.normalizedAgent.auth_token;\n let got401 = false;\n\n const fetchImpl = async (url: string | URL | Request, requestInit?: RequestInit) => {\n const headers: Record<string, string> = {\n ...(requestInit?.headers as Record<string, string>),\n ...this.normalizedAgent.headers,\n ...(authToken && {\n Authorization: `Bearer ${authToken}`,\n 'x-adcp-auth': authToken,\n }),\n };\n\n const response = await withAbortSignal<Response>(\n [readOptions?.signal, requestInit?.signal],\n requestTimeoutMs,\n signal => sizeLimitedFetch(url as RequestInfo | URL, { ...requestInit, headers, signal })\n );\n\n // Track 401 errors for later handling\n if (response.status === 401) {\n got401 = true;\n }\n\n return response;\n };\n\n const cardUrls = buildCardUrls(agentUri);\n\n try {\n let client: InstanceType<typeof A2AClient> | undefined;\n let lastError: Error = new Error(`A2A agent card not found at ${cardUrls.join(', ')}`);\n for (const cardUrl of cardUrls) {\n try {\n client = await withResponseSizeLimit(maxResponseBytes, () => A2AClient.fromCardUrl(cardUrl, { fetchImpl }));\n break;\n } catch (err: unknown) {\n lastError = err as Error;\n if (got401) break;\n }\n }\n if (!client) {\n throw lastError;\n }\n const agentCard = await withResponseSizeLimit(maxResponseBytes, async () =>\n client.agentCardPromise ? client.agentCardPromise : client.agentCard\n );\n\n // Use the canonical URL from the agent card, falling back to computed base URL\n if (agentCard?.url) {\n return agentCard.url;\n }\n\n return this.computeBaseUrl(agentUri);\n } catch (error: unknown) {\n // If we got a 401, throw the richer NeedsAuthorizationError when the\n // full discovery walk succeeds; otherwise fall back to the simpler\n // one-hop AuthenticationRequiredError so behavior degrades gracefully.\n if (is401Error(error, got401)) {\n const requirements = await discoverAuthorizationRequirements(agentUri, {\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(agentUri),\n fetchFn: transport?.trustedFetchFn,\n signal: readOptions?.signal,\n });\n if (requirements) {\n throw new NeedsAuthorizationError(requirements);\n }\n // `discoverAuthorizationRequirements` returned null — either no PRM\n // walk available, or the 401 challenge wasn't Bearer. Re-probe to\n // surface the scheme on the error (Basic-fronted gateways are the\n // common non-Bearer case) so consumers don't bounce through OAuth\n // remediation that will never succeed.\n const challenge = await probeAuthChallenge(agentUri, {\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(agentUri),\n fetchFn: transport?.trustedFetchFn,\n signal: readOptions?.signal,\n });\n const oauthMetadata = await discoverOAuthMetadata(agentUri, {\n trustedFetchFn: transport?.trustedFetchFn,\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(agentUri),\n signal: readOptions?.signal,\n });\n throw new AuthenticationRequiredError(agentUri, oauthMetadata || undefined, undefined, challenge ?? undefined);\n }\n\n // Re-throw other errors\n throw error;\n }\n }\n\n /**\n * Compute base URL by stripping protocol-specific suffixes\n *\n * - Strips /.well-known/agent.json or /.well-known/agent-card.json for A2A discovery URLs\n * - Strips the protocol transport suffix (/mcp, /a2a, /sse)\n * - Strips trailing slash for consistency\n */\n private computeBaseUrl(url: string): string {\n let baseUrl = stripAgentCardPath(url);\n baseUrl = stripTransportSuffix(baseUrl);\n baseUrl = baseUrl.replace(/\\/$/, '');\n return baseUrl;\n }\n\n private isWellKnownAgentCardUrl(url: string): boolean {\n return isWellKnownCardUrl(url);\n }\n\n /**\n * Discover MCP endpoint by testing the provided path, then trying variants\n *\n * Strategy:\n * 1. Test the exact URL provided (preserving trailing slashes)\n * 2. If that fails, try with/without trailing slash\n * 3. If still fails and doesn't end with /mcp, try adding /mcp\n *\n * Special handling for authentication errors (401):\n * - If any endpoint returns 401, we know the server exists but requires auth\n * - We fetch OAuth metadata and throw AuthenticationRequiredError\n * - This gives consumers clear guidance on how to authenticate\n *\n * Note: This is async and called lazily on first agent interaction\n */\n private async discoverMCPEndpoint(providedUri: string, options?: ReadRequestOptions): Promise<string> {\n throwIfAborted(options?.signal);\n const { connectMCPWithFallback } = await import('../protocols/mcp');\n const { probeModernMCPConnection } = await import('../protocols/mcp-modern');\n const transport = normalizeTransportOptions(options?.transport ?? this.config.transport);\n const usesScopedFetch = transport?.trustedFetchFn !== undefined;\n\n const authToken = this.normalizedAgent.oauth_client_credentials\n ? this.normalizedAgent.oauth_tokens?.access_token\n : this.agent.auth_token;\n const agentHeaders = this.agent.headers;\n const authHeaders = createMCPRequestHeaders(agentHeaders, authToken);\n const oauth =\n this.normalizedAgent.oauth_tokens && !this.normalizedAgent.oauth_client_credentials\n ? await import('../auth/oauth')\n : undefined;\n const authProvider = oauth\n ? (await import('../auth/oauth/provider-cache')).getNonInteractiveOAuthProvider(this.normalizedAgent, {\n agentHint: this.normalizedAgent.id,\n storage: oauth.getAgentStorage(this.normalizedAgent),\n allowHttp: isLikelyPrivateUrl(this.normalizedAgent.agent_uri),\n })\n : undefined;\n\n type EndpointTestResult = {\n success: boolean;\n status?: number;\n error?: unknown;\n };\n\n const testEndpoint = async (url: string): Promise<EndpointTestResult> => {\n try {\n const modern = await probeModernMCPConnection(url, authToken, agentHeaders, {\n authProvider,\n signal: options?.signal,\n requestTimeoutMs: transport?.requestTimeoutMs,\n fetchFn: transport?.trustedFetchFn,\n allowPrivateIp: transport?.allowPrivateIp,\n });\n if (modern.connected) {\n if (!usesScopedFetch) {\n this.discoveredMcpEra = modern.era;\n this.discoveredMcpEraAt = Date.now();\n }\n return { success: true };\n }\n\n // The v2 Streamable HTTP probe could not connect. Preserve the\n // established v1 Streamable→SSE fallback for old SSE-only agents.\n const client = await connectMCPWithFallback(\n new URL(url),\n authHeaders,\n [],\n 'endpoint discovery',\n transport?.trustedFetchFn,\n {\n signal: options?.signal,\n requestTimeoutMs: transport?.requestTimeoutMs,\n allowPrivateIp: transport?.allowPrivateIp,\n }\n );\n await client.close();\n if (!usesScopedFetch) {\n this.discoveredMcpEra = 'legacy';\n this.discoveredMcpEraAt = Date.now();\n }\n return { success: true };\n } catch (error: unknown) {\n if (isAbortOrTimeoutError(error)) {\n throw error;\n }\n if (is401Error(error)) {\n return { success: false, status: 401, error };\n }\n const errObj = error as Record<string, unknown>;\n const status =\n (errObj?.status as number | undefined) ||\n ((errObj?.response as Record<string, unknown>)?.status as number | undefined) ||\n ((errObj?.cause as Record<string, unknown>)?.status as number | undefined);\n return { success: false, status, error };\n }\n };\n\n const urlsToTry: string[] = [];\n\n // 1. Always try the exact URL provided first\n urlsToTry.push(providedUri);\n\n // 2. Try the opposite trailing slash variant\n const hasTrailingSlash = providedUri.endsWith('/');\n const alternateSlash = hasTrailingSlash\n ? providedUri.slice(0, -1) // Remove trailing slash\n : providedUri + '/'; // Add trailing slash\n urlsToTry.push(alternateSlash);\n\n // 3. If URL doesn't end with /mcp or /mcp/, try adding /mcp\n const normalizedUri = providedUri.replace(/\\/$/, '');\n if (!normalizedUri.endsWith('/mcp')) {\n urlsToTry.push(normalizedUri + '/mcp');\n urlsToTry.push(normalizedUri + '/mcp/');\n }\n\n // Remove duplicates while preserving order\n const uniqueUrls = [...new Set(urlsToTry)];\n\n // Track results and whether we got any 401s\n let got401 = false;\n let firstWorkingUrl: string | undefined;\n\n // Test each URL\n for (const url of uniqueUrls) {\n const result = await testEndpoint(url);\n\n if (result.success) {\n firstWorkingUrl = url;\n break;\n }\n\n if (result.status === 401) {\n got401 = true;\n }\n }\n\n if (firstWorkingUrl) {\n return firstWorkingUrl;\n }\n\n // If we got 401 from any endpoint, throw an authentication-required error.\n // Prefer the richer NeedsAuthorizationError when we can walk the full\n // RFC 9728 chain (PRM → AS metadata → endpoints + scopes + DCR hint).\n // Fall back to the simpler AuthenticationRequiredError with one-hop AS\n // metadata when the walk doesn't yield enough.\n if (got401) {\n const requirements = await discoverAuthorizationRequirements(providedUri, {\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(providedUri),\n fetchFn: transport?.trustedFetchFn,\n signal: options?.signal,\n });\n if (requirements) {\n throw new NeedsAuthorizationError(requirements);\n }\n // Non-Bearer 401 (or Bearer-without-PRM). Re-probe to surface the\n // scheme on the error envelope — `Basic` is the common shape for\n // gateway-fronted agents (Apigee, Kong, AWS API GW) and routing\n // consumers at OAuth would never succeed.\n const challenge = await probeAuthChallenge(providedUri, {\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(providedUri),\n fetchFn: transport?.trustedFetchFn,\n signal: options?.signal,\n });\n const oauthMetadata = await discoverOAuthMetadata(providedUri, {\n trustedFetchFn: transport?.trustedFetchFn,\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(providedUri),\n signal: options?.signal,\n });\n throw new AuthenticationRequiredError(providedUri, oauthMetadata || undefined, undefined, challenge ?? undefined);\n }\n\n // None worked and no 401 - generic discovery failure.\n // The most common cause is `agent_uri` pointing at the host root when the\n // MCP endpoint lives at a non-standard path; the SDK only auto-probes `/`,\n // `/mcp`, and `/mcp/`. Surface that hint so operators can fix the\n // registration instead of debugging transport.\n throw new Error(\n `Failed to discover MCP endpoint. Tried:\\n` +\n uniqueUrls.map((url, i) => ` ${i + 1}. ${url}`).join('\\n') +\n '\\n' +\n `None responded to MCP protocol.\\n\\n` +\n `Hint: this usually means agent_uri does not include the MCP endpoint path. ` +\n `The SDK auto-appends /mcp and /mcp/ (plus a trailing-slash variant) ` +\n `to the provided path. If your server exposes MCP at a different path ` +\n `(e.g. /api/mcp, /v1/mcp) or uses legacy SSE at /sse, register that ` +\n `exact path as agent_uri.`\n );\n }\n\n /**\n * Normalize agent config\n *\n * - If URL is a well-known agent card URL, switch to A2A protocol\n * (these are A2A discovery URLs, not MCP endpoints)\n * - A2A agents are marked for canonical URL resolution (from agent card)\n * - MCP agents are marked for endpoint discovery\n */\n private normalizeAgentConfig(agent: AgentConfig): InternalAgentConfig {\n // If URL is a well-known agent card URL, use A2A protocol regardless of what was specified\n // Mark for canonical URL resolution - we'll fetch the agent card and use its url field\n if (this.isWellKnownAgentCardUrl(agent.agent_uri)) {\n return {\n ...agent,\n protocol: 'a2a',\n _needsCanonicalUrl: true,\n };\n }\n\n if (agent.protocol === 'a2a') {\n // A2A agents need canonical URL resolution from agent card\n return {\n ...agent,\n _needsCanonicalUrl: true,\n };\n }\n\n if (agent.protocol !== 'mcp') {\n return agent;\n }\n\n // In-process MCP clients have no HTTP endpoint to discover\n if (agent._inProcessMcpClient) {\n return agent;\n }\n\n // MCP agents need endpoint discovery - we'll test their path, then try adding /mcp\n return {\n ...agent,\n _needsDiscovery: true,\n };\n }\n\n /**\n * Handle webhook from agent (async task status updates and completions)\n *\n * Accepts webhook payloads from both MCP and A2A protocols:\n * 1. MCP: MCPWebhookPayload envelope with AdCP data in .result field\n * 2. A2A: Native Task/TaskStatusUpdateEvent with AdCP data in either:\n * - status.message.parts[].data (for status updates)\n * - artifacts (for task completion, per A2A spec)\n *\n * The method normalizes both formats so handlers receive the unwrapped\n * AdCP response data (AdCPAsyncResponseData), not the raw protocol structure.\n *\n * @param payload - Protocol-specific webhook payload (MCPWebhookPayload | Task | TaskStatusUpdateEvent)\n * @param taskType - Task type (e.g create_media_buy) from url param or url part of the webhook delivery\n * @param operationId - Operation id (e.g used for client app to track the operation) from the param or url part of the webhook delivery\n * @param signature - X-ADCP-Signature header (format: \"sha256=...\")\n * @param timestamp - X-ADCP-Timestamp header (Unix timestamp)\n * @returns Whether webhook was handled successfully\n *\n * @example\n * ```typescript\n * app.post(\n * '/webhook/:task_type/:operation_id',\n * express.raw({ type: 'application/json' }),\n * client.createWebhookHandler({\n * getRequestUrl: req => `https://buyer.example${req.originalUrl}`,\n * }),\n * );\n * ```\n *\n * `createWebhookHandler()` preserves the SDK's typed HTTP mapping: authentication\n * failures return 401, invalid/conflicting deliveries return 400/409, rate abuse\n * returns 429, and transient verification, storage, or publication failures return\n * 503 for seller retry. Do not map every `handleWebhook()` exception to 401.\n */\n async handleWebhook(\n payload: MCPWebhookPayload | A2ATask | TaskStatusUpdateEvent,\n taskType: string,\n operationId: string,\n signature?: WebhookHeaderValue,\n timestamp?: WebhookHeaderValue,\n rawBody?: string | Buffer | Uint8Array\n ): Promise<boolean> {\n const parsed = await this.verifyAndParseWebhook({\n payload,\n taskType,\n operationId,\n signature,\n timestamp,\n rawBody,\n });\n if (!parsed.ok) {\n throw new WebhookDispatchError(parsed.code, parsed.message, parsed.cause);\n }\n\n return this.dispatchParsedWebhook(parsed);\n }\n\n /**\n * Verify and normalize an inbound webhook without dispatching handlers.\n *\n * This is the lower-level receiver primitive for integrations that need to\n * map malformed webhooks to precise HTTP responses. It verifies the mode\n * selected by the trusted outbound registration (RFC 9421 by default, or\n * legacy HMAC when `webhookSecret` was used), parses raw JSON bodies,\n * validates the transport envelope shape, and returns the canonicalized\n * AdCP result plus routing metadata. Legacy wire inspection is intentionally\n * confined to the transport adapter and is not returned by this primary API.\n */\n async verifyAndParseWebhook(options: VerifyAndParseWebhookOptions): Promise<WebhookParseResult> {\n const rawBody = options.rawBody ?? rawBodyFromUnknown(options.body);\n const authHeaders = inspectWebhookAuthenticationHeaders(options.headers, options.signature, options.timestamp);\n const trustedOperationId =\n options.operationId && options.operationId !== 'unknown' ? options.operationId : undefined;\n let registration: Readonly<WebhookRegistration> | undefined;\n if (trustedOperationId) {\n try {\n registration = await this.webhookRegistrationStore.get(this.agent.id, trustedOperationId);\n } catch (cause) {\n const routedTaskType = options.taskType && options.taskType !== 'unknown' ? options.taskType : undefined;\n if (\n !this.config.webhookSecret ||\n routedTaskType === undefined ||\n !RECORDLESS_HMAC_READ_ONLY_TASKS.has(routedTaskType)\n ) {\n return {\n ok: false,\n code: 'webhook_registration_store_unavailable',\n message: 'Webhook registration state is temporarily unavailable.',\n cause,\n };\n }\n }\n }\n if (registration && (registration.agentId !== this.agent.id || registration.operationId !== trustedOperationId)) {\n return {\n ok: false,\n code: 'webhook_registration_store_unavailable',\n message: 'Webhook registration state is inconsistent with the trusted route.',\n };\n }\n if (registration) {\n const nowMs = this.config.webhookVerification?.now\n ? Math.floor(this.config.webhookVerification.now() * 1000)\n : Date.now();\n if (!Number.isFinite(registration.createdAt) || !Number.isFinite(registration.expiresAt)) {\n return {\n ok: false,\n code: 'webhook_registration_store_unavailable',\n message: 'Webhook registration state contains invalid timestamps.',\n };\n }\n try {\n const registeredAgentUrl = new URL(registration.agentUrl);\n if (registeredAgentUrl.username || registeredAgentUrl.password) {\n throw new TypeError('Webhook registration seller URL contains userinfo.');\n }\n } catch (cause) {\n return {\n ok: false,\n code: 'webhook_registration_store_unavailable',\n message: 'Webhook registration state contains an invalid seller URL.',\n cause,\n };\n }\n if (registration.expiresAt <= nowMs) registration = undefined;\n }\n\n const trustedRouteTaskType = options.taskType && options.taskType !== 'unknown' ? options.taskType : undefined;\n if (\n !registration &&\n this.config.webhookSecret &&\n (trustedRouteTaskType === undefined || !RECORDLESS_HMAC_READ_ONLY_TASKS.has(trustedRouteTaskType))\n ) {\n return {\n ok: false,\n code: 'webhook_registration_store_unavailable',\n message: 'A trusted webhook registration is required for this task type.',\n };\n }\n\n if (authHeaders.hasRfc9421 && !trustedOperationId) {\n return {\n ok: false,\n code: 'webhook_verification_context_missing',\n message: 'RFC 9421 verification requires a trusted route operation id.',\n };\n }\n if (registration) {\n const routedTaskType = options.taskType === 'unknown' ? undefined : options.taskType;\n if (routedTaskType !== undefined && routedTaskType !== registration.taskType) {\n return {\n ok: false,\n code: 'webhook_registration_mismatch',\n message: 'Trusted webhook route does not match the registered task type.',\n };\n }\n const oppositeMode =\n (registration.mode === 'rfc9421' && authHeaders.hasLegacy) ||\n (registration.mode === 'hmac-sha256' && authHeaders.hasRfc9421);\n if (oppositeMode) {\n const cause = new WebhookSignatureError(\n 'webhook_mode_mismatch',\n 1,\n 'Received webhook authentication mode does not match the registered callback mode.'\n );\n return { ok: false, code: cause.code, message: cause.message, cause };\n }\n }\n if (!registration && this.config.webhookSecret && authHeaders.hasRfc9421) {\n const cause = new WebhookSignatureError(\n 'webhook_mode_mismatch',\n 1,\n 'RFC 9421 signature headers do not match the configured legacy HMAC receiver mode.'\n );\n return { ok: false, code: cause.code, message: cause.message, cause };\n }\n if (registration?.mode === 'rfc9421') {\n if (\n rawBody === undefined ||\n !options.headers ||\n !trustedOperationId ||\n !options.requestMethod ||\n !options.requestUrl\n ) {\n return {\n ok: false,\n code: 'webhook_verification_context_missing',\n message:\n 'RFC 9421 verification requires raw body bytes, all headers, POST method, an absolute trusted public URL, and a trusted route operation id.',\n };\n }\n if (options.requestMethod.toUpperCase() !== 'POST') {\n return {\n ok: false,\n code: 'webhook_verification_context_missing',\n message: 'Webhook request method must be POST.',\n };\n }\n try {\n if (canonicalTargetUri(options.requestUrl) !== canonicalTargetUri(registration.callbackUrl)) {\n const cause = new WebhookSignatureError(\n 'webhook_signature_invalid',\n 10,\n 'Trusted request URL does not match the registered callback URL.'\n );\n return { ok: false, code: cause.code, message: cause.message, cause };\n }\n } catch (cause) {\n return {\n ok: false,\n code: 'webhook_verification_context_missing',\n message: 'Webhook request URL must be a valid absolute public URL.',\n cause,\n };\n }\n const normalizedHeaders = normalizeRfc9421WebhookHeaders(options.headers);\n if (!normalizedHeaders.ok) return normalizedHeaders.failure;\n try {\n await verifyRfc9421WebhookSignature(\n {\n method: options.requestMethod,\n url: options.requestUrl,\n headers: normalizedHeaders.headers,\n body: rawBody,\n },\n {\n jwks: this.webhookJwksFor(registration),\n replayStore: this.webhookReplayStore,\n revocationStore: this.webhookRevocationStore,\n ...(this.config.webhookVerification?.now && { now: this.config.webhookVerification.now }),\n agentUrlForKeyid: () => registration.agentUrl,\n }\n );\n } catch (cause) {\n if (cause instanceof WebhookSignatureError) {\n return { ok: false, code: cause.code, message: cause.message, cause };\n }\n return {\n ok: false,\n code: 'webhook_verification_unavailable',\n message: 'Seller signing keys could not be resolved for webhook verification.',\n cause,\n };\n }\n } else if (registration?.mode === 'hmac-sha256' || (!registration && this.config.webhookSecret)) {\n if (rawBody === undefined) {\n return {\n ok: false,\n code: 'webhook_signature_invalid',\n message: 'Raw webhook body required for HMAC signature verification; capture bytes before JSON parsing.',\n };\n }\n let hmacSecret: string | undefined;\n try {\n hmacSecret = this.config.webhookSecret;\n } catch (cause) {\n return {\n ok: false,\n code: 'webhook_verification_unavailable',\n message: 'Legacy webhook key material is temporarily unavailable.',\n cause,\n };\n }\n if (!hmacSecret) {\n return {\n ok: false,\n code: 'webhook_verification_unavailable',\n message: 'Legacy webhook key material is unavailable for this registration.',\n };\n }\n const check = verifyWebhookRequest({\n rawBody,\n secret: hmacSecret,\n headers: options.headers,\n signature: options.signature,\n timestamp: options.timestamp,\n });\n if (!check.ok) {\n return {\n ok: false,\n code:\n check.reason === 'invalid_timestamp' || check.reason === 'stale_timestamp'\n ? 'webhook_timestamp_invalid'\n : 'webhook_signature_invalid',\n message: check.message,\n };\n }\n } else if (\n this.config.allowUnauthenticatedWebhooks === true &&\n !registration &&\n !authHeaders.hasRfc9421 &&\n !authHeaders.hasLegacy\n ) {\n warnUnverifiedWebhookReceive();\n } else {\n return {\n ok: false,\n code: authHeaders.hasRfc9421 ? 'webhook_registration_not_found' : 'webhook_unverifiable',\n message: 'Refusing a webhook without trusted registration provenance or a configured legacy HMAC secret.',\n };\n }\n\n const payloadSource =\n (registration || this.config.webhookSecret) && rawBody !== undefined\n ? rawBody\n : (options.payload ?? options.body ?? rawBody);\n const parsedPayload = parseWebhookBody(payloadSource);\n if (!parsedPayload.ok) {\n return parsedPayload;\n }\n\n const topLevelTaskType =\n isObjectRecord(parsedPayload.payload) && typeof parsedPayload.payload.task_type === 'string'\n ? parsedPayload.payload.task_type\n : undefined;\n const payloadRecord = isObjectRecord(parsedPayload.payload) ? parsedPayload.payload : undefined;\n const signedRoute = extractSignedWebhookRoute(parsedPayload.payload);\n if (!signedRoute.ok) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: signedRoute.message,\n };\n }\n const parsedTaskType = signedRoute.taskType ?? topLevelTaskType;\n if (!registration && this.config.webhookSecret && trustedOperationId === undefined) {\n return {\n ok: false,\n code: 'webhook_verification_context_missing',\n message: 'Legacy HMAC verification requires a trusted route operation id.',\n };\n }\n const hmacAuthenticated = registration?.mode === 'hmac-sha256' || (!registration && this.config.webhookSecret);\n if (\n hmacAuthenticated &&\n (signedRoute.operationId === undefined ||\n signedRoute.operationId !== trustedOperationId ||\n signedRoute.taskType === undefined ||\n signedRoute.taskType !== trustedRouteTaskType)\n ) {\n return {\n ok: false,\n code: 'webhook_registration_mismatch',\n message: 'Legacy HMAC webhook body is not bound to the trusted callback route.',\n };\n }\n if (\n registration &&\n ((signedRoute.operationId !== undefined && signedRoute.operationId !== registration.operationId) ||\n (signedRoute.taskType !== undefined && signedRoute.taskType !== registration.taskType) ||\n (signedRoute.agentId !== undefined && signedRoute.agentId !== registration.agentId))\n ) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Authenticated webhook routing fields do not match the trusted registration.',\n };\n }\n const associatedTaskTypes = new Set(\n [\n options.operationId,\n typeof payloadRecord?.operation_id === 'string' ? payloadRecord.operation_id : undefined,\n typeof payloadRecord?.task_id === 'string' ? payloadRecord.task_id : undefined,\n typeof payloadRecord?.context_id === 'string' ? payloadRecord.context_id : undefined,\n ].flatMap(id => {\n const taskType = this.canonicalCreativeTaskAssociation(id)?.taskType;\n return taskType ? [taskType] : [];\n })\n );\n const associatedTaskType = associatedTaskTypes.size === 1 ? [...associatedTaskTypes][0] : undefined;\n const routedTaskType = options.taskType === 'unknown' ? undefined : options.taskType;\n const declaredTaskType = routedTaskType ?? parsedTaskType;\n const previewOperationId =\n typeof payloadRecord?.operation_id === 'string' ? payloadRecord.operation_id : options.operationId;\n const localPreviewHandler =\n declaredTaskType === 'preview_creative' && previewOperationId\n ? this.previewCreativeHandlerForWebhook({\n operation_id: previewOperationId,\n task_id: '',\n context_id: '',\n task_type: 'preview_creative',\n })\n : undefined;\n // Durable registration provenance wins when available. During the legacy\n // HMAC store-outage fallback, the operation-scoped local marker must win\n // over a stale canonical association on a reused task or context id.\n const previewHandler = registration?.previewMode ?? localPreviewHandler;\n const authoritativePreviewTask = declaredTaskType === 'preview_creative' && previewHandler !== undefined;\n if (\n !authoritativePreviewTask &&\n (associatedTaskTypes.size > 1 ||\n (associatedTaskType !== undefined && declaredTaskType !== undefined && associatedTaskType !== declaredTaskType))\n ) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Webhook task_type does not match the locally tracked task association.',\n };\n }\n let normalizedTaskType = authoritativePreviewTask ? declaredTaskType : (associatedTaskType ?? declaredTaskType);\n try {\n const normalizedPayload = this.normalizeWebhookPayload(\n parsedPayload.payload,\n normalizedTaskType ?? 'unknown',\n options.operationId ?? 'unknown',\n registration?.mode === 'rfc9421'\n );\n normalizedTaskType = normalizedPayload.task_type;\n if (registration && (normalizedPayload.protocol ?? 'mcp') !== registration.protocol) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Authenticated webhook protocol does not match the trusted registration.',\n };\n }\n if (\n !authoritativePreviewTask &&\n associatedTaskType !== undefined &&\n normalizedPayload.task_type !== associatedTaskType\n ) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Webhook task_type does not match the locally tracked task association.',\n };\n }\n const metadata: WebhookMetadata = {\n operation_id: normalizedPayload.operation_id,\n context_id: normalizedPayload.context_id,\n task_id: normalizedPayload.task_id,\n agent_id: this.agent.id,\n task_type: normalizedPayload.task_type,\n status: normalizedPayload.status,\n message: normalizedPayload.message,\n timestamp: normalizedPayload.timestamp || new Date().toISOString(),\n idempotency_key: normalizedPayload.idempotency_key,\n notification_id: normalizedPayload.notification_id,\n protocol: normalizedPayload.protocol ?? 'mcp',\n };\n const canonicalCreativeTask =\n CANONICAL_CREATIVE_ACTIVITY_TASKS.has(normalizedPayload.task_type) ||\n (normalizedPayload.task_type === 'preview_creative' &&\n (previewHandler !== undefined ? previewHandler === 'canonical' : associatedTaskType === 'preview_creative'));\n const canonicalResult = this.canonicalizeWebhookCreativeResult(\n metadata,\n normalizedPayload.result,\n canonicalCreativeTask\n );\n const legacyFormatConverter = this.legacyFormatConverterForWebhook(metadata);\n const canonicalEnvelope = canonicalCreativeTask\n ? stripLegacyCreativeIdentity(\n projectCanonicalCreativeResponseValue(\n parsedPayload.payload,\n normalizedPayload.task_type,\n legacyFormatConverter\n )\n )\n : parsedPayload.payload;\n const canonicalMessage = canonicalCreativeTask\n ? (\n stripLegacyCreativeIdentity({\n message: normalizedPayload.message,\n legacySource: parsedPayload.payload,\n }) as { message?: string }\n ).message\n : normalizedPayload.message;\n return {\n ok: true,\n protocol: normalizedPayload.protocol ?? 'mcp',\n envelope: canonicalEnvelope as MCPWebhookPayload | A2ATask | TaskStatusUpdateEvent,\n result: canonicalResult,\n metadata: {\n operationId: normalizedPayload.operation_id,\n contextId: normalizedPayload.context_id,\n taskId: normalizedPayload.task_id,\n taskType: normalizedPayload.task_type,\n status: normalizedPayload.status,\n message: canonicalMessage,\n previewHandler,\n timestamp: normalizedPayload.timestamp,\n idempotencyKey: normalizedPayload.idempotency_key,\n notificationId: normalizedPayload.notification_id,\n requiresDurableSettlement: registration?.requiresDurableSettlement,\n },\n };\n } catch (error) {\n const canonicalCreativeTask =\n normalizedTaskType !== undefined &&\n (CANONICAL_CREATIVE_ACTIVITY_TASKS.has(normalizedTaskType) ||\n (normalizedTaskType === 'preview_creative' &&\n (previewHandler !== undefined\n ? previewHandler === 'canonical'\n : associatedTaskType === 'preview_creative')));\n if (error instanceof WebhookDispatchError) {\n if (!canonicalCreativeTask) {\n return { ok: false, code: error.code, message: error.message };\n }\n const safe = stripLegacyCreativeIdentity({\n message: error.message,\n legacySource: parsedPayload.payload,\n }) as { message: string };\n return { ok: false, code: error.code, message: safe.message };\n }\n const message = error instanceof Error ? error.message : 'Webhook payload could not be normalized.';\n if (canonicalCreativeTask) {\n const safe = stripLegacyCreativeIdentity({ message, legacySource: parsedPayload.payload }) as {\n message: string;\n };\n return { ok: false, code: 'webhook_result_invalid', message: safe.message };\n }\n return {\n ok: false,\n code: 'webhook_result_invalid',\n message: 'Webhook payload could not be normalized.',\n };\n }\n }\n\n private async dispatchParsedWebhook(parsed: WebhookParseSuccess): Promise<boolean> {\n if (parsed.metadata.taskType === 'preview_creative' && parsed.metadata.previewHandler) {\n for (const key of [parsed.metadata.operationId, parsed.metadata.taskId, parsed.metadata.contextId]) {\n if (!key) continue;\n this.rememberPreviewCreativeHandlerKey(key, parsed.metadata.previewHandler);\n if (parsed.metadata.previewHandler === 'canonical') {\n this.rememberCanonicalCreativeTaskAssociation(key, 'preview_creative');\n } else {\n this.canonicalCreativeTaskAssociations.delete(key);\n }\n }\n }\n const canonicalCreativeTask =\n parsed.metadata.taskType === 'preview_creative' && parsed.metadata.previewHandler !== undefined\n ? parsed.metadata.previewHandler === 'canonical'\n : this.isCanonicalCreativeWebhook({\n operation_id: parsed.metadata.operationId,\n context_id: parsed.metadata.contextId,\n task_id: parsed.metadata.taskId,\n task_type: parsed.metadata.taskType,\n });\n let metadata: WebhookMetadata = {\n operation_id: parsed.metadata.operationId,\n context_id: parsed.metadata.contextId,\n task_id: parsed.metadata.taskId,\n agent_id: this.agent.id,\n task_type: parsed.metadata.taskType,\n status: parsed.metadata.status,\n message: parsed.metadata.message,\n timestamp: parsed.metadata.timestamp || new Date().toISOString(),\n idempotency_key: parsed.metadata.idempotencyKey,\n notification_id: parsed.metadata.notificationId,\n protocol: parsed.protocol,\n rawHTTPPayload: canonicalCreativeTask ? stripLegacyCreativeIdentity(parsed.envelope) : parsed.envelope,\n };\n try {\n this.asyncHandler?.assertWebhookDedupInput(metadata);\n } catch (error) {\n if (error instanceof WebhookDedupInputError) {\n throw new WebhookDispatchError('webhook_envelope_invalid', error.message, error);\n }\n throw error;\n }\n this.rememberCanonicalCreativeWebhookContext(metadata);\n let externalStatus: ExternalTaskStatusResult | undefined;\n let forgetPolicyState = false;\n try {\n const canonicalResult = this.canonicalizeWebhookCreativeResult(metadata, parsed.result, canonicalCreativeTask);\n const dedupResult = canonicalResult as AdCPAsyncResponseData | undefined;\n const dedupMetadata = { ...metadata };\n let webhookResult = dedupResult;\n let suppressHandler = false;\n\n const dispatchClaimedWebhook = async (): Promise<boolean> => {\n try {\n const policyDispatch = await this.applyProductPropertyPolicyToWebhookResult(webhookResult, metadata);\n webhookResult = policyDispatch.result;\n metadata = policyDispatch.metadata;\n suppressHandler = policyDispatch.suppressHandler;\n\n if (metadata.task_type === 'request_proposals') {\n assertNativeRequestProposalsResult(webhookResult);\n }\n\n const observation = {\n status: metadata.status as import('./ConversationTypes').TaskStatus,\n result: webhookResult,\n serverTaskId: metadata.task_id,\n taskType: metadata.task_type,\n ...(metadata.idempotency_key !== undefined && { idempotencyKey: metadata.idempotency_key }),\n };\n if (parsed.metadata.requiresDurableSettlement === true) {\n const recovered = await this.recoverDurableSettlement(metadata.operation_id, observation);\n if (recovered) {\n const hasTerminalStatus =\n recovered.status !== undefined && DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(recovered.status);\n const validQueued =\n recovered.queued === true &&\n recovered.settled === false &&\n recovered.duplicate !== true &&\n recovered.status === undefined &&\n recovered.result === undefined &&\n recovered.error === undefined;\n const validDuplicate =\n recovered.duplicate === true &&\n recovered.settled === true &&\n recovered.queued !== true &&\n hasTerminalStatus;\n const validSettled =\n recovered.settled === true &&\n recovered.duplicate !== true &&\n recovered.queued !== true &&\n hasTerminalStatus &&\n (recovered.status !== 'completed' || recovered.result !== undefined);\n if (!validQueued && !validDuplicate && !validSettled) {\n throw new WebhookDispatchError(\n 'webhook_durable_settlement_unavailable',\n 'The durable settlement recoverer returned an invalid or contradictory callback outcome.'\n );\n }\n externalStatus = recovered;\n } else {\n throw new WebhookDispatchError(\n 'webhook_durable_settlement_unavailable',\n 'The callback requires durable mutation settlement, but no recoverable settlement route is available.'\n );\n }\n } else {\n externalStatus = await this.executor.observeExternalTaskStatus(\n metadata.operation_id,\n observation.status,\n observation.result,\n { serverTaskId: observation.serverTaskId, taskType: observation.taskType }\n );\n }\n if (!externalStatus) throw new Error('Webhook settlement did not produce an observable status.');\n if (externalStatus.queued) {\n externalStatus = undefined;\n return true;\n }\n if (externalStatus.duplicate) {\n metadata = {\n ...metadata,\n status: externalStatus.status ?? metadata.status,\n ...(externalStatus.error !== undefined && { message: externalStatus.error }),\n };\n const duplicateActivity: Activity = {\n type: 'webhook_duplicate',\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n idempotency_key: metadata.idempotency_key,\n timestamp: metadata.timestamp,\n };\n await this.config.onActivity?.(canonicalCreativeActivity(duplicateActivity));\n await this.asyncHandler?.handleDurableSettlementDuplicate(metadata);\n await externalStatus.afterDispatch?.();\n externalStatus = undefined;\n return true;\n }\n if (externalStatus.settled) {\n webhookResult = externalStatus.result as AdCPAsyncResponseData | undefined;\n metadata = {\n ...metadata,\n status: externalStatus.status ?? metadata.status,\n ...(externalStatus.error !== undefined && { message: externalStatus.error }),\n };\n }\n\n await this.config.onActivity?.(\n canonicalCreativeActivity({\n type: 'webhook_received',\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n payload: webhookResult,\n timestamp: metadata.timestamp,\n })\n );\n\n if (!suppressHandler && this.asyncHandler) {\n await this.asyncHandler.handleClaimedWebhook({\n result: webhookResult,\n metadata,\n previewHandler: parsed.metadata.previewHandler ?? this.previewCreativeHandlerForWebhook(metadata),\n });\n }\n await externalStatus.afterDispatch?.();\n externalStatus = undefined;\n return this.asyncHandler !== undefined || suppressHandler;\n } catch (error) {\n const rejectedStatus = externalStatus;\n externalStatus = undefined;\n if (rejectedStatus?.onDispatchError) {\n try {\n await rejectedStatus.onDispatchError();\n } catch (rejectionError) {\n throw new WebhookDedupClaimRetentionError(\n [error, rejectionError],\n 'Webhook dispatch failed and its durable settlement ownership could not be released.'\n );\n }\n }\n throw error;\n }\n };\n\n if (!this.asyncHandler) {\n let handled: boolean;\n try {\n handled = await dispatchClaimedWebhook();\n } catch (error) {\n if (error instanceof WebhookDedupClaimRetentionError) {\n throw new WebhookDispatchError(\n 'webhook_publication_in_progress',\n 'Webhook dispatch failed while durable publication ownership remained active.',\n error\n );\n }\n throw error;\n }\n forgetPolicyState = DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(\n metadata.status as import('./ConversationTypes').TaskStatus\n );\n return handled;\n }\n\n let deduped: {\n outcome: 'handled' | 'already_handled' | 'in_progress';\n value?: boolean;\n };\n try {\n deduped = await this.asyncHandler.runWebhookDeduplicated({\n result: dedupResult,\n metadata: dedupMetadata,\n dispatch: dispatchClaimedWebhook,\n });\n } catch (error) {\n if (error instanceof WebhookDedupClaimRetentionError) {\n throw new WebhookDispatchError(\n 'webhook_publication_in_progress',\n 'Webhook dispatch failed while durable publication ownership remained active.',\n error\n );\n }\n if (error instanceof WebhookDedupConflictError) {\n throw new WebhookDispatchError('webhook_idempotency_conflict', error.message, error);\n }\n if (error instanceof WebhookDedupInputError) {\n throw new WebhookDispatchError('webhook_envelope_invalid', error.message, error);\n }\n throw error;\n }\n if (deduped.outcome === 'in_progress') {\n throw new WebhookDispatchError(\n 'webhook_publication_in_progress',\n 'A matching callback publication is still in progress.'\n );\n }\n if (deduped.outcome === 'already_handled') {\n await this.config.onActivity?.(\n canonicalCreativeActivity({\n type: 'webhook_duplicate',\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n idempotency_key: metadata.idempotency_key,\n timestamp: metadata.timestamp,\n })\n );\n forgetPolicyState = DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(\n metadata.status as import('./ConversationTypes').TaskStatus\n );\n return true;\n }\n forgetPolicyState = DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(\n metadata.status as import('./ConversationTypes').TaskStatus\n );\n return deduped.value ?? true;\n } finally {\n if (forgetPolicyState) this.forgetProductPolicyRequestParams(metadata);\n }\n }\n\n private rememberCanonicalCreativeWebhookContext(metadata: WebhookMetadata): void {\n if (!metadata.context_id || !this.isCanonicalCreativeWebhook(metadata)) return;\n const association =\n this.canonicalCreativeTaskAssociation(metadata.operation_id) ??\n this.canonicalCreativeTaskAssociation(metadata.task_id) ??\n this.canonicalCreativeTaskAssociation(metadata.context_id);\n if (!association) return;\n this.rememberCanonicalCreativeTaskAssociation(\n metadata.context_id,\n association.taskType,\n association.legacyFormatConverter,\n association.routingSnapshot\n );\n const previewHandler = this.previewCreativeHandlerForWebhook(metadata);\n if (previewHandler) this.rememberPreviewCreativeHandlerKey(metadata.context_id, previewHandler);\n }\n\n private canonicalizeWebhookCreativeResult(\n metadata: WebhookMetadata,\n result: unknown,\n canonicalCreativeTask = this.isCanonicalCreativeWebhook(metadata)\n ): unknown {\n if (!result || typeof result !== 'object' || Array.isArray(result)) return result;\n const taskType = metadata.task_type;\n const legacyFormatConverter = this.legacyFormatConverterForWebhook(metadata);\n const response = result as Record<string, unknown>;\n if (taskType === 'get_products' && Array.isArray(response.products)) {\n const { response: canonical, diagnostics } = toCanonicalOnlyResponse(\n response as unknown as { products?: V1Product[] },\n { legacyFormatConverter }\n );\n const requestParams = this.productPolicyRequestParamsForWebhook(metadata);\n this.rememberCanonicalProductRoutes(canonical.products, requestParams.account, response.products);\n const { _message: _dropLegacyMessage, ...safe } = canonical as typeof canonical & { _message?: unknown };\n void _dropLegacyMessage;\n return stripLegacyCreativeIdentity({ ...safe, projection: { diagnostics } });\n }\n if (taskType === 'list_creatives' && Array.isArray(response.creatives)) {\n const { _message: _dropLegacyMessage, ...safe } = response;\n void _dropLegacyMessage;\n return stripLegacyCreativeIdentity({\n ...safe,\n creatives: response.creatives.map(creative =>\n projectCreativeForDelivery(creative as never, {}, 'canonical', 'list_creatives', legacyFormatConverter)\n ),\n });\n }\n const canonical = canonicalCreativeTask\n ? stripLegacyCreativeIdentity(projectCanonicalCreativeResponseValue(result, taskType, legacyFormatConverter))\n : result;\n const association =\n this.canonicalCreativeTaskAssociation(metadata.operation_id) ??\n this.canonicalCreativeTaskAssociation(metadata.task_id) ??\n this.canonicalCreativeTaskAssociation(metadata.context_id);\n if (metadata.status === 'completed') {\n this.rememberCanonicalPackageRoutesForTask(taskType, canonical, association?.routingSnapshot);\n }\n return canonical;\n }\n\n /**\n * Normalize webhook payload - handles both MCP and A2A webhook formats\n *\n * MCP: Uses MCPWebhookPayload envelope with AdCP data in .result field\n * A2A: Uses native Task/TaskStatusUpdateEvent messages with AdCP data in either:\n * - status.message.parts[].data (for status updates)\n * - artifacts (for task completion responses, per A2A spec)\n *\n * @param payload - Protocol-specific webhook payload (MCPWebhookPayload | Task | TaskStatusUpdateEvent)\n * @param taskType - Task type override\n * @param operationId - Operation id\n * @returns Normalized webhook payload with extracted AdCP response\n */\n private normalizeWebhookPayload(\n payload: unknown,\n taskType: string,\n operationId: string,\n allowLegacyA2AArtifactFallback = false\n ): NormalizedWebhookPayload {\n if (!isObjectRecord(payload)) {\n throw new WebhookDispatchError(\n 'webhook_unsupported_payload',\n 'Unsupported webhook payload format. Expected an MCP webhook envelope object or an A2A task/status event.'\n );\n }\n\n if (isBareDeliveryReport(payload)) {\n throw new WebhookDispatchError(\n 'webhook_unsupported_payload',\n 'Unsupported webhook payload format: received a bare delivery report result. Webhook POST bodies must be an MCP envelope with top-level idempotency_key, operation_id, task_id, task_type, status, timestamp, and result, or an A2A task/status event. Put delivery fields under result.'\n );\n }\n\n // 1. Check for A2A Task or TaskStatusUpdateEvent before considering MCP.\n // Native A2A events also carry a top-level `status`, so MCP's broad\n // candidate detector must never get first refusal.\n if ('kind' in payload && (payload.kind === 'task' || payload.kind === 'status-update')) {\n const a2aPayload = payload as unknown as A2ATask | TaskStatusUpdateEvent;\n const statusMessageData = latestA2AWebhookMessageData(a2aPayload.status?.message?.parts);\n const artifactExtraction = a2aPayload.kind === 'task' ? getLatestA2ADataPartFromTask(a2aPayload) : undefined;\n const artifactData = artifactExtraction?.data;\n // A terminal Task's artifacts are canonical. Its status.message can be\n // an earlier progress observation and must not shadow the final result.\n const adcpData = a2aPayload.kind === 'task' ? (artifactData ?? statusMessageData) : statusMessageData;\n const artifactMetadata = isObjectRecord(artifactExtraction?.artifact.metadata)\n ? artifactExtraction.artifact.metadata\n : undefined;\n const hasExplicitTaskEnvelope =\n adcpData !== undefined &&\n (Object.hasOwn(adcpData, 'result') || Object.hasOwn(adcpData, 'error') || Object.hasOwn(adcpData, 'errors'));\n const dataAdcpStatus =\n adcpData && hasExplicitTaskEnvelope && isAdcpStatus(adcpData.status)\n ? adcpData.status\n : extractAdcpTaskStatusFromPayload(adcpData);\n const metadataAdcpStatus = isAdcpStatus(artifactMetadata?.adcp_status) ? artifactMetadata.adcp_status : undefined;\n if (metadataAdcpStatus !== undefined && dataAdcpStatus !== undefined && metadataAdcpStatus !== dataAdcpStatus) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n 'Invalid A2A webhook envelope: artifact and structured AdCP work statuses do not match.'\n );\n }\n // Native A2A artifact metadata is the transport-safe work observation.\n // It must win over typed result payloads whose domain `status` can use\n // the same literals (for example a completed cancellation result).\n const legacyArtifactStatus = legacyA2AArtifactStatus(a2aPayload, artifactExtraction?.artifact);\n const usesLegacyArtifactFallback =\n allowLegacyA2AArtifactFallback &&\n metadataAdcpStatus === undefined &&\n dataAdcpStatus === undefined &&\n legacyArtifactStatus !== undefined;\n const adcpStatus =\n metadataAdcpStatus ?? dataAdcpStatus ?? (usesLegacyArtifactFallback ? legacyArtifactStatus : undefined);\n const isTerminalAdcpStatus =\n adcpStatus !== undefined &&\n DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(adcpStatus as import('./ConversationTypes').TaskStatus);\n const hasTerminalEnvelope =\n adcpData !== undefined &&\n (!isTerminalAdcpStatus ||\n metadataAdcpStatus !== undefined ||\n usesLegacyArtifactFallback ||\n Object.hasOwn(adcpData, 'result') ||\n Object.hasOwn(adcpData, 'error') ||\n Object.hasOwn(adcpData, 'errors'));\n if (!adcpData || !adcpStatus || !WEBHOOK_TASK_STATUSES.has(adcpStatus) || !hasTerminalEnvelope) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n 'Invalid A2A webhook envelope: structured AdCP status data is required; transport Task state is not an AdCP work observation.'\n );\n }\n\n const wrapped = { result: a2aPayload };\n const artifactTaskId = responseParser.getTaskId({\n task_id: artifactMetadata?.adcp_task_id ?? artifactMetadata?.serverTaskId,\n });\n const dataTaskId = responseParser.getTaskId({ task_id: adcpData.task_id });\n if (artifactTaskId && dataTaskId && artifactTaskId !== dataTaskId) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n 'Invalid A2A webhook envelope: artifact and structured AdCP work task IDs do not match.'\n );\n }\n // Prefer seller-issued AdCP work identity. For synchronous native A2A\n // callbacks there may be no separate work handle; the authenticated,\n // buyer-issued callback route operation is then the trusted identity.\n // A2A transport Task.id is deliberately never used.\n const taskId = artifactTaskId ?? dataTaskId ?? (usesLegacyArtifactFallback ? operationId : undefined);\n if (!taskId) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n 'Invalid A2A webhook envelope: a structured AdCP work task_id is required; transport Task.id is not accepted.'\n );\n }\n\n const declaredTaskType = typeof adcpData.task_type === 'string' ? adcpData.task_type : undefined;\n if (declaredTaskType && taskType !== 'unknown' && declaredTaskType !== taskType) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n 'Invalid A2A webhook envelope: structured task_type does not match the trusted route.'\n );\n }\n\n const result = Object.hasOwn(adcpData, 'result')\n ? (adcpData.result as AdCPAsyncResponseData | undefined)\n : (adcpData as AdCPAsyncResponseData);\n const textParts = Array.isArray(a2aPayload.status?.message?.parts)\n ? a2aPayload.status.message.parts\n .filter(part => part.kind === 'text' && 'text' in part)\n .map(part => ('text' in part ? part.text : ''))\n : [];\n\n return {\n operation_id: operationId,\n context_id: responseParser.getContextId(wrapped),\n task_id: taskId,\n task_type: taskType !== 'unknown' ? taskType : (declaredTaskType ?? 'unknown'),\n status: adcpStatus,\n result,\n message: textParts.length > 0 ? textParts.join(' ') : undefined,\n timestamp: a2aPayload.status?.timestamp || new Date().toISOString(),\n ...(typeof adcpData.idempotency_key === 'string' && { idempotency_key: adcpData.idempotency_key }),\n ...(typeof adcpData.notification_id === 'string' && { notification_id: adcpData.notification_id }),\n protocol: 'a2a',\n };\n }\n\n // 2. Check for MCP Webhook Payload (has task_id, status, task_type fields)\n if (isMcpWebhookCandidate(payload)) {\n const missing = missingMcpWebhookFields(payload);\n if (missing.length > 0) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n `Invalid MCP webhook envelope: missing top-level field(s) ${missing.join(', ')}. Delivery result fields such as notification_type and media_buy_deliveries belong under result, not at the top level.`\n );\n }\n if (typeof payload.status !== 'string' || !WEBHOOK_TASK_STATUSES.has(payload.status)) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n `Invalid MCP webhook envelope: unsupported top-level status. Expected one of ${Array.from(WEBHOOK_TASK_STATUSES).join(', ')}.`\n );\n }\n if (typeof payload.timestamp !== 'string' || Number.isNaN(Date.parse(payload.timestamp))) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n 'Invalid MCP webhook envelope: timestamp must be an ISO 8601 date-time string.'\n );\n }\n const mcpPayload = payload as unknown as MCPWebhookPayload;\n return {\n operation_id: operationId && operationId !== 'unknown' ? operationId : mcpPayload.operation_id || 'unknown',\n context_id: mcpPayload.context_id ?? undefined,\n task_id: mcpPayload.task_id,\n task_type: taskType && taskType !== 'unknown' ? taskType : mcpPayload.task_type,\n status: mcpPayload.status,\n result: mcpPayload.result ?? undefined,\n message: mcpPayload.message ?? undefined,\n timestamp: mcpPayload.timestamp,\n idempotency_key: mcpPayload.idempotency_key,\n notification_id: mcpPayload.notification_id ?? undefined,\n protocol: 'mcp',\n };\n }\n\n // 3. Unknown payload format\n throw new WebhookDispatchError(\n 'webhook_unsupported_payload',\n 'Unsupported webhook payload format. Expected an MCP webhook envelope with top-level idempotency_key, operation_id, task_id, task_type, status, timestamp, and result, or an A2A Task/TaskStatusUpdateEvent with AdCP data nested in status.message.parts[].data or task artifacts.'\n );\n }\n\n /**\n * Generate webhook URL using macro substitution\n *\n * @param taskType - Type of task (e.g., 'get_products', 'media_buy_delivery')\n * @param operationId - Operation ID for this request\n * @returns Full webhook URL with macros replaced\n *\n * @example\n * ```typescript\n * // With template: \"https://myapp.com/webhook/{task_type}/{agent_id}/{operation_id}\"\n * const webhookUrl = client.getWebhookUrl('sync_creatives', 'op_123');\n * // Returns: https://myapp.com/webhook/sync_creatives/agent_x/op_123\n *\n * // With template: \"https://myapp.com/webhook?agent={agent_id}&op={operation_id}\"\n * const webhookUrl = client.getWebhookUrl('sync_creatives', 'op_123');\n * // Returns: https://myapp.com/webhook?agent=agent_x&op=op_123\n * ```\n */\n getWebhookUrl(taskType: string, operationId: string): string {\n if (!this.config.webhookUrlTemplate) {\n throw new Error('webhookUrlTemplate not configured - cannot generate webhook URL');\n }\n\n const webhookUrl = resolveWebhookUrl(this.config.webhookUrlTemplate, this.agent.id, taskType, operationId);\n if (!webhookUrl) {\n throw new Error(`webhookUrlTemplate not configured for task type '${taskType}'`);\n }\n return webhookUrl;\n }\n\n /**\n * Create an HTTP webhook handler that automatically verifies signatures\n *\n * This helper creates a standard HTTP handler (Express/Next.js/etc.) that:\n * - Reads the full header bag so duplicate/conflicting signature headers are rejected\n * - Verifies the registered RFC 9421 or legacy HMAC signature mode\n * - Validates signature freshness and RFC 9421 nonce replay\n * - Calls handleWebhook() with proper error handling\n *\n * @returns HTTP handler function compatible with Express-style adapters.\n *\n * @example Express\n * ```typescript\n * const client = new SingleAgentClient(agent, {\n * webhookUrlTemplate: 'https://buyer.example/webhook/{task_type}/{operation_id}',\n * handlers: {\n * onSyncCreativesStatusChange: async (result) => {\n * console.log('Creative synced:', result);\n * }\n * }\n * });\n *\n * app.post(\n * '/webhook/:task_type/:operation_id',\n * express.raw({ type: 'application/json' }),\n * client.createWebhookHandler({\n * getRequestUrl: req => `https://buyer.example${req.originalUrl}`,\n * }),\n * );\n * ```\n */\n createWebhookHandler(adapter: WebhookHandlerAdapter = {}) {\n return async (\n req: WebhookHandlerRequest,\n res: {\n status: (code: number) => { json: (body: unknown) => void };\n json?: unknown;\n writeHead: (code: number, headers: Record<string, string>) => void;\n end: (body: string) => void;\n }\n ) => {\n try {\n // Capture raw body bytes for signature verification, then parse.\n const rawBody =\n req.rawBody ??\n (typeof req.body === 'string' || Buffer.isBuffer(req.body) || req.body instanceof Uint8Array\n ? req.body\n : undefined);\n if (this.config.webhookSecret && rawBody === undefined) {\n throw new WebhookDispatchError(\n 'webhook_signature_invalid',\n 'Raw webhook body required for HMAC signature verification; capture bytes before JSON parsing.'\n );\n }\n const payload =\n typeof req.body === 'string' || Buffer.isBuffer(req.body) || req.body instanceof Uint8Array\n ? undefined\n : req.body;\n\n // Extract routing params if available (e.g., Express route params)\n const taskType =\n (await adapter.getTaskType?.(req)) || req.params?.task_type || req.params?.taskType || 'unknown';\n const operationId =\n (await adapter.getOperationId?.(req)) || req.params?.operation_id || req.params?.operationId || 'unknown';\n const requestMethod = (await adapter.getRequestMethod?.(req)) || req.method;\n const requestUrl = (await adapter.getRequestUrl?.(req)) || req.publicUrl;\n\n const parsed = await this.verifyAndParseWebhook({\n payload,\n body: req.body,\n rawBody,\n headers: req.headers,\n taskType,\n operationId,\n requestMethod,\n requestUrl,\n });\n if (!parsed.ok) {\n throw new WebhookDispatchError(parsed.code, parsed.message, parsed.cause);\n }\n\n const handled = await this.dispatchParsedWebhook(parsed);\n\n // Return success\n if (res.json) {\n res.status(202).json({ status: 'accepted', received: handled });\n } else {\n res.writeHead(202, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'accepted', received: handled }));\n }\n } catch (error: unknown) {\n // Stable verification/dispatch errors are safe for callers. Never\n // reflect arbitrary handler, storage, or infrastructure messages.\n const errorMessage = error instanceof WebhookDispatchError ? error.message : 'Webhook could not be processed.';\n const statusCode = webhookErrorHttpStatus(error);\n\n if (res.json) {\n res.status(statusCode).json({ error: errorMessage });\n } else {\n res.writeHead(statusCode, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: errorMessage }));\n }\n }\n };\n }\n\n /**\n * Verify webhook signature using HMAC-SHA256 per AdCP spec.\n *\n * HMAC is computed over the **raw HTTP body bytes** — the exact bytes received\n * on the wire, before JSON parsing. This ensures cross-language interop since\n * different JSON serializers may produce different byte representations of the\n * same logical payload.\n *\n * For backward compatibility, a parsed object is still accepted but will be\n * re-serialized with JSON.stringify, which may not match the sender's bytes.\n * Always prefer passing the raw body string.\n *\n * Signature format: sha256={hex_signature}\n * Message format: {timestamp}.{raw_body}\n *\n * @param rawBodyOrPayload - Raw HTTP body string (preferred) or parsed payload object (deprecated)\n * @param signature - X-ADCP-Signature header value (format: \"sha256=...\")\n * @param timestamp - X-ADCP-Timestamp header value (Unix timestamp)\n * @returns true if signature is valid\n */\n verifyWebhookSignature(\n rawBodyOrPayload: string | Buffer | Uint8Array | unknown,\n signature: WebhookHeaderValue,\n timestamp: WebhookHeaderValue\n ): boolean {\n if (!this.config.webhookSecret) {\n return false;\n }\n\n // Use raw body bytes when available; fall back to JSON.stringify for backward compat\n const rawBody =\n typeof rawBodyOrPayload === 'string' ||\n Buffer.isBuffer(rawBodyOrPayload) ||\n rawBodyOrPayload instanceof Uint8Array\n ? rawBodyOrPayload\n : String(JSON.stringify(rawBodyOrPayload));\n\n return verifyWebhookRequest({\n rawBody,\n secret: this.config.webhookSecret,\n signature,\n timestamp,\n }).ok;\n }\n\n /**\n * Execute task and call appropriate handler on completion\n *\n * Automatically adapts requests for v2 servers and normalizes responses.\n */\n private async executeAndHandle<T>(\n taskType: string,\n handlerName: keyof AsyncHandlerConfig,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions,\n transformCompletedResponse?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter,\n canonicalRequest?: unknown,\n projectionCatalogs?: readonly ProjectionCatalogSnapshot[]\n ): Promise<TaskResult<T>> {\n const requestParamsSnapshot = structuredClone(params);\n const canonicalRequestSnapshot = canonicalRequest === undefined ? undefined : structuredClone(canonicalRequest);\n const deferredProjectionCatalogs = projectionCatalogs ? structuredClone(projectionCatalogs) : undefined;\n const taskOptionsSnapshot = snapshotTaskOptions(options);\n return withTaskDeadline(taskOptionsSnapshot, effectiveOptions =>\n this.executeAndHandleWithinDeadline(\n taskType,\n handlerName,\n requestParamsSnapshot,\n inputHandler,\n effectiveOptions,\n transformCompletedResponse,\n legacyFormatConverter,\n canonicalRequestSnapshot,\n deferredProjectionCatalogs\n )\n );\n }\n\n private async executeAndHandleWithinDeadline<T>(\n taskType: string,\n handlerName: keyof AsyncHandlerConfig,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions,\n transformCompletedResponse?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter,\n canonicalRequest?: unknown,\n projectionCatalogs?: readonly ProjectionCatalogSnapshot[]\n ): Promise<TaskResult<T>> {\n throwIfAborted(options?.signal);\n const canonicalCreativeInvocation =\n CANONICAL_CREATIVE_ACTIVITY_TASKS.has(taskType) || canonicalRequest !== undefined;\n // Normalize params for backwards compatibility before validation\n let normalizedParams = normalizeRequestParams(taskType, params, {\n skipIdempotencyAutoInject: options?.skipIdempotencyAutoInject,\n skipAccountValidation: options?.skipAccountValidation,\n });\n this.assertRequestSupportedByConfiguredVersion(taskType, normalizedParams, options, canonicalCreativeInvocation);\n this.assertDurablePropertyListCredentialSupported(taskType, normalizedParams);\n\n // Inject an idempotency_key for mutating tools before schema validation\n // so callers don't have to supply one. TaskExecutor also guards against\n // missing keys, but validation happens here first — do the injection up\n // front so the request passes the spec's required-field check.\n // `options.skipIdempotencyAutoInject` disables this for compliance\n // testing that needs to exercise server-side missing-key behavior.\n if (\n !options?.skipIdempotencyAutoInject &&\n requestUsesIdempotency(taskType, normalizedParams) &&\n normalizedParams &&\n typeof normalizedParams === 'object' &&\n !normalizedParams.idempotency_key\n ) {\n normalizedParams = { ...normalizedParams, idempotency_key: generateIdempotencyKey() };\n }\n\n // Validate request params against schema. When compliance testing has\n // asked us to suppress idempotency auto-injection or account validation,\n // skip the entire Zod schema parse — the required field is intentionally\n // absent and Zod would fail on it too. This matches the pre-existing\n // `skipIdempotencyAutoInject` behavior and is acceptable because both\n // flags are @internal and only set by the storyboard runner for\n // schema_validation steps. An explicit external schema root also skips\n // this generated snapshot; TaskExecutor's AJV pass below validates the\n // same request against the caller-supplied current-source bundle.\n if (\n !options?.skipIdempotencyAutoInject &&\n !options?.skipAccountValidation &&\n !isExternalSchemaRootActive(this.resolvedAdcpVersion)\n ) {\n this.validateRequest(taskType, normalizedParams);\n }\n\n // Validate required features before sending request\n await this.validateTaskFeatures(taskType, options);\n throwIfAborted(options?.signal);\n\n // Guard mutating calls against pre-v3 sellers when opted in.\n if (this.config.requireV3ForMutations && requestUsesIdempotency(taskType, normalizedParams)) {\n await this.requireSupportedMajor(taskType, options);\n throwIfAborted(options?.signal);\n }\n\n // Check for v3 features used against v2 servers - return empty result if unsupported\n const earlyResult = await this.getEarlyResultForUnsupportedFeatures<T>(taskType, normalizedParams, options);\n throwIfAborted(options?.signal);\n if (earlyResult) {\n return attachMatch(earlyResult);\n }\n\n const agent = await this.ensureEndpointDiscovered(options);\n throwIfAborted(options?.signal);\n\n // Schema-driven pre-send validation runs on the unadapted v3 shape so\n // wire-format adapters (e.g. adaptGetProductsRequestForV2) don't strip\n // v3-only fields out from under the v3 bundled schema. Skip the entire\n // Zod parse when compliance testing has suppressed required-field\n // validation — the missing field is intentional and Zod would reject it.\n if (!options?.skipIdempotencyAutoInject && !options?.skipAccountValidation) {\n this.executor.validateRequest(taskType, normalizedParams);\n }\n\n // Adapt request for the detected server and AdCP protocol versions.\n const capabilityDiscoveryContext: CapabilityDiscoveryContext = {};\n const detectionOptions: InternalReadRequestOptions = {\n ...options,\n [CAPABILITY_DISCOVERY_CONTEXT]: capabilityDiscoveryContext,\n };\n const serverVersion = await this.detectServerVersion(detectionOptions);\n throwIfAborted(options?.signal);\n this.assertRequestSupportedByTargetVersion(\n taskType,\n normalizedParams,\n capabilityDiscoveryContext.capabilities,\n canonicalCreativeInvocation,\n serverVersion\n );\n const { options: effectiveOptions, driftLog: webhookDriftLog } = this.suppressPre31DiscoveryWebhook(\n taskType,\n options,\n capabilityDiscoveryContext.capabilities\n );\n const inputSchemaStripLogs: any[] = [];\n const { params: adaptedParams, driftLogs: adaptDriftLogs } = this.adaptRequest(\n taskType,\n normalizedParams,\n serverVersion,\n inputSchemaStripLogs,\n capabilityDiscoveryContext.toolSchemas,\n capabilityDiscoveryContext.capabilities\n );\n\n // Symmetric to the pre-adapter v3 pass above: when the adapter\n // rewrote the request for a v2 server, warn-validate the adapted\n // shape against the cached v2.5 schema bundle. Drift gets collected\n // here and merged into result.metadata.debug_logs after executeTask\n // returns — without that merge the warning would silently drop on\n // the floor and adapter drift would land in production unnoticed.\n const v25DriftLogs: any[] = [...adaptDriftLogs];\n if (webhookDriftLog) v25DriftLogs.push(webhookDriftLog);\n if (serverVersion === 'v2') {\n this.executor.validateAdaptedRequestAgainstV2(taskType, adaptedParams, v25DriftLogs);\n }\n\n const canonicalInputHandler = this.canonicalCreativeInputHandler(\n taskType,\n inputHandler,\n canonicalCreativeInvocation\n );\n const routingSnapshot = canonicalCreativeInvocation\n ? canonicalCreativeRoutingSnapshot(taskType, canonicalRequest ?? normalizedParams)\n : undefined;\n const deferredClientContext: DeferredClientFinalizationContext = {\n kind: 'single-agent',\n taskType,\n handlerName,\n canonical: canonicalCreativeInvocation,\n productPolicyRequest: productPolicyRequestSnapshot(normalizedParams),\n ...(projectionCatalogs !== undefined && { projectionCatalogs }),\n ...(routingSnapshot !== undefined && { routingSnapshot }),\n ...(effectiveOptions?.taskId !== undefined && { optionTaskId: effectiveOptions.taskId }),\n ...(effectiveOptions?.contextId !== undefined && { optionContextId: effectiveOptions.contextId }),\n };\n let result = await canonicalCreativeExecutionStorage.run(\n {\n taskType,\n canonical: canonicalCreativeInvocation,\n legacyFormatConverter,\n canonicalRequest: canonicalRequest ?? normalizedParams,\n },\n () =>\n this.executor.executeTask<T>(\n agent,\n taskType,\n adaptedParams,\n canonicalInputHandler,\n effectiveOptions,\n serverVersion,\n capabilityDiscoveryContext.capabilities,\n undefined,\n deferredClientContext\n )\n );\n throwIfAborted(effectiveOptions?.signal);\n\n // Merge collected drift into the executor's debug_logs so adopters\n // reading result.debug_logs see input-schema stripping, post-adapter\n // v2.5 warnings, and any pre-3.1 webhook-degradation notice alongside\n // the executor's own logs. On error paths the executor may not surface\n // result.debug_logs at all; logs collected before the failure are\n // dropped, matching the executor's own debug-log behavior.\n const postAdapterLogs = [...inputSchemaStripLogs, ...v25DriftLogs];\n if (postAdapterLogs.length > 0) {\n result.debug_logs = [...(result.debug_logs ?? []), ...postAdapterLogs];\n }\n\n return this.finalizeTaskResult(\n result,\n deferredClientContext,\n effectiveOptions,\n transformCompletedResponse,\n legacyFormatConverter\n );\n }\n\n private async finalizeTaskResult<T>(\n result: TaskResult<T>,\n context: DeferredClientFinalizationContext,\n options?: TaskOptions,\n transformCompletedResponse?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter\n ): Promise<TaskResult<T>> {\n try {\n return await this.finalizeTaskResultInner(\n result,\n context,\n options,\n transformCompletedResponse,\n legacyFormatConverter\n );\n } catch (error) {\n await rejectDeferredSettlement(result);\n throw error;\n }\n }\n\n private async finalizeTaskResultInner<T>(\n result: TaskResult<T>,\n context: DeferredClientFinalizationContext,\n options?: TaskOptions,\n transformCompletedResponse?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter\n ): Promise<TaskResult<T>> {\n const completionHandlerAlreadyPublished = hasCompletionHandlerAlreadyPublished(result);\n const settlementAcknowledger = (\n result as TaskResult<T> & {\n [DEFERRED_SETTLEMENT_ACK]?: (finalizedResult?: TaskResult<T>) => Promise<void>;\n }\n )[DEFERRED_SETTLEMENT_ACK];\n const taskType = context.taskType;\n const resumedOptions: TaskOptions = {\n ...(options ?? {}),\n ...(context.optionTaskId !== undefined && { taskId: context.optionTaskId }),\n ...(context.optionContextId !== undefined && { contextId: context.optionContextId }),\n };\n const rawDeferredResume = result.deferred?.resume;\n const rawSubmittedWaitForCompletion = result.submitted?.waitForCompletion;\n const finalizerLegacyFormatConverter =\n legacyFormatConverter ?? this.resolveLegacyFormatConverter(undefined, context.projectionCatalogs);\n\n if (result.success && result.data) {\n result.data = this.normalizeResponseToV3(taskType, result.data) as T;\n }\n\n result = this.wrapProductPolicySubmittedContinuation(\n result,\n taskType,\n context.productPolicyRequest,\n resumedOptions\n );\n if (result.status === 'working') {\n this.rememberProductPolicyRequestParams(taskType, context.productPolicyRequest, result, resumedOptions);\n }\n this.rememberLegacyFormatConverter(taskType, finalizerLegacyFormatConverter, result, resumedOptions);\n result = await this.applyProductPropertyPolicy(result, taskType, context.productPolicyRequest);\n throwIfAborted(options?.signal);\n\n if (context.canonical) {\n if (result.status === 'completed' && result.success && result.data) {\n this.rememberCanonicalProductRoutesForCompletion(\n taskType,\n result.data,\n finalizerLegacyFormatConverter,\n context.productPolicyRequest.account\n );\n }\n result = this.canonicalizeCreativeTaskResult(\n result,\n taskType,\n transformCompletedResponse,\n finalizerLegacyFormatConverter\n );\n result = this.wrapCanonicalCreativeContinuations(\n result,\n taskType,\n transformCompletedResponse,\n finalizerLegacyFormatConverter,\n context.routingSnapshot,\n context.productPolicyRequest.account\n );\n this.rememberCanonicalCreativeTaskIds(result, taskType, finalizerLegacyFormatConverter, context.routingSnapshot);\n if (result.success && result.status === 'completed' && result.data !== undefined) {\n this.rememberCanonicalPackageRoutesForTask(taskType, result.data, context.routingSnapshot);\n }\n } else if (result.status === 'completed' && result.success && result.data && transformCompletedResponse) {\n result = { ...result, data: transformCompletedResponse(result.data) };\n }\n\n if (context.handlerName) {\n this.rememberPreviewCreativeHandler(result, taskType, context.handlerName, resumedOptions);\n if (!completionHandlerAlreadyPublished) {\n await this.notifyCompletedStatusHandler(result, taskType, context.handlerName, resumedOptions);\n markCompletionHandlerAlreadyPublished(result);\n }\n }\n\n // Replace the canonical wrapper's recursive closure with the shared\n // finalizer. Durable tokens re-enter the public client path after restart;\n // in-process tokens keep their one-shot executor closure.\n if (result.deferred && rawDeferredResume) {\n result.deferred = {\n ...result.deferred,\n resume: input =>\n rawDeferredResume(input).then(next =>\n this.finalizeTaskResult(next, context, options, transformCompletedResponse, finalizerLegacyFormatConverter)\n ),\n };\n }\n if (result.submitted && rawSubmittedWaitForCompletion) {\n result.submitted = {\n ...result.submitted,\n waitForCompletion: async (pollInterval, signal) =>\n this.finalizeTaskResult(\n await rawSubmittedWaitForCompletion(pollInterval, signal),\n context,\n options,\n transformCompletedResponse,\n finalizerLegacyFormatConverter\n ),\n };\n }\n\n const finalized = attachMatch(result);\n await settlementAcknowledger?.(finalized);\n return finalized;\n }\n\n private async notifyCompletedStatusHandler<T>(\n result: TaskResult<T>,\n taskType: string,\n handlerName: keyof AsyncHandlerConfig,\n options?: TaskOptions\n ): Promise<void> {\n if (result.status !== 'completed' || !result.success || !this.asyncHandler) return;\n const handler = this.config.handlers?.[handlerName] as\n | ((data: unknown, metadata: Record<string, unknown>) => void | Promise<void>)\n | undefined;\n if (!handler) return;\n throwIfAborted(options?.signal);\n await handler(result.data, {\n operation_id: options?.contextId || 'sync',\n context_id: options?.contextId,\n task_id: result.metadata.taskId,\n agent_id: this.agent.id,\n task_type: taskType,\n status: result.status,\n timestamp: new Date().toISOString(),\n });\n throwIfAborted(options?.signal);\n }\n\n private canonicalCreativeInputHandler(\n taskType: string,\n inputHandler?: InputHandler,\n canonical = CANONICAL_CREATIVE_ACTIVITY_TASKS.has(taskType)\n ): InputHandler | undefined {\n if (!inputHandler || !canonical) return inputHandler;\n return async context => {\n const active = canonicalCreativeExecutionStorage.getStore();\n const converter = this.finalLegacyFormatConverter(\n active?.taskType === taskType ? active.legacyFormatConverter : undefined\n );\n const project = <T>(value: T): CanonicalCreativeResponse<T> =>\n projectCanonicalCreativeAncillaryValue(value, taskType, converter) as CanonicalCreativeResponse<T>;\n const messages = context.messages.map(message => ({\n ...message,\n content: project(message.content),\n })) as typeof context.messages;\n const safeContext = {\n ...context,\n messages,\n inputRequest: project(context.inputRequest) as typeof context.inputRequest,\n getSummary: () => messages.map(message => `${message.role}: ${JSON.stringify(message.content)}`).join('\\n'),\n getPreviousResponse: (field: string) => project(context.getPreviousResponse(field)),\n };\n return inputHandler(safeContext);\n };\n }\n\n private projectCanonicalCreativeData<T>(\n taskType: string,\n data: T,\n transform?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter\n ): CanonicalCreativeResponse<T> {\n let projected = this.normalizeResponseToV3(taskType, data) as T;\n const record = projected && typeof projected === 'object' ? (projected as Record<string, unknown>) : undefined;\n const canProjectRead =\n taskType === 'get_products'\n ? Array.isArray(record?.products)\n : taskType === 'list_creatives'\n ? Array.isArray(record?.creatives)\n : true;\n if (transform && canProjectRead) {\n projected = transform(projected);\n } else if (canProjectRead && taskType === 'get_products' && record) {\n const active = canonicalCreativeExecutionStorage.getStore();\n const converter = this.finalLegacyFormatConverter(\n legacyFormatConverter ?? (active?.taskType === taskType ? active.legacyFormatConverter : undefined)\n );\n const { response, diagnostics } = toCanonicalOnlyResponse(record as { products?: V1Product[] }, {\n legacyFormatConverter: converter,\n });\n const { _message: _dropLegacyMessage, ...canonical } = response as typeof response & { _message?: unknown };\n void _dropLegacyMessage;\n projected = { ...canonical, projection: { diagnostics } } as T;\n } else if (canProjectRead && taskType === 'list_creatives' && record) {\n const active = canonicalCreativeExecutionStorage.getStore();\n const activeLegacyFormatConverter = this.finalLegacyFormatConverter(\n legacyFormatConverter ?? (active?.taskType === taskType ? active.legacyFormatConverter : undefined)\n );\n const { _message: _dropLegacyMessage, ...safe } = record;\n void _dropLegacyMessage;\n projected = {\n ...safe,\n creatives: (record.creatives as unknown[]).map(creative =>\n projectCreativeForDelivery(\n creative as import('../types/tools.generated').CreativeAsset,\n {},\n 'canonical',\n 'list_creatives',\n activeLegacyFormatConverter\n )\n ),\n } as T;\n } else if (canProjectRead && CANONICAL_CREATIVE_ACTIVITY_TASKS.has(taskType)) {\n const active = canonicalCreativeExecutionStorage.getStore();\n projected = projectCanonicalCreativeResponseValue(\n projected,\n taskType,\n this.finalLegacyFormatConverter(\n legacyFormatConverter ?? (active?.taskType === taskType ? active.legacyFormatConverter : undefined)\n )\n ) as T;\n }\n return stripLegacyCreativeIdentity(projected);\n }\n\n private canonicalizeCreativeTaskResult<T>(\n result: TaskResult<T>,\n taskType: string,\n transform?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter\n ): TaskResult<T> {\n const projectedData =\n result.data !== undefined\n ? this.projectCanonicalCreativeData(taskType, result.data, transform, legacyFormatConverter)\n : undefined;\n const errorInstance = result.errorInstance;\n const converter = this.finalLegacyFormatConverter(legacyFormatConverter);\n const metadataRecord = result.metadata as TaskResult<T>['metadata'] & { inputRequest?: unknown };\n const semanticMetadata = {\n ...metadataRecord,\n ...(metadataRecord.inputRequest !== undefined && {\n inputRequest: projectCanonicalCreativeAncillaryValue(metadataRecord.inputRequest, taskType, converter),\n }),\n };\n const semanticConversation = result.conversation?.map(message => ({\n ...message,\n content: projectCanonicalCreativeAncillaryValue(message.content, taskType, converter),\n }));\n const safe = stripLegacyCreativeIdentity({\n data: projectedData,\n metadata: semanticMetadata,\n conversation: semanticConversation,\n debug_logs: result.debug_logs,\n adcpError: result.adcpError,\n error: result.error,\n governance: result.governance,\n governanceOutcome: result.governanceOutcome,\n governanceOutcomeError: result.governanceOutcomeError,\n deferredQuestion: result.deferred?.question,\n // Token source only: discarded below, but lets the sanitizer remove exact\n // legacy IDs/URLs when the seller repeats them in messages or diagnostics.\n legacySource: result.data,\n }) as Record<string, any>;\n\n const safeErrorInstance = errorInstance ? canonicalCreativeErrorInstance(errorInstance, result.data) : undefined;\n\n const safeDeferred = result.deferred\n ? { ...result.deferred, ...(result.deferred.question !== undefined && { question: safe.deferredQuestion }) }\n : undefined;\n\n return attachMatch({\n ...result,\n ...(result.data !== undefined && { data: safe.data as T }),\n metadata: safe.metadata,\n ...(result.conversation !== undefined && { conversation: safe.conversation }),\n ...(result.debug_logs !== undefined && { debug_logs: safe.debug_logs }),\n ...(result.adcpError !== undefined && { adcpError: safe.adcpError }),\n ...(result.error !== undefined && { error: safe.error }),\n ...(result.governance !== undefined && { governance: safe.governance }),\n ...(result.governanceOutcome !== undefined && { governanceOutcome: safe.governanceOutcome }),\n ...(result.governanceOutcomeError !== undefined && { governanceOutcomeError: safe.governanceOutcomeError }),\n ...(safeDeferred !== undefined && { deferred: safeDeferred }),\n ...(safeErrorInstance !== undefined && { errorInstance: safeErrorInstance }),\n } as TaskResult<T>);\n }\n\n private canonicalizeCreativeTaskInfo<T>(\n taskInfo: TaskInfo,\n taskType: string,\n transform?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter\n ): TaskInfo {\n const source = taskInfo.result;\n const projected =\n source !== undefined\n ? this.projectCanonicalCreativeData(taskType, source as T, transform, legacyFormatConverter)\n : undefined;\n const { legacySource: _dropLegacySource, ...safe } = stripLegacyCreativeIdentity({\n ...taskInfo,\n taskType,\n ...(source !== undefined && { result: projected }),\n legacySource: source,\n }) as TaskInfo & { legacySource?: unknown };\n void _dropLegacySource;\n return safe as TaskInfo;\n }\n\n private wrapCanonicalCreativeContinuations<T>(\n result: TaskResult<T>,\n taskType: string,\n transform?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter,\n routingRequest?: unknown,\n productAccount?: unknown\n ): TaskResult<T> {\n const routingSnapshot = canonicalCreativeRoutingSnapshot(taskType, routingRequest);\n if (result.submitted) {\n const submitted = result.submitted;\n result = {\n ...result,\n submitted: {\n ...submitted,\n track: async transport => {\n const tracked = await canonicalCreativeExecutionStorage.run(\n { taskType, canonical: true, legacyFormatConverter },\n () => submitted.track(transport)\n );\n if (tracked.status === 'completed' && tracked.result !== undefined) {\n this.rememberCanonicalProductRoutesForCompletion(\n taskType,\n tracked.result,\n legacyFormatConverter,\n productAccount\n );\n }\n const canonical = this.canonicalizeCreativeTaskInfo<T>(tracked, taskType, transform, legacyFormatConverter);\n if (canonical.status === 'completed' && canonical.result !== undefined) {\n this.rememberCanonicalPackageRoutesForTask(taskType, canonical.result, routingSnapshot);\n }\n return canonical;\n },\n waitForCompletion: async (pollInterval, signal) => {\n const completed = await canonicalCreativeExecutionStorage.run(\n { taskType, canonical: true, legacyFormatConverter },\n () => submitted.waitForCompletion(pollInterval, signal)\n );\n if (completed.success && completed.status === 'completed' && completed.data !== undefined) {\n this.rememberCanonicalProductRoutesForCompletion(\n taskType,\n completed.data,\n legacyFormatConverter,\n productAccount\n );\n }\n const canonical = this.canonicalizeCreativeTaskResult(\n completed,\n taskType,\n transform,\n legacyFormatConverter\n );\n if (canonical.success && canonical.status === 'completed' && canonical.data !== undefined) {\n this.rememberCanonicalPackageRoutesForTask(taskType, canonical.data, routingSnapshot);\n }\n this.rememberCanonicalCreativeTaskIds(canonical, taskType, legacyFormatConverter, routingSnapshot);\n return this.wrapCanonicalCreativeContinuations(\n canonical,\n taskType,\n transform,\n legacyFormatConverter,\n routingSnapshot,\n productAccount\n );\n },\n },\n } as TaskResult<T>;\n }\n if (result.deferred) {\n const deferred = result.deferred;\n result = {\n ...result,\n deferred: {\n ...deferred,\n resume: async input => {\n const resumed = await canonicalCreativeExecutionStorage.run(\n { taskType, canonical: true, legacyFormatConverter },\n () => deferred.resume(input)\n );\n const canonical = this.canonicalizeCreativeTaskResult(resumed, taskType, transform, legacyFormatConverter);\n if (canonical.success && canonical.status === 'completed' && canonical.data !== undefined) {\n this.rememberCanonicalPackageRoutesForTask(taskType, canonical.data, routingSnapshot);\n }\n this.rememberCanonicalCreativeTaskIds(canonical, taskType, legacyFormatConverter, routingSnapshot);\n return this.wrapCanonicalCreativeContinuations(\n canonical,\n taskType,\n transform,\n legacyFormatConverter,\n routingSnapshot,\n productAccount\n );\n },\n },\n } as TaskResult<T>;\n }\n return attachMatch(result);\n }\n\n private rememberCanonicalCreativeTaskIds<T>(\n result: TaskResult<T>,\n taskType: string,\n legacyFormatConverter?: LegacyFormatConverter,\n routingRequest?: unknown\n ): void {\n const routingSnapshot = canonicalCreativeRoutingSnapshot(taskType, routingRequest);\n const keys = [\n result.metadata.taskId,\n result.metadata.contextId,\n result.metadata.serverTaskId,\n result.submitted?.taskId,\n ];\n for (const key of keys) {\n if (!key) continue;\n this.rememberCanonicalCreativeTaskAssociation(key, taskType, legacyFormatConverter, routingSnapshot);\n }\n }\n\n private rememberPreviewCreativeHandler<T>(\n result: TaskResult<T>,\n taskType: string,\n handlerName: keyof AsyncHandlerConfig,\n options?: TaskOptions\n ): void {\n if (taskType !== 'preview_creative') return;\n const handler = handlerName === 'onPreviewCreativeLegacyStatusChange' ? 'legacy' : 'canonical';\n const metadata = result.metadata as typeof result.metadata & { operationId?: string };\n const keys = [\n metadata.operationId,\n metadata.taskId,\n metadata.contextId,\n metadata.serverTaskId,\n result.submitted?.taskId,\n options?.taskId,\n options?.contextId,\n ];\n for (const key of keys) {\n if (!key) continue;\n this.rememberPreviewCreativeHandlerKey(key, handler);\n if (handler === 'legacy') this.canonicalCreativeTaskAssociations.delete(key);\n }\n }\n\n private rememberPreviewCreativeHandlerKey(key: string, handler: 'canonical' | 'legacy'): void {\n this.previewCreativeHandlersByTask.delete(key);\n this.previewCreativeHandlersByTask.set(key, handler);\n while (this.previewCreativeHandlersByTask.size > TASK_SCOPED_STATE_LIMIT) {\n const oldest = this.previewCreativeHandlersByTask.keys().next().value;\n if (oldest === undefined) break;\n this.previewCreativeHandlersByTask.delete(oldest);\n }\n }\n\n private previewCreativeHandlerForWebhook(\n metadata: Pick<WebhookMetadata, 'operation_id' | 'task_id' | 'context_id' | 'task_type'>\n ): 'canonical' | 'legacy' | undefined {\n if (metadata.task_type !== 'preview_creative') return undefined;\n for (const key of [metadata.operation_id, metadata.task_id, metadata.context_id]) {\n if (!key) continue;\n const handler = this.previewCreativeHandlersByTask.get(key);\n if (!handler) continue;\n this.previewCreativeHandlersByTask.delete(key);\n this.previewCreativeHandlersByTask.set(key, handler);\n return handler;\n }\n return undefined;\n }\n\n private isCanonicalCreativeWebhook(\n metadata: Pick<WebhookMetadata, 'operation_id' | 'task_id' | 'context_id' | 'task_type'>\n ): boolean {\n if (CANONICAL_CREATIVE_ACTIVITY_TASKS.has(metadata.task_type)) return true;\n if (metadata.task_type !== 'preview_creative') return false;\n return [metadata.operation_id, metadata.task_id, metadata.context_id].some(\n key => this.canonicalCreativeTaskAssociation(key) !== undefined\n );\n }\n\n private rememberCanonicalCreativeTaskAssociation(\n key: string,\n taskType: string,\n legacyFormatConverter?: LegacyFormatConverter,\n canonicalRequest?: unknown\n ): void {\n const previous = this.canonicalCreativeTaskAssociations.get(key);\n const routingSnapshot = canonicalCreativeRoutingSnapshot(taskType, canonicalRequest);\n const effectiveRoutingSnapshot =\n routingSnapshot ?? (previous?.taskType === taskType ? previous.routingSnapshot : undefined);\n this.canonicalCreativeTaskAssociations.delete(key);\n this.canonicalCreativeTaskAssociations.set(key, {\n taskType,\n legacyFormatConverter,\n ...(effectiveRoutingSnapshot ? { routingSnapshot: effectiveRoutingSnapshot } : {}),\n });\n while (this.canonicalCreativeTaskAssociations.size > TASK_SCOPED_STATE_LIMIT) {\n const oldest = this.canonicalCreativeTaskAssociations.keys().next().value;\n if (oldest === undefined) break;\n this.canonicalCreativeTaskAssociations.delete(oldest);\n }\n }\n\n private canonicalCreativeTaskAssociation(key: string | undefined): CanonicalCreativeTaskAssociation | undefined {\n if (!key) return undefined;\n const association = this.canonicalCreativeTaskAssociations.get(key);\n if (!association) return undefined;\n // Touch the entry so actively-polled tasks and continued conversations\n // survive ahead of abandoned associations when the cache reaches its cap.\n this.canonicalCreativeTaskAssociations.delete(key);\n this.canonicalCreativeTaskAssociations.set(key, association);\n return association;\n }\n\n private forgetCanonicalCreativeTaskAssociationKeys(keys: Array<string | undefined>): void {\n for (const key of keys) {\n if (key) this.canonicalCreativeTaskAssociations.delete(key);\n }\n }\n\n /**\n * Drop products that arrive without a usable `pricing_options[]` array from a\n * completed `get_products` response. `pricing_options` is required and\n * non-empty in AdCP 3.1; a product with no pricing model can't be bought, so\n * the SDK rejects it before callers and completion handlers see the list.\n *\n * Controlled by `config.validation.rejectProductsWithoutPricingOptions`\n * (default `true`) and applied on every completion path via\n * {@link applyProductPropertyPolicy}, independent of the response validation\n * mode.\n */\n private enforceProductPricingOptions<T>(result: TaskResult<T>, taskType: string): TaskResult<T> {\n if (taskType !== 'get_products') return result;\n if (this.config.validation?.rejectProductsWithoutPricingOptions === false) return result;\n if (!result.success || result.status !== 'completed' || !result.data) return result;\n\n const response = result.data as unknown as GetProductsResponse;\n const products = (response as { products?: unknown }).products;\n if (!Array.isArray(products) || products.length === 0) return result;\n\n const kept: unknown[] = [];\n const rejected: Array<{ index: number; product_id?: string }> = [];\n products.forEach((product, index) => {\n if (productHasPricingOptions(product)) {\n kept.push(product);\n return;\n }\n const productId = productIdForPricingDiagnostics(product);\n rejected.push({ index, ...(productId ? { product_id: productId } : {}) });\n });\n\n if (rejected.length === 0) return result;\n\n const message = `Rejected ${rejected.length} product${rejected.length === 1 ? '' : 's'} without pricing_options`;\n\n // Mutate in place (like the property-policy filter path) so the\n // non-enumerable `match` accessor and result identity survive.\n result.data = { ...(response as unknown as Record<string, unknown>), products: kept } as T;\n result.metadata = {\n ...result.metadata,\n productPricingPolicy: {\n ok: true,\n accepted_count: kept.length,\n rejected_count: rejected.length,\n rejected_products: rejected,\n },\n };\n result.debug_logs = [\n ...(result.debug_logs ?? []),\n {\n type: 'warning',\n message,\n timestamp: new Date().toISOString(),\n details: {\n code: 'product_missing_pricing_options',\n task: taskType,\n agent_id: this.agent.id,\n rejected_count: rejected.length,\n rejected_products: rejected,\n },\n },\n ];\n return result;\n }\n\n private async applyProductPropertyPolicy<T>(\n result: TaskResult<T>,\n taskType: string,\n requestParams: Record<string, unknown>\n ): Promise<TaskResult<T>> {\n // Reject non-transactable products (no pricing_options) before any\n // property-policy evaluation, regardless of whether a property policy is\n // configured. This runs on the same completion chokepoint so it covers the\n // sync, polling, track, and webhook paths uniformly.\n result = this.enforceProductPricingOptions(result, taskType);\n\n const policyConfig = this.config.validation?.productPropertyPolicy;\n if (policyConfig === false || taskType !== 'get_products') return result;\n if (!result.success || result.status !== 'completed' || !result.data) return result;\n\n const response = result.data as unknown as GetProductsResponse;\n if (!Array.isArray(response.products)) return result;\n\n const requestPropertyList = propertyListReferenceFromRequest(requestParams);\n const {\n mode = 'filter',\n message = 'Property list not adhered to',\n enforceRequestPropertyList = true,\n propertyListResolveOptions,\n ...explicitPolicy\n } = policyConfig || {};\n const policy: BuyerPropertyPolicy = {\n ...explicitPolicy,\n };\n\n let resolvedRequestPropertyList:\n | {\n listId: string;\n agentUrl: string;\n identifierCount: number;\n cacheValidUntil?: string;\n }\n | undefined;\n\n if (requestPropertyList && enforceRequestPropertyList) {\n try {\n const resolved = await resolvePropertyList(requestPropertyList, propertyListResolveOptions);\n const comparableIdentifiers = comparablePropertyIdentifiers(resolved.identifiers);\n const unsupportedIdentifiers = unsupportedPropertyIdentifiers(resolved.identifiers);\n if (unsupportedIdentifiers.length > 0) {\n throw new Error('property_list_unsupported_identifier_types');\n }\n if (comparableIdentifiers.length > 0 || resolved.identifiers.length === 0) {\n policy.allowedPropertyIdentifiers = [...(policy.allowedPropertyIdentifiers ?? []), ...comparableIdentifiers];\n policy.requireAllowedPropertyMatch = true;\n }\n policy.strict = policy.strict ?? true;\n resolvedRequestPropertyList = {\n listId: resolved.listId,\n agentUrl: resolved.agentUrl,\n identifierCount: resolved.identifiers.length,\n ...(resolved.cacheValidUntil ? { cacheValidUntil: resolved.cacheValidUntil } : {}),\n };\n } catch (err) {\n const errorCode = propertyListResolutionErrorCode(err);\n const diagnosticAgentUrl = sanitizeDiagnosticUrl(requestPropertyList.agent_url);\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n data: response as unknown as T,\n error: `${message}: could not resolve property_list ${requestPropertyList.list_id}`,\n metadata: {\n ...result.metadata,\n status: 'failed',\n productPropertyPolicy: {\n mode,\n ok: false,\n accepted_count: 0,\n rejected_count: response.products.length,\n flagged_count: 0,\n message,\n diagnostics: [],\n request_property_list: {\n list_id: requestPropertyList.list_id,\n agent_url: diagnosticAgentUrl,\n resolution_error: errorCode,\n },\n },\n },\n conversation: result.conversation,\n debug_logs: [\n ...(result.debug_logs ?? []),\n {\n type: 'product_property_policy',\n message,\n mode,\n ok: false,\n request_property_list: {\n list_id: requestPropertyList.list_id,\n agent_url: diagnosticAgentUrl,\n resolution_error: errorCode,\n },\n },\n ],\n });\n }\n }\n\n if (!hasProductPropertyPolicyRules(policy)) return result;\n\n let validation: ProductPropertyPolicyValidationResult<ProductPolicyProductLike>;\n try {\n validation = validateProductsAgainstPropertyPolicy({\n products: response.products,\n policy,\n mode,\n });\n } catch (err) {\n if (!(err instanceof ProductPropertyPolicyError)) throw err;\n validation = err.result;\n }\n\n const summary = {\n mode,\n ok: validation.ok,\n accepted_count: validation.acceptedProducts.length,\n rejected_count: validation.rejectedProducts.length,\n flagged_count: validation.flaggedProducts.length,\n ...(validation.ok ? {} : { message }),\n ...(resolvedRequestPropertyList\n ? {\n request_property_list: {\n list_id: resolvedRequestPropertyList.listId,\n agent_url: sanitizeDiagnosticUrl(resolvedRequestPropertyList.agentUrl),\n identifier_count: resolvedRequestPropertyList.identifierCount,\n ...(resolvedRequestPropertyList.cacheValidUntil\n ? { cache_valid_until: resolvedRequestPropertyList.cacheValidUntil }\n : {}),\n },\n }\n : {}),\n diagnostics: validation.diagnostics as ProductPropertyPolicyDiagnostic[],\n };\n result.metadata.productPropertyPolicy = summary;\n\n if (validation.diagnostics.length > 0) {\n result.debug_logs = [\n ...(result.debug_logs ?? []),\n {\n type: 'product_property_policy',\n message: validation.ok ? 'Product property policy evaluated' : message,\n mode,\n ok: validation.ok,\n accepted_count: validation.acceptedProducts.length,\n rejected_count: validation.rejectedProducts.length,\n flagged_count: validation.flaggedProducts.length,\n ...(summary.request_property_list ? { request_property_list: summary.request_property_list } : {}),\n diagnostics: validation.diagnostics,\n },\n ];\n }\n\n if (mode === 'filter') {\n result.data = {\n ...(response as unknown as Record<string, unknown>),\n products: validation.products,\n } as T;\n return result;\n }\n\n if (mode === 'reject_response' && !validation.ok) {\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n data: response as unknown as T,\n error: message,\n metadata: {\n ...result.metadata,\n status: 'failed',\n productPropertyPolicy: summary,\n },\n conversation: result.conversation,\n debug_logs: result.debug_logs,\n });\n }\n\n return result;\n }\n\n private rememberProductPolicyRequestParams<T>(\n taskType: string,\n requestParams: Record<string, unknown>,\n result: TaskResult<T>,\n options?: TaskOptions\n ): void {\n this.rememberProductPolicyRequestState(\n taskType,\n { request: productPolicyRequestSnapshot(requestParams) },\n result,\n options\n );\n }\n\n private rememberProductPolicyRequestState<T>(\n taskType: string,\n requestState: ProductPolicyRequestState,\n result: TaskResult<T>,\n options?: TaskOptions\n ): void {\n if (taskType !== 'get_products') return;\n if (result.status !== 'submitted' && result.status !== 'working') return;\n\n const keys = new Set<string>();\n if (result.metadata.taskId) keys.add(result.metadata.taskId);\n if (result.metadata.contextId) keys.add(result.metadata.contextId);\n if (result.metadata.serverTaskId) keys.add(result.metadata.serverTaskId);\n if (result.submitted?.taskId) keys.add(result.submitted.taskId);\n if (options?.taskId) keys.add(options.taskId);\n if (options?.contextId) keys.add(options.contextId);\n\n for (const key of keys) {\n this.productPolicyRequestParamsByTask.delete(key);\n this.productPolicyRequestParamsByTask.set(key, requestState);\n while (this.productPolicyRequestParamsByTask.size > TASK_SCOPED_STATE_LIMIT) {\n const oldest = this.productPolicyRequestParamsByTask.keys().next().value;\n if (oldest === undefined) break;\n this.productPolicyRequestParamsByTask.delete(oldest);\n }\n }\n }\n\n private rememberLegacyFormatConverter<T>(\n taskType: string,\n converter: LegacyFormatConverter | undefined,\n result: TaskResult<T>,\n options?: TaskOptions\n ): void {\n if (!converter || (taskType !== 'get_products' && taskType !== 'list_creatives')) return;\n const metadata = result.metadata as typeof result.metadata & { operationId?: string };\n const keys = [\n metadata.operationId,\n metadata.taskId,\n metadata.contextId,\n metadata.serverTaskId,\n options?.taskId,\n options?.contextId,\n ];\n for (const key of keys) {\n if (key) this.rememberCanonicalCreativeTaskAssociation(key, taskType, converter);\n }\n }\n\n private legacyFormatConverterForWebhook(metadata: WebhookMetadata): LegacyFormatConverter | undefined {\n return (\n this.canonicalCreativeTaskAssociation(metadata.operation_id)?.legacyFormatConverter ??\n this.canonicalCreativeTaskAssociation(metadata.task_id)?.legacyFormatConverter ??\n this.canonicalCreativeTaskAssociation(metadata.context_id)?.legacyFormatConverter ??\n this.resolveLegacyFormatConverter()\n );\n }\n\n private forgetProductPolicyRequestParams(metadata: WebhookMetadata): void {\n const aliases = [metadata.operation_id, metadata.task_id, metadata.context_id];\n const states = new Set(\n aliases\n .filter((key): key is string => key !== undefined)\n .map(key => this.productPolicyRequestParamsByTask.get(key))\n .filter((value): value is ProductPolicyRequestState => value !== undefined)\n );\n for (const state of states) state.request = undefined;\n this.forgetProductPolicyRequestParamKeys(aliases);\n if (states.size === 0) return;\n // All aliases for one request share the same immutable snapshot. A webhook\n // may name only operation/task/context, so remove any caller-supplied A2A\n // aliases that point at that same snapshot as well.\n for (const [key, state] of this.productPolicyRequestParamsByTask) {\n if (states.has(state)) this.productPolicyRequestParamsByTask.delete(key);\n }\n }\n\n private forgetProductPolicyRequestParamKeys(keys: Array<string | undefined>): void {\n for (const key of keys) {\n if (!key) continue;\n this.productPolicyRequestParamsByTask.delete(key);\n }\n }\n\n private wrapProductPolicySubmittedContinuation<T>(\n result: TaskResult<T>,\n taskType: string,\n requestParams: Record<string, unknown>,\n options?: TaskOptions\n ): TaskResult<T> {\n if (taskType !== 'get_products' || result.status !== 'submitted' || !result.submitted) return result;\n\n const submitted = result.submitted;\n const policyState: { request?: Readonly<Record<string, unknown>> } = {\n request: productPolicyRequestSnapshot(requestParams),\n };\n this.rememberProductPolicyRequestState(taskType, policyState, result, options);\n const retainedKeys = [\n result.metadata.taskId,\n result.metadata.contextId,\n result.metadata.serverTaskId,\n submitted.taskId,\n options?.taskId,\n options?.contextId,\n ];\n result.submitted = {\n ...submitted,\n track: async transport => {\n const taskInfo = await submitted.track(transport);\n const terminal = ['completed', 'failed', 'rejected', 'canceled'].includes(taskInfo.status);\n try {\n return await this.applyProductPropertyPolicyToTaskInfo(\n taskInfo,\n taskType,\n (policyState.request ?? {}) as Record<string, unknown>\n );\n } finally {\n if (terminal) {\n policyState.request = undefined;\n this.forgetProductPolicyRequestParamKeys([...retainedKeys, taskInfo.taskId]);\n }\n }\n },\n waitForCompletion: async (pollInterval, signal) => {\n let completed = await submitted.waitForCompletion(pollInterval, signal);\n if (completed.success && completed.data) {\n completed.data = this.normalizeResponseToV3(taskType, completed.data) as T;\n }\n const terminal = completed.status === 'completed' || completed.status === 'failed';\n try {\n return await this.applyProductPropertyPolicy(\n completed,\n taskType,\n (policyState.request ?? {}) as Record<string, unknown>\n );\n } finally {\n if (terminal) {\n policyState.request = undefined;\n this.forgetProductPolicyRequestParamKeys([\n ...retainedKeys,\n completed.metadata.taskId,\n completed.metadata.serverTaskId,\n ]);\n }\n }\n },\n };\n\n return result;\n }\n\n private async applyProductPropertyPolicyToTaskInfo(\n taskInfo: TaskInfo,\n taskType: string,\n requestParams: Record<string, unknown>\n ): Promise<TaskInfo> {\n if (taskType !== 'get_products' || taskInfo.status !== 'completed' || !taskInfo.result) return taskInfo;\n\n const policyResult = await this.applyProductPropertyPolicy(\n attachMatch({\n success: true as const,\n status: 'completed' as const,\n data: this.normalizeResponseToV3(taskType, taskInfo.result),\n metadata: {\n taskId: taskInfo.taskId,\n taskName: taskInfo.taskType,\n agent: { id: this.agent.id, name: this.agent.name, protocol: this.agent.protocol },\n responseTimeMs: Math.max(0, Date.now() - taskInfo.createdAt),\n timestamp: new Date().toISOString(),\n clarificationRounds: 0,\n status: 'completed',\n },\n debug_logs: [],\n }),\n taskType,\n requestParams\n );\n\n if (policyResult.success) {\n return { ...taskInfo, result: policyResult.data };\n }\n\n return {\n ...taskInfo,\n status: 'failed',\n result: policyResult.data,\n error: policyResult.error,\n message: policyResult.error,\n };\n }\n\n private productPolicyRequestParamsForWebhook(metadata: WebhookMetadata): Record<string, unknown> {\n return (\n this.executor.getRequestParams(metadata.operation_id) ??\n this.executor.getRequestParams(metadata.task_id) ??\n this.productPolicyRequestParamsForKey(metadata.operation_id) ??\n this.productPolicyRequestParamsForKey(metadata.task_id) ??\n this.productPolicyRequestParamsForKey(metadata.context_id) ??\n {}\n );\n }\n\n private productPolicyRequestParamsForKey(key: string | undefined): Record<string, unknown> | undefined {\n if (!key) return undefined;\n const state = this.productPolicyRequestParamsByTask.get(key);\n if (!state?.request) return undefined;\n this.productPolicyRequestParamsByTask.delete(key);\n this.productPolicyRequestParamsByTask.set(key, state);\n return state.request as Record<string, unknown>;\n }\n\n private async applyProductPropertyPolicyToWebhookResult(\n result: AdCPAsyncResponseData | undefined,\n metadata: WebhookMetadata\n ): Promise<{ result: AdCPAsyncResponseData | undefined; metadata: WebhookMetadata; suppressHandler: boolean }> {\n if (metadata.task_type !== 'get_products' || metadata.status !== 'completed' || !result) {\n return { result, metadata, suppressHandler: false };\n }\n\n const policyResult = await this.applyProductPropertyPolicy<AdCPAsyncResponseData>(\n attachMatch({\n success: true as const,\n status: 'completed' as const,\n data: result,\n metadata: {\n taskId: metadata.operation_id,\n taskName: metadata.task_type,\n agent: { id: this.agent.id, name: this.agent.name, protocol: this.agent.protocol },\n responseTimeMs: 0,\n timestamp: metadata.timestamp,\n clarificationRounds: 0,\n status: 'completed',\n },\n debug_logs: [],\n }),\n metadata.task_type,\n this.productPolicyRequestParamsForWebhook(metadata)\n );\n\n const nextMetadata: WebhookMetadata = {\n ...metadata,\n status: policyResult.success ? metadata.status : 'failed',\n ...(policyResult.error ? { message: policyResult.error } : {}),\n ...(policyResult.metadata.productPropertyPolicy\n ? { productPropertyPolicy: policyResult.metadata.productPropertyPolicy }\n : {}),\n ...(policyResult.metadata.productPricingPolicy\n ? { productPricingPolicy: policyResult.metadata.productPricingPolicy }\n : {}),\n };\n\n return {\n result: policyResult.data as AdCPAsyncResponseData | undefined,\n metadata: nextMetadata,\n suppressHandler: !policyResult.success,\n };\n }\n\n /**\n * Adapt a request for the detected server wire version and the seller's\n * AdCP protocol version. Applies wire-format adapters (v2.5) when talking\n * to a v2 server, then applies protocol-version adapters (e.g. stripping\n * 3.1-only fields for a 3.0 seller). Returns the adapted params and any\n * drift log entries describing what was changed.\n *\n * Runs after `detectServerVersion` so capabilities are available and the\n * current call's tool schemas can be supplied without cross-tenant caching.\n */\n private adaptRequest(\n taskType: string,\n params: any,\n serverVersion: string,\n debugLogs?: any[],\n perCallToolSchemas?: ToolSchemaMap,\n perCallCapabilities?: AdcpCapabilities\n ): { params: any; driftLogs: Record<string, unknown>[] } {\n const driftLogs: Record<string, unknown>[] = [];\n let adapted = params;\n\n if (serverVersion !== 'v3') {\n // Dispatch through the legacy v2.5 adapter registry. Per-tool pairs\n // live in `src/lib/adapters/legacy/v2-5/<tool>.ts`. Tools without a\n // registered pair (or pairs whose request side is pass-through)\n // leave `adapted` unchanged. Adding a future legacy version means\n // adding a sibling `legacy/<version>/` directory, not editing\n // this dispatch.\n const pair = getV25Adapter(taskType);\n if (pair) adapted = pair.adaptRequest(adapted);\n }\n\n // Strip any top-level fields not declared in the agent's tool schema.\n // This handles partial implementations (agents that omit some fields)\n // and prevents unknown fields from causing validation errors on the\n // remote server.\n // Fails open when no schema is cached OR when the schema declares no\n // properties (JSON Schema semantics: an object with no properties\n // and no `additionalProperties: false` accepts any shape). Post-#909,\n // framework-registered agents publish `{ type: 'object', properties: {} }`\n // on tools/list — treating that as \"strip everything\" would silently\n // drop every field the buyer sent.\n // MCP-only in practice: A2A agents don't populate cachedToolSchemas.\n //\n // Note: the empty-properties state from framework agents is intentional\n // (LLM context-window economy — see `PASSTHROUGH_INPUT_SCHEMA` in\n // `create-adcp-server.ts`). Don't try to \"fix\" it by wiring per-tool\n // schemas into `tools/list`. If you genuinely need to know a tool's\n // shape (gating, validation, version adaptation), read raw JSON from\n // `schemas/cache/{version}/` via `schema-loader.ts`. The right defense\n // against unknown-field errors is to gate at the *injection site*\n // (e.g. `applyBrandInvariant` in the storyboard runner — see #940),\n // not to lean on this strip path as a backstop.\n const toolSchema = (perCallToolSchemas ?? this.cachedToolSchemas)?.get(taskType);\n if (toolSchema && Object.keys(toolSchema).length > 0) {\n const declaredFields = new Set(Object.keys(toolSchema));\n\n // The v2 adapter may rename fields (e.g. brand → brand_manifest) that a\n // v3 server — misdetected as v2 — doesn't declare. Reconcile known\n // adapter mappings so the value isn't silently dropped.\n //\n // CRITICAL: only alias when the JS type of the moved value is\n // compatible with the destination field's declared shape. v2.5 sellers\n // (e.g. Wonderstruck) declare `brand` in their tool schema as a\n // BrandReference object — v2 adapter produces a `brand_manifest` URL\n // string, and blindly aliasing the string into the object slot causes\n // the seller to reject with `Input should be a valid dictionary or\n // instance of BrandReference`. Skip the alias when shapes don't match\n // and let the field-stripping path drop the v2-shaped value cleanly.\n const adapterAliases: [string, string][] = [['brand_manifest', 'brand']];\n for (const [adapterField, schemaField] of adapterAliases) {\n if (\n adapted[adapterField] !== undefined &&\n !declaredFields.has(adapterField) &&\n declaredFields.has(schemaField) &&\n adapted[schemaField] === undefined &&\n valueMatchesSchemaType(adapted[adapterField], (toolSchema as Record<string, unknown>)[schemaField])\n ) {\n adapted[schemaField] = adapted[adapterField];\n delete adapted[adapterField];\n }\n }\n\n // Protocol envelope fields are always preserved — they live at the\n // protocol layer, not in individual tool schemas.\n const envelopeFields = ADCP_ENVELOPE_FIELDS;\n const filtered: Record<string, unknown> = {};\n const schemaStripped: string[] = [];\n\n // A field is preserved when it's declared by the agent's (possibly\n // partial) tool schema, OR it's a protocol envelope field, OR it's a\n // CANONICAL top-level field for this task in the resolved AdCP version.\n //\n // The canonical-schema union is the fix for partial-schema sellers\n // (e.g. \"Open Ads\", https://api.openads.ai/mcp): such agents\n // under-declare their `tools/list` inputSchema, so intersecting only\n // their self-declared fields silently dropped canonical — sometimes\n // REQUIRED — AdCP request fields (`media_buy_id` on update_media_buy,\n // `media_buy_ids` on get_media_buy_delivery, `creative_ids` on\n // sync_creatives) before the request left the client, breaking\n // media-buy updates and delivery polling. Only fields unknown to BOTH\n // the agent schema AND the canonical request schema are genuine junk\n // and get stripped.\n //\n // `taskType` is the snake_case tool name (e.g. `update_media_buy`),\n // which is exactly the `toolName` key `schemaAllowsTopLevelField` looks\n // up as `${toolName}::request` in the loader's fileIndex. The version\n // arg is the raw resolved pin (`this.resolvedAdcpVersion`); the loader\n // resolves the bundle key internally via `ensureInit`/`resolveBundleKey`\n // (same contract as `TaskExecutor.validateRequest`). The helper FAILS\n // OPEN (returns true) when no canonical schema is indexed for the tool,\n // which preserves the field rather than dropping something we can't\n // authoritatively rule out.\n for (const [key, value] of Object.entries(adapted)) {\n if (\n declaredFields.has(key) ||\n envelopeFields.has(key) ||\n schemaAllowsTopLevelField(taskType, key, this.resolvedAdcpVersion)\n ) {\n filtered[key] = value;\n } else {\n schemaStripped.push(key);\n }\n }\n\n if (schemaStripped.length > 0) {\n console.warn(\n `[AdCP] Stripping request fields not declared by either agent \"${this.agent.id}\" or canonical AdCP schemas ` +\n `for ${taskType}: ${schemaStripped.join(', ')}`\n );\n debugLogs?.push({\n type: 'warning',\n message:\n `Stripped request fields not declared by either the agent tool input schema or canonical AdCP schema ` +\n `for ${taskType}: ${schemaStripped.join(', ')}`,\n timestamp: new Date().toISOString(),\n details: {\n code: 'input_schema_field_stripped',\n task: taskType,\n fields: schemaStripped,\n agent_id: this.agent.id,\n },\n });\n }\n\n adapted = filtered;\n }\n\n // Protocol version adaptation: strip fields not accepted by the target\n // AdCP version. `resolveAdapterKey` returns the effective target version\n // based on the client pin and the seller's advertised caps; adapters live\n // in `src/lib/adapters/version/<target>/`.\n const adapterKey = resolveAdapterKey(this.resolvedAdcpVersion, perCallCapabilities ?? this.cachedCapabilities);\n if (adapterKey) {\n const versionAdapter = getVersionAdapter(adapterKey, taskType);\n if (versionAdapter) {\n const result = versionAdapter.adaptRequest(adapted);\n adapted = result.params;\n if (result.drift) {\n driftLogs.push({\n ...result.drift,\n taskName: taskType,\n clientVersion: this.resolvedAdcpVersion,\n targetVersion: adapterKey,\n timestamp: new Date().toISOString(),\n });\n }\n }\n }\n\n return { params: adapted, driftLogs };\n }\n\n /**\n * Normalize response to v3 format\n *\n * Converts v2 responses to v3 structure for consistent API surface.\n */\n private normalizeResponseToV3(taskType: string, data: any): any {\n // Dispatch through the legacy v2.5 adapter registry. The pair's\n // optional `normalizeResponse` runs when present; otherwise the\n // response is passed through unchanged.\n const pair = getV25Adapter(taskType);\n if (pair?.normalizeResponse) return pair.normalizeResponse(data);\n return data;\n }\n\n /**\n * Check if request uses v3 features that the server doesn't support\n *\n * Returns an early empty result if the request requires v3 features\n * that the server doesn't support. This treats \"products matching unsupported\n * capability\" as an empty result set rather than an error.\n *\n * @returns TaskResult with empty data if v3 features are unsupported, null to proceed normally\n */\n private async getEarlyResultForUnsupportedFeatures<T>(\n taskType: string,\n params: any,\n options?: ReadRequestOptions\n ): Promise<TaskResult<T> | null> {\n // Only check for tasks that have v3-specific features\n if (taskType !== 'get_products') {\n return null;\n }\n\n // Get capabilities to check what the server supports\n const capabilities = await this.getCapabilities(options);\n\n // If server is v3, all features are supported - proceed normally\n if (capabilities.version === 'v3') {\n return null;\n }\n\n // Check for v3-only features that would make this query return empty results.\n //\n // TODO: Once we remove backwards-compatibility stripping in adaptGetProductsRequestForV2,\n // re-enable these guards so v3-only requests fail fast against v2 servers:\n // (params.property_list && !capabilities.features.propertyListFiltering) ||\n // (params.filters?.required_features?.includes('property_list_filtering') &&\n // !capabilities.features.propertyListFiltering) ||\n //\n // TODO: Surface the reason for empty results to the caller (e.g. metadata or a\n // structured warning) so they can distinguish \"no products matched\" from \"server\n // lacks v3 feature support\" vs \"request failed\". Right now empty results from a\n // capability mismatch look identical to a seller that simply has no inventory.\n const usesUnsupportedFeature =\n // required_features: content_standards requires contentStandards\n params.filters?.required_features?.includes('content_standards') && !capabilities.features.contentStandards;\n\n if (!usesUnsupportedFeature) {\n return null; // Proceed normally\n }\n\n // Log warning about v2 downgrade\n console.warn(\n `[AdCP] v3-only features not supported by server \"${this.agent.id}\" (${capabilities.version}). Returning empty results.`\n );\n\n // Return empty result - semantically \"no products match this filter\"\n const emptyResponse = {\n products: [],\n property_list_applied: false,\n } as T;\n\n return {\n success: true,\n status: 'completed',\n data: emptyResponse,\n metadata: {\n taskId: `early_${Date.now()}`,\n taskName: taskType,\n agent: {\n id: this.agent.id,\n name: this.agent.name,\n protocol: this.normalizedAgent.protocol,\n },\n responseTimeMs: 0,\n timestamp: new Date().toISOString(),\n clarificationRounds: 0,\n status: 'completed',\n },\n };\n }\n\n // ====== MEDIA BUY TASKS ======\n\n /**\n * Discover available advertising products\n *\n * `brand` is optional when `catalog` is absent, including for the brief-only\n * request below. Requests with `catalog` must include `brand`; otherwise,\n * include it whenever discovery should account for a specific advertiser.\n *\n * @param params - Product discovery parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n *\n * @example\n * ```typescript\n * const products = await client.getProducts(\n * {\n * buying_mode: 'brief',\n * brief: 'Find podcast and streaming audio placements for an eco-friendly bike subscription launch'\n * },\n * (context) => {\n * if (context.inputRequest.field === 'budget') return 50000;\n * return context.deferToHuman();\n * }\n * );\n * ```\n */\n async getProducts(\n params: CanonicalGetProductsRequest,\n inputHandler?: InputHandler,\n options?: CanonicalReadTaskOptions\n ): Promise<TaskResult<CanonicalGetProductsResponse>> {\n const { legacyFormatConverter, projectionCatalogs, ...taskOptions } = options ?? {};\n this.assertDurableProjectionOverrideSupported(legacyFormatConverter);\n const effectiveLegacyFormatConverter = this.resolveLegacyFormatConverter(\n legacyFormatConverter,\n projectionCatalogs ?? this.config.projectionCatalogs\n );\n const account = canonicalAccountRoutingSnapshot(params.account);\n return this.executeAndHandle<CanonicalGetProductsResponse>(\n 'get_products',\n 'onGetProductsStatusChange',\n params,\n inputHandler,\n taskOptions,\n data => {\n const { response, diagnostics } = toCanonicalOnlyResponse(data as unknown as { products?: V1Product[] }, {\n legacyFormatConverter: effectiveLegacyFormatConverter,\n projectionCatalogs: projectionCatalogs ?? this.config.projectionCatalogs,\n });\n const authoritativeProducts = Array.isArray((data as unknown as { products?: unknown[] }).products)\n ? (data as unknown as { products: unknown[] }).products\n : response.products;\n this.rememberCanonicalProductRoutes(response.products, account, authoritativeProducts);\n const { _message: _dropLegacyMessage, ...canonical } = response as typeof response & { _message?: unknown };\n void _dropLegacyMessage;\n return { ...canonical, projection: { diagnostics } } as CanonicalGetProductsResponse;\n },\n effectiveLegacyFormatConverter,\n undefined,\n projectionCatalogs\n );\n }\n\n /** @deprecated Explicit raw-wire escape hatch for migration tooling. */\n async getProductsLegacy(\n params: GetProductsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetProductsResponse>> {\n return this.executeTaskUnprojected<GetProductsResponse>('get_products', params, inputHandler, options);\n }\n\n /** @internal Run final legacy get_products adaptation before an application-owned atomic mutation claim. */\n async getProductsLegacyWithPreDispatch(\n params: GetProductsRequest,\n beforeDispatch: UnprojectedPreDispatchHook<GetProductsResponse>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetProductsResponse>> {\n const requestSnapshot = structuredClone(params);\n return this.executeTaskUnprojected<GetProductsResponse>(\n 'get_products',\n requestSnapshot,\n inputHandler,\n options,\n undefined,\n beforeDispatch\n );\n }\n\n /**\n * List a legacy named-format catalog for migration tooling.\n *\n * @param params - Format listing parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n * @deprecated Canonical applications discover `format_options[]` through `getProducts()`.\n */\n async listCreativeFormatsLegacy(\n params: ListCreativeFormatsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListCreativeFormatsResponse>> {\n return this.executeAndHandle<ListCreativeFormatsResponse>(\n 'list_creative_formats',\n 'onListCreativeFormatsLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /** @deprecated Migration-only access to legacy creative transformer declarations. */\n async listTransformersLegacy(\n params: ListTransformersRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListTransformersResponse>> {\n return this.executeTaskUnprojected<ListTransformersResponse>('list_transformers', params, inputHandler, options);\n }\n\n /**\n * Create a new media buy\n *\n * @param params - Media buy creation parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async createMediaBuy(\n params: MutatingRequestInput<CanonicalCreateMediaBuyRequest>,\n inputHandler?: InputHandler,\n options?: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<CreateMediaBuyResponse>>> {\n this.assertDurableProjectionOverrideSupported(options?.legacyFormatConverter);\n const requestSnapshot = structuredCloneWithLegacyCreativeMetadata(params);\n const projectionCatalogs = options?.projectionCatalogs ? structuredClone(options.projectionCatalogs) : undefined;\n const snapshottedOptions = {\n ...snapshotTaskOptions(options),\n ...(projectionCatalogs !== undefined && { projectionCatalogs }),\n };\n return withTaskDeadline(snapshottedOptions, effectiveOptions =>\n this.createMediaBuyWithinDeadline(requestSnapshot, inputHandler, effectiveOptions)\n );\n }\n\n private async createMediaBuyWithinDeadline(\n params: MutatingRequestInput<CanonicalCreateMediaBuyRequest>,\n inputHandler: InputHandler | undefined,\n options: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<CreateMediaBuyResponse>>> {\n const { legacyFormatConverter, projectionCatalogs, canonicalFormatLegacyResolver, ...taskOptions } = options ?? {};\n const effectiveLegacyFormatConverter = this.resolveLegacyFormatConverter(\n legacyFormatConverter,\n projectionCatalogs ?? this.config.projectionCatalogs\n );\n const effectiveCanonicalFormatLegacyResolver = this.resolveCanonicalFormatLegacyResolver(\n canonicalFormatLegacyResolver,\n params.account\n );\n const hasCreativeFormatData = hasMediaBuyCreativeFormatData(params);\n if (hasCreativeFormatData) {\n this.validateBeforeCreativeCapabilityProbe('create_media_buy', params, taskOptions);\n }\n const wireMode = hasCreativeFormatData\n ? this.resolveCreativeFormatWireMode(\n 'create_media_buy',\n await this.getCapabilities({ signal: taskOptions.signal, transport: taskOptions.transport })\n )\n : 'canonical';\n // Merge library defaults with consumer-provided reporting_webhook config\n // Library provides url/auth/frequency defaults, consumer can override any field\n // Generates a media_buy_delivery webhook URL using operation_id pattern: delivery_report_{agent_id}_{YYYY-MM}\n if (this.config.webhookUrlTemplate && !options?.disableWebhook) {\n const now = new Date();\n const year = now.getUTCFullYear();\n const month = String(now.getUTCMonth() + 1).padStart(2, '0');\n const operationId = `delivery_report_${this.agent.id}_${year}-${month}`;\n const deliveryWebhookUrl = resolveWebhookUrl(\n this.config.webhookUrlTemplate,\n this.agent.id,\n 'media_buy_delivery',\n operationId,\n options\n );\n\n if (deliveryWebhookUrl) {\n const consumerAuth = params.reporting_webhook?.authentication;\n const defaultAuth = this.config.webhookSecret\n ? { schemes: ['HMAC-SHA256'] as const, credentials: this.config.webhookSecret }\n : undefined;\n\n // `reporting-webhook.json` requires `authentication` throughout AdCP 3.x\n // (the requirement lifts in 4.0 when RFC 9421 becomes the only path), so\n // unlike `push_notification_config` the block cannot simply be omitted.\n // With no configured secret and no caller-supplied credential there is\n // nothing real to put there — registering a placeholder would tell the\n // seller its delivery reports are authenticated by a constant that ships\n // in this file. Skip the auto-injection instead and say why.\n if (!consumerAuth && !defaultAuth) {\n // A caller who asked for a `reporting_webhook` explicitly gets an\n // error, not a silent edit: the request cannot be made spec-valid\n // without a credential, and quietly dropping a field the caller wrote\n // would make the SDK a translator of intent rather than a witness to\n // it. Only the library's OWN auto-injection is skipped silently.\n if (params.reporting_webhook) {\n throw new Error(\n 'reporting_webhook requires an `authentication` block for all of AdCP 3.x, and no credential ' +\n 'is available: set `webhookSecret` on the client, or pass `reporting_webhook.authentication` ' +\n 'explicitly. Remove `reporting_webhook` from the request if you do not need automated ' +\n 'delivery reports — the media buy itself does not require it.'\n );\n }\n warnReportingWebhookNeedsSecret();\n } else {\n // Library defaults\n const libraryDefaults = {\n url: deliveryWebhookUrl,\n reporting_frequency: (this.config.reportingWebhookFrequency || 'daily') as 'hourly' | 'daily' | 'monthly',\n };\n\n // Merge the envelope, but treat `authentication` as ATOMIC. A\n // field-level merge would cross `schemes` from the caller with\n // `credentials` from `webhookSecret` — a caller passing\n // `schemes: ['Bearer']` with no credential would have the HMAC shared\n // secret registered as a Bearer token, which the seller then sends in\n // cleartext on every delivery. `schemes` determines how `credentials`\n // travels, so the two must come from the same source.\n params = {\n ...params,\n reporting_webhook: {\n ...libraryDefaults,\n ...params.reporting_webhook,\n authentication: consumerAuth ?? defaultAuth,\n },\n } as CanonicalCreateMediaBuyRequest;\n }\n }\n }\n\n const result = await this.executeAndHandle<CreateMediaBuyResponse>(\n 'create_media_buy',\n 'onCreateMediaBuyStatusChange',\n projectMediaBuyCreativesForDelivery(\n params,\n wireMode,\n 'create_media_buy',\n effectiveLegacyFormatConverter,\n effectiveCanonicalFormatLegacyResolver\n ),\n inputHandler,\n taskOptions,\n undefined,\n effectiveLegacyFormatConverter,\n params,\n projectionCatalogs\n );\n if (result.data !== undefined) this.rememberCanonicalPackageRoutes(result.data, params);\n return result;\n }\n\n /**\n * @deprecated Compatibility-only entry point for callers still holding legacy creative `format_id` values.\n * Projection-only options are ignored because this method preserves the caller's legacy wire payload.\n */\n async createMediaBuyLegacy(\n params: MutatingRequestInput<CreateMediaBuyRequest>,\n inputHandler?: InputHandler,\n options?: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<CreateMediaBuyResponse>> {\n return this.executeTaskUnprojected<CreateMediaBuyResponse>(\n 'create_media_buy',\n params,\n inputHandler,\n options,\n 'onCreateMediaBuyStatusChange'\n );\n }\n\n /** @internal Run deterministic legacy-create preflight before the caller atomically claims its mutation. */\n async createMediaBuyLegacyWithPreDispatch(\n params: MutatingRequestInput<CreateMediaBuyRequest>,\n beforeDispatch: UnprojectedPreDispatchHook<CreateMediaBuyResponse>,\n inputHandler?: InputHandler,\n options?: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<CreateMediaBuyResponse>> {\n // Snapshot synchronously at the public boundary. Request validation and\n // endpoint/capability discovery contain awaits; callers must not be able to\n // mutate nested commercial terms between validation and durable dispatch.\n const requestSnapshot = structuredClone(params);\n return this.executeTaskUnprojected<CreateMediaBuyResponse>(\n 'create_media_buy',\n requestSnapshot,\n inputHandler,\n options,\n 'onCreateMediaBuyStatusChange',\n beforeDispatch\n );\n }\n\n /**\n * Update an existing media buy\n *\n * @param params - Media buy update parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async updateMediaBuy(\n params: MutatingRequestInput<CanonicalUpdateMediaBuyRequest>,\n inputHandler?: InputHandler,\n options?: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<UpdateMediaBuyResponse>>> {\n this.assertDurableProjectionOverrideSupported(options?.legacyFormatConverter);\n const requestSnapshot = structuredCloneWithLegacyCreativeMetadata(params);\n const projectionCatalogs = options?.projectionCatalogs ? structuredClone(options.projectionCatalogs) : undefined;\n const snapshottedOptions = {\n ...snapshotTaskOptions(options),\n ...(projectionCatalogs !== undefined && { projectionCatalogs }),\n };\n return withTaskDeadline(snapshottedOptions, effectiveOptions =>\n this.updateMediaBuyWithinDeadline(requestSnapshot, inputHandler, effectiveOptions)\n );\n }\n\n private async updateMediaBuyWithinDeadline(\n params: MutatingRequestInput<CanonicalUpdateMediaBuyRequest>,\n inputHandler: InputHandler | undefined,\n options: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<UpdateMediaBuyResponse>>> {\n const { legacyFormatConverter, projectionCatalogs, canonicalFormatLegacyResolver, ...taskOptions } = options ?? {};\n const effectiveLegacyFormatConverter = this.resolveLegacyFormatConverter(\n legacyFormatConverter,\n projectionCatalogs ?? this.config.projectionCatalogs\n );\n const effectiveCanonicalFormatLegacyResolver = this.resolveCanonicalFormatLegacyResolver(\n canonicalFormatLegacyResolver,\n params.account\n );\n const hasCreativeFormatData = hasMediaBuyCreativeFormatData(params);\n if (hasCreativeFormatData) {\n this.validateBeforeCreativeCapabilityProbe('update_media_buy', params, taskOptions);\n }\n const wireMode = hasCreativeFormatData\n ? this.resolveCreativeFormatWireMode(\n 'update_media_buy',\n await this.getCapabilities({ signal: taskOptions.signal, transport: taskOptions.transport })\n )\n : 'canonical';\n const result = await this.executeAndHandle<UpdateMediaBuyResponse>(\n 'update_media_buy',\n 'onUpdateMediaBuyStatusChange',\n projectMediaBuyCreativesForDelivery(\n params,\n wireMode,\n 'update_media_buy',\n effectiveLegacyFormatConverter,\n effectiveCanonicalFormatLegacyResolver\n ),\n inputHandler,\n taskOptions,\n undefined,\n effectiveLegacyFormatConverter,\n params,\n projectionCatalogs\n );\n if (result.data !== undefined) this.rememberCanonicalPackageRoutes(result.data, params);\n return result;\n }\n\n /**\n * @deprecated Compatibility-only entry point for callers still holding legacy creative `format_id` values.\n * Projection-only options are ignored because this method preserves the caller's legacy wire payload.\n */\n async updateMediaBuyLegacy(\n params: MutatingRequestInput<UpdateMediaBuyRequest>,\n inputHandler?: InputHandler,\n options?: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<UpdateMediaBuyResponse>> {\n return this.executeTaskUnprojected<UpdateMediaBuyResponse>(\n 'update_media_buy',\n params,\n inputHandler,\n options,\n 'onUpdateMediaBuyStatusChange'\n );\n }\n\n /**\n * Sync creative assets\n *\n * @param params - Creative sync parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async syncCreatives(\n params: MutatingRequestInput<CanonicalSyncCreativesRequest>,\n inputHandler?: InputHandler,\n options?: SyncCreativesTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<SyncCreativesResponse>>> {\n this.assertDurableProjectionOverrideSupported(\n options?.creativeFormatProjection?.legacyFormatConverter ?? options?.legacyFormatConverter\n );\n const requestSnapshot = structuredCloneWithLegacyCreativeMetadata(params);\n const projectionCatalogs = options?.projectionCatalogs ? structuredClone(options.projectionCatalogs) : undefined;\n const creativeFormatProjection = options?.creativeFormatProjection\n ? {\n ...options.creativeFormatProjection,\n ...(options.creativeFormatProjection.selectorContainers !== undefined && {\n selectorContainers: structuredCloneWithLegacyCreativeMetadata(\n options.creativeFormatProjection.selectorContainers\n ),\n }),\n }\n : undefined;\n const snapshottedOptions = {\n ...snapshotTaskOptions(options),\n ...(projectionCatalogs !== undefined && { projectionCatalogs }),\n ...(creativeFormatProjection !== undefined && { creativeFormatProjection }),\n };\n return withTaskDeadline(snapshottedOptions, effectiveOptions =>\n this.syncCreativesWithinDeadline(requestSnapshot, inputHandler, effectiveOptions)\n );\n }\n\n private async syncCreativesWithinDeadline(\n params: MutatingRequestInput<CanonicalSyncCreativesRequest>,\n inputHandler: InputHandler | undefined,\n options: SyncCreativesTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<SyncCreativesResponse>>> {\n const {\n creativeFormatProjection,\n legacyFormatConverter,\n projectionCatalogs,\n canonicalFormatLegacyResolver,\n ...taskOptions\n } = options ?? {};\n const effectiveCanonicalFormatLegacyResolver = this.resolveCanonicalFormatLegacyResolver(\n canonicalFormatLegacyResolver,\n params.account\n );\n const effectiveLegacyFormatConverter = this.resolveLegacyFormatConverter(\n creativeFormatProjection?.legacyFormatConverter ?? legacyFormatConverter,\n projectionCatalogs ?? this.config.projectionCatalogs\n );\n this.validateBeforeCreativeCapabilityProbe('sync_creatives', params, taskOptions);\n const wireMode = this.resolveCreativeFormatWireMode(\n 'sync_creatives',\n await this.getCapabilities({ signal: taskOptions.signal, transport: taskOptions.transport })\n );\n const configuredSelectorContainers = [\n ...((creativeFormatProjection?.selectorContainers ?? []) as ReadonlyArray<CreativeFormatSelectorContainer>),\n ];\n const configuredPackageIds = new Set(\n configuredSelectorContainers.flatMap(container =>\n typeof container.package_id === 'string' ? [container.package_id] : []\n )\n );\n const assignmentPackageContainers = Array.isArray(params.assignments)\n ? params.assignments.flatMap(assignment =>\n typeof assignment.package_id === 'string' && !configuredPackageIds.has(assignment.package_id)\n ? [{ package_id: assignment.package_id }]\n : []\n )\n : [];\n const wireParams = projectSyncCreativesForDelivery(\n params,\n [...configuredSelectorContainers, ...assignmentPackageContainers],\n wireMode,\n effectiveLegacyFormatConverter,\n effectiveCanonicalFormatLegacyResolver\n );\n return this.executeAndHandle<SyncCreativesResponse>(\n 'sync_creatives',\n 'onSyncCreativesStatusChange',\n wireParams,\n inputHandler,\n taskOptions,\n undefined,\n effectiveLegacyFormatConverter,\n params,\n projectionCatalogs\n );\n }\n\n /**\n * @deprecated Compatibility-only entry point for callers still holding legacy creative `format_id` values.\n * Projection-only options are ignored because this method preserves the caller's legacy wire payload.\n */\n async syncCreativesLegacy(\n params: MutatingRequestInput<SyncCreativesRequest>,\n inputHandler?: InputHandler,\n options?: SyncCreativesTaskOptions\n ): Promise<TaskResult<SyncCreativesResponse>> {\n return this.executeTaskUnprojected<SyncCreativesResponse>(\n 'sync_creatives',\n params,\n inputHandler,\n options,\n 'onSyncCreativesStatusChange'\n );\n }\n\n private resolveCreativeFormatWireMode(taskType: string, capabilities: unknown): CreativeFormatWireMode {\n // Capabilities `adcp.build_version` is advisory deployment metadata. The\n // protocol schema explicitly forbids using it for negotiation, so wire\n // guarantees follow the release pin this client actually emits.\n const wireRelease = this.config.wireAdcpVersion ?? this.resolvedAdcpVersion;\n const declared = resolveCreativeFormatWireMode(capabilities, wireRelease);\n const schema = creativeSchemaSupport(this.cachedToolSchemas?.get(taskType));\n if (declared !== 'unknown' && schema !== 'unknown' && declared !== schema) {\n throw new CreativeFormatCapabilityError(\n `Seller capability and ${taskType} input schema disagree about canonical creative support`\n );\n }\n const resolved = declared !== 'unknown' ? declared : schema;\n const release = /^v?(\\d+)\\.(\\d+)(?:\\.|-|$)/.exec(wireRelease.trim());\n const canonicalRequiredByBuyerPin =\n release !== null && (Number(release[1]) > 3 || (Number(release[1]) === 3 && Number(release[2]) >= 2));\n if (resolved === 'unknown' && canonicalRequiredByBuyerPin) {\n throw new CreativeFormatCapabilityError(\n `Cannot prove which AdCP release the seller serves for ${taskType}; a 3.2+ client will not guess a legacy creative wire shape`\n );\n }\n return resolved;\n }\n\n /** Validate malformed creative payloads before capability discovery can perform I/O. */\n private validateBeforeCreativeCapabilityProbe(taskType: string, params: unknown, options: TaskOptions): void {\n if (options.skipIdempotencyAutoInject || options.skipAccountValidation) return;\n let normalizedParams = normalizeRequestParams(taskType, params);\n if (\n requestUsesIdempotency(taskType, normalizedParams) &&\n normalizedParams &&\n typeof normalizedParams === 'object' &&\n !normalizedParams.idempotency_key\n ) {\n normalizedParams = { ...normalizedParams, idempotency_key: generateIdempotencyKey() };\n }\n if (!isExternalSchemaRootActive(this.resolvedAdcpVersion)) {\n this.validateRequest(taskType, normalizedParams);\n }\n }\n\n /**\n * List creatives through the canonical SDK boundary.\n *\n * Legacy format filters are rejected and returned creative identities are\n * projected to `format_kind` / `format_option_ref`. Migration tooling that\n * needs the negotiated raw wire shape must call `listCreativesLegacy()`.\n *\n * @param params - Creative listing parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async listCreatives(\n params: CanonicalListCreativesRequest,\n inputHandler?: InputHandler,\n options?: CanonicalReadTaskOptions\n ): Promise<TaskResult<CanonicalListCreativesResponse>> {\n const { legacyFormatConverter, projectionCatalogs, ...taskOptions } = options ?? {};\n this.assertDurableProjectionOverrideSupported(legacyFormatConverter);\n const effectiveLegacyFormatConverter = this.resolveLegacyFormatConverter(\n legacyFormatConverter,\n projectionCatalogs ?? this.config.projectionCatalogs\n );\n return this.executeAndHandle<CanonicalListCreativesResponse>(\n 'list_creatives',\n 'onListCreativesStatusChange',\n params,\n inputHandler,\n taskOptions,\n data => {\n const { _message: _dropLegacyMessage, ...safe } = data as typeof data & { _message?: unknown };\n void _dropLegacyMessage;\n return {\n ...safe,\n creatives: data.creatives.map(creative =>\n projectCreativeForDelivery(\n creative as unknown as import('../types/tools.generated').CreativeAsset,\n {},\n 'canonical',\n 'list_creatives',\n effectiveLegacyFormatConverter\n )\n ),\n } as CanonicalListCreativesResponse;\n },\n effectiveLegacyFormatConverter,\n undefined,\n projectionCatalogs\n );\n }\n\n /** @deprecated Explicit raw-wire escape hatch for migration tooling. */\n async listCreativesLegacy(\n params: ListCreativesRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListCreativesResponse>> {\n return this.executeTaskUnprojected<ListCreativesResponse>('list_creatives', params, inputHandler, options);\n }\n\n /** Preview a creative using canonical capability or creative-library identity. */\n async previewCreative(\n params: CanonicalPreviewCreativeRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<CanonicalPreviewCreativeResponse>> {\n const legacyPath = legacyCreativeIdentityPath(params);\n if (legacyPath) {\n const suggestion = 'Move this request to previewCreativeLegacy(), or replace format_id with canonical identity.';\n throw new ProtocolFeatureUnsupportedError(['preview_creative.canonical_identity'], [], this.agent.agent_uri, {\n message: `previewCreative() does not accept legacy creative identity at ${legacyPath}. ${suggestion}`,\n field: legacyPath,\n suggestion,\n details: {\n feature: 'preview_creative.canonical_identity',\n tool: 'preview_creative',\n field: legacyPath,\n },\n });\n }\n return this.executeAndHandle<CanonicalPreviewCreativeResponse>(\n 'preview_creative',\n 'onPreviewCreativeStatusChange',\n params,\n inputHandler,\n options,\n undefined,\n undefined,\n params\n );\n }\n\n /** @deprecated Migration-only access to `format_id`-based creative preview. */\n async previewCreativeLegacy(\n params: PreviewCreativeRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<PreviewCreativeResponse>> {\n return this.executeAndHandle<PreviewCreativeResponse>(\n 'preview_creative',\n 'onPreviewCreativeLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Get media buy status, creative approvals, and optional delivery snapshots\n *\n * @param params - Request parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async getMediaBuys(\n params: GetMediaBuysRequest,\n inputHandler?: InputHandler,\n options?: CanonicalReadTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<GetMediaBuysResponse>>> {\n const { legacyFormatConverter, projectionCatalogs, ...taskOptions } = options ?? {};\n this.assertDurableProjectionOverrideSupported(legacyFormatConverter);\n const result = await this.executeAndHandle<GetMediaBuysResponse>(\n 'get_media_buys',\n 'onGetMediaBuysStatusChange',\n params,\n inputHandler,\n taskOptions,\n undefined,\n this.resolveLegacyFormatConverter(legacyFormatConverter, projectionCatalogs ?? this.config.projectionCatalogs),\n undefined,\n projectionCatalogs\n );\n if (result.data !== undefined) this.rememberCanonicalPackageRoutes(result.data, params);\n return result;\n }\n\n /**\n * Get media buy delivery information\n *\n * @param params - Delivery information parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async getMediaBuyDelivery(\n params: GetMediaBuyDeliveryRequest,\n inputHandler?: InputHandler,\n options?: CanonicalReadTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<GetMediaBuyDeliveryResponse>>> {\n const { legacyFormatConverter, projectionCatalogs, ...taskOptions } = options ?? {};\n this.assertDurableProjectionOverrideSupported(legacyFormatConverter);\n return this.executeAndHandle<GetMediaBuyDeliveryResponse>(\n 'get_media_buy_delivery',\n 'onGetMediaBuyDeliveryStatusChange',\n params,\n inputHandler,\n taskOptions,\n undefined,\n this.resolveLegacyFormatConverter(legacyFormatConverter, projectionCatalogs ?? this.config.projectionCatalogs),\n undefined,\n projectionCatalogs\n );\n }\n\n /** Retrieve canonical creative-level and variant-level delivery metrics. */\n async getCreativeDelivery(\n params: GetCreativeDeliveryRequest,\n inputHandler?: InputHandler,\n options?: CanonicalReadTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<GetCreativeDeliveryResponse>>> {\n const { legacyFormatConverter, projectionCatalogs, ...taskOptions } = options ?? {};\n this.assertDurableProjectionOverrideSupported(legacyFormatConverter);\n return this.executeAndHandle<GetCreativeDeliveryResponse>(\n 'get_creative_delivery',\n 'onGetCreativeDeliveryStatusChange',\n params,\n inputHandler,\n taskOptions,\n undefined,\n this.resolveLegacyFormatConverter(legacyFormatConverter, projectionCatalogs ?? this.config.projectionCatalogs),\n undefined,\n projectionCatalogs\n );\n }\n\n /**\n * Provide performance feedback\n *\n * @param params - Performance feedback parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async providePerformanceFeedback(\n params: MutatingRequestInput<ProvidePerformanceFeedbackRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ProvidePerformanceFeedbackResponse>> {\n return this.executeAndHandle<ProvidePerformanceFeedbackResponse>(\n 'provide_performance_feedback',\n 'onProvidePerformanceFeedbackStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== SIGNALS TASKS ======\n\n /**\n * Get audience signals\n *\n * @param params - Signals request parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async getSignals(\n params: GetSignalsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetSignalsResponse>> {\n return this.executeAndHandle<GetSignalsResponse>(\n 'get_signals',\n 'onGetSignalsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Activate audience signals\n *\n * @param params - Signal activation parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async activateSignal(\n params: MutatingRequestInput<ActivateSignalRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ActivateSignalResponse>> {\n return this.executeAndHandle<ActivateSignalResponse>(\n 'activate_signal',\n 'onActivateSignalStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== GOVERNANCE TASKS ======\n\n /**\n * Sync campaign plans to a governance agent.\n * Plans define authorized parameters: budget, channels, flight dates, markets, policies, delegations.\n *\n * Uses the governance agent from config.governance.campaign.agent by default.\n * Pass an explicit agent via options.agent to override.\n */\n async syncPlans(\n params: MutatingRequestInput<SyncPlansRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions & { agent?: AgentConfig }\n ): Promise<TaskResult<SyncPlansResponse>> {\n const agent = options?.agent ?? this.getGovernanceAgent();\n // Pre-send schema check on the unadapted shape, mirroring the public-task\n // executeTask path. Without this call, governance/protocol entry points\n // that bypass the executeTask seam silently round-trip malformed requests\n // to the server instead of failing locally.\n this.executor.validateRequest('sync_plans', params);\n return this.executor.executeTask<SyncPlansResponse>(agent, 'sync_plans', params, inputHandler, options);\n }\n\n /**\n * Get governance audit logs for one or more plans.\n * Returns budget state, channel allocation, per-campaign breakdown, and audit trail.\n *\n * Uses the governance agent from config.governance.campaign.agent by default.\n * Pass an explicit agent via options.agent to override.\n */\n async getPlanAuditLogs(\n params: GetPlanAuditLogsRequest,\n options?: TaskOptions & { agent?: AgentConfig }\n ): Promise<TaskResult<GetPlanAuditLogsResponse>> {\n const agent = options?.agent ?? this.getGovernanceAgent();\n this.executor.validateRequest('get_plan_audit_logs', params);\n return this.executor.executeTask<GetPlanAuditLogsResponse>(\n agent,\n 'get_plan_audit_logs',\n params,\n undefined,\n options\n );\n }\n\n /**\n * Report a governance outcome for an async task that has resolved.\n *\n * Use this when a task returned status 'submitted' or 'working' and\n * later resolves via polling or webhooks. The checkId is available\n * on the original TaskResult at result.governance.checkId. After a\n * TaskTimeoutError during governance postflight, pass the error's\n * governanceRecovery.outcomeIdempotencyKey in `options` to safely retry.\n */\n async reportGovernanceOutcome(\n checkId: string,\n outcome: OutcomeType,\n governanceContext?: string,\n sellerResponse?: Record<string, unknown>,\n error?: { code?: string; message: string },\n options?: { outcomeIdempotencyKey?: string; signal?: AbortSignal }\n ): Promise<import('./GovernanceTypes').GovernanceOutcome | undefined> {\n const middleware = this.executor.getGovernanceMiddleware();\n if (!middleware) {\n throw new Error('No governance middleware configured. Set config.governance.campaign to enable governance.');\n }\n return middleware.reportOutcome(\n checkId,\n outcome,\n sellerResponse,\n error,\n [],\n governanceContext,\n options?.signal,\n options?.outcomeIdempotencyKey\n );\n }\n\n private getGovernanceAgent(): AgentConfig {\n const agent = this.config.governance?.campaign?.agent;\n if (!agent) {\n throw new Error(\n 'No governance agent configured. Either pass an explicit agent via options.agent or set config.governance.campaign.agent.'\n );\n }\n return agent;\n }\n\n // ====== PROTOCOL TASKS ======\n\n /**\n * Get AdCP capabilities\n *\n * @param params - Capabilities request parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async getAdcpCapabilities(\n params: GetAdCPCapabilitiesRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetAdCPCapabilitiesResponse>> {\n return withTaskDeadline(options, effectiveOptions =>\n this.getAdcpCapabilitiesWithinDeadline(params, inputHandler, effectiveOptions)\n );\n }\n\n private async getAdcpCapabilitiesWithinDeadline(\n params: GetAdCPCapabilitiesRequest,\n inputHandler: InputHandler | undefined,\n options: TaskOptions\n ): Promise<TaskResult<GetAdCPCapabilitiesResponse>> {\n const agent = await this.ensureEndpointDiscovered(options);\n this.executor.validateRequest('get_adcp_capabilities', params);\n return this.executor.executeTask<GetAdCPCapabilitiesResponse>(\n agent,\n 'get_adcp_capabilities',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== CREATIVE BUILD TASKS ======\n\n /**\n * Build a creative through the legacy named-format protocol.\n * @deprecated Migration-only access to `target_format_id`-based creative building.\n */\n async buildCreativeLegacy(\n params: MutatingRequestInput<BuildCreativeRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<BuildCreativeResponse>> {\n return this.executeAndHandle<BuildCreativeResponse>(\n 'build_creative',\n 'onBuildCreativeLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== ACCOUNT & AUDIENCE TASKS ======\n\n /**\n * List accounts\n */\n async listAccounts(\n params: ListAccountsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListAccountsResponse>> {\n return this.executeAndHandle<ListAccountsResponse>(\n 'list_accounts',\n 'onListAccountsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Sync accounts\n */\n async syncAccounts(\n params: MutatingRequestInput<SyncAccountsRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SyncAccountsResponse>> {\n return this.executeAndHandle<SyncAccountsResponse>(\n 'sync_accounts',\n 'onSyncAccountsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Sync audiences\n */\n async syncAudiences(\n params: MutatingRequestInput<SyncAudiencesRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SyncAudiencesResponse>> {\n return this.executeAndHandle<SyncAudiencesResponse>(\n 'sync_audiences',\n 'onSyncAudiencesStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== GOVERNANCE TASKS ======\n\n /**\n * Create a property list\n */\n async createPropertyList(\n params: MutatingRequestInput<CreatePropertyListRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<CreatePropertyListResponse>> {\n return this.executeAndHandle<CreatePropertyListResponse>(\n 'create_property_list',\n 'onCreatePropertyListStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Get a property list\n */\n async getPropertyList(\n params: GetPropertyListRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetPropertyListResponse>> {\n return this.executeAndHandle<GetPropertyListResponse>(\n 'get_property_list',\n 'onGetPropertyListStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Update a property list\n */\n async updatePropertyList(\n params: MutatingRequestInput<UpdatePropertyListRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<UpdatePropertyListResponse>> {\n return this.executeAndHandle<UpdatePropertyListResponse>(\n 'update_property_list',\n 'onUpdatePropertyListStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * List property lists\n */\n async listPropertyLists(\n params: ListPropertyListsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListPropertyListsResponse>> {\n return this.executeAndHandle<ListPropertyListsResponse>(\n 'list_property_lists',\n 'onListPropertyListsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Delete a property list\n */\n async deletePropertyList(\n params: MutatingRequestInput<DeletePropertyListRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<DeletePropertyListResponse>> {\n return this.executeAndHandle<DeletePropertyListResponse>(\n 'delete_property_list',\n 'onDeletePropertyListStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * List content standards\n */\n async listContentStandardsLegacy(\n params: ListContentStandardsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListContentStandardsResponse>> {\n return this.executeAndHandle<ListContentStandardsResponse>(\n 'list_content_standards',\n 'onListContentStandardsLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Get content standards\n */\n async getContentStandardsLegacy(\n params: GetContentStandardsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetContentStandardsResponse>> {\n return this.executeAndHandle<GetContentStandardsResponse>(\n 'get_content_standards',\n 'onGetContentStandardsLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Calibrate content against standards\n */\n async calibrateContentLegacy(\n params: MutatingRequestInput<CalibrateContentRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<CalibrateContentResponse>> {\n return this.executeAndHandle<CalibrateContentResponse>(\n 'calibrate_content',\n 'onCalibrateContentLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Validate content delivery\n */\n async validateContentDeliveryLegacy(\n params: ValidateContentDeliveryRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ValidateContentDeliveryResponse>> {\n return this.executeAndHandle<ValidateContentDeliveryResponse>(\n 'validate_content_delivery',\n 'onValidateContentDeliveryLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== SPONSORED INTELLIGENCE TASKS ======\n\n /**\n * Get an SI offering\n */\n async siGetOffering(\n params: SIGetOfferingRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SIGetOfferingResponse>> {\n return this.executeAndHandle<SIGetOfferingResponse>(\n 'si_get_offering',\n 'onSIGetOfferingStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Initiate an SI session\n */\n async siInitiateSession(\n params: MutatingRequestInput<SIInitiateSessionRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SIInitiateSessionResponse>> {\n return this.executeAndHandle<SIInitiateSessionResponse>(\n 'si_initiate_session',\n 'onSIInitiateSessionStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Send a message in an SI session\n */\n async siSendMessage(\n params: MutatingRequestInput<SISendMessageRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SISendMessageResponse>> {\n return this.executeAndHandle<SISendMessageResponse>(\n 'si_send_message',\n 'onSISendMessageStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Terminate an SI session\n */\n async siTerminateSession(\n params: SITerminateSessionRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SITerminateSessionResponse>> {\n return this.executeAndHandle<SITerminateSessionResponse>(\n 'si_terminate_session',\n 'onSITerminateSessionStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== GENERIC TASK EXECUTION ======\n\n /**\n * Execute any task by name with type safety\n *\n * @param taskName - Name of the task to execute\n * @param params - Task parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n *\n * @example\n * ```typescript\n * const result = await client.executeTask(\n * 'get_products',\n * { brief: 'Coffee brands' },\n * handler\n * );\n * ```\n */\n async executeTask<K extends AdcpTaskName>(\n taskName: K,\n params: TaskRequestFor<K>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<TaskResponseTypeMap[K]>>;\n async executeTask(\n taskName: string,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<any>> {\n switch (taskName) {\n case 'get_products':\n return this.getProducts(params as CanonicalGetProductsRequest, inputHandler, options);\n case 'create_media_buy':\n return (await this.createMediaBuy(\n params as MutatingRequestInput<CanonicalCreateMediaBuyRequest>,\n inputHandler,\n options\n )) as TaskResult<any>;\n case 'update_media_buy':\n return (await this.updateMediaBuy(\n params as MutatingRequestInput<CanonicalUpdateMediaBuyRequest>,\n inputHandler,\n options\n )) as TaskResult<any>;\n case 'sync_creatives':\n return (await this.syncCreatives(\n params as MutatingRequestInput<CanonicalSyncCreativesRequest>,\n inputHandler,\n options\n )) as TaskResult<any>;\n case 'list_creatives':\n return this.listCreatives(params as CanonicalListCreativesRequest, inputHandler, options);\n case 'get_media_buys':\n return this.getMediaBuys(params as GetMediaBuysRequest, inputHandler, options);\n case 'get_media_buy_delivery':\n return this.getMediaBuyDelivery(params as GetMediaBuyDeliveryRequest, inputHandler, options);\n case 'get_creative_delivery':\n return this.getCreativeDelivery(params as GetCreativeDeliveryRequest, inputHandler, options);\n case 'request_proposals':\n return guardNativeRequestProposalsCompletion(\n await this.executeTaskUnprojected(taskName, params, inputHandler, options)\n );\n }\n return this.executeTaskUnprojected(taskName, params, inputHandler, options);\n }\n\n /**\n * Execute an extension task that is not part of the standard AdCP task set.\n *\n * Keeping custom tasks on an explicitly named API prevents a response-type\n * generic from weakening the canonical request types enforced by\n * `executeTask()` for standard creative-boundary tasks.\n */\n async executeCustomTask<T = unknown>(\n taskName: string,\n params: Record<string, unknown>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<T>> {\n if (STANDARD_ADCP_TASK_NAMES.has(taskName)) {\n throw new Error(\n `executeCustomTask() cannot execute standard AdCP task \"${taskName}\". ` +\n 'Use its typed primary method, or an explicitly named *Legacy method for legacy creative tools.'\n );\n }\n return this.executeTaskUnprojected<T>(taskName, params, inputHandler, options);\n }\n\n /**\n * Explicit raw-task compatibility escape hatch for conformance and migration tooling.\n * @deprecated Application code should use typed primary methods or `executeTask()`.\n */\n async executeTaskLegacy<T = any>(\n taskName: string,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<T>> {\n return this.executeTaskUnprojected<T>(taskName, params, inputHandler, options);\n }\n\n private async executeTaskUnprojected<T = any>(\n taskName: string,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions,\n handlerName?: keyof AsyncHandlerConfig,\n beforeDispatch?: UnprojectedPreDispatchHook<T>\n ): Promise<TaskResult<T>> {\n const requestParamsSnapshot = structuredClone(params);\n const taskOptionsSnapshot = snapshotTaskOptions(options);\n return withTaskDeadline(taskOptionsSnapshot, async effectiveOptions => {\n const result = await this.executeTaskUnprojectedWithinDeadline<T>(\n taskName,\n requestParamsSnapshot,\n inputHandler,\n effectiveOptions,\n beforeDispatch,\n handlerName\n );\n return result;\n });\n }\n\n private async executeTaskUnprojectedWithinDeadline<T = any>(\n taskName: string,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions,\n beforeDispatch?: UnprojectedPreDispatchHook<T>,\n handlerName?: keyof AsyncHandlerConfig\n ): Promise<TaskResult<T>> {\n throwIfAborted(options?.signal);\n const startTime = Date.now();\n try {\n const normalizedParams = normalizeRequestParams(taskName, params, {\n skipIdempotencyAutoInject: options?.skipIdempotencyAutoInject,\n skipAccountValidation: options?.skipAccountValidation,\n });\n this.assertRequestSupportedByConfiguredVersion(taskName, normalizedParams, options);\n this.assertDurablePropertyListCredentialSupported(taskName, normalizedParams);\n\n await this.validateTaskFeatures(taskName, options);\n if (this.config.requireV3ForMutations && requestUsesIdempotency(taskName, normalizedParams)) {\n await this.requireSupportedMajor(taskName, options);\n }\n const agent = await this.ensureEndpointDiscovered(options);\n\n // Schema-driven pre-send validation runs on the unadapted v3 shape so\n // wire-format adapters (e.g. adaptGetProductsRequestForV2) don't strip\n // v3-only fields out from under the v3 bundled schema. Skip the entire\n // Zod parse when compliance testing has suppressed required-field\n // validation — the missing field is intentional and Zod would reject it.\n if (!options?.skipIdempotencyAutoInject && !options?.skipAccountValidation) {\n this.executor.validateRequest(taskName, normalizedParams);\n }\n\n // Adapt request for the detected server and AdCP protocol versions.\n const capabilityDiscoveryContext: CapabilityDiscoveryContext = {};\n const detectionOptions: InternalReadRequestOptions = {\n ...options,\n [CAPABILITY_DISCOVERY_CONTEXT]: capabilityDiscoveryContext,\n };\n const serverVersion = await this.detectServerVersion(detectionOptions);\n this.assertRequestSupportedByTargetVersion(\n taskName,\n normalizedParams,\n capabilityDiscoveryContext.capabilities,\n false,\n serverVersion\n );\n const { options: effectiveOptions, driftLog: webhookDriftLog } = this.suppressPre31DiscoveryWebhook(\n taskName,\n options,\n capabilityDiscoveryContext.capabilities\n );\n const inputSchemaStripLogs: any[] = [];\n const { params: adaptedParams, driftLogs: adaptDriftLogs } = this.adaptRequest(\n taskName,\n normalizedParams,\n serverVersion,\n inputSchemaStripLogs,\n capabilityDiscoveryContext.toolSchemas,\n capabilityDiscoveryContext.capabilities\n );\n\n // Symmetric warn-only post-adapter pass against the v2.5 schema bundle.\n // Drift gets surfaced via result.metadata.debug_logs so adapter\n // regressions in production aren't silently swallowed.\n const v25DriftLogs: any[] = [...adaptDriftLogs];\n if (webhookDriftLog) v25DriftLogs.push(webhookDriftLog);\n if (serverVersion === 'v2') {\n this.executor.validateAdaptedRequestAgainstV2(taskName, adaptedParams, v25DriftLogs);\n }\n\n const deferredClientContext: DeferredClientFinalizationContext = {\n kind: 'single-agent',\n taskType: taskName,\n ...(handlerName !== undefined && { handlerName }),\n canonical: false,\n productPolicyRequest: productPolicyRequestSnapshot(normalizedParams),\n ...(effectiveOptions?.taskId !== undefined && { optionTaskId: effectiveOptions.taskId }),\n ...(effectiveOptions?.contextId !== undefined && { optionContextId: effectiveOptions.contextId }),\n };\n let result = await this.executor.executeTask<T>(\n agent,\n taskName,\n adaptedParams,\n inputHandler,\n effectiveOptions,\n serverVersion,\n capabilityDiscoveryContext.capabilities,\n beforeDispatch,\n deferredClientContext\n );\n\n const postAdapterLogs = [...inputSchemaStripLogs, ...v25DriftLogs];\n if (postAdapterLogs.length > 0) {\n result.debug_logs = [...(result.debug_logs ?? []), ...postAdapterLogs];\n }\n\n return this.finalizeTaskResult(result, deferredClientContext, effectiveOptions);\n } catch (error) {\n if (error instanceof BeforeProtocolDispatchHookError || error instanceof AfterProtocolDispatchHookError) {\n throw error.original;\n }\n // Structured protocol errors carry typed fields (reason, actualVersion,\n // unsupportedFeatures, …) that callers use for recovery decisions. Auth\n // and timeout errors trigger OAuth flows / cancellation. All four are\n // established throws — rethrow so callers' existing catch sites work.\n if (\n error instanceof AuthenticationRequiredError ||\n error instanceof TaskTimeoutError ||\n error instanceof VersionUnsupportedError ||\n error instanceof FeatureUnsupportedError ||\n isAbortOrTimeoutError(error)\n ) {\n throw error;\n }\n // Unexpected pre-flight errors (e.g. a TypeError from response parsing\n // during version detection) surface as a structured TaskResult rather\n // than escaping as raw exceptions — matching the declared return type\n // and the contract the internal executor already upholds for network\n // errors. attachMatch ensures the fluent .match() API works on this path.\n const errorMessage = error instanceof Error ? error.message : String(error);\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n error: errorMessage,\n metadata: {\n taskId: crypto.randomUUID(),\n taskName,\n agent: {\n id: this.agent.id,\n name: this.agent.name,\n protocol: this.normalizedAgent.protocol,\n },\n responseTimeMs: Date.now() - startTime,\n timestamp: new Date().toISOString(),\n clarificationRounds: 0,\n status: 'failed',\n },\n conversation: [],\n debug_logs: [],\n });\n }\n }\n\n // ====== DEFERRED TASK MANAGEMENT ======\n\n /**\n * Resume a deferred task using its token\n *\n * @param token - Deferred task token\n * @param input - Human- or application-provided answer for the paused task\n *\n * @example\n * ```typescript\n * const paused = await client.createMediaBuy(params, handler);\n * if (paused.status === 'deferred') {\n * const result = await client.resumeDeferredTask(paused.deferred.token, humanProvidedValue);\n * }\n * ```\n */\n async resumeDeferredTask<T = any>(token: string, input: unknown): Promise<TaskResult<T>> {\n const { result, clientContext } = await this.executor.resumeDeferredTaskWithContext<T>(token, input);\n const finalized = isDeferredClientFinalizationContext(clientContext)\n ? await this.finalizeTaskResult(result, clientContext)\n : result;\n if (!isDeferredClientFinalizationContext(clientContext)) {\n await acknowledgeDeferredSettlement(finalized);\n }\n return finalized;\n }\n\n // ====== CONVERSATION MANAGEMENT ======\n\n /**\n * Continue an existing conversation with the agent\n *\n * @param message - Message to send to the agent\n * @param contextId - Conversation context ID to continue\n * @param inputHandler - Handler for any clarification requests\n *\n * @example\n * ```typescript\n * const agent = new ADCPClient(config);\n * const initial = await agent.getProducts({ brief: 'Tech products' });\n *\n * // Continue the conversation — use the server-returned contextId, not\n * // the client-minted correlation taskId.\n * const refined = await agent.continueConversation(\n * 'Focus only on laptops under $1000',\n * initial.metadata.contextId!\n * );\n * ```\n */\n async continueConversation<T = any>(\n message: string,\n contextId: string,\n inputHandler?: InputHandler\n ): Promise<TaskResult<T>> {\n const agent = await this.ensureEndpointDiscovered();\n const creativeAssociation = this.canonicalCreativeTaskAssociation(contextId);\n if (!creativeAssociation) {\n return this.executor.executeTask<T>(agent, 'continue_conversation', { message }, inputHandler, { contextId });\n }\n\n const { taskType: creativeTaskType } = creativeAssociation;\n const legacyFormatConverter = this.finalLegacyFormatConverter(creativeAssociation.legacyFormatConverter);\n const result = await canonicalCreativeExecutionStorage.run(\n { taskType: creativeTaskType, canonical: true, legacyFormatConverter },\n () =>\n this.executor.executeTask<T>(\n agent,\n 'continue_conversation',\n { message },\n this.canonicalCreativeInputHandler(creativeTaskType, inputHandler),\n { contextId }\n )\n );\n const canonical = this.canonicalizeCreativeTaskResult(result, creativeTaskType, undefined, legacyFormatConverter);\n this.rememberCanonicalCreativeTaskIds(\n canonical,\n creativeTaskType,\n legacyFormatConverter,\n creativeAssociation.routingSnapshot\n );\n return this.wrapCanonicalCreativeContinuations(\n canonical,\n creativeTaskType,\n undefined,\n legacyFormatConverter,\n creativeAssociation.routingSnapshot\n );\n }\n\n /**\n * Get conversation history for a task\n */\n getConversationHistory(taskId: string): Message[] | undefined {\n const history = this.executor.getConversationHistory(taskId);\n const association = this.canonicalCreativeTaskAssociation(taskId);\n if (!association) return history;\n const { taskType } = association;\n const converter = this.resolveLegacyFormatConverter(association.legacyFormatConverter);\n return history?.map(message => ({\n ...message,\n content: projectCanonicalCreativeAncillaryValue(message.content, taskType, converter),\n })) as Message[] | undefined;\n }\n\n /**\n * Clear conversation history for a task\n */\n clearConversationHistory(taskId: string): void {\n this.executor.clearConversationHistory(taskId);\n this.forgetCanonicalCreativeTaskAssociationKeys([taskId]);\n this.productPolicyRequestParamsByTask.delete(taskId);\n }\n\n // ====== AGENT INFORMATION ======\n\n /**\n * Get the agent configuration with normalized protocol\n *\n * Returns the agent config with:\n * - Protocol normalized (e.g., .well-known URLs switch to A2A)\n * - If canonical URL has been resolved, agent_uri will be the canonical URL\n *\n * For guaranteed canonical URL, use getResolvedAgent() instead.\n */\n getAgent(): AgentConfig {\n // If we have resolved the canonical URL, return config with it\n if (this.canonicalBaseUrl) {\n const { _needsDiscovery, _needsCanonicalUrl, ...cleanAgent } = this.normalizedAgent;\n return {\n ...cleanAgent,\n agent_uri: this.canonicalBaseUrl,\n };\n }\n\n // Return normalized agent without internal flags\n const { _needsDiscovery, _needsCanonicalUrl, ...cleanAgent } = this.normalizedAgent;\n return { ...cleanAgent };\n }\n\n /**\n * Get the fully resolved agent configuration\n *\n * This async method ensures the agent config has the canonical URL resolved:\n * - For A2A: Fetches the agent card and uses its 'url' field\n * - For MCP: Performs endpoint discovery\n *\n * @returns Promise resolving to agent config with canonical URL\n */\n async getResolvedAgent(): Promise<AgentConfig> {\n await this.resolveCanonicalUrl();\n return this.getAgent();\n }\n\n /**\n * Get the agent ID\n */\n getAgentId(): string {\n return this.agent.id;\n }\n\n /**\n * Get the agent name\n */\n getAgentName(): string {\n return this.agent.name;\n }\n\n /**\n * Get the agent protocol (may be normalized from original config)\n */\n getProtocol(): 'mcp' | 'a2a' {\n return this.normalizedAgent.protocol;\n }\n\n /**\n * Get the canonical base URL for this agent\n *\n * Returns the canonical URL if already resolved, or computes it synchronously\n * from the configured URL. For the most accurate canonical URL (especially for A2A\n * where the agent card contains the authoritative URL), use resolveCanonicalUrl() first.\n *\n * The canonical URL is:\n * - For A2A: The 'url' field from the agent card (if resolved), or base URL with\n * the well-known agent card path stripped\n * - For MCP: The discovered endpoint with /mcp stripped\n *\n * @returns The canonical base URL (synchronous, may not be fully resolved)\n */\n getCanonicalUrl(): string {\n // Return cached canonical URL if available\n if (this.canonicalBaseUrl) {\n return this.canonicalBaseUrl;\n }\n\n // Compute from configured URL (best effort without network call)\n return this.computeBaseUrl(this.normalizedAgent.agent_uri);\n }\n\n /**\n * Resolve and return the canonical base URL for this agent\n *\n * This async method ensures the canonical URL is properly resolved:\n * - For A2A: Fetches the agent card and uses its 'url' field\n * - For MCP: Performs endpoint discovery and strips /mcp suffix\n *\n * The result is cached, so subsequent calls are fast.\n *\n * @returns Promise resolving to the canonical base URL\n */\n async resolveCanonicalUrl(): Promise<string> {\n if (this.canonicalBaseUrl) {\n return this.canonicalBaseUrl;\n }\n\n if (this.normalizedAgent.protocol === 'a2a') {\n await this.ensureCanonicalUrlResolved();\n } else if (this.normalizedAgent.protocol === 'mcp') {\n await this.ensureEndpointDiscovered();\n }\n\n return this.canonicalBaseUrl || this.computeBaseUrl(this.normalizedAgent.agent_uri);\n }\n\n /**\n * Check if this agent is the same as another agent\n *\n * Compares agents by their canonical base URLs. Two agents are considered\n * the same if they have the same canonical URL, regardless of:\n * - Protocol (MCP vs A2A)\n * - URL format (with/without /mcp, with/without well-known agent card path)\n * - Trailing slashes\n *\n * @param other - Another agent configuration or SingleAgentClient to compare\n * @returns true if agents have the same canonical URL\n */\n isSameAgent(other: AgentConfig | SingleAgentClient): boolean {\n const thisUrl = this.getCanonicalUrl().toLowerCase();\n\n let otherUrl: string;\n if (other instanceof SingleAgentClient) {\n otherUrl = other.getCanonicalUrl().toLowerCase();\n } else {\n otherUrl = this.computeBaseUrl(other.agent_uri).toLowerCase();\n }\n\n return thisUrl === otherUrl;\n }\n\n /**\n * Async version of isSameAgent that resolves canonical URLs first\n *\n * This provides more accurate comparison for A2A agents since it fetches\n * the agent card to get the authoritative canonical URL.\n *\n * @param other - Another agent configuration or SingleAgentClient to compare\n * @returns Promise resolving to true if agents have the same canonical URL\n */\n async isSameAgentResolved(other: AgentConfig | SingleAgentClient): Promise<boolean> {\n const thisUrl = (await this.resolveCanonicalUrl()).toLowerCase();\n\n let otherUrl: string;\n if (other instanceof SingleAgentClient) {\n otherUrl = (await other.resolveCanonicalUrl()).toLowerCase();\n } else {\n // For raw AgentConfig, we can only compute from the URL\n otherUrl = this.computeBaseUrl(other.agent_uri).toLowerCase();\n }\n\n return thisUrl === otherUrl;\n }\n\n /**\n * Get active tasks for this agent\n */\n getActiveTasks() {\n return this.executor\n .getActiveTasks()\n .filter(task => task.agent.id === this.agent.id)\n .map(task => {\n assertNativeRequestProposalsTask(task);\n if (!CANONICAL_CREATIVE_ACTIVITY_TASKS.has(task.taskName)) return task;\n const converter = this.resolveLegacyFormatConverter(\n this.canonicalCreativeTaskAssociation(task.taskId)?.legacyFormatConverter\n );\n return stripLegacyCreativeIdentity({\n ...task,\n params: projectCanonicalCreativeAncillaryValue(task.params, task.taskName, converter),\n messages: task.messages.map(message => ({\n ...message,\n content: projectCanonicalCreativeAncillaryValue(message.content, task.taskName, converter),\n })),\n ...(task.pendingInput !== undefined && {\n pendingInput: projectCanonicalCreativeAncillaryValue(task.pendingInput, task.taskName, converter),\n }),\n }) as TaskState;\n });\n }\n\n // ====== TASK MANAGEMENT & NOTIFICATIONS ======\n\n /**\n * List all tasks for this agent with detailed information\n *\n * @returns Promise resolving to array of task information\n *\n * @example\n * ```typescript\n * const tasks = await client.listTasks();\n * tasks.forEach(task => {\n * console.log(`${task.taskName}: ${task.status}`);\n * });\n * ```\n */\n async listTasks(): Promise<TaskInfo[]> {\n const tasks = await this.executor.getTaskList(this.agent.id);\n return tasks.map(task =>\n assertNativeRequestProposalsTask(\n CANONICAL_CREATIVE_ACTIVITY_TASKS.has(task.taskType)\n ? this.canonicalizeCreativeTaskInfo(\n task,\n task.taskType,\n undefined,\n this.resolveLegacyFormatConverter(\n this.canonicalCreativeTaskAssociation(task.taskId)?.legacyFormatConverter\n )\n )\n : task\n )\n );\n }\n\n /**\n * Get detailed information about a specific task\n *\n * @param taskId - ID of the task to get information for\n * @returns Promise resolving to task information\n */\n async getTaskInfo(taskId: string): Promise<TaskInfo | null> {\n const task = await this.executor.getTaskInfo(taskId);\n if (!task) return null;\n return assertNativeRequestProposalsTask(\n CANONICAL_CREATIVE_ACTIVITY_TASKS.has(task.taskType)\n ? this.canonicalizeCreativeTaskInfo(\n task,\n task.taskType,\n undefined,\n this.resolveLegacyFormatConverter(this.canonicalCreativeTaskAssociation(task.taskId)?.legacyFormatConverter)\n )\n : task\n );\n }\n\n /**\n * Subscribe to task notifications for this agent\n *\n * @param callback - Function to call when task status changes\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * const unsubscribe = client.onTaskUpdate((task) => {\n * console.log(`Task ${task.taskName} is now ${task.status}`);\n * if (task.status === 'completed') {\n * // Handle completion\n * }\n * });\n *\n * // Later, stop listening\n * unsubscribe();\n * ```\n */\n onTaskUpdate(callback: (task: TaskInfo) => void): () => void {\n return this.executor.onTaskUpdate(this.agent.id, task =>\n callback(\n assertNativeRequestProposalsTask(\n CANONICAL_CREATIVE_ACTIVITY_TASKS.has(task.taskType)\n ? this.canonicalizeCreativeTaskInfo(\n task,\n task.taskType,\n undefined,\n this.resolveLegacyFormatConverter(\n this.canonicalCreativeTaskAssociation(task.taskId)?.legacyFormatConverter\n )\n )\n : task\n )\n )\n );\n }\n\n /**\n * Subscribe to all task events (create, update, complete, error)\n *\n * @param callbacks - Event callbacks for different task events\n * @returns Unsubscribe function\n */\n onTaskEvents(callbacks: {\n onTaskCreated?: (task: TaskInfo) => void;\n onTaskUpdated?: (task: TaskInfo) => void;\n onTaskCompleted?: (task: TaskInfo) => void;\n onTaskFailed?: (task: TaskInfo, error: string) => void;\n }): () => void {\n const safe = (task: TaskInfo): TaskInfo =>\n assertNativeRequestProposalsTask(\n CANONICAL_CREATIVE_ACTIVITY_TASKS.has(task.taskType)\n ? this.canonicalizeCreativeTaskInfo(\n task,\n task.taskType,\n undefined,\n this.resolveLegacyFormatConverter(\n this.canonicalCreativeTaskAssociation(task.taskId)?.legacyFormatConverter\n )\n )\n : task\n );\n return this.executor.onTaskEvents(this.agent.id, {\n ...(callbacks.onTaskCreated && { onTaskCreated: task => callbacks.onTaskCreated!(safe(task)) }),\n ...(callbacks.onTaskUpdated && { onTaskUpdated: task => callbacks.onTaskUpdated!(safe(task)) }),\n ...(callbacks.onTaskCompleted && { onTaskCompleted: task => callbacks.onTaskCompleted!(safe(task)) }),\n ...(callbacks.onTaskFailed && {\n onTaskFailed: (task, error) => {\n const safeTask = safe(task);\n callbacks.onTaskFailed!(safeTask, safeTask.error ?? stripLegacyCreativeIdentity(error));\n },\n }),\n });\n }\n\n /**\n * Register webhook URL for receiving task notifications\n *\n * @param webhookUrl - URL to receive webhook notifications\n * @param taskTypes - Optional array of task types to watch (defaults to all)\n *\n * @example\n * ```typescript\n * await client.registerWebhook('https://myapp.com/webhook', ['create_media_buy']);\n * ```\n */\n async registerWebhook(webhookUrl: string, taskTypes?: string[]): Promise<void> {\n const agent = await this.ensureEndpointDiscovered();\n return this.executor.registerWebhook(agent, webhookUrl, taskTypes);\n }\n\n /**\n * Unregister webhook notifications\n */\n async unregisterWebhook(): Promise<void> {\n const agent = await this.ensureEndpointDiscovered();\n return this.executor.unregisterWebhook(agent);\n }\n\n // ====== AGENT DISCOVERY METHODS ======\n\n /**\n * Get comprehensive agent information including name, description, and available tools/skills\n *\n * Works with both MCP (tools) and A2A (skills) protocols to discover what the agent can do.\n *\n * Auth resolution: this method forwards `agent.headers` as `customHeaders`\n * to the MCP transport so header-only auth (HTTP Basic via gateways like\n * Apigee/Kong, x-api-key, custom tenant routing) reaches the precheck\n * path. The invariant — **basic-auth credentials live entirely on\n * `headers.Authorization`; do not also set `auth_token`** — is documented\n * at `docs/guides/BASIC-AUTH.md`. See #1864 for the failure mode if it's\n * violated.\n *\n * @returns Promise resolving to agent information including tools\n *\n * @example\n * ```typescript\n * const client = new ADCPClient(agentConfig);\n * const info = await client.getAgentInfo();\n *\n * console.log(`${info.name}: ${info.description}`);\n * console.log(`Supports ${info.tools.length} tools`);\n *\n * info.tools.forEach(tool => {\n * console.log(` - ${tool.name}: ${tool.description}`);\n * });\n * ```\n */\n async getAgentInfo(options?: ReadRequestOptions): Promise<{\n name: string;\n description?: string;\n protocol: 'mcp' | 'a2a';\n url: string;\n tools: Array<{\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n parameters?: string[];\n }>;\n }> {\n // adcp-client#1799 — wrap every wire call in the response-size cap so\n // `transport.maxResponseBytes` extends to discovery / tools-list bodies.\n // `withResponseSizeLimit` is a no-op when no cap is configured.\n const { withResponseSizeLimit } = await import('../protocols/responseSizeLimit');\n throwIfAborted(options?.signal);\n const transport = normalizeTransportOptions(options?.transport ?? this.config.transport);\n const maxResponseBytes = transport?.maxResponseBytes;\n const requestTimeoutMs = resolveRequestTimeoutMs(transport?.requestTimeoutMs, DEFAULT_REQUEST_TIMEOUT_MS);\n const clientRequestTimeoutMs = resolveClientRequestTimeoutMs(transport?.requestTimeoutMs);\n const mcpRequestOptions = {\n ...(options?.signal && { signal: options.signal }),\n ...(clientRequestTimeoutMs !== undefined && { timeout: clientRequestTimeoutMs }),\n };\n const ensureReadAuthToken = async (): Promise<string | undefined> => {\n if (!this.normalizedAgent.oauth_client_credentials) return this.normalizedAgent.auth_token;\n const { ensureClientCredentialsTokens, getAgentStorage } = await import('../auth/oauth');\n await ensureClientCredentialsTokens(this.normalizedAgent, {\n storage: getAgentStorage(this.normalizedAgent),\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(this.normalizedAgent.agent_uri),\n fetch: transport?.trustedFetchFn,\n signal: options?.signal,\n });\n return this.normalizedAgent.oauth_tokens?.access_token;\n };\n if (this.normalizedAgent.protocol === 'mcp') {\n // In-process: use the pre-connected client instead of opening a new HTTP connection\n if (this.normalizedAgent._inProcessMcpClient) {\n const mcpClient = this.normalizedAgent._inProcessMcpClient;\n const toolsList = await withResponseSizeLimit(maxResponseBytes, () =>\n mcpClient.listTools(undefined, mcpRequestOptions)\n );\n const tools = toolsList.tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema as Record<string, unknown> | undefined,\n parameters: tool.inputSchema?.properties ? Object.keys(tool.inputSchema.properties as object) : [],\n }));\n return {\n name: this.normalizedAgent.name,\n description: undefined,\n protocol: this.normalizedAgent.protocol,\n url: this.normalizedAgent.agent_uri,\n tools,\n };\n }\n\n const readAuthToken = await ensureReadAuthToken();\n // Discover endpoint if needed\n const agent = await this.ensureEndpointDiscovered(options);\n\n // Use the shared connectMCP path so both static bearer AND saved OAuth\n // tokens work. OAuth takes the refresh-capable authProvider branch.\n // Header-only auth (basic, x-api-key, custom routing) lives on\n // `normalizedAgent.headers` and must be forwarded as `customHeaders` —\n // basic auth in particular suppresses `auth_token` on purpose so the\n // SDK doesn't emit a competing `Authorization: Bearer …`.\n const { connectMCP } = await import('../protocols/mcp');\n const { tryListModernMCPTools } = await import('../protocols/mcp-modern');\n const connectOptions: Parameters<typeof connectMCP>[0] = { agentUrl: agent.agent_uri };\n if (options?.signal) {\n connectOptions.signal = options.signal;\n }\n if (transport?.requestTimeoutMs !== undefined) {\n connectOptions.requestTimeoutMs = transport.requestTimeoutMs;\n }\n if (transport?.trustedFetchFn) {\n connectOptions.fetchFn = transport.trustedFetchFn;\n }\n if (transport?.allowPrivateIp !== undefined) {\n connectOptions.allowPrivateIp = transport.allowPrivateIp;\n }\n if (this.normalizedAgent.headers && Object.keys(this.normalizedAgent.headers).length > 0) {\n connectOptions.customHeaders = this.normalizedAgent.headers;\n }\n let authProvider: Parameters<typeof connectMCP>[0]['authProvider'];\n if (this.normalizedAgent.oauth_tokens && !this.normalizedAgent.oauth_client_credentials) {\n const { getAgentStorage } = await import('../auth/oauth');\n const { getNonInteractiveOAuthProvider } = await import('../auth/oauth/provider-cache');\n authProvider = getNonInteractiveOAuthProvider(this.normalizedAgent, {\n agentHint: this.normalizedAgent.id,\n storage: getAgentStorage(this.normalizedAgent),\n allowHttp: isLikelyPrivateUrl(this.normalizedAgent.agent_uri),\n });\n connectOptions.authProvider = authProvider;\n } else if (readAuthToken) {\n connectOptions.authToken = readAuthToken;\n }\n\n const modernTools =\n !transport?.trustedFetchFn &&\n this.discoveredMcpEra === 'legacy' &&\n Date.now() - this.discoveredMcpEraAt < 5 * 60 * 1000\n ? ({ handled: false } as const)\n : await withResponseSizeLimit(maxResponseBytes, () =>\n tryListModernMCPTools(agent.agent_uri, readAuthToken, this.normalizedAgent.headers, {\n authProvider,\n signal: options?.signal,\n requestTimeoutMs: transport?.requestTimeoutMs,\n fetchFn: transport?.trustedFetchFn,\n allowPrivateIp: transport?.allowPrivateIp,\n })\n );\n if (modernTools.handled) {\n const tools = modernTools.tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n parameters: tool.inputSchema?.properties ? Object.keys(tool.inputSchema.properties) : [],\n }));\n return {\n name: this.normalizedAgent.name,\n description: undefined,\n protocol: this.normalizedAgent.protocol,\n url: agent.agent_uri,\n tools,\n };\n }\n\n const { client: mcpClient } = await connectMCP(connectOptions);\n try {\n const toolsList = await withResponseSizeLimit(maxResponseBytes, () =>\n mcpClient.listTools(undefined, mcpRequestOptions)\n );\n\n const tools = toolsList.tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n parameters: tool.inputSchema?.properties ? Object.keys(tool.inputSchema.properties) : [],\n }));\n\n return {\n name: this.normalizedAgent.name,\n description: undefined,\n protocol: this.normalizedAgent.protocol,\n url: agent.agent_uri,\n tools,\n };\n } finally {\n try {\n await mcpClient.close();\n } catch {\n /* ignore */\n }\n }\n } else if (this.normalizedAgent.protocol === 'a2a') {\n // Use A2A SDK to get agent card\n\n // adcp-client#1799 — route the custom fetchImpl through\n // `wrapFetchWithSizeLimit` so the active ALS slot enforces the cap on\n // the card-discovery body. Without this, the auth-stamping wrapper\n // calls native `fetch` directly and ignores `transport.maxResponseBytes`.\n const { wrapFetchWithSizeLimit } = await import('../protocols/responseSizeLimit');\n const authToken = await ensureReadAuthToken();\n const agentHeaders = this.normalizedAgent.headers ?? {};\n const sizeLimitedFetch = wrapFetchWithSizeLimit((input, init) =>\n transport?.trustedFetchFn ? transport.trustedFetchFn(input, init) : fetch(input as RequestInfo | URL, init)\n );\n const normalizeHeaders = (headers?: HeadersInit): Record<string, string> => {\n const normalized: Record<string, string> = {};\n if (!headers) return normalized;\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n normalized[key] = value;\n });\n } else if (Array.isArray(headers)) {\n for (const [key, value] of headers) {\n normalized[key] = value;\n }\n } else {\n Object.assign(normalized, headers);\n }\n return normalized;\n };\n const buildHeaders = (requestInit?: RequestInit): Record<string, string> => ({\n ...normalizeHeaders(requestInit?.headers),\n ...agentHeaders,\n ...(authToken && {\n Authorization: `Bearer ${authToken}`,\n 'x-adcp-auth': authToken,\n }),\n });\n const fetchImpl = async (url: string | URL | Request, requestInit?: RequestInit) => {\n const headers = buildHeaders(requestInit);\n return withAbortSignal<Response>([options?.signal, requestInit?.signal], requestTimeoutMs, signal =>\n sizeLimitedFetch(url as RequestInfo | URL, { ...requestInit, headers, signal })\n );\n };\n\n const cardUrls = buildCardUrls(this.normalizedAgent.agent_uri);\n\n let client: InstanceType<typeof A2AClient> | undefined;\n let lastCardError: Error = new Error(`A2A agent card not found at ${cardUrls.join(', ')}`);\n for (const cardUrl of cardUrls) {\n try {\n // Wrap A2A card discovery so `transport.maxResponseBytes` applies\n // to agent-card fetches and the deferred `agentCardPromise` read\n // below — both fire fetches that would otherwise bypass the cap.\n client = await withResponseSizeLimit(maxResponseBytes, () => A2AClient.fromCardUrl(cardUrl, { fetchImpl }));\n break;\n } catch (err: unknown) {\n lastCardError = err as Error;\n }\n }\n if (!client) {\n throw lastCardError;\n }\n const agentCard = await withResponseSizeLimit(maxResponseBytes, async () =>\n client.agentCardPromise ? client.agentCardPromise : client.agentCard\n );\n\n const tools = agentCard?.skills\n ? agentCard.skills.map(\n (skill: {\n id?: string;\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n inputFormats?: string[];\n }) => ({\n name: skill.id || skill.name,\n description: skill.description,\n inputSchema: skill.inputSchema,\n parameters: skill.inputFormats || [],\n })\n )\n : [];\n\n return {\n name: agentCard?.displayName || agentCard?.name || this.normalizedAgent.name,\n description: agentCard?.description,\n protocol: this.normalizedAgent.protocol,\n url: this.normalizedAgent.agent_uri,\n tools,\n };\n }\n\n throw new Error(`Unsupported protocol: ${this.normalizedAgent.protocol}`);\n }\n\n /**\n * Get agent capabilities, including AdCP version support\n *\n * For v3 servers, calls get_adcp_capabilities tool.\n * For v2 servers, builds synthetic capabilities from available tools.\n *\n * @returns Promise resolving to normalized capabilities object\n *\n * @example\n * ```typescript\n * const capabilities = await client.getCapabilities();\n *\n * console.log(`Server version: ${capabilities.version}`);\n * console.log(`Protocols: ${capabilities.protocols.join(', ')}`);\n *\n * if (capabilities.features.propertyListFiltering) {\n * // Use v3 property list features\n * }\n * ```\n */\n async getCapabilities(options?: ReadRequestOptions): Promise<AdcpCapabilities> {\n throwIfAborted(options?.signal);\n const discoveryContext = (options as InternalReadRequestOptions | undefined)?.[CAPABILITY_DISCOVERY_CONTEXT];\n const transport = normalizeTransportOptions(options?.transport ?? this.config.transport);\n const usesScopedFetch = transport?.trustedFetchFn !== undefined;\n // Return cached if available\n if (!usesScopedFetch && this.cachedCapabilities) {\n if (discoveryContext) discoveryContext.toolSchemas = this.cachedToolSchemas;\n this.maybeWarnV2Sunset(this.cachedCapabilities);\n return this.cachedCapabilities;\n }\n\n // First get tool list to support both detection methods\n const agentInfo = await this.getAgentInfo(options);\n const tools: ToolInfo[] = agentInfo.tools.map(t => ({\n name: t.name,\n description: t.description,\n }));\n\n // Make raw tool schemas available for field-level compatibility checks\n // (e.g. buying_mode on get_products). Scoped fetch keeps them in the\n // request-local discovery context; unscoped calls may share the cache.\n const discoveredToolSchemas = new Map(\n agentInfo.tools\n .filter(t => t.inputSchema?.properties)\n .map(t => [t.name, t.inputSchema!.properties as Record<string, unknown>])\n );\n if (discoveryContext) discoveryContext.toolSchemas = discoveredToolSchemas;\n if (!usesScopedFetch) this.cachedToolSchemas = discoveredToolSchemas;\n\n // Check if agent supports get_adcp_capabilities (v3)\n const advertisesCapabilitiesTool = tools.some(t => t.name === 'get_adcp_capabilities');\n // The official A2A adapter omits discovery from the public skill card but\n // does advertise the framework task lifecycle. That combination is safe\n // evidence that get_adcp_capabilities is routable. Do not blindly probe\n // arbitrary A2A agents: an unadvertised call can consume application work\n // or change session state on non-AdCP routers.\n const officialA2ALifecycle =\n this.normalizedAgent.protocol === 'a2a' &&\n tools.some(tool => ['tasks/get', 'get_task_status', 'list_tasks'].includes(tool.name));\n const hasCapabilitiesTool = advertisesCapabilitiesTool || officialA2ALifecycle;\n\n if (hasCapabilitiesTool) {\n try {\n // ensureEndpointDiscovered is a no-op for in-process agents (_needsDiscovery is false\n // because normalizeAgentConfig returns early when _inProcessMcpClient is set). The\n // executor then hits ProtocolClient.callTool which reads _inProcessMcpClient directly,\n // so the sentinel adcp-in-process:// URI never reaches validateAgentUrl.\n const agent = await this.ensureEndpointDiscovered(options);\n const result = await this.executor.executeTask<any>(agent, 'get_adcp_capabilities', {}, undefined, options);\n throwIfAborted(options?.signal);\n const requestTimeoutMs = resolveRequestTimeoutMs(\n options?.transport?.requestTimeoutMs ?? this.config.transport?.requestTimeoutMs\n );\n if (\n !result.success &&\n requestTimeoutMs !== undefined &&\n /\\b(requesttimeout|timeout|timed out)\\b/i.test(result.error ?? '')\n ) {\n throw createTimeoutError(requestTimeoutMs);\n }\n\n if (result.success && result.data) {\n const capabilities = augmentCapabilitiesFromTools(parseCapabilitiesResponse(result.data), tools);\n if (!usesScopedFetch) this.cachedCapabilities = capabilities;\n this.maybeWarnV2Sunset(capabilities);\n return capabilities;\n }\n if (!advertisesCapabilitiesTool) {\n throw new Error('unadvertised official A2A capability probe was not supported');\n }\n // Tightened v2 fallback (issue #1189). When `result.success` is false\n // but `result.data` is structurally v3-shaped, the agent is a v3 agent\n // with a wire-shape bug — typically a single failed schema validation\n // on `get_adcp_capabilities`. Falling back to v2 in this case masks\n // the original bug behind cascading \"AdCP schema data for version v2.5\n // not found\" errors that nobody can debug. Parse the data anyway,\n // surface the validation failure loudly, and continue with the\n // v3 capabilities the agent actually returned.\n //\n // Override `version`/`majorVersions` after parse: when the response\n // doesn't carry an explicit `adcp.major_versions` block (one of the\n // valid v3-shape signals), `parseCapabilitiesResponse` defaults\n // majorVersions to [2] which would re-classify a known-v3 response\n // as v2 downstream. The heuristic established v3-shape; honor that.\n // CodeQL: deliberately omit `result.error` from the log (matches the\n // existing fallback log below) — it can carry transport-level agent\n // identifiers that flow through the clear-text-logging tracker.\n if (result.data && looksLikeV3Capabilities(result.data)) {\n console.warn(\n `[AdCP] Agent \"${this.agent.id}\" returned a get_adcp_capabilities response that ` +\n `failed validation, but the response is structurally v3-shaped. Treating as v3 ` +\n `(the agent has a wire-shape bug — that's the thing to fix).`,\n { hasError: !!result.error, hasData: !!result.data }\n );\n const parsed = parseCapabilitiesResponse(result.data);\n const v3Capabilities: AdcpCapabilities = {\n ...parsed,\n version: 'v3',\n majorVersions: parsed.majorVersions.includes(3) ? parsed.majorVersions : ([3] as AdcpMajorVersion[]),\n };\n const capabilities = augmentCapabilitiesFromTools(v3Capabilities, tools);\n if (!usesScopedFetch) this.cachedCapabilities = capabilities;\n this.maybeWarnV2Sunset(capabilities);\n return capabilities;\n }\n // The call returned non-success and the response wasn't even\n // structurally v3-shaped (so the heuristic above didn't catch it),\n // OR data is missing entirely. The agent still advertises the\n // v3-only `get_adcp_capabilities` tool, so it's verifiably v3 —\n // synthesize v3 capabilities from the tool list and continue\n // (issue #1217). Falling back to v2 here cascades into \"AdCP\n // schema data for version v2.5 not found\" errors that obscure\n // the real bug (the broken capabilities response).\n //\n // We deliberately omit `result.data` and `result.error` from the\n // log: they can carry OAuth metadata or transport-level identifiers\n // (CodeQL clear-text-logging tracker). Shape booleans + status are\n // enough to triage.\n console.warn(\n `[AdCP] Agent \"${this.agent.id}\" advertises get_adcp_capabilities but the call ` +\n `returned non-success and the response is not v3-shaped — treating as v3 (synthetic) ` +\n `since the agent has the v3-only discovery tool. ` +\n `This client routes to v3 adapters, but calls reading capability details ` +\n `(idempotency TTL, supported_versions, feature flags) will fail until the agent ` +\n `operator fixes the capabilities endpoint.`,\n {\n success: result.success,\n hasError: !!result.error,\n hasData: !!result.data,\n }\n );\n } catch (error: unknown) {\n // Re-throw errors that indicate real infrastructure problems —\n // only fall through for tool-execution failures (the agent\n // advertises get_adcp_capabilities but can't actually serve it).\n if (\n error instanceof AuthenticationRequiredError ||\n error instanceof ConfigurationError ||\n error instanceof TaskTimeoutError ||\n isAbortOrTimeoutError(error)\n ) {\n throw error;\n }\n if (advertisesCapabilitiesTool) {\n console.warn(\n `[AdCP] Agent \"${this.agent.id}\" advertises get_adcp_capabilities but the call ` +\n `threw — treating as v3 (synthetic) since the agent has the v3-only discovery tool. ` +\n `This client routes to v3 adapters, but calls reading capability details ` +\n `(idempotency TTL, supported_versions, feature flags) will fail until the agent ` +\n `operator fixes the capabilities endpoint.`\n );\n }\n }\n\n // Synthesize v3 capabilities from the tool list. Reached only when\n // the executor returned non-v3-shaped data, OR threw a non-auth\n // non-timeout error. The agent's v3-only tool list is the affirmative\n // signal that it's v3 even though we couldn't read details.\n if (advertisesCapabilitiesTool) {\n const capabilities = augmentCapabilitiesFromTools(buildSyntheticV3Capabilities(tools), tools);\n if (!usesScopedFetch) this.cachedCapabilities = capabilities;\n this.maybeWarnV2Sunset(capabilities);\n return capabilities;\n }\n }\n\n // No get_adcp_capabilities tool — the agent is verifiably v2 (the tool\n // is v3-only). Synthesize v2 capabilities from the tool list.\n console.warn(\n `[AdCP] Agent \"${this.agent.id}\" detected as v2 (no get_adcp_capabilities tool). ` +\n `Tools: [${tools.map(t => t.name).join(', ')}]`\n );\n const capabilities = buildSyntheticCapabilities(tools);\n if (!usesScopedFetch) this.cachedCapabilities = capabilities;\n return capabilities;\n }\n\n /**\n * Emit a one-time warning when the agent reports v2 capabilities.\n *\n * v2 went unsupported on 2026-04-20 (AdCP 3.0 GA — adcp#2220). We still\n * execute v2 code paths (no behaviour change), but clients integrating\n * against an unsupported agent should hear about it loudly.\n *\n * Synthetic capabilities (no `get_adcp_capabilities` tool available) don't\n * trigger the warning — we don't actually know the agent's version, and\n * shouting at legitimately-unversioned agents would be noise.\n *\n * Suppression: `process.env.ADCP_ALLOW_V2 === '1'`.\n */\n private maybeWarnV2Sunset(capabilities: AdcpCapabilities): void {\n if (this._v2WarningFired) return;\n if (capabilities.version === 'v3') return;\n if (capabilities._synthetic) return;\n if (process.env.ADCP_ALLOW_V2 === '1') return;\n\n this._v2WarningFired = true;\n console.warn(\n `[adcp] Warning: agent ${this.agent.agent_uri} reports v2 capabilities. ` +\n `v2 went unsupported on 2026-04-20 (AdCP 3.0 GA). ` +\n `Upgrade the agent to v3 or set ADCP_ALLOW_V2=1 to suppress this warning. ` +\n `See https://github.com/adcontextprotocol/adcp/issues/2220`\n );\n }\n\n /**\n * Warn once per client when `requireSupportedMajor` accepts synthetic v3\n * capabilities — the agent advertised the v3-only `get_adcp_capabilities`\n * tool but the call itself failed, so the version + idempotency-TTL\n * checks were skipped. Adopters who depend on TTL guarantees (BYOK retry\n * callers, idempotency replay logic) should know they're in a degraded\n * mode where the agent is verifiably v3 but specifics are unverifiable\n * until the agent's capabilities endpoint is fixed.\n *\n * One-shot via `_syntheticV3WarningFired` (matches `maybeWarnV2Sunset`\n * cadence). Issue #1217.\n */\n private maybeWarnSyntheticV3(): void {\n if (this._syntheticV3WarningFired) return;\n this._syntheticV3WarningFired = true;\n console.warn(\n `[adcp] Warning: agent ${this.agent.agent_uri} advertises get_adcp_capabilities (v3-only) ` +\n `but the call failed. Treating as v3 (synthetic) — version + idempotency-TTL checks skipped. ` +\n `Calls to getIdempotencyReplayTtlSeconds() will throw until the agent's capabilities ` +\n `endpoint is fixed. Report the wire-shape bug to the agent operator at ${this.agent.agent_uri}.`\n );\n }\n\n /**\n * Warn once per client when `requireSupportedMajor` routes a synthetic-v2\n * seller through the v2 adapter — the agent did not expose\n * `get_adcp_capabilities`, so the version was inferred from `tools/list`.\n * A compliant v3 seller would declare itself; absence of a declaration is\n * read as v2. Idempotency-TTL guarantees are unknown for these sellers,\n * so BYOK retry callers should treat them as such.\n *\n * One-shot via `_syntheticV2WarningFired` (matches `maybeWarnV2Sunset`\n * cadence).\n */\n private maybeWarnSyntheticV2(): void {\n if (this._syntheticV2WarningFired) return;\n this._syntheticV2WarningFired = true;\n console.warn(\n `[adcp] Warning: agent ${this.agent.agent_uri} does not expose get_adcp_capabilities. ` +\n `Routing as v2 (synthetic) — idempotency-TTL guarantee is unknown. ` +\n `Ask the agent operator to declare v3 via get_adcp_capabilities if v3 routing is intended. ` +\n `Branch on client.isSyntheticV2() to tighten retry policies for these sellers.`\n );\n }\n\n /**\n * Detect server AdCP version\n *\n * @returns 'v2' or 'v3' based on server capabilities\n */\n async detectServerVersion(options?: ReadRequestOptions): Promise<'v2' | 'v3'> {\n const capabilities = await this.getCapabilities(options);\n const discoveryContext = (options as InternalReadRequestOptions | undefined)?.[CAPABILITY_DISCOVERY_CONTEXT];\n if (discoveryContext) discoveryContext.capabilities = capabilities;\n return capabilities.version;\n }\n\n /**\n * Whether the seller's capabilities are synthesized from `tools/list`\n * with no authoritative `get_adcp_capabilities` response — i.e. the\n * dispatcher routes through the v2 adapter and idempotency-TTL is\n * unknown. Use this to gate retry behavior for sellers whose retry\n * safety can't be derived from declared capabilities (lower attempt\n * caps, longer backoff, or fall back to natural-key recovery).\n *\n * Returns `false` for declared v2 sellers, declared v3 sellers, and\n * synthetic v3 sellers (which advertise the v3 discovery tool even\n * when the call itself failed).\n *\n * Caveat for synthetic v3: the predicate returns `false`, but TTL is\n * still unknown for those sellers — `getIdempotencyReplayTtlSeconds()`\n * throws until the agent's capabilities endpoint is fixed (issue\n * #1217). Retry-policy consumers that need a complete \"TTL unknown\"\n * gate should additionally check `getCapabilities()._synthetic`.\n */\n async isSyntheticV2(): Promise<boolean> {\n const capabilities = await this.getCapabilities();\n return capabilities._synthetic === true && capabilities.version === 'v2';\n }\n\n /**\n * Check if server supports a specific AdCP major version\n */\n async supportsVersion(version: 2 | 3): Promise<boolean> {\n const capabilities = await this.getCapabilities();\n return capabilities.majorVersions.includes(version);\n }\n\n /**\n * Return the seller's declared `adcp.idempotency.replay_ttl_seconds`.\n *\n * BYOK callers use this to compare the age of persisted keys against the\n * seller's replay window — past the window, the safe recovery is a\n * natural-key lookup rather than reusing the key.\n *\n * Fails closed when the seller is v3 but does not declare the field: the\n * spec makes the declaration REQUIRED, and silently defaulting to 24h\n * would mislead buyers about retry safety. Callers on v2 servers get\n * `undefined` instead of a throw — v2 pre-dates the idempotency envelope.\n */\n async getIdempotencyReplayTtlSeconds(): Promise<number | undefined> {\n const capabilities = await this.getCapabilities();\n if (capabilities.idempotency?.supported === false) return undefined;\n if (capabilities.idempotency) {\n assertValidIdempotencyReplayTtlSeconds(capabilities.idempotency.replayTtlSeconds);\n return capabilities.idempotency.replayTtlSeconds;\n }\n if (capabilities.version !== 'v3') return undefined;\n throw new ConfigurationError(\n `Agent \"${this.agent.id}\" is v3 but does not declare adcp.idempotency.replay_ttl_seconds. ` +\n `The spec requires this for v3 sellers — treating the agent as non-compliant rather than ` +\n `defaulting to 24h, which would silently mislead retry-sensitive flows.`,\n 'adcp.idempotency.replay_ttl_seconds'\n );\n }\n\n /**\n * Check if the seller supports a feature.\n *\n * Feature names resolve as follows:\n * - Protocol names ('media_buy', 'signals', etc.) check supported_protocols\n * - 'ext:<name>' checks extensions_supported\n * - 'targeting.<name>' checks media_buy.execution.targeting\n * - Other names check media_buy.features (e.g., 'audience_targeting', 'conversion_tracking')\n *\n * Absent features return false.\n */\n async supports(feature: FeatureName): Promise<boolean> {\n const capabilities = await this.getCapabilities();\n return resolveFeature(capabilities, feature);\n }\n\n /**\n * Require that the seller supports all listed features.\n * Throws FeatureUnsupportedError if any are missing.\n *\n * Call this before making feature-dependent task calls to fail fast\n * with an actionable error message.\n */\n async require(...features: FeatureName[]): Promise<void> {\n const capabilities = await this.getCapabilities();\n const missing = features.filter(f => !resolveFeature(capabilities, f));\n if (missing.length > 0) {\n throw new FeatureUnsupportedError(missing, listDeclaredFeatures(capabilities), this.agent.agent_uri);\n }\n }\n\n /**\n * Force-refresh cached capabilities from the server.\n * Useful when seller capabilities may have changed.\n */\n async refreshCapabilities(): Promise<AdcpCapabilities> {\n this.cachedCapabilities = undefined;\n return this.getCapabilities();\n }\n\n /**\n * Validate that the seller supports all features required by a task.\n * Throws FeatureUnsupportedError if any required features are missing.\n *\n * Skipped when validateFeatures is false or the task has no feature requirements.\n */\n private async validateTaskFeatures(taskName: string, options?: ReadRequestOptions): Promise<void> {\n if (this.config.validateFeatures === false) return;\n\n const requiredFeatures = TASK_FEATURE_MAP[taskName];\n if (!requiredFeatures || requiredFeatures.length === 0) return;\n\n const capabilities = await this.getCapabilities(options);\n const missing = requiredFeatures.filter(f => !resolveFeature(capabilities, f));\n if (missing.length > 0) {\n throw new FeatureUnsupportedError(missing, listDeclaredFeatures(capabilities), this.agent.agent_uri);\n }\n }\n\n /**\n * Fail version-incompatible request shapes before schema validation.\n *\n * Some 3.1 request controls change behavior rather than merely filtering a\n * result set. A pre-3.1 client pin should not silently drop those controls\n * or let a generic schema error hide the recovery path.\n */\n private assertRequestSupportedByConfiguredVersion(\n taskName: string,\n params: unknown,\n _options?: TaskOptions,\n canonicalCreativeInvocation = false\n ): void {\n const configuredVersion = this.config.wireAdcpVersion ?? this.resolvedAdcpVersion;\n const beta6Issue = beta6ReportingRequestIssue(taskName, params);\n if (beta6Issue && !isAdcpVersionAtLeast(configuredVersion, '3.2.0-beta.6')) {\n this.throwBeta6ReportingUnsupported(taskName, beta6Issue, configuredVersion);\n }\n if (\n taskName === 'preview_creative' &&\n canonicalCreativeInvocation &&\n isPre32AdcpVersion(this.config.wireAdcpVersion ?? this.resolvedAdcpVersion)\n ) {\n this.throwCanonicalPreviewUnsupported(this.config.wireAdcpVersion ?? this.resolvedAdcpVersion);\n }\n if (!isPre31AdcpVersion(this.resolvedAdcpVersion)) return;\n const request =\n params && typeof params === 'object' && !Array.isArray(params) ? (params as Record<string, unknown>) : {};\n\n if (taskName === 'get_signals' && request.discovery_mode === 'wholesale') {\n this.throwPre31UnsupportedFeature(taskName, 'discovery_mode', 'get_signals.discovery_mode=wholesale', {\n capabilityPath: 'signals.discovery_modes',\n suffix: 'Probe get_adcp_capabilities at signals.discovery_modes before issuing wholesale calls.',\n });\n }\n\n // An EXPLICIT push_notification_config on a discovery task is caller misuse\n // while hard-pinned <3.1: surface it rather than silently dropping the\n // caller's webhook. An AUTO-injected discovery webhook (from\n // `webhookUrlTemplate`) is degraded to polling instead; see\n // `suppressPre31DiscoveryWebhook`.\n if ((taskName === 'get_products' || taskName === 'get_signals') && request.push_notification_config !== undefined) {\n this.throwPre31UnsupportedFeature(taskName, 'push_notification_config', `${taskName}.push_notification_config`, {\n capabilityPath: 'adcp.supported_versions',\n suffix: 'Probe get_adcp_capabilities at adcp.supported_versions before relying on discovery task webhooks.',\n });\n }\n\n // Intentionally do not guard `if_wholesale_feed_version` /\n // `if_pricing_version`: 3.1 defines them as optimistic conditional\n // probes, and pre-3.1 sellers may safely ignore them and return the full\n // payload.\n }\n\n /**\n * Degrade the auto-injected get_products / get_signals discovery webhook to\n * polling when the client is pinned below 3.1. Discovery-task\n * `push_notification_config` is an AdCP 3.1 feature; a pre-3.1 seller would\n * reject it. Rather than throwing on the library's own auto-injected webhook\n * (which the caller never asked for), suppress it via `disableWebhook` and\n * record a `pre31_webhook_degraded` drift entry so the loss of push is\n * visible in `debug_logs`.\n *\n * Returns the effective options (a `disableWebhook` copy when suppressing,\n * otherwise the caller's unchanged) and an optional drift log to merge into\n * the result. Explicit caller-supplied `push_notification_config` is handled\n * by `assertRequestSupportedByConfiguredVersion` (it throws) and never\n * reaches here.\n */\n private suppressPre31DiscoveryWebhook(\n taskName: string,\n options?: TaskOptions,\n capabilities?: AdcpCapabilities\n ): { options: TaskOptions | undefined; driftLog?: Record<string, unknown> } {\n if (resolveAdapterKey(this.resolvedAdcpVersion, capabilities) !== '3.0') return { options };\n if (taskName !== 'get_products' && taskName !== 'get_signals') return { options };\n if (options?.disableWebhook) return { options };\n if (selectWebhookTemplate(this.config.webhookUrlTemplate, taskName) === undefined) return { options };\n\n const clientPinnedPre31 = isPre31AdcpVersion(this.resolvedAdcpVersion);\n const targetVersions = capabilities?.supportedVersions ?? [];\n const reason = clientPinnedPre31\n ? `this client is pinned to ${this.resolvedAdcpVersion}`\n : targetVersions.length > 0\n ? `the target seller advertises only ${targetVersions.join(', ')}`\n : 'the target seller does not advertise AdCP 3.1 support';\n return {\n options: { ...options, disableWebhook: true },\n driftLog: {\n type: 'pre31_webhook_degraded',\n message:\n `${taskName} discovery webhook degraded to polling: discovery-task push_notification_config ` +\n `requires AdCP 3.1, but ${reason}. ` +\n 'The seller will not receive a push webhook; poll for the result instead.',\n timestamp: new Date().toISOString(),\n taskName,\n clientVersion: this.resolvedAdcpVersion,\n ...(targetVersions.length > 0 ? { targetVersions } : {}),\n },\n };\n }\n\n /**\n * Reject shape-changing 3.1 requests after seller capability discovery.\n * This second gate covers a modern client talking to a 3.0 seller on the\n * first (cold-cache) call; the configured-version gate above still catches\n * an explicitly pre-3.1 client before validation or network I/O.\n */\n private assertRequestSupportedByTargetVersion(\n taskName: string,\n params: unknown,\n capabilities: AdcpCapabilities | undefined,\n canonicalCreativeInvocation = false,\n serverVersion?: 'v2' | 'v3'\n ): void {\n const beta6Issue = beta6ReportingRequestIssue(taskName, params);\n if (beta6Issue) {\n const advertisedVersions = capabilities?.supportedVersions ?? [];\n const responseVersion =\n typeof capabilities?._raw?.adcp_version === 'string' ? capabilities._raw.adcp_version : undefined;\n const supportsBeta6 =\n advertisedVersions.some(version => isAdcpVersionAtLeast(version, '3.2.0-beta.6')) ||\n (advertisedVersions.length === 0 && isAdcpVersionAtLeast(responseVersion, '3.2.0-beta.6'));\n const hasAuthoritativeLegacyEvidence =\n serverVersion === 'v2' ||\n advertisedVersions.length > 0 ||\n responseVersion !== undefined ||\n (capabilities?._synthetic === false && capabilities?.version === 'v3');\n if (!supportsBeta6 && hasAuthoritativeLegacyEvidence) {\n this.throwBeta6ReportingUnsupported(\n taskName,\n beta6Issue,\n advertisedVersions.join(', ') || responseVersion || serverVersion || capabilities?.version || 'unknown',\n 'the target seller does not advertise AdCP 3.2.0-beta.6 support'\n );\n }\n }\n if (taskName === 'preview_creative' && canonicalCreativeInvocation) {\n const advertisedVersions = capabilities?.supportedVersions ?? [];\n const responseVersion =\n typeof capabilities?._raw?.adcp_version === 'string' ? capabilities._raw.adcp_version : undefined;\n const supports32 =\n advertisedVersions.some(version => !isPre32AdcpVersion(version)) ||\n (advertisedVersions.length === 0 && responseVersion !== undefined && !isPre32AdcpVersion(responseVersion));\n const hasAuthoritativeLegacyEvidence =\n serverVersion === 'v2' ||\n advertisedVersions.length > 0 ||\n responseVersion !== undefined ||\n (capabilities?._synthetic === false && capabilities?.version === 'v3');\n if (!supports32 && hasAuthoritativeLegacyEvidence) {\n this.throwCanonicalPreviewUnsupported(\n advertisedVersions.join(', ') || responseVersion || serverVersion || capabilities?.version || 'unknown',\n 'the target seller does not advertise AdCP 3.2 support'\n );\n }\n }\n if (isPre31AdcpVersion(this.resolvedAdcpVersion)) return;\n // supportedVersions is the authoritative negotiation field. Legacy 3.0\n // sellers omit it; buildVersion is advisory and must not select a newer\n // wire shape. Shape-breaking wholesale discovery therefore requires\n // positive 3.1+ support from a declared v3 seller. The response envelope's\n // adcp_version is also direct evidence of the wire release the seller just\n // served (distinct from advisory adcp.build_version). Synthetic discovery\n // alone is not enough evidence to classify the seller as 3.0.\n const advertisedVersions = capabilities?.supportedVersions ?? [];\n if (advertisedVersions.some(version => !isPre31AdcpVersion(version))) return;\n const responseVersion =\n typeof capabilities?._raw?.adcp_version === 'string' ? capabilities._raw.adcp_version : undefined;\n if (advertisedVersions.length === 0 && responseVersion !== undefined && !isPre31AdcpVersion(responseVersion)) {\n return;\n }\n const declaredLegacyV3 = capabilities?.version === 'v3' && capabilities._synthetic === false;\n if (advertisedVersions.length === 0 && !declaredLegacyV3) return;\n const request =\n params && typeof params === 'object' && !Array.isArray(params) ? (params as Record<string, unknown>) : {};\n if (taskName === 'get_signals' && request.discovery_mode === 'wholesale') {\n this.throwPre31UnsupportedFeature(taskName, 'discovery_mode', 'get_signals.discovery_mode=wholesale', {\n capabilityPath: 'signals.discovery_modes',\n currentVersion: advertisedVersions.join(', ') || responseVersion || '3.0 (not advertised)',\n incompatibility: 'the target seller does not advertise AdCP 3.1 support',\n suffix: 'Retry with a meaningful signal_spec, or probe signals.discovery_modes before issuing wholesale calls.',\n });\n }\n }\n\n private throwPre31UnsupportedFeature(\n taskName: string,\n field: string,\n feature: string,\n opts: { capabilityPath: string; suffix: string; currentVersion?: string; incompatibility?: string }\n ): never {\n const currentVersion = opts.currentVersion ?? this.resolvedAdcpVersion;\n const incompatibility = opts.incompatibility ?? `this client is pinned to ${this.resolvedAdcpVersion}`;\n throw new ProtocolFeatureUnsupportedError([feature], [], this.agent.agent_uri, {\n message: `${taskName} ${field} requires AdCP 3.1 or later; ` + `${incompatibility}. ${opts.suffix}`,\n field,\n suggestion: opts.suffix,\n details: {\n feature,\n required_version: '3.1',\n capability_path: opts.capabilityPath,\n current_version: currentVersion,\n tool: taskName,\n field,\n },\n });\n }\n\n private throwBeta6ReportingUnsupported(\n taskName: string,\n issue: Beta6DeliveryRequestIssue,\n currentVersion: string,\n incompatibility = `this client is pinned to ${currentVersion}`\n ): never {\n const suggestion = 'Negotiate AdCP 3.2.0-beta.6 or omit the beta.6 reporting field or metric.';\n throw new ProtocolFeatureUnsupportedError([`${taskName}.${issue.field}`], [], this.agent.agent_uri, {\n message: `${taskName} ${issue.field} requires AdCP 3.2.0-beta.6 or later; ${incompatibility}. ${suggestion}`,\n field: issue.field,\n suggestion,\n details: {\n feature: `${taskName}.${issue.field}`,\n required_version: '3.2.0-beta.6',\n capability_path: 'adcp.supported_versions',\n current_version: currentVersion,\n tool: taskName,\n field: issue.field,\n },\n });\n }\n\n private throwCanonicalPreviewUnsupported(currentVersion: string, incompatibility?: string): never {\n const suggestion =\n 'Use previewCreativeLegacy() for format_id-based sellers, or negotiate AdCP 3.2 before calling previewCreative().';\n throw new ProtocolFeatureUnsupportedError(['preview_creative.canonical_identity'], [], this.agent.agent_uri, {\n message:\n `preview_creative canonical identity requires AdCP 3.2 or later; ` +\n `${incompatibility ?? `this client is pinned to ${currentVersion}`}. ${suggestion}`,\n field: 'target_capability_id',\n suggestion,\n details: {\n feature: 'preview_creative.canonical_identity',\n required_version: '3.2',\n capability_path: 'adcp.supported_versions',\n current_version: currentVersion,\n tool: 'preview_creative',\n field: 'target_capability_id',\n },\n });\n }\n\n /**\n * Assert that the seller's capabilities corroborate the major this client\n * is pinned to (per `getAdcpVersion()`).\n *\n * A self-reported `version: 'v3'` is not enough — a hostile or\n * misconfigured seller can just string-claim the version. For sellers\n * that return an authoritative `get_adcp_capabilities` response, the\n * guard requires:\n *\n * 1. `capabilities.majorVersions.includes(<this client's major>)`\n * 2. `capabilities.idempotency.replayTtlSeconds` present (spec-required\n * for real major-3+ sellers)\n *\n * Sellers whose capabilities are synthesized from `tools/list` (no\n * authoritative `get_adcp_capabilities` response) are treated as v2: a\n * compliant v3 seller would declare itself, so absence of a declaration\n * is taken as evidence of v2. The dispatcher routes the request through\n * the v2 wire-shape adapter. A one-time warning surfaces the routing\n * decision so adopters can audit it; retry-safety (idempotency TTL) is\n * unknown for these sellers and BYOK callers should treat them as such.\n *\n * Per-client `allowV2: true` or, when that's undefined,\n * `ADCP_ALLOW_V2=1` in the environment bypasses the guard entirely.\n *\n * Throws `VersionUnsupportedError` with the specific reason on failure.\n */\n async requireSupportedMajor(taskType: string = 'request', options?: ReadRequestOptions): Promise<void> {\n if (this.isV2Allowed()) return;\n const capabilities = await this.getCapabilities(options);\n\n // Synthetic capabilities — no authoritative `get_adcp_capabilities`\n // response, so the version + idempotency-TTL fields couldn't be read.\n // Route as the synthesized version (v2 when the v3 discovery tool is\n // absent from tools/list, v3 when the tool is present but the call\n // failed). Emit a one-time per-client warning so adopters can audit\n // the routing decision and the skipped TTL guarantee.\n if (capabilities._synthetic) {\n if (capabilities.version === 'v3') {\n this.maybeWarnSyntheticV3();\n } else {\n this.maybeWarnSyntheticV2();\n }\n return;\n }\n // Prefer release-precision matching when the seller advertises\n // `supported_versions` (AdCP 3.1+ per spec PR `adcontextprotocol/adcp#3493`).\n // Fall back to the deprecated integer `major_versions` for legacy 3.0\n // sellers. Pre-release pins match exactly per spec — `'3.1.0-beta.1'`\n // matches only against another `'3.1.0-beta.1'`, not `'3.1'`.\n const supportedVersions = capabilities.supportedVersions;\n if (supportedVersions !== undefined && supportedVersions.length > 0) {\n if (!isAdcpVersionSupported(this.resolvedAdcpVersion, supportedVersions)) {\n throw new VersionUnsupportedError(taskType, 'version', capabilities.version, this.agent.agent_uri);\n }\n } else {\n // `AdcpMajorVersion` is currently `2 | 3` — cast through `number[]` because\n // the parsed major is a plain number; a future SDK release that supports\n // major 4 will widen the union.\n const expectedMajor = parseAdcpMajorVersion(this.resolvedAdcpVersion);\n const advertisedMajors = capabilities.majorVersions as readonly number[];\n if (!Number.isFinite(expectedMajor) || !advertisedMajors.includes(expectedMajor)) {\n throw new VersionUnsupportedError(taskType, 'version', capabilities.version, this.agent.agent_uri);\n }\n }\n if (capabilities.idempotency?.replayTtlSeconds === undefined) {\n throw new VersionUnsupportedError(taskType, 'idempotency', capabilities.version, this.agent.agent_uri);\n }\n assertValidIdempotencyReplayTtlSeconds(capabilities.idempotency.replayTtlSeconds);\n }\n\n /**\n * Deprecated alias for {@link requireSupportedMajor}. Original name from\n * the AdCP v2/v3 split; the function generalized in Stage 3 to check the\n * client's per-instance major instead of hardcoded 3, and `requireV3`\n * stopped reflecting what the function actually does.\n *\n * @deprecated Use `requireSupportedMajor()` instead.\n */\n async requireV3(taskType: string = 'request'): Promise<void> {\n return this.requireSupportedMajor(taskType);\n }\n\n private isV2Allowed(): boolean {\n if (this.config.allowV2 !== undefined) return this.config.allowV2 === true;\n return process.env.ADCP_ALLOW_V2 === '1';\n }\n\n // ====== STATIC HELPER METHODS ======\n\n /**\n * Query a legacy creative-agent named-format catalog.\n *\n * Canonical applications discover seller-supported declarations through\n * `AgentClient.getProducts()` and consume `format_options[]` instead.\n *\n * @param creativeAgentUrl - URL of the creative agent (e.g., 'https://creative.adcontextprotocol.org/mcp')\n * @param protocol - Protocol to use ('mcp' or 'a2a'), defaults to 'mcp'\n * @returns Promise resolving to the list of available formats\n *\n * @deprecated Migration-only helper for the legacy named-format protocol.\n */\n static async discoverCreativeFormatsLegacy(\n creativeAgentUrl: string,\n protocol: 'mcp' | 'a2a' = 'mcp'\n ): Promise<Format[]> {\n const client = new SingleAgentClient(\n {\n id: 'creative_agent_discovery',\n name: 'Creative Agent',\n agent_uri: creativeAgentUrl,\n protocol,\n },\n {}\n );\n\n const result = await client.listCreativeFormatsLegacy({});\n\n if (!result.success || !result.data) {\n throw new Error(`Failed to discover creative formats: ${result.error || 'Unknown error'}`);\n }\n\n return result.data.formats || [];\n }\n\n /**\n * Validate request parameters against AdCP schema.\n *\n * Uses default (non-strict) parsing so required fields are still enforced\n * but unknown top-level keys pass through. This matters because callers —\n * including the storyboard runner's `applyBrandInvariant` — inject\n * scoping fields (`brand`, `account`) onto every outgoing request, and\n * `adaptRequest` strips those fields downstream for tools\n * whose schema doesn't declare them. A strict parse here rejects the\n * injected fields before the adapter gets a chance to clean them up, so\n * the two passes have to agree on \"extra keys are fine.\"\n */\n private validateRequest(taskType: string, params: any): void {\n const schema = this.getRequestSchema(taskType);\n if (!schema) {\n return; // No schema available for this task type\n }\n\n try {\n schema.parse(params);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const issues = error.issues.map(i => `${i.path.join('.')}: ${i.message}`).join('; ');\n throw new Error(`Request validation failed for ${taskType}: ${issues}`);\n }\n throw error;\n }\n }\n\n /**\n * Get request schema for a given task type.\n *\n * Note: Schema validation is not available for all task types. The following\n * tasks use complex discriminated unions that cannot be represented in Zod\n * without significant runtime overhead:\n *\n * - `update_media_buy`: Uses conditional package update operations\n *\n * For these tasks, TypeScript compile-time checking is still enforced via\n * the generated types, but runtime validation falls back to basic type checks.\n * Invalid requests will still be rejected by the server with descriptive errors.\n *\n * @internal\n */\n private getRequestSchema(taskType: string): z.ZodSchema | null {\n const schemaMap: Partial<Record<string, z.ZodSchema>> = {\n get_products: schemas.GetProductsRequestSchema,\n list_creative_formats: schemas.ListCreativeFormatsRequestSchema,\n create_media_buy: schemas.CreateMediaBuyRequestSchema,\n // update_media_buy: excluded - complex discriminated unions (package operations)\n sync_creatives: schemas.SyncCreativesRequestSchema,\n list_creatives: schemas.ListCreativesRequestSchema,\n get_media_buys: schemas.GetMediaBuysRequestSchema,\n get_creative_features: schemas.GetCreativeFeaturesRequestSchema,\n get_media_buy_delivery: schemas.GetMediaBuyDeliveryRequestSchema,\n get_signals: schemas.GetSignalsRequestSchema,\n activate_signal: schemas.ActivateSignalRequestSchema,\n };\n\n return schemaMap[taskType] || null;\n }\n}\n\nlet hasWarnedAboutUnverifiedWebhookReceive = false;\n\n/**\n * Warn once when a webhook is accepted with no authenticity check at all.\n *\n * This path is available only through the explicit\n * `allowUnauthenticatedWebhooks` escape hatch and only when no trusted push\n * registration or legacy HMAC secret is available.\n */\nfunction warnUnverifiedWebhookReceive(): void {\n if (hasWarnedAboutUnverifiedWebhookReceive) return;\n hasWarnedAboutUnverifiedWebhookReceive = true;\n console.warn(\n '[adcp] Webhook accepted WITHOUT authenticity verification because ' +\n '`allowUnauthenticatedWebhooks` is enabled and no trusted registration was found. ' +\n 'Any caller able to reach this receiver can forge task completions and status changes.'\n );\n}\n\nlet hasWarnedAboutReportingWebhookSecret = false;\n\n/**\n * Warn once when an automatic `reporting_webhook` registration is skipped.\n *\n * `reporting-webhook.json` makes `authentication` required for all of AdCP 3.x,\n * so the registration cannot be sent without a credential — and the only\n * credential available without `webhookSecret` would be a hardcoded placeholder,\n * which would misrepresent the channel as authenticated.\n */\nfunction warnReportingWebhookNeedsSecret(): void {\n if (hasWarnedAboutReportingWebhookSecret) return;\n hasWarnedAboutReportingWebhookSecret = true;\n console.warn(\n '[adcp] Skipping automatic `reporting_webhook` registration: AdCP 3.x requires an `authentication` ' +\n 'block and no `webhookSecret` is configured. Set `webhookSecret` on the client, or pass an explicit ' +\n '`reporting_webhook.authentication` on the request. The media buy itself is unaffected.'\n );\n}\n\nfunction rawBodyFromUnknown(value: unknown): string | Buffer | Uint8Array | undefined {\n return typeof value === 'string' || Buffer.isBuffer(value) || value instanceof Uint8Array ? value : undefined;\n}\n\nfunction parseWebhookBody(value: unknown): { ok: true; payload: unknown } | WebhookParseFailure {\n if (value === undefined) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Webhook body is required.',\n };\n }\n if (typeof value === 'string' || Buffer.isBuffer(value) || value instanceof Uint8Array) {\n const raw = Buffer.isBuffer(value) || value instanceof Uint8Array ? Buffer.from(value).toString('utf8') : value;\n try {\n return { ok: true, payload: JSON.parse(raw) };\n } catch {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Webhook body must be valid JSON.',\n };\n }\n }\n return { ok: true, payload: value };\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction inspectWebhookAuthenticationHeaders(\n headers: WebhookHeadersLike | undefined,\n explicitSignature: WebhookHeaderValue,\n explicitTimestamp: WebhookHeaderValue\n): { hasLegacy: boolean; hasRfc9421: boolean } {\n const hasHeader = (name: string): boolean => {\n if (!headers) return false;\n if (typeof (headers as Headers).get === 'function') return (headers as Headers).get(name) !== null;\n return Object.entries(headers).some(\n ([key, value]) => key.toLowerCase() === name && value !== null && value !== undefined\n );\n };\n return {\n hasLegacy:\n explicitSignature != null ||\n explicitTimestamp != null ||\n hasHeader('x-adcp-signature') ||\n hasHeader('x-adcp-timestamp'),\n hasRfc9421: hasHeader('signature') || hasHeader('signature-input'),\n };\n}\n\nfunction normalizeRfc9421WebhookHeaders(\n headers: WebhookHeadersLike\n): { ok: true; headers: Record<string, string | string[] | undefined> } | { ok: false; failure: WebhookParseFailure } {\n const normalized: Record<string, string | string[] | undefined> = {};\n if (typeof (headers as Headers).forEach === 'function') {\n (headers as Headers).forEach((value, key) => {\n normalized[key] = value;\n });\n return { ok: true, headers: normalized };\n }\n\n const singletonHeaders = new Set([\n 'signature',\n 'signature-input',\n 'content-digest',\n 'content-type',\n 'x-adcp-signature',\n 'x-adcp-timestamp',\n ]);\n const seen = new Set<string>();\n for (const [key, value] of Object.entries(headers)) {\n const lower = key.toLowerCase();\n if (singletonHeaders.has(lower)) {\n if (seen.has(lower) || Array.isArray(value)) {\n const cause = new WebhookSignatureError(\n 'webhook_signature_header_malformed',\n 1,\n `Webhook header ${lower} must have exactly one unambiguous value.`\n );\n return { ok: false, failure: { ok: false, code: cause.code, message: cause.message, cause } };\n }\n seen.add(lower);\n }\n if (value === null || value === undefined) continue;\n normalized[key] = Array.isArray(value) ? value.map(String) : String(value);\n }\n return { ok: true, headers: normalized };\n}\n\nfunction isBareDeliveryReport(payload: Record<string, unknown>): boolean {\n return (\n typeof payload.notification_type === 'string' &&\n ('media_buy_deliveries' in payload || 'creative_deliveries' in payload || 'reporting_period' in payload) &&\n !('result' in payload) &&\n !('task_id' in payload)\n );\n}\n\nfunction latestA2AWebhookMessageData(parts: unknown): Record<string, unknown> | undefined {\n if (!Array.isArray(parts)) return undefined;\n for (let index = parts.length - 1; index >= 0; index -= 1) {\n const part = parts[index];\n if (!isObjectRecord(part) || part.kind !== 'data' || !isObjectRecord(part.data)) continue;\n return part.data;\n }\n return undefined;\n}\n\ntype SignedWebhookRoute = {\n operationId?: string;\n taskType?: string;\n agentId?: string;\n};\n\nfunction extractSignedWebhookRoute(\n payload: unknown\n): ({ ok: true } & SignedWebhookRoute) | { ok: false; message: string } {\n if (!isObjectRecord(payload)) return { ok: true };\n const records: Record<string, unknown>[] = [payload];\n if (payload.kind === 'task' || payload.kind === 'status-update') {\n records.length = 0;\n const status = isObjectRecord(payload.status) ? payload.status : undefined;\n const message = isObjectRecord(status?.message) ? status.message : undefined;\n const messageData = latestA2AWebhookMessageData(message?.parts);\n if (messageData) records.push(messageData);\n if (payload.kind === 'task') {\n const artifactData = getLatestA2ADataPartFromTask(payload as unknown as A2ATask)?.data;\n if (artifactData) records.push(artifactData);\n }\n }\n\n const oneValue = (field: 'operation_id' | 'task_type' | 'agent_id'): string | undefined | null => {\n const values = new Set(\n records\n .map(record => record[field])\n .filter((value): value is string => typeof value === 'string' && value.length > 0)\n );\n return values.size > 1 ? null : values.values().next().value;\n };\n const operationId = oneValue('operation_id');\n const taskType = oneValue('task_type');\n const agentId = oneValue('agent_id');\n if (operationId === null || taskType === null || agentId === null) {\n return {\n ok: false,\n message: 'Authenticated webhook contains contradictory signed routing fields.',\n };\n }\n return {\n ok: true,\n ...(operationId !== undefined && { operationId }),\n ...(taskType !== undefined && { taskType }),\n ...(agentId !== undefined && { agentId }),\n };\n}\n\nfunction legacyA2AArtifactStatus(\n payload: A2ATask | TaskStatusUpdateEvent,\n artifact: unknown\n): NormalizedWebhookPayload['status'] | undefined {\n if (payload.kind !== 'task' || !isObjectRecord(artifact) || typeof artifact.name !== 'string') return undefined;\n const transportState = payload.status?.state;\n if (artifact.name === 'result' && transportState === 'completed') return 'completed';\n if (artifact.name !== 'error') return undefined;\n if (transportState === 'failed' || transportState === 'rejected' || transportState === 'canceled') {\n return transportState;\n }\n return undefined;\n}\n\nfunction isMcpWebhookCandidate(payload: Record<string, unknown>): boolean {\n return (\n MCP_WEBHOOK_REQUIRED_FIELDS.some(field => field in payload) ||\n 'result' in payload ||\n 'context_id' in payload ||\n 'notification_id' in payload\n );\n}\n\nfunction missingMcpWebhookFields(payload: Record<string, unknown>): string[] {\n return MCP_WEBHOOK_REQUIRED_FIELDS.filter(field => {\n const value = payload[field];\n return typeof value !== 'string' || value.length === 0;\n });\n}\n\nfunction webhookErrorHttpStatus(error: unknown): number {\n if (error instanceof WebhookDispatchError) {\n if (error.code === 'webhook_signature_replayed') return 409;\n if (error.code === 'webhook_idempotency_conflict') return 409;\n if (error.code === 'webhook_signature_rate_abuse') return 429;\n if (\n error.code === 'webhook_registration_store_unavailable' ||\n error.code === 'webhook_verification_unavailable' ||\n error.code === 'webhook_durable_settlement_unavailable' ||\n error.code === 'webhook_publication_in_progress' ||\n error.code === 'webhook_signature_revocation_stale'\n ) {\n return 503;\n }\n if (error.code === 'webhook_verification_context_missing') return 500;\n if (\n error.code.startsWith('webhook_signature_') ||\n error.code === 'webhook_timestamp_invalid' ||\n error.code === 'webhook_mode_mismatch' ||\n error.code === 'webhook_registration_not_found' ||\n error.code === 'webhook_registration_mismatch' ||\n error.code === 'webhook_unverifiable'\n ) {\n return 401;\n }\n return 400;\n }\n return 500;\n}\n\n/**\n * Factory function to create a single-agent client.\n *\n * @param agent - Agent configuration\n * @param config - Client configuration\n * @returns Configured SingleAgentClient instance\n */\nexport function createSingleAgentClient(agent: AgentConfig, config?: SingleAgentClientConfig): SingleAgentClient {\n return new SingleAgentClient(agent, config);\n}\n"],"mappings":"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","names":["import_version","import_abort","A2AClientImpl","legacy","canonicalizeJson","isWellKnownCardUrl","routedTaskType","verifyRfc9421WebhookSignature","canonical","_needsDiscovery","_needsCanonicalUrl","cleanAgent","mcpClient","capabilities","advertisedVersions","responseVersion"]}
1
+ {"version":3,"sources":["../../../src/lib/core/SingleAgentClient.ts"],"sourcesContent":["// Main ADCP Client - Type-safe conversation-aware client for AdCP agents\n\nimport { z } from 'zod';\nimport * as schemas from '../types/schemas.generated';\nimport type { AgentConfig } from '../types';\nimport { ADCP_ENVELOPE_FIELDS } from '../types/adcp';\nimport { parseAdcpMajorVersion, type AdcpVersion } from '../version';\nimport {\n isAdcpVersionSupported,\n isAdcpVersionAtLeast,\n isPre31AdcpVersion,\n isPre32AdcpVersion,\n resolveAdcpVersion,\n} from '../utils/adcp-version-config';\nimport { beta6ReportingRequestIssue, type Beta6DeliveryRequestIssue } from '../media-buy/reporting-version';\nimport { getVersionAdapter, resolveAdapterKey } from '../adapters/version';\nimport { isExternalSchemaRootActive, schemaAllowsTopLevelField } from '../validation/schema-loader';\nimport type {\n GetProductsRequest,\n GetProductsResponse,\n PropertyListReference,\n ListCreativeFormatsRequest,\n ListCreativeFormatsResponse,\n ListTransformersRequest,\n ListTransformersResponse,\n CreateMediaBuyRequest,\n CreateMediaBuyResponse,\n UpdateMediaBuyRequest,\n UpdateMediaBuyResponse,\n SyncCreativesRequest,\n SyncCreativesResponse,\n ListCreativesRequest,\n ListCreativesResponse,\n GetMediaBuysRequest,\n GetMediaBuysResponse,\n GetMediaBuyDeliveryRequest,\n GetMediaBuyDeliveryResponse,\n GetCreativeDeliveryRequest,\n GetCreativeDeliveryResponse,\n ProvidePerformanceFeedbackRequest,\n ProvidePerformanceFeedbackResponse,\n GetSignalsRequest,\n GetSignalsResponse,\n ActivateSignalRequest,\n ActivateSignalResponse,\n PreviewCreativeRequest,\n PreviewCreativeResponse,\n BuildCreativeRequest,\n BuildCreativeResponse,\n Format,\n GetAdCPCapabilitiesRequest,\n GetAdCPCapabilitiesResponse,\n ListAccountsRequest,\n ListAccountsResponse,\n SyncAccountsRequest,\n SyncAccountsResponse,\n SyncAudiencesRequest,\n SyncAudiencesResponse,\n CreatePropertyListRequest,\n CreatePropertyListResponse,\n GetPropertyListRequest,\n GetPropertyListResponse,\n UpdatePropertyListRequest,\n UpdatePropertyListResponse,\n ListPropertyListsRequest,\n ListPropertyListsResponse,\n DeletePropertyListRequest,\n DeletePropertyListResponse,\n ListContentStandardsRequest,\n ListContentStandardsResponse,\n GetContentStandardsRequest,\n GetContentStandardsResponse,\n CalibrateContentRequest,\n CalibrateContentResponse,\n ValidateContentDeliveryRequest,\n ValidateContentDeliveryResponse,\n SIGetOfferingRequest,\n SIGetOfferingResponse,\n SIInitiateSessionRequest,\n SIInitiateSessionResponse,\n SISendMessageRequest,\n SISendMessageResponse,\n SITerminateSessionRequest,\n SITerminateSessionResponse,\n SyncPlansRequest,\n SyncPlansResponse,\n GetPlanAuditLogsRequest,\n GetPlanAuditLogsResponse,\n OutcomeType,\n} from '../types/tools.generated';\nimport { type MutatingRequestInput, generateIdempotencyKey, requestUsesIdempotency } from '../utils/idempotency';\n\nimport type { MCPWebhookPayload, AdCPAsyncResponseData, TaskStatus } from '../types/core.generated';\nimport type { Task as A2ATask, TaskStatusUpdateEvent } from '@a2a-js/sdk';\nimport { A2AClient as A2AClientImpl } from '@a2a-js/sdk/client';\n// A2A SDK client used untyped — wire shapes are validated at runtime, matching\n// the prior CommonJS `require('@a2a-js/sdk/client')` behaviour.\nconst A2AClient: any = A2AClientImpl;\n\nimport {\n TaskExecutor,\n DEFERRED_SETTLEMENT_ACK,\n acknowledgeDeferredSettlement,\n rejectDeferredSettlement,\n hasCompletionHandlerAlreadyPublished,\n markCompletionHandlerAlreadyPublished,\n AfterProtocolDispatchHookError,\n BeforeProtocolDispatchHookError,\n type BeforeProtocolDispatchHook,\n type ExternalTaskSettlementObservation,\n type ExternalTaskStatusResult,\n} from './TaskExecutor';\nimport { attachMatch } from './match';\nimport {\n assertNativeRequestProposalsResult,\n assertNativeRequestProposalsTask,\n guardNativeRequestProposalsCompletion,\n} from './request-proposals-guard';\nimport { withTaskDeadline } from './task-deadline';\nimport { createMCPRequestHeaders } from '../auth';\nimport { isAbortOrTimeoutError } from '../protocols/abort';\nimport { ProtocolClient, normalizeTransportOptions } from '../protocols';\nimport {\n AuthenticationRequiredError,\n ConfigurationError,\n FeatureUnsupportedError,\n ProtocolFeatureUnsupportedError,\n TaskTimeoutError,\n VersionUnsupportedError,\n is401Error,\n} from '../errors';\nimport { createAgentTransportFetch, isLikelyPrivateUrl } from '../net';\nimport {\n discoverAuthorizationRequirements,\n NeedsAuthorizationError,\n probeAuthChallenge,\n} from '../auth/oauth/authorization-required';\nimport { discoverOAuthMetadata } from '../auth/oauth/discovery';\nimport type {\n InputHandler,\n Message,\n TaskOptions,\n TaskResult,\n ConversationConfig,\n TaskInfo,\n TaskState,\n WebhookUrlTemplate,\n} from './ConversationTypes';\nimport type { AdcpTaskName, TaskRequestFor, TaskResponseTypeMap } from './AgentClient';\nimport type { DeferredTaskStorage } from '../storage/interfaces';\nimport type { Activity, AsyncHandlerConfig, WebhookMetadata } from './AsyncHandler';\nimport {\n AsyncHandler,\n WebhookDedupClaimRetentionError,\n WebhookDedupConflictError,\n WebhookDedupInputError,\n} from './AsyncHandler';\nimport { verifyWebhookRequest, type WebhookHeaderValue, type WebhookHeadersLike } from '../webhooks';\nimport {\n InMemoryWebhookRegistrationStore,\n type WebhookRegistration,\n type WebhookRegistrationStore,\n} from './webhook-registration';\nimport {\n InMemoryReplayStore,\n type ReplayStore,\n InMemoryRevocationStore,\n type RevocationStore,\n type JwksResolver,\n WebhookSignatureError,\n type WebhookSignatureErrorCode,\n verifyWebhookSignature as verifyRfc9421WebhookSignature,\n ResolvedAgentJwksResolver,\n type ResolvedAgentJwksResolverOptions,\n canonicalTargetUri,\n} from '../signing/server';\nimport { unwrapProtocolResponse } from '../utils/response-unwrapper';\nimport { getLatestA2ADataPartFromTask } from '../utils/a2a-artifacts';\nimport { extractAdcpTaskStatusFromPayload, isAdcpStatus } from './task-status';\nimport { responseParser } from './ProtocolResponseParser';\nimport {\n isWellKnownAgentCardUrl as isWellKnownCardUrl,\n buildCardUrls,\n stripAgentCardPath,\n stripTransportSuffix,\n} from '../utils/a2a-discovery';\nimport * as crypto from 'crypto';\nimport {\n DEFAULT_REQUEST_TIMEOUT_MS,\n createTimeoutError,\n resolveClientRequestTimeoutMs,\n resolveRequestTimeoutMs,\n throwIfAborted,\n withAbortSignal,\n} from '../protocols/abort';\n\n// v3.0 compatibility utilities\nimport type { AdcpCapabilities, AdcpMajorVersion, ToolInfo, FeatureName } from '../utils/capabilities';\nimport {\n buildSyntheticCapabilities,\n buildSyntheticV3Capabilities,\n augmentCapabilitiesFromTools,\n looksLikeV3Capabilities,\n parseCapabilitiesResponse,\n resolveFeature,\n listDeclaredFeatures,\n TASK_FEATURE_MAP,\n assertValidIdempotencyReplayTtlSeconds,\n} from '../utils/capabilities';\n\nimport { normalizeRequestParams } from '../utils/request-normalizer';\nimport { globalAsyncLocalStorage } from '../utils/global-async-local-storage';\nimport { validateUserAgent } from '../utils/validate-user-agent';\nimport { resolveWebhookUrl, selectWebhookTemplate } from './webhook-url';\nimport { getV25Adapter } from '../adapters/legacy/v2-5';\nimport {\n ProductPropertyPolicyError,\n validateProductsAgainstPropertyPolicy,\n type BuyerPropertyPolicy,\n type ProductPolicyProductLike,\n type ProductPropertyPolicyDiagnostic,\n type ProductPropertyPolicyMode,\n type ProductPropertyPolicyValidationResult,\n} from '../media-buy/property-policy';\nimport { resolvePropertyList, type ResolveListOptions } from '../server/targeting-helpers';\nimport {\n CreativeFormatCapabilityError,\n CreativeFormatProjectionError,\n projectMediaBuyCreativesForDelivery,\n projectCreativeForDelivery,\n projectSyncCreativesForDelivery,\n resolveCreativeFormatWireMode,\n stripLegacyCreativeIdentity,\n type CanonicalCreateMediaBuyRequest,\n type CanonicalCreativeResponse,\n type CanonicalGetProductsRequest,\n type CanonicalGetProductsResponse,\n type CanonicalListCreativesRequest,\n type CanonicalListCreativesResponse,\n type CanonicalPreviewCreativeRequest,\n type CanonicalPreviewCreativeResponse,\n type CanonicalSyncCreativesRequest,\n type CanonicalUpdateMediaBuyRequest,\n type CreativeFormatWireMode,\n type CreativeFormatSelectorContainer,\n type SyncCreativeFormatProjection,\n} from '../v2/projection/creative-delivery';\nimport type { LegacyFormatConverter } from '../v2/projection/v1-to-v2';\nimport {\n legacyFormatConverterFromCatalogSnapshots,\n type ProjectionCatalogSnapshot,\n} from '../v2/projection/catalog-snapshot';\nimport type { CanonicalFormatLegacyResolutionContext, CanonicalFormatLegacyResolver } from '../v2/projection/v2-to-v1';\nimport { toCanonicalOnlyResponse } from '../v2/projection/augment-response';\nimport {\n legacyFormatRefsForDeclaration,\n structuredCloneWithLegacyCreativeMetadata,\n} from '../v2/projection/legacy-metadata';\nimport { isProjectionProductInput, type V1FormatId, type V1Product } from '../v2/projection/types';\nimport { canonicalize as canonicalizeJson } from '../utils/jcs';\n\ntype ReadRequestOptions = Pick<TaskOptions, 'signal' | 'transport'>;\ntype ToolSchemaMap = Map<string, Record<string, unknown>>;\ntype CapabilityDiscoveryContext = {\n toolSchemas?: ToolSchemaMap;\n capabilities?: AdcpCapabilities;\n};\nconst CAPABILITY_DISCOVERY_CONTEXT = Symbol('capabilityDiscoveryContext');\ntype InternalReadRequestOptions = ReadRequestOptions & {\n [CAPABILITY_DISCOVERY_CONTEXT]?: CapabilityDiscoveryContext;\n};\ntype UnprojectedPreDispatchHook<T> = BeforeProtocolDispatchHook<T>;\n\nfunction creativeSchemaSupport(value: unknown, depth = 0): CreativeFormatWireMode {\n if (depth > 24 || value === null || typeof value !== 'object') return 'unknown';\n if (Array.isArray(value)) {\n let legacy = false;\n for (const item of value) {\n const support = creativeSchemaSupport(item, depth + 1);\n if (support === 'canonical') return support;\n if (support === 'legacy') legacy = true;\n }\n return legacy ? 'legacy' : 'unknown';\n }\n const object = value as Record<string, unknown>;\n const properties = object.properties;\n if (properties !== null && typeof properties === 'object' && !Array.isArray(properties)) {\n const keys = properties as Record<string, unknown>;\n if ('creative_id' in keys && 'format_kind' in keys) return 'canonical';\n if ('creative_id' in keys && 'format_id' in keys) return 'legacy';\n }\n let legacy = false;\n for (const child of Object.values(object)) {\n const support = creativeSchemaSupport(child, depth + 1);\n if (support === 'canonical') return support;\n if (support === 'legacy') legacy = true;\n }\n return legacy ? 'legacy' : 'unknown';\n}\n\nfunction hasMediaBuyCreativeFormatData(request: unknown): boolean {\n if (request === null || typeof request !== 'object' || Array.isArray(request)) return false;\n const record = request as Record<string, unknown>;\n return ['packages', 'new_packages'].some(key => {\n const packages = record[key];\n return (\n Array.isArray(packages) &&\n packages.some(pkg => {\n if (pkg === null || typeof pkg !== 'object' || Array.isArray(pkg)) return false;\n const packageRecord = pkg as Record<string, unknown>;\n return (\n Array.isArray(packageRecord.creatives) ||\n Array.isArray(packageRecord.format_option_refs) ||\n Array.isArray(packageRecord.format_ids) ||\n typeof packageRecord.format_kind === 'string' ||\n Object.getOwnPropertySymbols(packageRecord).length > 0\n );\n })\n );\n });\n}\n\nfunction legacyCreativeIdentityPath(value: unknown, path = '$', seen = new WeakSet<object>()): string | undefined {\n if (value === null || typeof value !== 'object') return undefined;\n if (seen.has(value)) return `${path} (cycle)`;\n seen.add(value);\n try {\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== 'string' || (Array.isArray(value) && key === 'length')) continue;\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!descriptor || !descriptor.enumerable) continue;\n const childPath = Array.isArray(value) ? `${path}[${key}]` : `${path}.${key}`;\n if (/(^|_)(?:format_ids?|v1_format_ref)($|_)/.test(key)) return childPath;\n if (!('value' in descriptor)) return `${childPath} (accessor)`;\n const nested = legacyCreativeIdentityPath(descriptor.value, childPath, seen);\n if (nested) return nested;\n }\n return undefined;\n } finally {\n seen.delete(value);\n }\n}\n\nconst CANONICAL_CREATIVE_ACTIVITY_TASKS = new Set([\n 'get_products',\n 'create_media_buy',\n 'update_media_buy',\n 'sync_creatives',\n 'list_creatives',\n 'get_media_buys',\n 'get_media_buy_delivery',\n 'get_creative_delivery',\n]);\n\n// Missing legacy-HMAC registrations are safe only for tools that cannot\n// mutate seller state. `get_products` is intentionally absent because its\n// legacy proposal-finalization variant is state-changing.\nconst RECORDLESS_HMAC_READ_ONLY_TASKS = new Set([\n 'get_adcp_capabilities',\n 'list_products',\n 'list_creative_formats',\n 'preview_creative',\n 'list_transformers',\n 'list_creatives',\n 'get_media_buys',\n 'get_media_buy_delivery',\n 'media_buy_delivery',\n 'get_creative_delivery',\n 'get_signals',\n 'list_accounts',\n 'get_property_list',\n 'list_property_lists',\n 'list_content_standards',\n 'get_content_standards',\n 'si_get_offering',\n 'get_plan_audit_logs',\n]);\n\n/**\n * Bound task/context state retained for async creative projection and policy.\n *\n * A creative task can contribute several aliases (operation, client task,\n * server task, and conversation context IDs). Ten thousand aliases covers\n * thousands of concurrent tasks while keeping abandoned tasks from growing a\n * long-lived client without limit. Associations retain only converters and a\n * frozen account/package routing projection—never creative assets or webhook\n * credentials. Map insertion order provides LRU eviction.\n */\nconst TASK_SCOPED_STATE_LIMIT = 10_000;\n\ninterface CanonicalCreativeTaskAssociation {\n taskType: string;\n legacyFormatConverter?: LegacyFormatConverter;\n routingSnapshot?: CanonicalCreativeRoutingSnapshot;\n}\n\ninterface ProductPolicyRequestState {\n request?: Readonly<Record<string, unknown>>;\n}\n\ntype CanonicalLegacyOptionRef =\n | { scope: 'product'; format_option_id: string }\n | { scope: 'publisher'; publisher_domain: string; format_option_id: string };\n\ntype CanonicalLegacyRoute =\n | {\n kind: 'product';\n accountScope: string;\n productId: string;\n optionRef: CanonicalLegacyOptionRef;\n refs: readonly V1FormatId[];\n }\n | {\n kind: 'package';\n accountScope: string;\n packageId: string;\n refs: readonly V1FormatId[];\n };\n\ninterface CanonicalPackageRouteSelectorSnapshot {\n readonly package_id?: string;\n readonly product_id?: string;\n readonly format_option_refs?: readonly CanonicalLegacyOptionRef[];\n}\n\ninterface CanonicalCreativeRoutingSnapshot {\n readonly account: Readonly<Record<string, unknown>>;\n readonly packages?: readonly CanonicalPackageRouteSelectorSnapshot[];\n readonly new_packages?: readonly CanonicalPackageRouteSelectorSnapshot[];\n}\n\ninterface DeferredClientFinalizationContext {\n readonly kind: 'single-agent';\n readonly taskType: string;\n readonly handlerName?: keyof AsyncHandlerConfig;\n readonly canonical: boolean;\n readonly serverVersion?: 'v2' | 'v3';\n readonly serverVersionSynthetic?: boolean;\n readonly productPolicyRequest: Readonly<Record<string, unknown>>;\n readonly projectionCatalogs?: readonly ProjectionCatalogSnapshot[];\n readonly routingSnapshot?: CanonicalCreativeRoutingSnapshot;\n readonly optionTaskId?: string;\n readonly optionContextId?: string;\n}\n\nfunction isDeferredClientFinalizationContext(value: unknown): value is DeferredClientFinalizationContext {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const context = value as Record<string, unknown>;\n return (\n context.kind === 'single-agent' &&\n typeof context.taskType === 'string' &&\n typeof context.canonical === 'boolean' &&\n !!context.productPolicyRequest &&\n typeof context.productPolicyRequest === 'object' &&\n !Array.isArray(context.productPolicyRequest) &&\n (context.serverVersion === undefined || context.serverVersion === 'v2' || context.serverVersion === 'v3') &&\n (context.serverVersionSynthetic === undefined || typeof context.serverVersionSynthetic === 'boolean') &&\n (context.projectionCatalogs === undefined || Array.isArray(context.projectionCatalogs)) &&\n (context.handlerName === undefined || typeof context.handlerName === 'string')\n );\n}\n\nconst CANONICAL_PACKAGE_ROUTE_TASKS = new Set(['create_media_buy', 'update_media_buy', 'get_media_buys']);\nconst canonicalCreativeRoutingSnapshots = new WeakSet<object>();\n\nfunction canonicalAccountRoutingSnapshot(value: unknown): Readonly<Record<string, unknown>> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const account = value as Record<string, unknown>;\n if (typeof account.account_id === 'string') return Object.freeze({ account_id: account.account_id });\n if (\n !account.brand ||\n typeof account.brand !== 'object' ||\n Array.isArray(account.brand) ||\n typeof account.operator !== 'string'\n ) {\n return undefined;\n }\n const sourceBrand = account.brand as Record<string, unknown>;\n if (typeof sourceBrand.domain !== 'string') return undefined;\n const brand = Object.freeze({\n domain: sourceBrand.domain,\n ...(typeof sourceBrand.brand_id === 'string' ? { brand_id: sourceBrand.brand_id } : {}),\n });\n return Object.freeze({\n brand,\n operator: account.operator,\n ...(typeof account.sandbox === 'boolean' ? { sandbox: account.sandbox } : {}),\n });\n}\n\nfunction canonicalOptionRefRoutingSnapshot(value: unknown): CanonicalLegacyOptionRef | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const ref = value as Record<string, unknown>;\n if (typeof ref.format_option_id !== 'string') return undefined;\n if (ref.scope === 'publisher' || typeof ref.publisher_domain === 'string') {\n if (typeof ref.publisher_domain !== 'string') return undefined;\n return Object.freeze({\n scope: 'publisher' as const,\n publisher_domain: ref.publisher_domain,\n format_option_id: ref.format_option_id,\n });\n }\n return Object.freeze({ scope: 'product' as const, format_option_id: ref.format_option_id });\n}\n\nfunction canonicalPackageRouteSelectorSnapshot(value: unknown): CanonicalPackageRouteSelectorSnapshot | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const selector = value as Record<string, unknown>;\n const formatOptionRefs = Array.isArray(selector.format_option_refs)\n ? selector.format_option_refs\n .map(canonicalOptionRefRoutingSnapshot)\n .filter((ref): ref is CanonicalLegacyOptionRef => ref !== undefined)\n : [];\n const snapshot = {\n ...(typeof selector.package_id === 'string' ? { package_id: selector.package_id } : {}),\n ...(typeof selector.product_id === 'string' ? { product_id: selector.product_id } : {}),\n ...(formatOptionRefs.length > 0 ? { format_option_refs: Object.freeze(formatOptionRefs) } : {}),\n };\n return Object.keys(snapshot).length > 0 ? Object.freeze(snapshot) : undefined;\n}\n\nfunction canonicalCreativeRoutingSnapshot(\n taskType: string,\n request: unknown\n): CanonicalCreativeRoutingSnapshot | undefined {\n if (\n !CANONICAL_PACKAGE_ROUTE_TASKS.has(taskType) ||\n !request ||\n typeof request !== 'object' ||\n Array.isArray(request)\n ) {\n return undefined;\n }\n if (canonicalCreativeRoutingSnapshots.has(request)) {\n return request as CanonicalCreativeRoutingSnapshot;\n }\n const record = request as Record<string, unknown>;\n const account = canonicalAccountRoutingSnapshot(record.account);\n if (!account) return undefined;\n const packageSnapshots = (key: 'packages' | 'new_packages'): readonly CanonicalPackageRouteSelectorSnapshot[] =>\n Object.freeze(\n (Array.isArray(record[key]) ? record[key] : [])\n .map(canonicalPackageRouteSelectorSnapshot)\n .filter((selector): selector is CanonicalPackageRouteSelectorSnapshot => selector !== undefined)\n );\n const packages = packageSnapshots('packages');\n const newPackages = packageSnapshots('new_packages');\n const snapshot = Object.freeze({\n account,\n ...(packages.length > 0 ? { packages } : {}),\n ...(newPackages.length > 0 ? { new_packages: newPackages } : {}),\n });\n canonicalCreativeRoutingSnapshots.add(snapshot);\n return snapshot;\n}\n\nconst canonicalCreativeExecutionStorage = globalAsyncLocalStorage<{\n taskType: string;\n canonical: boolean;\n legacyFormatConverter?: LegacyFormatConverter;\n canonicalRequest?: unknown;\n}>('canonicalCreativeExecution');\n\nfunction isCanonicalCreativeExecution(taskType: string | undefined): boolean {\n if (!taskType) return false;\n if (CANONICAL_CREATIVE_ACTIVITY_TASKS.has(taskType)) return true;\n const active = canonicalCreativeExecutionStorage.getStore();\n return active?.canonical === true && active.taskType === taskType;\n}\n\n/**\n * Snapshot semantic payloads without executing adopter-controlled behavior.\n * Plain data retains identity when unchanged (including private WeakMap format\n * metadata); class instances are flattened to enumerable own data.\n */\nfunction prepareCanonicalCreativePayload(\n value: unknown,\n taskType: string,\n active = new WeakSet<object>(),\n prepared = new WeakMap<object, unknown>()\n): unknown {\n if (value === null || typeof value !== 'object') return value;\n for (let owner: object | null = value; owner !== null; owner = Object.getPrototypeOf(owner)) {\n const toJSON = Object.getOwnPropertyDescriptor(owner, 'toJSON');\n if (toJSON && (!('value' in toJSON) || typeof toJSON.value === 'function')) {\n throw new CreativeFormatProjectionError(\n taskType,\n '(response:toJSON)',\n 'custom or accessor toJSON hooks cannot cross the canonical creative boundary safely'\n );\n }\n }\n if (active.has(value)) {\n throw new CreativeFormatProjectionError(\n taskType,\n '(response:cycle)',\n 'cyclic values cannot cross the canonical creative boundary'\n );\n }\n const cached = prepared.get(value);\n if (cached !== undefined) return cached;\n\n active.add(value);\n try {\n const isArray = Array.isArray(value);\n const prototype = Object.getPrototypeOf(value);\n const plain = isArray ? prototype === Array.prototype : prototype === Object.prototype || prototype === null;\n const output: Record<string | symbol, unknown> | unknown[] = isArray\n ? []\n : Object.create(prototype === null ? null : Object.prototype);\n prepared.set(value, output);\n let changed = !plain;\n for (const key of Reflect.ownKeys(value)) {\n if (isArray && key === 'length') continue;\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!descriptor) continue;\n if (!('value' in descriptor)) {\n throw new CreativeFormatProjectionError(\n taskType,\n `(response:${String(key)})`,\n 'accessors cannot cross the canonical creative boundary safely'\n );\n }\n if (!descriptor.enumerable) continue;\n const safe = prepareCanonicalCreativePayload(descriptor.value, taskType, active, prepared);\n if (safe !== descriptor.value) changed = true;\n Object.defineProperty(output, key, { ...descriptor, value: safe });\n }\n if (!changed) {\n prepared.set(value, value);\n return value;\n }\n return output;\n } finally {\n active.delete(value);\n }\n}\n\nfunction projectPreparedCanonicalCreativeResponseValue(\n value: unknown,\n taskType: string,\n legacyFormatConverter: LegacyFormatConverter | undefined,\n selectorContainer: CreativeFormatSelectorContainer = {}\n): unknown {\n if (Array.isArray(value)) {\n return value.map(item =>\n projectPreparedCanonicalCreativeResponseValue(item, taskType, legacyFormatConverter, selectorContainer)\n );\n }\n if (!value || typeof value !== 'object') return value;\n\n let projected = value as Record<string, unknown>;\n if (isProjectionProductInput(projected)) {\n const canonical = toCanonicalOnlyResponse({ products: [projected] }, { legacyFormatConverter });\n if (canonical.diagnostics.length > 0 || canonical.response.products.length !== 1) {\n throw new CreativeFormatProjectionError(\n taskType,\n `(product:${String(projected.product_id)})`,\n 'legacy product formats in the response have no complete canonical representation'\n );\n }\n projected = canonical.response.products[0] as unknown as Record<string, unknown>;\n } else if (\n (typeof projected.package_id === 'string' || typeof projected.product_id === 'string') &&\n Array.isArray(projected.format_ids)\n ) {\n projected = (\n projectMediaBuyCreativesForDelivery(\n { packages: [projected] },\n 'canonical',\n taskType === 'update_media_buy' ? 'update_media_buy' : 'create_media_buy',\n legacyFormatConverter\n ) as { packages: Record<string, unknown>[] }\n ).packages[0]!;\n }\n\n if (\n typeof projected.creative_id === 'string' &&\n (projected.format_id !== undefined || typeof projected.format_kind === 'string')\n ) {\n projected = projectCreativeForDelivery(\n projected as unknown as import('../types/tools.generated').CreativeAsset,\n selectorContainer,\n 'canonical',\n taskType,\n legacyFormatConverter\n ) as unknown as Record<string, unknown>;\n }\n\n const nextSelector =\n Array.isArray(projected.format_ids) ||\n Array.isArray(projected.format_options) ||\n Array.isArray(projected.format_option_refs)\n ? (projected as CreativeFormatSelectorContainer)\n : selectorContainer;\n let changed = projected !== value;\n const next: Record<string, unknown> = { ...projected };\n for (const [key, child] of Object.entries(projected)) {\n const childProjected = projectPreparedCanonicalCreativeResponseValue(\n child,\n taskType,\n legacyFormatConverter,\n nextSelector\n );\n if (childProjected !== child) {\n next[key] = childProjected;\n changed = true;\n }\n }\n return changed ? next : projected;\n}\n\nfunction projectCanonicalCreativeResponseValue(\n value: unknown,\n taskType: string,\n legacyFormatConverter: LegacyFormatConverter | undefined,\n selectorContainer: CreativeFormatSelectorContainer = {}\n): unknown {\n return projectPreparedCanonicalCreativeResponseValue(\n prepareCanonicalCreativePayload(value, taskType),\n taskType,\n legacyFormatConverter,\n selectorContainer\n );\n}\n\nfunction projectCanonicalCreativeAncillaryValue(\n value: unknown,\n taskType: string,\n legacyFormatConverter: LegacyFormatConverter | undefined\n): unknown {\n try {\n return stripLegacyCreativeIdentity(projectCanonicalCreativeResponseValue(value, taskType, legacyFormatConverter));\n } catch (error) {\n if (!(error instanceof CreativeFormatProjectionError)) throw error;\n return { omitted: true, reason: 'canonical creative payload unavailable' };\n }\n}\n\n/** Keep legacy creative identity confined to the transport adapter. */\nfunction canonicalCreativeActivity(activity: Activity): Activity {\n const active = canonicalCreativeExecutionStorage.getStore();\n const effectiveTaskType = active?.taskType && active.canonical ? active.taskType : activity.task_type;\n if (!isCanonicalCreativeExecution(effectiveTaskType) || activity.payload === undefined) {\n return activity;\n }\n const converter = active?.taskType === effectiveTaskType ? active.legacyFormatConverter : undefined;\n const source =\n activity.type === 'protocol_request' &&\n active?.taskType === effectiveTaskType &&\n active.canonicalRequest !== undefined\n ? { params: active.canonicalRequest }\n : activity.payload;\n try {\n return {\n ...activity,\n payload: stripLegacyCreativeIdentity(projectCanonicalCreativeResponseValue(source, effectiveTaskType, converter)),\n };\n } catch (error) {\n if (!(error instanceof CreativeFormatProjectionError)) throw error;\n return { ...activity, payload: { omitted: true, reason: 'canonical creative payload unavailable' } };\n }\n}\n\nfunction canonicalCreativeDiagnosticBody(body: string | undefined, taskType: string): string | undefined {\n if (body === undefined) return undefined;\n try {\n const active = canonicalCreativeExecutionStorage.getStore();\n const converter = active?.taskType === taskType ? active.legacyFormatConverter : undefined;\n return JSON.stringify(\n stripLegacyCreativeIdentity(projectCanonicalCreativeResponseValue(JSON.parse(body), taskType, converter))\n );\n } catch {\n // Truncated JSON and streaming envelopes cannot be projected reliably.\n // Omitting them keeps the canonical public boundary deterministic.\n return '[canonical creative payload omitted]';\n }\n}\n\n/** Prevent transport observability from becoming a backdoor to legacy creative identity. */\nfunction canonicalCreativeTransportActivity(\n event: import('../protocols').TransportActivity\n): import('../protocols').TransportActivity {\n const active = canonicalCreativeExecutionStorage.getStore();\n const taskType = active?.taskType && active.canonical ? active.taskType : (event.taskType ?? event.tool);\n if (!taskType || !isCanonicalCreativeExecution(taskType)) return event;\n return {\n ...event,\n ...(event.requestBody !== undefined && {\n requestBody: canonicalCreativeDiagnosticBody(event.requestBody, taskType),\n }),\n ...(event.responseBody !== undefined && {\n responseBody: canonicalCreativeDiagnosticBody(event.responseBody, taskType),\n }),\n };\n}\n\n/** Clone a typed error without retaining legacy identity in reflective own fields. */\nfunction canonicalCreativeErrorInstance<T extends Error>(error: T, legacySource?: unknown): T {\n const own: Record<string, unknown> = {};\n const descriptors = Object.getOwnPropertyDescriptors(error);\n for (const [key, descriptor] of Object.entries(descriptors)) {\n // Invoking an adopter-defined accessor while sanitizing is unsafe. Prototype\n // accessors remain available; reflective own accessors are omitted.\n if ('value' in descriptor) own[key] = descriptor.value;\n }\n const { legacySource: _dropLegacySource, own: safeOwn } = stripLegacyCreativeIdentity({ own, legacySource }) as {\n own: Record<string, unknown>;\n legacySource?: unknown;\n };\n void _dropLegacySource;\n\n const clone = Object.create(Object.getPrototypeOf(error)) as T;\n for (const [key, value] of Object.entries(safeOwn)) {\n const descriptor = descriptors[key];\n if (!descriptor || !('value' in descriptor)) continue;\n Object.defineProperty(clone, key, { ...descriptor, value });\n }\n // Symbol-keyed data is not traversed by JSON projection, but it is visible\n // through reflection. Sanitize its value independently and omit accessors.\n for (const symbol of Object.getOwnPropertySymbols(error)) {\n const descriptor = Object.getOwnPropertyDescriptor(error, symbol);\n if (!descriptor || !('value' in descriptor)) continue;\n const safe = stripLegacyCreativeIdentity({ value: descriptor.value, legacySource }) as {\n value: unknown;\n };\n Object.defineProperty(clone, symbol, { ...descriptor, value: safe.value });\n }\n return stripLegacyCreativeIdentity(clone) as T;\n}\n\nexport type CreativeDeliveryTaskOptions = TaskOptions & {\n legacyFormatConverter?: LegacyFormatConverter;\n /** Pre-resolved exact-owner publisher/community catalogs, highest precedence first. */\n projectionCatalogs?: readonly ProjectionCatalogSnapshot[];\n /** Resolver for persisted canonical selections that need a seller-specific legacy wire identity. */\n canonicalFormatLegacyResolver?: CanonicalFormatLegacyResolver;\n};\n\nexport type CanonicalReadTaskOptions = TaskOptions & {\n legacyFormatConverter?: LegacyFormatConverter;\n /** Pre-resolved exact-owner publisher/community catalogs, highest precedence first. */\n projectionCatalogs?: readonly ProjectionCatalogSnapshot[];\n};\n\nexport type SyncCreativesTaskOptions = CreativeDeliveryTaskOptions & {\n creativeFormatProjection?: SyncCreativeFormatProjection;\n};\n\nfunction snapshotTaskOptions<T extends TaskOptions | undefined>(options: T): T {\n if (!options) return options;\n return {\n ...options,\n ...(options.transport !== undefined && { transport: { ...options.transport } }),\n ...(options.metadata !== undefined && { metadata: structuredClone(options.metadata) }),\n } as T;\n}\n\nconst PRIMARY_ADCP_TASK_NAMES = {\n get_products: true,\n list_products: true,\n request_proposals: true,\n refine_proposals: true,\n decline_proposals: true,\n buy_products: true,\n accept_proposal: true,\n control_media_buy: true,\n create_media_buy: true,\n update_media_buy: true,\n sync_creatives: true,\n list_creatives: true,\n get_media_buys: true,\n get_media_buy_delivery: true,\n get_creative_delivery: true,\n provide_performance_feedback: true,\n get_signals: true,\n activate_signal: true,\n get_adcp_capabilities: true,\n list_accounts: true,\n sync_accounts: true,\n sync_audiences: true,\n create_property_list: true,\n get_property_list: true,\n update_property_list: true,\n list_property_lists: true,\n delete_property_list: true,\n si_get_offering: true,\n si_initiate_session: true,\n si_send_message: true,\n si_terminate_session: true,\n get_brand_identity: true,\n sync_plans: true,\n check_governance: true,\n report_plan_outcome: true,\n report_plan_adjustment: true,\n get_plan_audit_logs: true,\n sync_agent_notification_configs: true,\n context_match: true,\n identity_match: true,\n} satisfies Record<AdcpTaskName, true>;\n\nconst STANDARD_ADCP_TASK_NAMES = new Set<string>([\n ...Object.keys(PRIMARY_ADCP_TASK_NAMES),\n 'list_creative_formats',\n 'list_transformers',\n 'preview_creative',\n 'build_creative',\n // These standard protocol tools still carry legacy creative `format_id`\n // identity through artifacts, manifests, standards, or rights constraints.\n // They are available only through explicitly named *Legacy APIs until a\n // lossless canonical projection exists.\n 'list_content_standards',\n 'get_content_standards',\n 'create_content_standards',\n 'update_content_standards',\n 'calibrate_content',\n 'validate_content_delivery',\n 'get_media_buy_artifacts',\n 'get_creative_features',\n 'get_rights',\n 'acquire_rights',\n 'update_rights',\n]);\n\n/**\n * Error class for v3 feature compatibility issues\n *\n * Note: The library no longer throws this error for get_products calls with\n * unsupported v3 features. Instead, it returns an empty result (semantically\n * \"no products match this filter\"). This error class is exported for use in\n * custom validation logic or other scenarios.\n *\n * @example\n * ```typescript\n * // Custom validation before making requests\n * const capabilities = await client.getCapabilities();\n * if (params.property_list && !capabilities.features.propertyListFiltering) {\n * throw new UnsupportedFeatureError('property_list', capabilities.version);\n * }\n * ```\n */\nexport class UnsupportedFeatureError extends Error {\n constructor(\n public readonly feature: string,\n public readonly serverVersion: 'v2' | 'v3',\n message?: string\n ) {\n super(message || `Feature '${feature}' requires AdCP v3 but server is ${serverVersion}`);\n this.name = 'UnsupportedFeatureError';\n }\n}\n\n/** AgentConfig with internal flags for lazy discovery */\ntype InternalAgentConfig = AgentConfig & {\n _needsDiscovery?: boolean;\n _needsCanonicalUrl?: boolean;\n};\n\ntype NormalizedWebhookPayload = {\n operation_id: string;\n task_id: string;\n task_type: string;\n status: TaskStatus;\n context_id?: string;\n result?: AdCPAsyncResponseData;\n message?: string;\n timestamp?: string;\n idempotency_key?: string;\n notification_id?: string;\n protocol?: 'mcp' | 'a2a';\n};\n\nexport interface ClientProductPropertyPolicy extends BuyerPropertyPolicy {\n /**\n * Enforcement mode for completed `get_products` responses.\n *\n * - `filter` (default): remove rejected products before handlers/callers see them\n * - `reject_response`: fail the task when any product violates the policy\n * - `audit`: keep products but attach diagnostics\n */\n mode?: ProductPropertyPolicyMode;\n /**\n * When true, a `get_products` request carrying `property_list` is resolved\n * and used as an allow-list for the returned products. Defaults to true.\n */\n enforceRequestPropertyList?: boolean;\n /**\n * Resolver options for request-derived property-list validation. The default\n * uses the SDK's process-local resolved-list cache.\n */\n propertyListResolveOptions?: ResolveListOptions;\n /**\n * Message surfaced in debug logs and failed results when the policy rejects\n * products.\n *\n * @default 'Property list not adhered to'\n */\n message?: string;\n}\n\nexport type WebhookParseErrorCode =\n | WebhookSignatureErrorCode\n | 'webhook_signature_invalid'\n | 'webhook_timestamp_invalid'\n | 'webhook_unsupported_payload'\n | 'webhook_envelope_invalid'\n | 'webhook_result_invalid'\n /**\n * The receiver has no trusted registration or legacy HMAC configuration, so\n * no authentication check can be selected safely.\n */\n | 'webhook_unverifiable'\n | 'webhook_registration_not_found'\n | 'webhook_registration_mismatch'\n | 'webhook_verification_context_missing'\n | 'webhook_registration_store_unavailable'\n | 'webhook_durable_settlement_unavailable'\n | 'webhook_publication_in_progress'\n | 'webhook_idempotency_conflict'\n | 'webhook_verification_unavailable';\n\nexport interface WebhookVerificationConfig {\n /** Deterministic/custom key source. Defaults to resolveAgent brand.json discovery. */\n jwks?: JwksResolver;\n /** Shared nonce replay store. Defaults to one process-local store per client. */\n replayStore?: ReplayStore;\n /** Key revocation source. Defaults to one process-local store per client. */\n revocationStore?: RevocationStore;\n /** Clock in epoch seconds. */\n now?: () => number;\n /** Safe discovery/cache tuning for the default seller-pinned JWK resolver. */\n resolverOptions?: Omit<ResolvedAgentJwksResolverOptions, 'fetchCapabilities'>;\n /**\n * Fetch capabilities for seller key discovery. The callback must authenticate\n * only to the supplied, already-pinned seller URL and protocol.\n */\n fetchCapabilities?: (agentUrl: string, protocol: 'mcp' | 'a2a') => Promise<unknown>;\n}\n\nexport interface VerifyAndParseWebhookOptions {\n /** Raw HTTP body bytes captured before JSON parsing. Required when `webhookSecret` is configured. */\n rawBody?: string | Buffer | Uint8Array;\n /** Parsed payload or raw body. When HMAC is configured, verified raw bytes are parsed instead of `payload`. */\n body?: string | Buffer | Uint8Array | unknown;\n /** Parsed protocol payload. */\n payload?: unknown;\n /** Header bag from the receiver framework. Used for HMAC verification when configured. */\n headers?: WebhookHeadersLike;\n /** Task type from trusted routing context. Used as an A2A fallback. */\n taskType?: string;\n /** Operation id from trusted routing context. Used as an A2A fallback. */\n operationId?: string;\n /** Actual HTTP method from trusted server context. Required for RFC 9421. */\n requestMethod?: string;\n /** Externally visible absolute request URL from trusted server/proxy configuration. Required for RFC 9421. */\n requestUrl?: string;\n /** Explicit legacy HMAC signature header value. */\n signature?: WebhookHeaderValue;\n /** Explicit legacy HMAC timestamp header value. */\n timestamp?: WebhookHeaderValue;\n}\n\nexport interface WebhookHandlerRequest {\n headers: Record<string, WebhookHeaderValue>;\n body: unknown;\n rawBody?: string | Buffer | Uint8Array;\n params?: Record<string, string>;\n method?: string;\n /** Trusted externally visible absolute URL supplied by the application. */\n publicUrl?: string;\n}\n\nexport interface WebhookHandlerAdapter {\n getOperationId?: (request: WebhookHandlerRequest) => string | undefined | Promise<string | undefined>;\n getTaskType?: (request: WebhookHandlerRequest) => string | undefined | Promise<string | undefined>;\n getRequestMethod?: (request: WebhookHandlerRequest) => string | undefined | Promise<string | undefined>;\n /** Must return a trusted externally visible URL; never derive it from untrusted forwarding headers. */\n getRequestUrl?: (request: WebhookHandlerRequest) => string | undefined | Promise<string | undefined>;\n}\n\nexport type WebhookParseResult = WebhookParseSuccess | WebhookParseFailure;\n\nexport interface WebhookParseSuccess {\n ok: true;\n protocol: 'mcp' | 'a2a';\n envelope: MCPWebhookPayload | A2ATask | TaskStatusUpdateEvent;\n result: unknown;\n metadata: {\n taskId: string;\n taskType: string;\n operationId: string;\n contextId?: string;\n idempotencyKey?: string;\n notificationId?: string;\n status: TaskStatus;\n timestamp?: string;\n message?: string;\n previewHandler?: 'canonical' | 'legacy';\n requiresDurableSettlement?: boolean;\n };\n}\n\nexport interface WebhookParseFailure {\n ok: false;\n code: WebhookParseErrorCode;\n message: string;\n cause?: unknown;\n}\n\nexport class WebhookDispatchError extends Error {\n readonly code: WebhookParseErrorCode;\n readonly cause?: unknown;\n\n constructor(code: WebhookParseErrorCode, message: string, cause?: unknown) {\n super(message);\n this.name = 'WebhookDispatchError';\n this.code = code;\n this.cause = cause;\n }\n}\n\nconst WEBHOOK_TASK_STATUSES = new Set<string>([\n 'submitted',\n 'working',\n 'input-required',\n 'completed',\n 'canceled',\n 'failed',\n 'rejected',\n 'auth-required',\n 'unknown',\n]);\nconst DURABLE_SETTLEMENT_TERMINAL_STATUSES = new Set<import('./ConversationTypes').TaskStatus>([\n 'completed',\n 'failed',\n 'rejected',\n 'canceled',\n 'governance-denied',\n 'aborted',\n]);\n\n// Top-level fields that every MCP webhook envelope must carry, regardless of\n// negotiated AdCP version. `operation_id` is intentionally NOT here: it became\n// a required webhook field in AdCP 3.1, but 3.0 senders are spec-compliant\n// without it. The receiver can't reliably know the sender's negotiated version\n// from the POST body alone, so requiring `operation_id` here broke 3.0\n// interop. When absent we fall back to the routing-context operationId (see\n// normalizeWebhookPayload), so its omission is non-fatal for dispatch.\nconst MCP_WEBHOOK_REQUIRED_FIELDS = ['idempotency_key', 'task_id', 'task_type', 'status', 'timestamp'] as const;\n\n/**\n * Configuration for SingleAgentClient (and multi-agent client)\n */\nexport interface SingleAgentClientConfig extends ConversationConfig {\n /** Durable storage for restart-safe A2A human continuations. */\n deferredStorage?: DeferredTaskStorage;\n /** Resolve current trusted agent configuration for a persisted continuation. */\n resolveDeferredAgent?: (agentId: string) => AgentConfig | undefined | Promise<AgentConfig | undefined>;\n /** Lifetime of a persisted continuation token in seconds. Defaults to seven days. */\n deferredTaskTtlSeconds?: number;\n /** Converter for seller-specific legacy creative formats at canonical read, write, and webhook boundaries. */\n legacyFormatConverter?: LegacyFormatConverter;\n /** Pre-resolved exact-owner publisher/community catalogs used at every projection boundary. */\n projectionCatalogs?: readonly ProjectionCatalogSnapshot[];\n /** Resolver for persisted canonical selections when a negotiated legacy wire is required. */\n canonicalFormatLegacyResolver?: CanonicalFormatLegacyResolver;\n /**\n * AdCP protocol version this client speaks to agents. Defaults to\n * {@link ADCP_VERSION} — the GA version the SDK ships against. Override\n * to pin to an older stable (e.g., `'3.0.0'`) or opt into a beta channel\n * (`'3.1.0-beta.1'`) once that registry ships.\n *\n * Stage 2 plumbs the option through and validates it at construction\n * time; cross-major pins (e.g. `'4.0.0-beta.1'` while the SDK ships\n * against major 3) throw `ConfigurationError`. Stage 3 wires per-instance\n * schema/validator selection off this field.\n *\n * Typed as `AdcpVersion | (string & {})` so editors autocomplete\n * canonical values from {@link COMPATIBLE_ADCP_VERSIONS} while still\n * accepting forward-compatible strings.\n */\n adcpVersion?: AdcpVersion | (string & {});\n /**\n * Optional wire-only AdCP version envelope override. Request/response\n * validation still uses `adcpVersion`; protocol envelopes use this value.\n */\n wireAdcpVersion?: AdcpVersion | (string & {});\n /**\n * Controls emission of AdCP version envelope fields. Defaults to `auto`.\n * `none` is primarily for conformance harnesses that need to send a\n * request exactly as authored, without SDK-managed version fields.\n */\n versionEnvelope?: import('../protocols').VersionEnvelopeMode;\n /** Enable debug logging */\n debug?: boolean;\n /** Custom User-Agent header sent with all outbound protocol requests.\n * Overridden by per-agent `headers['User-Agent']` if set. */\n userAgent?: string;\n /** Additional headers to include in requests */\n headers?: Record<string, string>;\n /** Activity callback for observability (logging, UI updates, etc) */\n onActivity?: (activity: Activity) => void | Promise<void>;\n /**\n * Transport-level diagnostics callback for outbound HTTP requests.\n *\n * Receives sanitized request/response/failure events from the SDK's\n * protocol fetch layer. Header maps are allowlisted/redacted and URLs have\n * credentials, query strings, and fragments stripped before emission.\n */\n onTransportActivity?: import('../protocols').TransportActivityHandler;\n /**\n * Task completion handlers — called for both sync responses and webhook\n * completions.\n *\n * For at-least-once webhook delivery, set `handlers.webhookDedup` to\n * drop duplicate retries by `idempotency_key`. See\n * `docs/guides/PUSH-NOTIFICATION-CONFIG.md#deduplication`.\n */\n handlers?: AsyncHandlerConfig;\n /** Select legacy HMAC-SHA256 push verification. Omit to use RFC 9421. */\n webhookSecret?: string;\n /** Durable provenance for outbound push registrations. Defaults to process-local memory. */\n webhookRegistrationStore?: WebhookRegistrationStore;\n /** Registration retention in seconds. Defaults to seven days. */\n webhookRegistrationTtlSeconds?: number;\n /** RFC 9421 key, replay, revocation, and discovery configuration. */\n webhookVerification?: WebhookVerificationConfig;\n /**\n * Accept inbound webhooks that carry no verifiable authenticity at all.\n *\n * This bypass applies only when no trusted push registration exists and no\n * HMAC secret is configured. It never bypasses a failed RFC 9421 or HMAC\n * verification for a known registration.\n *\n * Set this only when the receiver is genuinely unreachable from outside your\n * network (in-process test harnesses, a route bound to loopback). It is not a\n * substitute for a secret on any route an agent can reach over the internet.\n *\n * @default false\n */\n allowUnauthenticatedWebhooks?: boolean;\n /**\n * Webhook URL template with macro substitution\n *\n * Available macros:\n * - {agent_id} - Agent ID\n * - {task_type} - Task type (e.g., sync_creatives, media_buy_delivery)\n * - {operation_id} - Operation ID\n *\n * @example\n * Path-based: \"https://myapp.com/webhook/{task_type}/{agent_id}/{operation_id}\"\n * Query string: \"https://myapp.com/webhook?agent={agent_id}&op={operation_id}&type={task_type}\"\n * Custom: \"https://myapp.com/api/v1/adcp/{agent_id}?operation={operation_id}\"\n */\n webhookUrlTemplate?: WebhookUrlTemplate;\n /**\n * Reporting webhook frequency\n *\n * @default 'daily'\n */\n reportingWebhookFrequency?: 'hourly' | 'daily' | 'monthly';\n /**\n * Validate that the seller supports required features before each task call.\n * When true, tasks like syncAudiences will fail fast with FeatureUnsupportedError\n * if the seller hasn't declared audience_targeting support.\n *\n * @default true\n */\n validateFeatures?: boolean;\n /**\n * Gate mutating-task dispatch on the seller's declared major version.\n * When the seller returns an authoritative `get_adcp_capabilities`\n * response, the guard requires:\n * 1. `major_versions` includes 3\n * 2. `adcp.idempotency.replay_ttl_seconds` is declared (spec-required)\n *\n * Sellers whose capabilities are synthesized from `tools/list` (no\n * authoritative `get_adcp_capabilities` response) route through the\n * v2 adapter with a one-time warning — a compliant v3 seller would\n * declare itself, so absence of a declaration is read as v2. Adopters\n * who need a hard \"definitely-v3\" gate should validate\n * `(await client.getCapabilities())._synthetic === false` directly.\n *\n * Throws `VersionUnsupportedError` before the request is sent when\n * the guard rejects. Bypass with `allowV2` or — process-wide as a\n * fallback — `ADCP_ALLOW_V2=1`.\n *\n * @default false\n */\n requireV3ForMutations?: boolean;\n /**\n * Per-client bypass for the v3 guard. When `true`, the guard is off\n * regardless of the `ADCP_ALLOW_V2` env var. When `undefined`, the env\n * var is consulted as a fallback. Set explicitly in multi-tenant\n * deployments so one tenant's override can't silently disable safety\n * for another.\n */\n allowV2?: boolean;\n /**\n * Runtime schema validation options\n */\n validation?: {\n /**\n * Validate outgoing requests against the bundled AdCP JSON schema before\n * dispatch. Catches field-name drift at call-time instead of at\n * storyboard-time.\n *\n * - `strict`: throw `ValidationError` with a JSON Pointer to the bad field\n * - `warn`: log to debug logs and continue\n * - `off`: skip the validator entirely (no overhead)\n *\n * @default `strict` in dev/test, `warn` in production\n */\n requests?: import('../validation/client-hooks').ValidationMode;\n /**\n * Validate incoming responses against the bundled AdCP JSON schema.\n *\n * - `strict`: fail the task with `VALIDATION_ERROR`\n * - `warn`: log to debug logs and surface the task as successful\n * - `off`: skip the validator entirely\n *\n * Overrides `strictSchemaValidation` when set.\n *\n * @default `strict` in dev/test, `warn` in production\n */\n responses?: import('../validation/client-hooks').ValidationMode;\n /**\n * Legacy: fail tasks when response schema validation fails (default: true).\n * Superseded by `responses` above — retained for backward compat.\n * `false` maps to `responses: 'warn'` when `responses` isn't set.\n *\n * @default true\n */\n strictSchemaValidation?: boolean;\n /**\n * Emit schema validation violations to debug logs and the console (default: true).\n * Set false when violations are surfaced through another structured channel.\n *\n * @default true\n */\n logSchemaViolations?: boolean;\n /**\n * Filter out invalid products from get_products responses instead of rejecting the entire response (default: false)\n *\n * When true: Each product in a get_products response is validated individually.\n * Valid products are kept, invalid products are dropped, and the response is\n * returned as long as it passes full schema validation after filtering.\n * When false: The entire response is rejected if any product fails validation.\n *\n * Only applies to get_products — all other tool responses use standard validation.\n *\n * @default false\n */\n filterInvalidProducts?: boolean;\n /**\n * Reject products that arrive without a usable `pricing_options[]` array\n * from completed `get_products` responses (default: true).\n *\n * `pricing_options` is a required, non-empty field in AdCP 3.1 — a product\n * that advertises no pricing model is non-transactable, so the SDK drops it\n * from the product list before callers and completion handlers see it. This\n * runs on every completion path (sync, polling, `track`, webhook) and is\n * independent of the response `validation` mode, so unpriced products are\n * removed even under `responses: 'warn' | 'off'`. The rejection is recorded\n * in `result.metadata.productPricingPolicy` and a\n * `product_missing_pricing_options` debug-log notice.\n *\n * Set to `false` to pass products through untouched (e.g. when the caller\n * deliberately inspects malformed seller responses).\n *\n * @default true\n */\n rejectProductsWithoutPricingOptions?: boolean;\n /**\n * Buyer-side property policy applied to completed `get_products`\n * responses before completion handlers and callers receive the product\n * list. A request-level `property_list` is enforced automatically by\n * default; set this to `false` only when the caller deliberately wants to\n * trust seller-side filtering without SDK verification.\n *\n * Use this for brand/block-list rules such as excluding `ladbible.com`;\n * domain matching normalizes `www.` aliases, so `www.ladbible.com`\n * violates an exclusion for `ladbible.com`.\n */\n productPropertyPolicy?: ClientProductPropertyPolicy | false;\n };\n /** Governance configuration for buyer-side campaign governance */\n governance?: import('./GovernanceTypes').GovernanceConfig;\n /**\n * Transport-level safeguards. Applies to every call this client dispatches\n * unless overridden at call time.\n *\n * Set `maxResponseBytes` when crawling untrusted agents (registries,\n * federated discovery layers) to prevent a hostile vendor from buffering\n * a large reply before any application-layer schema validation runs. Set\n * `requestTimeoutMs` to override the default 60s cap on A2A agent-card\n * discovery; use `0` to disable the SDK-imposed discovery timeout.\n */\n transport?: import('../protocols').TransportOptions;\n}\n\n/**\n * Internal single-agent client implementation\n *\n * This is an internal implementation detail used by AgentClient and ADCPMultiAgentClient.\n * External users should use AdCPClient (alias for ADCPMultiAgentClient) instead.\n *\n * Key features:\n * - 🔒 Full type safety for all ADCP tasks\n * - 💬 Conversation management with context preservation\n * - 🔄 Input handler pattern for clarifications\n * - ⏱️ Timeout and retry support\n * - 🐛 Debug logging and observability\n * - 🎯 Works with both MCP and A2A protocols\n */\n/**\n * Does a JS runtime value's type plausibly match a JSON Schema's declared\n * shape? Used by the v2 adapter aliasing path to avoid moving a string\n * into a slot the agent's tool schema declared as an object (e.g.,\n * Wonderstruck's `brand: BrandReference` slot vs our adapter's\n * `brand_manifest: 'https://...'` URL string).\n *\n * Recurses into `anyOf` / `oneOf`: the move is safe iff at least one\n * variant accepts the value's runtime type. `$ref` we can't introspect\n * locally — return true and let the seller's own validation catch.\n *\n * The empty schema `{}` is treated as \"doesn't accept this type\" so\n * Pydantic-generated tool schemas with `anyOf: [{}, {type: null}]` —\n * which technically allow anything but in practice mask a stricter\n * Pydantic union — don't pull the buyer into the broken alias.\n */\nfunction valueMatchesSchemaType(value: unknown, propSchema: unknown): boolean {\n if (!propSchema || typeof propSchema !== 'object') return false;\n const schema = propSchema as { type?: unknown; oneOf?: unknown; anyOf?: unknown; $ref?: unknown };\n if (schema.$ref) return true;\n\n const valueType: string = Array.isArray(value)\n ? 'array'\n : value === null\n ? 'null'\n : typeof value === 'object'\n ? 'object'\n : typeof value;\n\n // anyOf / oneOf: any variant matching = safe.\n for (const key of ['anyOf', 'oneOf'] as const) {\n const variants = (schema as { [k: string]: unknown })[key];\n if (Array.isArray(variants)) {\n return variants.some(v => valueMatchesSchemaType(value, v));\n }\n }\n\n const declared = schema.type;\n if (declared === undefined) return false;\n if (typeof declared === 'string') return declared === valueType;\n if (Array.isArray(declared)) return declared.includes(valueType);\n return false;\n}\n\nfunction productHasPricingOptions(product: unknown): boolean {\n if (!product || typeof product !== 'object') return false;\n const options = (product as { pricing_options?: unknown }).pricing_options;\n return Array.isArray(options) && options.length > 0;\n}\n\nfunction productIdForPricingDiagnostics(product: unknown): string | undefined {\n if (!product || typeof product !== 'object') return undefined;\n const id = (product as { product_id?: unknown }).product_id;\n return typeof id === 'string' ? id : undefined;\n}\n\nfunction propertyListReferenceFromRequest(params: Record<string, unknown>): PropertyListReference | undefined {\n const value = params.property_list;\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const ref = value as Partial<PropertyListReference>;\n if (typeof ref.agent_url !== 'string' || typeof ref.list_id !== 'string') return undefined;\n return {\n agent_url: ref.agent_url,\n list_id: ref.list_id,\n ...(typeof ref.auth_token === 'string' ? { auth_token: ref.auth_token } : {}),\n };\n}\n\nfunction productPolicyRequestSnapshot(requestParams: Record<string, unknown>): Readonly<Record<string, unknown>> {\n const account = canonicalAccountRoutingSnapshot(requestParams.account);\n const propertyList = propertyListReferenceFromRequest(requestParams);\n return Object.freeze({\n ...(account ? { account } : {}),\n ...(propertyList ? { property_list: Object.freeze(propertyList) } : {}),\n });\n}\n\nfunction hasProductPropertyPolicyRules(policy: BuyerPropertyPolicy): boolean {\n return Boolean(\n policy.allowedDomains?.length ||\n policy.allowedPropertyIdentifiers?.length ||\n policy.requireAllowedPropertyMatch ||\n policy.excludedDomains?.length ||\n policy.excludedPropertyIds?.length ||\n policy.strict ||\n policy.unknownSelectorBehavior ||\n policy.missingPublisherPropertiesBehavior\n );\n}\n\nfunction comparablePropertyIdentifiers(\n identifiers: readonly { type: string; value: string }[]\n): Array<{ type: string; value: string }> {\n return identifiers\n .filter(identifier => identifier.type === 'domain' || identifier.type === 'subdomain')\n .map(identifier => ({ type: identifier.type, value: identifier.value }));\n}\n\nfunction unsupportedPropertyIdentifiers(\n identifiers: readonly { type: string; value: string }[]\n): Array<{ type: string }> {\n return identifiers\n .filter(identifier => identifier.type !== 'domain' && identifier.type !== 'subdomain')\n .map(identifier => ({ type: identifier.type }));\n}\n\nfunction sanitizeDiagnosticUrl(value: string): string {\n try {\n const url = new URL(value);\n url.username = '';\n url.password = '';\n url.search = '';\n url.hash = '';\n return url.toString();\n } catch {\n return 'invalid_url';\n }\n}\n\nfunction propertyListResolutionErrorCode(err: unknown): string {\n const message = err instanceof Error ? err.message : '';\n if (/^property_list_[a-z_]+$/.test(message)) return message;\n if (/^list_agent_url_[a-z_]+$/.test(message)) return message;\n return 'property_list_resolution_failed';\n}\n\nexport class SingleAgentClient {\n private executor: TaskExecutor;\n private asyncHandler?: AsyncHandler;\n private normalizedAgent: InternalAgentConfig;\n private discoveredEndpoint?: string; // Cache discovered MCP endpoint\n private discoveredAgent?: AgentConfig; // Stable post-discovery config for protocol/provider caches\n private discoveredMcpEra?: 'legacy' | 'modern';\n private discoveredMcpEraAt = 0;\n private canonicalBaseUrl?: string; // Cache canonical base URL (from agent card or stripped /mcp)\n private cachedCapabilities?: AdcpCapabilities; // Cache detected server capabilities\n private cachedToolSchemas?: Map<string, Record<string, unknown>>; // inputSchema.properties per tool name\n private _v2WarningFired = false; // Gate: emit the v2-sunset warning once per client instance\n private _syntheticV3WarningFired = false; // Gate: emit the synthetic-v3 warning once per client instance\n private _syntheticV2WarningFired = false; // Gate: emit the synthetic-v2 warning once per client instance\n private readonly productPolicyRequestParamsByTask = new Map<string, ProductPolicyRequestState>();\n private readonly canonicalCreativeTaskAssociations = new Map<string, CanonicalCreativeTaskAssociation>();\n private readonly previewCreativeHandlersByTask = new Map<string, 'canonical' | 'legacy'>();\n private readonly canonicalLegacyRoutes = new Map<string, CanonicalLegacyRoute>();\n private readonly resolvedAdcpVersion: string;\n private readonly webhookRegistrationStore: WebhookRegistrationStore;\n private readonly webhookReplayStore: ReplayStore;\n private readonly webhookRevocationStore: RevocationStore;\n private readonly webhookJwksResolvers = new Map<string, JwksResolver>();\n private readonly durableSettlementRecoverers = new Set<\n (\n operationId: string,\n observation: ExternalTaskSettlementObservation\n ) => Promise<ExternalTaskStatusResult | undefined>\n >();\n private readonly durableDeferredResumeAuthorizers = new Set<\n (operationId: string, token: string) => boolean | undefined | Promise<boolean | undefined>\n >();\n private readonly durableDeferredOperationRecoveryAuthorizers = new Set<\n (\n operationId: string,\n recoveryKey: string,\n purpose: 'pause-recovery' | 'callback-checkpoint'\n ) => boolean | undefined | Promise<boolean | undefined>\n >();\n private readonly durableDeferredResumeTokenReplacers = new Set<\n (\n operationId: string,\n currentToken: string,\n replacementToken: string\n ) => boolean | undefined | Promise<boolean | undefined>\n >();\n\n constructor(\n private agent: AgentConfig,\n private config: SingleAgentClientConfig = {}\n ) {\n // Own the nested trust-boundary object at construction. Normalization\n // historically returns the input object unchanged for the preferred\n // `trustedFetchFn` spelling, so clone first while retaining function identity.\n const configuredTransport = config.transport === undefined ? undefined : { ...config.transport };\n this.config = { ...config, transport: normalizeTransportOptions(configuredTransport) };\n config = this.config;\n // Validate the configured adcpVersion at construction time. Throws\n // ConfigurationError if the pin's major differs from ADCP_MAJOR_VERSION\n // — cross-major support lands in Stage 3 of the multi-version refactor.\n this.resolvedAdcpVersion = resolveAdcpVersion(config.adcpVersion);\n this.webhookRegistrationStore = config.webhookRegistrationStore ?? new InMemoryWebhookRegistrationStore();\n this.webhookReplayStore = config.webhookVerification?.replayStore ?? new InMemoryReplayStore();\n this.webhookRevocationStore = config.webhookVerification?.revocationStore ?? new InMemoryRevocationStore();\n const registrationTtl = config.webhookRegistrationTtlSeconds ?? 7 * 24 * 60 * 60;\n if (!Number.isSafeInteger(registrationTtl) || registrationTtl < 1) {\n throw new ConfigurationError('webhookRegistrationTtlSeconds must be a positive safe integer.');\n }\n\n // Inject userAgent into agent headers so it flows through both MCP and A2A transports\n if (config.userAgent) {\n validateUserAgent(config.userAgent);\n this.agent = {\n ...this.agent,\n headers: { 'User-Agent': config.userAgent, ...this.agent.headers },\n };\n }\n\n // Normalize agent URL for MCP protocol\n this.normalizedAgent = this.normalizeAgentConfig(this.agent);\n\n this.executor = new TaskExecutor({\n workingTimeout: config.workingTimeout || 120000, // Max 120s for working status\n defaultMaxClarifications: config.defaultMaxClarifications || 3,\n enableConversationStorage: config.persistConversations !== false,\n deferredStorage: config.deferredStorage,\n resolveDeferredAgent:\n config.resolveDeferredAgent ??\n (async agentId => {\n if (agentId !== this.normalizedAgent.id) return undefined;\n return this.normalizedAgent.protocol === 'a2a'\n ? this.ensureCanonicalUrlResolved()\n : this.ensureEndpointDiscovered();\n }),\n deferredTaskTtlSeconds: config.deferredTaskTtlSeconds,\n canRecoverDeferredSettlement: () => this.durableSettlementRecoverers.size > 0,\n authorizeDeferredSettlementResume: async (operationId, token) => {\n for (const authorize of this.durableDeferredResumeAuthorizers) {\n if ((await authorize(operationId, token)) === true) return true;\n }\n return false;\n },\n authorizeDeferredSettlementOperationRecovery: async (operationId, recoveryKey, purpose) => {\n for (const authorize of this.durableDeferredOperationRecoveryAuthorizers) {\n if ((await authorize(operationId, recoveryKey, purpose)) === true) return true;\n }\n return false;\n },\n replaceDeferredSettlementResumeToken: async (operationId, currentToken, replacementToken) => {\n for (const replace of this.durableDeferredResumeTokenReplacers) {\n if ((await replace(operationId, currentToken, replacementToken)) === true) return true;\n }\n return false;\n },\n recoverDeferredSettlement: async (result, operationId, serverTaskId) => {\n const settlement = await this.wrapPersistedDeferredSettlement(result, operationId, serverTaskId);\n return {\n result: settlement.result,\n ...(settlement.afterDispatch !== undefined && { afterFinalize: settlement.afterDispatch }),\n };\n },\n webhookUrlTemplate: config.webhookUrlTemplate,\n agentId: agent.id,\n webhookSecret: config.webhookSecret,\n onWebhookRegistration: registration => this.persistWebhookRegistration(registration),\n onDurableSettlementRequired: operationId => this.markWebhookDurableSettlementRequired(operationId),\n externalTaskSettlementRetentionMs: registrationTtl * 1000,\n strictSchemaValidation: config.validation?.strictSchemaValidation !== false, // Default: true\n logSchemaViolations: config.validation?.logSchemaViolations !== false, // Default: true\n filterInvalidProducts: config.validation?.filterInvalidProducts === true, // Default: false\n validation: {\n ...(config.validation?.requests != null && { requests: config.validation.requests }),\n ...(config.validation?.responses != null && { responses: config.validation.responses }),\n },\n onActivity: config.onActivity ? activity => config.onActivity!(canonicalCreativeActivity(activity)) : undefined,\n onTransportActivity: config.onTransportActivity\n ? event => config.onTransportActivity!(canonicalCreativeTransportActivity(event))\n : undefined,\n governance: config.governance,\n adcpVersion: this.resolvedAdcpVersion,\n ...(config.wireAdcpVersion !== undefined && { wireAdcpVersion: config.wireAdcpVersion }),\n ...(config.versionEnvelope !== undefined && { versionEnvelope: config.versionEnvelope }),\n transport: config.transport,\n });\n\n // Create async handler if handlers are provided\n if (config.handlers) {\n this.asyncHandler = new AsyncHandler(config.handlers);\n }\n }\n\n private async persistWebhookRegistration(args: {\n agent: AgentConfig;\n taskType: string;\n operationId: string;\n callbackUrl: string;\n mode: WebhookRegistration['mode'];\n }): Promise<void> {\n const nowMs = this.config.webhookVerification?.now\n ? Math.floor(this.config.webhookVerification.now() * 1000)\n : Date.now();\n const ttlSeconds = this.config.webhookRegistrationTtlSeconds ?? 7 * 24 * 60 * 60;\n const activeCreativeExecution = canonicalCreativeExecutionStorage.getStore();\n const previewMode =\n args.taskType === 'preview_creative' && activeCreativeExecution?.taskType === args.taskType\n ? activeCreativeExecution.canonical\n ? 'canonical'\n : 'legacy'\n : undefined;\n // Keep an operation-scoped fallback before awaiting durable persistence.\n // This preserves preview callback identity for immediate HMAC callbacks and\n // for the legacy HMAC compatibility path when the registration store is\n // temporarily unavailable.\n if (previewMode) {\n this.rememberPreviewCreativeHandlerKey(args.operationId, previewMode);\n if (previewMode === 'canonical') {\n this.rememberCanonicalCreativeTaskAssociation(args.operationId, args.taskType);\n } else {\n this.canonicalCreativeTaskAssociations.delete(args.operationId);\n }\n }\n const persistedAgentUrl = new URL(args.agent.agent_uri);\n persistedAgentUrl.username = '';\n persistedAgentUrl.password = '';\n persistedAgentUrl.hash = '';\n try {\n await this.webhookRegistrationStore.putIfAbsent({\n agentId: args.agent.id,\n agentUrl: persistedAgentUrl.toString(),\n protocol: args.agent.protocol,\n operationId: args.operationId,\n taskType: args.taskType,\n callbackUrl: args.callbackUrl,\n method: 'POST',\n mode: args.mode,\n ...(previewMode && { previewMode }),\n createdAt: nowMs,\n expiresAt: nowMs + ttlSeconds * 1000,\n });\n } catch (cause) {\n // RFC 9421 has no safe fallback without seller-pinned provenance. Legacy\n // HMAC remains verifiable from the configured global secret only for the\n // explicit recordless read-only allowlist. Mutation and unknown-task\n // receivers require registration provenance, so dispatch must fail too.\n if (args.mode === 'rfc9421' || !RECORDLESS_HMAC_READ_ONLY_TASKS.has(args.taskType)) {\n const error = new ConfigurationError('Could not persist trusted webhook registration for this operation.');\n Object.defineProperty(error, 'cause', { value: cause, configurable: true });\n throw error;\n }\n }\n }\n\n private async markWebhookDurableSettlementRequired(operationId: string): Promise<void> {\n const mark = this.webhookRegistrationStore.markRequiresDurableSettlement;\n if (!mark) {\n throw new ConfigurationError(\n 'A custom webhookRegistrationStore must implement markRequiresDurableSettlement for durable mutation callbacks.'\n );\n }\n await mark.call(this.webhookRegistrationStore, this.agent.id, operationId);\n }\n\n private webhookJwksFor(registration: Readonly<WebhookRegistration>): JwksResolver {\n const configured = this.config.webhookVerification?.jwks;\n if (configured) return configured;\n const key = `${registration.protocol}\\x00${registration.agentUrl}`;\n const existing = this.webhookJwksResolvers.get(key);\n if (existing) return existing;\n\n const resolver = new ResolvedAgentJwksResolver(registration.agentUrl, registration.protocol, {\n ...this.config.webhookVerification?.resolverOptions,\n fetchCapabilities: agentUrl => {\n const configuredFetch = this.config.webhookVerification?.fetchCapabilities;\n if (configuredFetch) return configuredFetch(agentUrl, registration.protocol);\n return ProtocolClient.callTool(\n {\n id: registration.agentId,\n name: registration.agentId,\n agent_uri: agentUrl,\n protocol: registration.protocol,\n },\n 'get_adcp_capabilities',\n {},\n {\n adcpVersion: this.resolvedAdcpVersion,\n ...(this.config.wireAdcpVersion !== undefined && { wireAdcpVersion: this.config.wireAdcpVersion }),\n ...(this.config.versionEnvelope !== undefined && { versionEnvelope: this.config.versionEnvelope }),\n transport: {\n ...this.config.transport,\n requestTimeoutMs:\n this.config.transport?.requestTimeoutMs ??\n this.config.webhookVerification?.resolverOptions?.timeoutMs ??\n 10_000,\n },\n }\n );\n },\n });\n this.webhookJwksResolvers.set(key, resolver);\n return resolver;\n }\n\n private resolveLegacyFormatConverter(\n override?: LegacyFormatConverter,\n projectionCatalogs: readonly ProjectionCatalogSnapshot[] | undefined = this.config.projectionCatalogs\n ): LegacyFormatConverter | undefined {\n return legacyFormatConverterFromCatalogSnapshots(projectionCatalogs, override ?? this.config.legacyFormatConverter);\n }\n\n /** Use an already-composed per-call converter without reapplying configured catalog precedence. */\n private finalLegacyFormatConverter(composed?: LegacyFormatConverter): LegacyFormatConverter | undefined {\n return composed ?? this.resolveLegacyFormatConverter();\n }\n\n private assertDurableProjectionOverrideSupported(override: LegacyFormatConverter | undefined): void {\n if (!override || !this.config.deferredStorage) return;\n throw new TypeError(\n 'Per-call legacyFormatConverter functions cannot be used with durable deferredStorage because functions ' +\n 'cannot be persisted for restart recovery. Configure legacyFormatConverter on the client, or pass ' +\n 'serializable projectionCatalogs for this call.'\n );\n }\n\n private assertDurablePropertyListCredentialSupported(taskType: string, requestParams: Record<string, unknown>): void {\n if (!this.config.deferredStorage || taskType !== 'get_products') return;\n const propertyList = propertyListReferenceFromRequest(requestParams);\n if (!propertyList?.auth_token) return;\n const policyConfig = this.config.validation?.productPropertyPolicy;\n if (policyConfig === false || policyConfig?.enforceRequestPropertyList === false) return;\n throw new ConfigurationError(\n 'Durable deferred recovery cannot persist property_list.auth_token for buyer-side property-list ' +\n 'verification. Configure validation.productPropertyPolicy.enforceRequestPropertyList as false, ' +\n 'or use a client without deferredStorage for this request.'\n );\n }\n\n private canonicalAccountScope(account: unknown): string {\n if (account === undefined) return 'none';\n // Account-scoped route identity is the account id or the protocol's\n // natural key (brand + operator + sandbox). Per-call BrandReference\n // overrides are not identity and must not make a live request differ from\n // the minimal snapshot retained for an async completion.\n return canonicalizeJson(canonicalAccountRoutingSnapshot(account) ?? account);\n }\n\n private canonicalLegacyRouteKey(\n account: unknown,\n productId: string,\n ref:\n | { scope: 'product'; format_option_id: string }\n | {\n scope: 'publisher';\n publisher_domain: string;\n format_option_id: string;\n }\n ): string {\n return canonicalizeJson([\n this.canonicalAccountScope(account),\n productId,\n ref.scope,\n ref.scope === 'publisher' ? ref.publisher_domain.toLowerCase() : '',\n ref.format_option_id,\n ]);\n }\n\n private canonicalLegacyPackageRouteKey(account: unknown, packageId: string): string {\n return canonicalizeJson([this.canonicalAccountScope(account), 'package', packageId]);\n }\n\n private sameCanonicalOptionRef(left: CanonicalLegacyOptionRef, right: CanonicalLegacyOptionRef): boolean {\n return (\n left.scope === right.scope &&\n left.format_option_id === right.format_option_id &&\n (left.scope !== 'publisher' ||\n (right.scope === 'publisher' && left.publisher_domain.toLowerCase() === right.publisher_domain.toLowerCase()))\n );\n }\n\n private rememberCanonicalLegacyRoute(key: string, route: CanonicalLegacyRoute): void {\n this.canonicalLegacyRoutes.delete(key);\n this.canonicalLegacyRoutes.set(key, {\n ...route,\n refs: Object.freeze(route.refs.map(ref => Object.freeze({ ...ref }))),\n });\n while (this.canonicalLegacyRoutes.size > TASK_SCOPED_STATE_LIMIT) {\n const oldest = this.canonicalLegacyRoutes.keys().next().value;\n if (oldest === undefined) break;\n this.canonicalLegacyRoutes.delete(oldest);\n }\n }\n\n private invalidateCanonicalProductRoutes(products: readonly unknown[], account: unknown): void {\n const accountScope = this.canonicalAccountScope(account);\n const productIds = new Set<string>();\n for (const value of products) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) continue;\n const productId = (value as Record<string, unknown>).product_id;\n if (typeof productId === 'string') productIds.add(productId);\n }\n if (productIds.size === 0) return;\n for (const [key, route] of this.canonicalLegacyRoutes) {\n if (route.kind === 'product' && route.accountScope === accountScope && productIds.has(route.productId)) {\n this.canonicalLegacyRoutes.delete(key);\n }\n }\n }\n\n private rememberCanonicalProductRoutes(\n products: readonly unknown[],\n account: unknown,\n authoritativeProducts: readonly unknown[] = products\n ): void {\n this.invalidateCanonicalProductRoutes(authoritativeProducts, account);\n const accountScope = this.canonicalAccountScope(account);\n for (const value of products) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) continue;\n const product = value as Record<string, unknown>;\n if (typeof product.product_id !== 'string' || !Array.isArray(product.format_options)) continue;\n for (const optionValue of product.format_options) {\n if (!optionValue || typeof optionValue !== 'object' || Array.isArray(optionValue)) continue;\n const option = optionValue as Record<string, unknown>;\n if (typeof option.format_option_id !== 'string') continue;\n const ref =\n typeof option.publisher_domain === 'string'\n ? {\n scope: 'publisher' as const,\n publisher_domain: option.publisher_domain,\n format_option_id: option.format_option_id,\n }\n : { scope: 'product' as const, format_option_id: option.format_option_id };\n const refs = legacyFormatRefsForDeclaration(option);\n if (refs.length === 0) continue;\n this.rememberCanonicalLegacyRoute(this.canonicalLegacyRouteKey(account, product.product_id, ref), {\n kind: 'product',\n accountScope,\n productId: product.product_id,\n optionRef: ref,\n refs,\n });\n }\n }\n }\n\n private rememberCanonicalProductRoutesForCompletion(\n taskType: string,\n data: unknown,\n legacyFormatConverter: LegacyFormatConverter | undefined,\n account: unknown\n ): void {\n if (taskType !== 'get_products' || !data || typeof data !== 'object' || Array.isArray(data)) return;\n const authoritativeProducts = Array.isArray((data as { products?: unknown[] }).products)\n ? (data as { products: unknown[] }).products\n : [];\n const { response } = toCanonicalOnlyResponse(data as { products?: V1Product[] }, {\n legacyFormatConverter,\n });\n this.rememberCanonicalProductRoutes(\n response.products,\n account,\n authoritativeProducts.length > 0 ? authoritativeProducts : response.products\n );\n }\n\n private routeForOption(\n account: unknown,\n productId: string,\n optionRef: CanonicalLegacyOptionRef\n ): CanonicalLegacyRoute | undefined {\n const accountScope = this.canonicalAccountScope(account);\n const exactKey = this.canonicalLegacyRouteKey(account, productId, optionRef);\n const exact = this.canonicalLegacyRoutes.get(exactKey);\n if (exact) {\n this.canonicalLegacyRoutes.delete(exactKey);\n this.canonicalLegacyRoutes.set(exactKey, exact);\n return exact;\n }\n const candidates = [...this.canonicalLegacyRoutes.entries()].filter(\n ([, route]) =>\n route.kind === 'product' &&\n route.productId === productId &&\n this.sameCanonicalOptionRef(route.optionRef, optionRef)\n );\n // A scoped write may consume one uniquely known accountless discovery\n // route. The inverse is unsafe: absence of an account is not proof that a\n // sole tenant-scoped route belongs to this request.\n if (candidates.length !== 1) return undefined;\n const [key, candidate] = candidates[0]!;\n if (accountScope === 'none' || candidate.accountScope !== 'none') return undefined;\n this.canonicalLegacyRoutes.delete(key);\n this.canonicalLegacyRoutes.set(key, candidate);\n return candidate;\n }\n\n private routeForPackage(account: unknown, packageId: string): CanonicalLegacyRoute | undefined {\n const exactKey = this.canonicalLegacyPackageRouteKey(account, packageId);\n const exact = this.canonicalLegacyRoutes.get(exactKey);\n if (exact) {\n this.canonicalLegacyRoutes.delete(exactKey);\n this.canonicalLegacyRoutes.set(exactKey, exact);\n return exact;\n }\n // Package routes are tenant resources, never public discovery data. Cache\n // uniqueness is not tenant identity, so only the exact account key above\n // may resolve one.\n return undefined;\n }\n\n private packageIdsFromSelector(selector: Readonly<Record<string, unknown>>): string[] {\n const ids = new Set<string>();\n if (typeof selector.package_id === 'string') ids.add(selector.package_id);\n if (Array.isArray(selector.selector_containers)) {\n for (const value of selector.selector_containers) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) continue;\n for (const id of this.packageIdsFromSelector(value as Readonly<Record<string, unknown>>)) ids.add(id);\n }\n }\n return [...ids];\n }\n\n private cachedCanonicalLegacyRefs(\n context: CanonicalFormatLegacyResolutionContext,\n account: unknown\n ): readonly V1FormatId[] | undefined {\n const selector: Readonly<Record<string, unknown>> =\n context.source === 'product'\n ? (context.declaration as unknown as Readonly<Record<string, unknown>>)\n : context.source === 'creative'\n ? context.selector\n : context.selector;\n const productId =\n context.source === 'product'\n ? context.productId\n : typeof selector.product_id === 'string'\n ? selector.product_id\n : undefined;\n if (!productId) {\n const packageIds = this.packageIdsFromSelector(selector);\n if (packageIds.length === 0) return undefined;\n const routes = packageIds.map(packageId => this.routeForPackage(account, packageId));\n if (routes.some(route => route === undefined)) return undefined;\n const normalized = routes.map(route =>\n canonicalizeJson(\n route!.refs\n .map(ref => ({ ...ref }))\n .sort((left, right) => canonicalizeJson(left).localeCompare(canonicalizeJson(right)))\n )\n );\n if (!normalized.every(value => value === normalized[0])) return undefined;\n return routes[0]!.refs.map(value => ({ ...value }));\n }\n\n const rawRefs: unknown[] = [];\n if (context.source === 'product') rawRefs.push(context.declaration);\n if (context.source === 'creative' && context.creative.format_option_ref !== undefined) {\n rawRefs.push(context.creative.format_option_ref);\n } else if (Array.isArray(selector.format_option_refs)) {\n rawRefs.push(...selector.format_option_refs);\n }\n const optionRefs: Array<\n | { scope: 'product'; format_option_id: string }\n | { scope: 'publisher'; publisher_domain: string; format_option_id: string }\n > = [];\n for (const value of rawRefs) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) continue;\n const record = value as Record<string, unknown>;\n if (typeof record.format_option_id !== 'string') continue;\n if (record.scope === 'publisher' || typeof record.publisher_domain === 'string') {\n if (typeof record.publisher_domain !== 'string') continue;\n optionRefs.push({\n scope: 'publisher',\n publisher_domain: record.publisher_domain,\n format_option_id: record.format_option_id,\n });\n } else {\n optionRefs.push({ scope: 'product', format_option_id: record.format_option_id });\n }\n }\n if (optionRefs.length === 0) return undefined;\n\n const resolved: V1FormatId[] = [];\n for (const ref of optionRefs) {\n const route = this.routeForOption(account, productId, ref);\n if (!route) return undefined;\n resolved.push(...route.refs.map(value => ({ ...value })));\n }\n return resolved;\n }\n\n private rememberCanonicalPackageRoutes(response: unknown, request: unknown): void {\n if (!response || typeof response !== 'object' || Array.isArray(response)) return;\n const requestRecord =\n request && typeof request === 'object' && !Array.isArray(request)\n ? (request as Record<string, unknown>)\n : undefined;\n const account = requestRecord?.account;\n // A package_id alone is not a tenant identity. Without an account (or a\n // future media_buy_id-bound key) retaining this route could cross tenants.\n if (account === undefined) return;\n const accountScope = this.canonicalAccountScope(account);\n const requestPackages = ['packages', 'new_packages'].flatMap(key =>\n Array.isArray(requestRecord?.[key])\n ? requestRecord[key].filter((value): value is Record<string, unknown> =>\n Boolean(value && typeof value === 'object' && !Array.isArray(value))\n )\n : []\n );\n const responsePackages: Record<string, unknown>[] = [];\n const visit = (value: unknown, depth = 0): void => {\n if (depth > 8 || !value || typeof value !== 'object') return;\n if (Array.isArray(value)) {\n for (const item of value) visit(item, depth + 1);\n return;\n }\n const record = value as Record<string, unknown>;\n if (typeof record.package_id === 'string') responsePackages.push(record);\n for (const key of ['packages', 'affected_packages', 'media_buys']) {\n if (record[key] !== undefined) visit(record[key], depth + 1);\n }\n };\n visit(response);\n\n for (const pkg of responsePackages) {\n const packageId = pkg.package_id as string;\n let selector: Record<string, unknown> | undefined = pkg;\n let refs = this.cachedCanonicalLegacyRefs(\n { source: 'selector', selector, operation: 'package_route', field: packageId },\n account\n );\n if (!refs) {\n const byPackageId = requestPackages.filter(value => value.package_id === packageId);\n const productId = typeof pkg.product_id === 'string' ? pkg.product_id : undefined;\n const byProduct = productId ? requestPackages.filter(value => value.product_id === productId) : [];\n const matches = byPackageId.length === 1 ? byPackageId : byProduct.length === 1 ? byProduct : [];\n selector = matches[0];\n if (selector) {\n refs = this.cachedCanonicalLegacyRefs(\n { source: 'selector', selector, operation: 'package_route', field: packageId },\n account\n );\n }\n }\n if (!refs || refs.length === 0) continue;\n this.rememberCanonicalLegacyRoute(this.canonicalLegacyPackageRouteKey(account, packageId), {\n kind: 'package',\n accountScope,\n packageId,\n refs,\n });\n }\n }\n\n private rememberCanonicalPackageRoutesForTask(taskType: string, response: unknown, request: unknown): void {\n if (taskType === 'create_media_buy' || taskType === 'update_media_buy' || taskType === 'get_media_buys') {\n this.rememberCanonicalPackageRoutes(response, request);\n }\n }\n\n private resolveCanonicalFormatLegacyResolver(\n override: CanonicalFormatLegacyResolver | undefined,\n account: unknown\n ): CanonicalFormatLegacyResolver {\n const configured = this.config.canonicalFormatLegacyResolver;\n return context => override?.(context) ?? this.cachedCanonicalLegacyRefs(context, account) ?? configured?.(context);\n }\n\n /**\n * Returns the AdCP protocol version this client is configured to speak.\n *\n * Defaults to {@link ADCP_VERSION} (the GA version the SDK ships against)\n * unless overridden via `new SingleAgentClient(agent, { adcpVersion })`.\n *\n * Plumbing surface — Stage 2 of the multi-version refactor exposes the\n * configured value but does not yet vary validator/schema selection by\n * version. Wire-shape adapters key off this method in subsequent stages.\n */\n getAdcpVersion(): string {\n return this.resolvedAdcpVersion;\n }\n\n /** Poll through the same discovered/canonical protocol endpoint used for dispatch. @internal */\n async getTaskStatus(\n taskId: string,\n transport?: import('../protocols').TransportOptions,\n signal?: AbortSignal\n ): Promise<TaskInfo> {\n // Transport options define the outbound trust boundary. Own them before\n // endpoint discovery yields so caller mutation cannot change the fetch or\n // private-address policy between discovery and tasks/get.\n const transportSnapshot = transport === undefined ? undefined : { ...transport };\n const options = { transport: transportSnapshot, signal };\n const agent =\n this.normalizedAgent.protocol === 'a2a'\n ? await this.ensureCanonicalUrlResolved(options)\n : await this.ensureEndpointDiscovered(options);\n return this.executor.getTaskStatus(agent, taskId, transportSnapshot, signal);\n }\n\n /** Register durable restart/replica settlement recovery for an SDK coordinator. @internal */\n registerDurableSettlementRecovery(\n recoverer: (\n operationId: string,\n observation: ExternalTaskSettlementObservation\n ) => Promise<ExternalTaskStatusResult | undefined>\n ): () => void {\n this.durableSettlementRecoverers.add(recoverer);\n return () => this.durableSettlementRecoverers.delete(recoverer);\n }\n\n /** Register exact-token authorization for committed deferred continuation recovery. @internal */\n registerDurableDeferredResumeAuthorization(\n authorizer: (operationId: string, token: string) => boolean | undefined | Promise<boolean | undefined>\n ): () => void {\n this.durableDeferredResumeAuthorizers.add(authorizer);\n return () => this.durableDeferredResumeAuthorizers.delete(authorizer);\n }\n\n /** Register owner-capability authorization for committed operation route discovery. @internal */\n registerDurableDeferredOperationRecoveryAuthorization(\n authorizer: (\n operationId: string,\n recoveryKey: string,\n purpose: 'pause-recovery' | 'callback-checkpoint'\n ) => boolean | undefined | Promise<boolean | undefined>\n ): () => void {\n this.durableDeferredOperationRecoveryAuthorizers.add(authorizer);\n return () => this.durableDeferredOperationRecoveryAuthorizers.delete(authorizer);\n }\n\n /** Register an atomic committed-route handoff for a nested durable pause. @internal */\n registerDurableDeferredResumeTokenReplacement(\n replacer: (\n operationId: string,\n currentToken: string,\n replacementToken: string\n ) => boolean | undefined | Promise<boolean | undefined>\n ): () => void {\n this.durableDeferredResumeTokenReplacers.add(replacer);\n return () => this.durableDeferredResumeTokenReplacers.delete(replacer);\n }\n\n /** Whether this exact continuation currently has a durable SDK checkpoint. @internal */\n hasDurablyStoredDeferredTask(token: string): Promise<boolean> {\n return this.executor.hasDurablyStoredDeferredTask(token);\n }\n\n /** Recover the current committed pause when its opaque token handoff was interrupted. @internal */\n recoverDeferredTaskForOperation<T>(\n operationId: string,\n recoveryKey: string,\n publishTerminalTaskStatus = true\n ): Promise<{ token: string; result: TaskResult<T> } | undefined> {\n return this.executor.recoverDeferredTaskForOperation(operationId, recoveryKey, publishTerminalTaskStatus);\n }\n\n /** Bridge a store-recovered callback into the deferred terminal checkpoint. @internal */\n checkpointExternalDeferredSettlement<T>(\n token: string,\n operationId: string,\n terminalResult: TaskResult<T>\n ): Promise<TaskResult<T> | undefined> {\n return this.executor.checkpointExternalDeferredSettlement(token, operationId, terminalResult);\n }\n\n /** Resolve and checkpoint the current generation using a separate owner capability. @internal */\n checkpointExternalDeferredSettlementForOperation<T>(\n operationId: string,\n recoveryKey: string,\n terminalResult: TaskResult<T>\n ): Promise<{ token: string; result?: TaskResult<T> } | undefined> {\n return this.executor.checkpointExternalDeferredSettlementForOperation(operationId, recoveryKey, terminalResult);\n }\n\n /** Publish a callback only after an external durable inbox has bound and settled it. @internal */\n async publishDurablySettledWebhook(args: {\n operationId: string;\n serverTaskId: string;\n taskType: string;\n status: import('./ConversationTypes').TaskStatus;\n result?: unknown;\n error?: string;\n idempotencyKey?: string;\n }): Promise<void> {\n const metadata: WebhookMetadata = {\n operation_id: args.operationId,\n task_id: args.serverTaskId,\n agent_id: this.agent.id,\n task_type: args.taskType,\n status: args.status,\n ...(args.error !== undefined && { message: args.error }),\n ...(args.idempotencyKey !== undefined && { idempotency_key: args.idempotencyKey }),\n timestamp: new Date().toISOString(),\n protocol: this.normalizedAgent.protocol,\n };\n await this.config.onActivity?.({\n type: 'webhook_received',\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n payload: args.result,\n timestamp: metadata.timestamp,\n });\n await this.asyncHandler?.handleDurablySettledResult({\n result: args.result as AdCPAsyncResponseData | undefined,\n metadata,\n });\n }\n\n private async recoverDurableSettlement(\n operationId: string,\n observation: ExternalTaskSettlementObservation\n ): Promise<ExternalTaskStatusResult | undefined> {\n for (const recoverer of this.durableSettlementRecoverers) {\n const recovered = await recoverer(operationId, observation);\n if (recovered) return recovered;\n }\n return undefined;\n }\n\n private async recoverPersistedDeferredTerminal(\n operationId: string,\n status: import('./ConversationTypes').TaskStatus,\n result: unknown,\n serverTaskId: string | undefined,\n taskType: string,\n idempotencyKey?: string\n ): Promise<ExternalTaskStatusResult> {\n if (!serverTaskId) {\n throw new Error('A committed deferred continuation completed without its trusted seller task identity.');\n }\n const recovered = await this.recoverDurableSettlement(operationId, {\n status,\n result,\n serverTaskId,\n taskType,\n ...(idempotencyKey !== undefined && { idempotencyKey }),\n deferredCheckpointOwned: true,\n });\n if (\n !recovered ||\n recovered.queued === true ||\n recovered.settled !== true ||\n recovered.status === undefined ||\n !DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(recovered.status)\n ) {\n throw new Error(\n 'The committed deferred continuation reached a terminal seller result, but durable settlement recovery was unavailable.'\n );\n }\n return recovered;\n }\n\n private taskResultFromRecoveredSettlement<T>(\n original: TaskResult<T>,\n recovered: ExternalTaskStatusResult\n ): TaskResult<T> {\n const status = recovered.status!;\n const settled = {\n ...original,\n success: status === 'completed',\n status,\n metadata: { ...original.metadata, status },\n } as TaskResult<T> & { data?: T; error?: string };\n if (recovered.result === undefined) delete settled.data;\n else settled.data = recovered.result as T;\n if (recovered.error === undefined) delete settled.error;\n else settled.error = recovered.error;\n const recoveredResult = attachMatch(settled as TaskResult<T>) as TaskResult<T>;\n if (hasCompletionHandlerAlreadyPublished(recovered)) {\n markCompletionHandlerAlreadyPublished(recoveredResult);\n }\n return recoveredResult;\n }\n\n private async wrapPersistedDeferredSettlement<T>(\n result: TaskResult<T>,\n operationId: string,\n persistedServerTaskId?: string\n ): Promise<{ result: TaskResult<T>; afterDispatch?: () => Promise<void> }> {\n if (DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(result.status)) {\n const recovered = await this.recoverPersistedDeferredTerminal(\n operationId,\n result.status,\n result.data,\n result.metadata.serverTaskId ?? persistedServerTaskId,\n result.metadata.taskName,\n result.metadata.idempotency_key\n );\n return {\n result: this.taskResultFromRecoveredSettlement(result, recovered),\n ...(recovered.afterDispatch !== undefined && { afterDispatch: recovered.afterDispatch }),\n };\n }\n if (result.deferred) {\n const deferred = result.deferred;\n result = attachMatch({\n ...result,\n deferred: {\n ...deferred,\n resume: input => this.resumeDeferredTask<T>(deferred.token, input),\n },\n } as TaskResult<T>);\n }\n if (!result.submitted) return { result };\n\n const submitted = result.submitted;\n return {\n result: attachMatch({\n ...result,\n submitted: {\n ...submitted,\n track: async transport => {\n const task = await submitted.track(transport);\n if (!DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(task.status as import('./ConversationTypes').TaskStatus)) {\n return task;\n }\n const recovered = await this.recoverPersistedDeferredTerminal(\n operationId,\n task.status as import('./ConversationTypes').TaskStatus,\n task.result,\n task.taskId ?? persistedServerTaskId,\n task.taskType\n );\n await recovered.afterDispatch?.();\n return {\n ...task,\n status: recovered.status!,\n ...(recovered.result === undefined ? { result: undefined } : { result: recovered.result }),\n ...(recovered.error === undefined ? { error: undefined } : { error: recovered.error }),\n };\n },\n waitForCompletion: async (pollInterval, signal) => {\n const completion = await submitted.waitForCompletion(pollInterval, signal);\n if (!DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(completion.status)) return completion;\n const recovered = await this.recoverPersistedDeferredTerminal(\n operationId,\n completion.status,\n completion.data,\n completion.metadata.serverTaskId ?? submitted.taskId ?? persistedServerTaskId,\n completion.metadata.taskName,\n completion.metadata.idempotency_key\n );\n const settled = this.taskResultFromRecoveredSettlement(completion, recovered);\n await recovered.afterDispatch?.();\n return settled;\n },\n },\n } as TaskResult<T>),\n };\n }\n\n /** Effective release pin emitted in protocol envelopes. @internal */\n getWireAdcpVersion(): string {\n return this.config.wireAdcpVersion ?? this.resolvedAdcpVersion;\n }\n\n /**\n * Ensure MCP endpoint is discovered (lazy initialization)\n *\n * If the agent needs discovery, perform it now and cache the result.\n * Returns the agent config with the discovered endpoint.\n * Also computes the canonical base URL by stripping /mcp suffix.\n */\n private async ensureEndpointDiscovered(options?: ReadRequestOptions): Promise<AgentConfig> {\n throwIfAborted(options?.signal);\n const needsDiscovery = this.normalizedAgent._needsDiscovery;\n const transport = normalizeTransportOptions(options?.transport ?? this.config.transport);\n const usesScopedFetch = transport?.trustedFetchFn !== undefined;\n\n if (!needsDiscovery) {\n return this.normalizedAgent;\n }\n\n // Already discovered? Use cached value\n if (!usesScopedFetch && this.discoveredAgent) {\n return this.discoveredAgent;\n }\n if (!usesScopedFetch && this.discoveredEndpoint) {\n this.discoveredAgent = {\n ...this.normalizedAgent,\n agent_uri: this.discoveredEndpoint,\n };\n if (this.normalizedAgent.oauth_tokens && !this.normalizedAgent.oauth_client_credentials) {\n const { shareNonInteractiveOAuthProvider } = await import('../auth/oauth/provider-cache');\n shareNonInteractiveOAuthProvider(this.normalizedAgent, this.discoveredAgent);\n }\n return this.discoveredAgent;\n }\n\n if (this.normalizedAgent.oauth_client_credentials) {\n const { ensureClientCredentialsTokens, getAgentStorage } = await import('../auth/oauth');\n await ensureClientCredentialsTokens(this.normalizedAgent, {\n storage: getAgentStorage(this.normalizedAgent),\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(this.normalizedAgent.agent_uri),\n fetch: transport?.trustedFetchFn,\n signal: options?.signal,\n });\n }\n\n // Perform discovery\n const discoveredEndpoint = await this.discoverMCPEndpoint(this.normalizedAgent.agent_uri, options);\n\n if (usesScopedFetch) {\n const discoveredAgent = { ...this.normalizedAgent, agent_uri: discoveredEndpoint };\n if (this.normalizedAgent.oauth_tokens && !this.normalizedAgent.oauth_client_credentials) {\n const { shareNonInteractiveOAuthProvider } = await import('../auth/oauth/provider-cache');\n shareNonInteractiveOAuthProvider(this.normalizedAgent, discoveredAgent);\n }\n return discoveredAgent;\n }\n\n this.discoveredEndpoint = discoveredEndpoint;\n\n // Compute canonical base URL by stripping /mcp suffix\n this.canonicalBaseUrl = this.computeBaseUrl(this.discoveredEndpoint);\n\n this.discoveredAgent = {\n ...this.normalizedAgent,\n agent_uri: this.discoveredEndpoint,\n };\n if (this.normalizedAgent.oauth_tokens && !this.normalizedAgent.oauth_client_credentials) {\n const { shareNonInteractiveOAuthProvider } = await import('../auth/oauth/provider-cache');\n shareNonInteractiveOAuthProvider(this.normalizedAgent, this.discoveredAgent);\n }\n return this.discoveredAgent;\n }\n\n /**\n * Ensure A2A canonical URL is resolved (lazy initialization)\n *\n * Fetches the agent card and extracts the canonical URL.\n * Returns the agent config with the canonical URL.\n */\n private async ensureCanonicalUrlResolved(options?: ReadRequestOptions): Promise<AgentConfig> {\n throwIfAborted(options?.signal);\n const needsCanonicalUrl = this.normalizedAgent._needsCanonicalUrl;\n const transport = normalizeTransportOptions(options?.transport ?? this.config.transport);\n const usesScopedFetch = transport?.trustedFetchFn !== undefined;\n\n if (!needsCanonicalUrl) {\n return this.normalizedAgent;\n }\n\n // Already resolved? Use cached value\n if (!usesScopedFetch && this.canonicalBaseUrl) {\n return {\n ...this.normalizedAgent,\n agent_uri: this.canonicalBaseUrl,\n };\n }\n\n if (this.normalizedAgent.oauth_client_credentials) {\n const { ensureClientCredentialsTokens, getAgentStorage } = await import('../auth/oauth');\n await ensureClientCredentialsTokens(this.normalizedAgent, {\n storage: getAgentStorage(this.normalizedAgent),\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(this.normalizedAgent.agent_uri),\n fetch: transport?.trustedFetchFn,\n signal: options?.signal,\n });\n }\n\n // Fetch agent card to get canonical URL\n const canonicalUrl = await this.fetchA2ACanonicalUrl(this.normalizedAgent.agent_uri, options);\n if (!usesScopedFetch) this.canonicalBaseUrl = canonicalUrl;\n\n return {\n ...this.normalizedAgent,\n agent_uri: canonicalUrl,\n };\n }\n\n /**\n * Fetch the canonical URL from an A2A agent card\n *\n * Special handling for authentication errors (401):\n * - If the agent card fetch returns 401, throw AuthenticationRequiredError\n * - Check for OAuth metadata to provide helpful guidance\n */\n private async fetchA2ACanonicalUrl(agentUri: string, readOptions?: ReadRequestOptions): Promise<string> {\n // adcp-client#1804 — wrap A2A card discovery in withResponseSizeLimit so\n // `transport.maxResponseBytes` applies to every agent-card fetch. The\n // auth-stamping fetchImpl composes through wrapFetchWithSizeLimit so the\n // active ALS slot enforces the cap on the wire call. Matches the same\n // pattern in `getAgentInfo` (closed #1799 via PR #1802).\n const { withResponseSizeLimit, wrapFetchWithSizeLimit } = await import('../protocols/responseSizeLimit');\n const transport = normalizeTransportOptions(readOptions?.transport ?? this.config.transport);\n const maxResponseBytes = transport?.maxResponseBytes;\n const requestTimeoutMs = resolveRequestTimeoutMs(transport?.requestTimeoutMs, DEFAULT_REQUEST_TIMEOUT_MS);\n const sizeLimitedFetch = wrapFetchWithSizeLimit(\n createAgentTransportFetch(agentUri, {\n trustedFetchFn: transport?.trustedFetchFn,\n allowPrivateIp: transport?.allowPrivateIp,\n })\n );\n\n const authToken = this.normalizedAgent.oauth_client_credentials\n ? this.normalizedAgent.oauth_tokens?.access_token\n : this.normalizedAgent.auth_token;\n let got401 = false;\n\n const fetchImpl = async (url: string | URL | Request, requestInit?: RequestInit) => {\n const headers: Record<string, string> = {\n ...(requestInit?.headers as Record<string, string>),\n ...this.normalizedAgent.headers,\n ...(authToken && {\n Authorization: `Bearer ${authToken}`,\n 'x-adcp-auth': authToken,\n }),\n };\n\n const response = await withAbortSignal<Response>(\n [readOptions?.signal, requestInit?.signal],\n requestTimeoutMs,\n signal => sizeLimitedFetch(url as RequestInfo | URL, { ...requestInit, headers, signal })\n );\n\n // Track 401 errors for later handling\n if (response.status === 401) {\n got401 = true;\n }\n\n return response;\n };\n\n const cardUrls = buildCardUrls(agentUri);\n\n try {\n let client: InstanceType<typeof A2AClient> | undefined;\n let lastError: Error = new Error(`A2A agent card not found at ${cardUrls.join(', ')}`);\n for (const cardUrl of cardUrls) {\n try {\n client = await withResponseSizeLimit(maxResponseBytes, () => A2AClient.fromCardUrl(cardUrl, { fetchImpl }));\n break;\n } catch (err: unknown) {\n lastError = err as Error;\n if (got401) break;\n }\n }\n if (!client) {\n throw lastError;\n }\n const agentCard = await withResponseSizeLimit(maxResponseBytes, async () =>\n client.agentCardPromise ? client.agentCardPromise : client.agentCard\n );\n\n // Use the canonical URL from the agent card, falling back to computed base URL\n if (agentCard?.url) {\n return agentCard.url;\n }\n\n return this.computeBaseUrl(agentUri);\n } catch (error: unknown) {\n // If we got a 401, throw the richer NeedsAuthorizationError when the\n // full discovery walk succeeds; otherwise fall back to the simpler\n // one-hop AuthenticationRequiredError so behavior degrades gracefully.\n if (is401Error(error, got401)) {\n const requirements = await discoverAuthorizationRequirements(agentUri, {\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(agentUri),\n fetchFn: transport?.trustedFetchFn,\n signal: readOptions?.signal,\n });\n if (requirements) {\n throw new NeedsAuthorizationError(requirements);\n }\n // `discoverAuthorizationRequirements` returned null — either no PRM\n // walk available, or the 401 challenge wasn't Bearer. Re-probe to\n // surface the scheme on the error (Basic-fronted gateways are the\n // common non-Bearer case) so consumers don't bounce through OAuth\n // remediation that will never succeed.\n const challenge = await probeAuthChallenge(agentUri, {\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(agentUri),\n fetchFn: transport?.trustedFetchFn,\n signal: readOptions?.signal,\n });\n const oauthMetadata = await discoverOAuthMetadata(agentUri, {\n trustedFetchFn: transport?.trustedFetchFn,\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(agentUri),\n signal: readOptions?.signal,\n });\n throw new AuthenticationRequiredError(agentUri, oauthMetadata || undefined, undefined, challenge ?? undefined);\n }\n\n // Re-throw other errors\n throw error;\n }\n }\n\n /**\n * Compute base URL by stripping protocol-specific suffixes\n *\n * - Strips /.well-known/agent.json or /.well-known/agent-card.json for A2A discovery URLs\n * - Strips the protocol transport suffix (/mcp, /a2a, /sse)\n * - Strips trailing slash for consistency\n */\n private computeBaseUrl(url: string): string {\n let baseUrl = stripAgentCardPath(url);\n baseUrl = stripTransportSuffix(baseUrl);\n baseUrl = baseUrl.replace(/\\/$/, '');\n return baseUrl;\n }\n\n private isWellKnownAgentCardUrl(url: string): boolean {\n return isWellKnownCardUrl(url);\n }\n\n /**\n * Discover MCP endpoint by testing the provided path, then trying variants\n *\n * Strategy:\n * 1. Test the exact URL provided (preserving trailing slashes)\n * 2. If that fails, try with/without trailing slash\n * 3. If still fails and doesn't end with /mcp, try adding /mcp\n *\n * Special handling for authentication errors (401):\n * - If any endpoint returns 401, we know the server exists but requires auth\n * - We fetch OAuth metadata and throw AuthenticationRequiredError\n * - This gives consumers clear guidance on how to authenticate\n *\n * Note: This is async and called lazily on first agent interaction\n */\n private async discoverMCPEndpoint(providedUri: string, options?: ReadRequestOptions): Promise<string> {\n throwIfAborted(options?.signal);\n const { connectMCPWithFallback } = await import('../protocols/mcp');\n const { probeModernMCPConnection } = await import('../protocols/mcp-modern');\n const transport = normalizeTransportOptions(options?.transport ?? this.config.transport);\n const usesScopedFetch = transport?.trustedFetchFn !== undefined;\n\n const authToken = this.normalizedAgent.oauth_client_credentials\n ? this.normalizedAgent.oauth_tokens?.access_token\n : this.agent.auth_token;\n const agentHeaders = this.agent.headers;\n const authHeaders = createMCPRequestHeaders(agentHeaders, authToken);\n const oauth =\n this.normalizedAgent.oauth_tokens && !this.normalizedAgent.oauth_client_credentials\n ? await import('../auth/oauth')\n : undefined;\n const authProvider = oauth\n ? (await import('../auth/oauth/provider-cache')).getNonInteractiveOAuthProvider(this.normalizedAgent, {\n agentHint: this.normalizedAgent.id,\n storage: oauth.getAgentStorage(this.normalizedAgent),\n allowHttp: isLikelyPrivateUrl(this.normalizedAgent.agent_uri),\n })\n : undefined;\n\n type EndpointTestResult = {\n success: boolean;\n status?: number;\n error?: unknown;\n };\n\n const testEndpoint = async (url: string): Promise<EndpointTestResult> => {\n try {\n const modern = await probeModernMCPConnection(url, authToken, agentHeaders, {\n authProvider,\n signal: options?.signal,\n requestTimeoutMs: transport?.requestTimeoutMs,\n fetchFn: transport?.trustedFetchFn,\n allowPrivateIp: transport?.allowPrivateIp,\n });\n if (modern.connected) {\n if (!usesScopedFetch) {\n this.discoveredMcpEra = modern.era;\n this.discoveredMcpEraAt = Date.now();\n }\n return { success: true };\n }\n\n // The v2 Streamable HTTP probe could not connect. Preserve the\n // established v1 Streamable→SSE fallback for old SSE-only agents.\n const client = await connectMCPWithFallback(\n new URL(url),\n authHeaders,\n [],\n 'endpoint discovery',\n transport?.trustedFetchFn,\n {\n signal: options?.signal,\n requestTimeoutMs: transport?.requestTimeoutMs,\n allowPrivateIp: transport?.allowPrivateIp,\n }\n );\n await client.close();\n if (!usesScopedFetch) {\n this.discoveredMcpEra = 'legacy';\n this.discoveredMcpEraAt = Date.now();\n }\n return { success: true };\n } catch (error: unknown) {\n if (isAbortOrTimeoutError(error)) {\n throw error;\n }\n if (is401Error(error)) {\n return { success: false, status: 401, error };\n }\n const errObj = error as Record<string, unknown>;\n const status =\n (errObj?.status as number | undefined) ||\n ((errObj?.response as Record<string, unknown>)?.status as number | undefined) ||\n ((errObj?.cause as Record<string, unknown>)?.status as number | undefined);\n return { success: false, status, error };\n }\n };\n\n const urlsToTry: string[] = [];\n\n // 1. Always try the exact URL provided first\n urlsToTry.push(providedUri);\n\n // 2. Try the opposite trailing slash variant\n const hasTrailingSlash = providedUri.endsWith('/');\n const alternateSlash = hasTrailingSlash\n ? providedUri.slice(0, -1) // Remove trailing slash\n : providedUri + '/'; // Add trailing slash\n urlsToTry.push(alternateSlash);\n\n // 3. If URL doesn't end with /mcp or /mcp/, try adding /mcp\n const normalizedUri = providedUri.replace(/\\/$/, '');\n if (!normalizedUri.endsWith('/mcp')) {\n urlsToTry.push(normalizedUri + '/mcp');\n urlsToTry.push(normalizedUri + '/mcp/');\n }\n\n // Remove duplicates while preserving order\n const uniqueUrls = [...new Set(urlsToTry)];\n\n // Track results and whether we got any 401s\n let got401 = false;\n let firstWorkingUrl: string | undefined;\n\n // Test each URL\n for (const url of uniqueUrls) {\n const result = await testEndpoint(url);\n\n if (result.success) {\n firstWorkingUrl = url;\n break;\n }\n\n if (result.status === 401) {\n got401 = true;\n }\n }\n\n if (firstWorkingUrl) {\n return firstWorkingUrl;\n }\n\n // If we got 401 from any endpoint, throw an authentication-required error.\n // Prefer the richer NeedsAuthorizationError when we can walk the full\n // RFC 9728 chain (PRM → AS metadata → endpoints + scopes + DCR hint).\n // Fall back to the simpler AuthenticationRequiredError with one-hop AS\n // metadata when the walk doesn't yield enough.\n if (got401) {\n const requirements = await discoverAuthorizationRequirements(providedUri, {\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(providedUri),\n fetchFn: transport?.trustedFetchFn,\n signal: options?.signal,\n });\n if (requirements) {\n throw new NeedsAuthorizationError(requirements);\n }\n // Non-Bearer 401 (or Bearer-without-PRM). Re-probe to surface the\n // scheme on the error envelope — `Basic` is the common shape for\n // gateway-fronted agents (Apigee, Kong, AWS API GW) and routing\n // consumers at OAuth would never succeed.\n const challenge = await probeAuthChallenge(providedUri, {\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(providedUri),\n fetchFn: transport?.trustedFetchFn,\n signal: options?.signal,\n });\n const oauthMetadata = await discoverOAuthMetadata(providedUri, {\n trustedFetchFn: transport?.trustedFetchFn,\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(providedUri),\n signal: options?.signal,\n });\n throw new AuthenticationRequiredError(providedUri, oauthMetadata || undefined, undefined, challenge ?? undefined);\n }\n\n // None worked and no 401 - generic discovery failure.\n // The most common cause is `agent_uri` pointing at the host root when the\n // MCP endpoint lives at a non-standard path; the SDK only auto-probes `/`,\n // `/mcp`, and `/mcp/`. Surface that hint so operators can fix the\n // registration instead of debugging transport.\n throw new Error(\n `Failed to discover MCP endpoint. Tried:\\n` +\n uniqueUrls.map((url, i) => ` ${i + 1}. ${url}`).join('\\n') +\n '\\n' +\n `None responded to MCP protocol.\\n\\n` +\n `Hint: this usually means agent_uri does not include the MCP endpoint path. ` +\n `The SDK auto-appends /mcp and /mcp/ (plus a trailing-slash variant) ` +\n `to the provided path. If your server exposes MCP at a different path ` +\n `(e.g. /api/mcp, /v1/mcp) or uses legacy SSE at /sse, register that ` +\n `exact path as agent_uri.`\n );\n }\n\n /**\n * Normalize agent config\n *\n * - If URL is a well-known agent card URL, switch to A2A protocol\n * (these are A2A discovery URLs, not MCP endpoints)\n * - A2A agents are marked for canonical URL resolution (from agent card)\n * - MCP agents are marked for endpoint discovery\n */\n private normalizeAgentConfig(agent: AgentConfig): InternalAgentConfig {\n // If URL is a well-known agent card URL, use A2A protocol regardless of what was specified\n // Mark for canonical URL resolution - we'll fetch the agent card and use its url field\n if (this.isWellKnownAgentCardUrl(agent.agent_uri)) {\n return {\n ...agent,\n protocol: 'a2a',\n _needsCanonicalUrl: true,\n };\n }\n\n if (agent.protocol === 'a2a') {\n // A2A agents need canonical URL resolution from agent card\n return {\n ...agent,\n _needsCanonicalUrl: true,\n };\n }\n\n if (agent.protocol !== 'mcp') {\n return agent;\n }\n\n // In-process MCP clients have no HTTP endpoint to discover\n if (agent._inProcessMcpClient) {\n return agent;\n }\n\n // MCP agents need endpoint discovery - we'll test their path, then try adding /mcp\n return {\n ...agent,\n _needsDiscovery: true,\n };\n }\n\n /**\n * Handle webhook from agent (async task status updates and completions)\n *\n * Accepts webhook payloads from both MCP and A2A protocols:\n * 1. MCP: MCPWebhookPayload envelope with AdCP data in .result field\n * 2. A2A: Native Task/TaskStatusUpdateEvent with AdCP data in either:\n * - status.message.parts[].data (for status updates)\n * - artifacts (for task completion, per A2A spec)\n *\n * The method normalizes both formats so handlers receive the unwrapped\n * AdCP response data (AdCPAsyncResponseData), not the raw protocol structure.\n *\n * @param payload - Protocol-specific webhook payload (MCPWebhookPayload | Task | TaskStatusUpdateEvent)\n * @param taskType - Task type (e.g create_media_buy) from url param or url part of the webhook delivery\n * @param operationId - Operation id (e.g used for client app to track the operation) from the param or url part of the webhook delivery\n * @param signature - X-ADCP-Signature header (format: \"sha256=...\")\n * @param timestamp - X-ADCP-Timestamp header (Unix timestamp)\n * @returns Whether webhook was handled successfully\n *\n * @example\n * ```typescript\n * app.post(\n * '/webhook/:task_type/:operation_id',\n * express.raw({ type: 'application/json' }),\n * client.createWebhookHandler({\n * getRequestUrl: req => `https://buyer.example${req.originalUrl}`,\n * }),\n * );\n * ```\n *\n * `createWebhookHandler()` preserves the SDK's typed HTTP mapping: authentication\n * failures return 401, invalid/conflicting deliveries return 400/409, rate abuse\n * returns 429, and transient verification, storage, or publication failures return\n * 503 for seller retry. Do not map every `handleWebhook()` exception to 401.\n */\n async handleWebhook(\n payload: MCPWebhookPayload | A2ATask | TaskStatusUpdateEvent,\n taskType: string,\n operationId: string,\n signature?: WebhookHeaderValue,\n timestamp?: WebhookHeaderValue,\n rawBody?: string | Buffer | Uint8Array\n ): Promise<boolean> {\n const parsed = await this.verifyAndParseWebhook({\n payload,\n taskType,\n operationId,\n signature,\n timestamp,\n rawBody,\n });\n if (!parsed.ok) {\n throw new WebhookDispatchError(parsed.code, parsed.message, parsed.cause);\n }\n\n return this.dispatchParsedWebhook(parsed);\n }\n\n /**\n * Verify and normalize an inbound webhook without dispatching handlers.\n *\n * This is the lower-level receiver primitive for integrations that need to\n * map malformed webhooks to precise HTTP responses. It verifies the mode\n * selected by the trusted outbound registration (RFC 9421 by default, or\n * legacy HMAC when `webhookSecret` was used), parses raw JSON bodies,\n * validates the transport envelope shape, and returns the canonicalized\n * AdCP result plus routing metadata. Legacy wire inspection is intentionally\n * confined to the transport adapter and is not returned by this primary API.\n */\n async verifyAndParseWebhook(options: VerifyAndParseWebhookOptions): Promise<WebhookParseResult> {\n const rawBody = options.rawBody ?? rawBodyFromUnknown(options.body);\n const authHeaders = inspectWebhookAuthenticationHeaders(options.headers, options.signature, options.timestamp);\n const trustedOperationId =\n options.operationId && options.operationId !== 'unknown' ? options.operationId : undefined;\n let registration: Readonly<WebhookRegistration> | undefined;\n if (trustedOperationId) {\n try {\n registration = await this.webhookRegistrationStore.get(this.agent.id, trustedOperationId);\n } catch (cause) {\n const routedTaskType = options.taskType && options.taskType !== 'unknown' ? options.taskType : undefined;\n if (\n !this.config.webhookSecret ||\n routedTaskType === undefined ||\n !RECORDLESS_HMAC_READ_ONLY_TASKS.has(routedTaskType)\n ) {\n return {\n ok: false,\n code: 'webhook_registration_store_unavailable',\n message: 'Webhook registration state is temporarily unavailable.',\n cause,\n };\n }\n }\n }\n if (registration && (registration.agentId !== this.agent.id || registration.operationId !== trustedOperationId)) {\n return {\n ok: false,\n code: 'webhook_registration_store_unavailable',\n message: 'Webhook registration state is inconsistent with the trusted route.',\n };\n }\n if (registration) {\n const nowMs = this.config.webhookVerification?.now\n ? Math.floor(this.config.webhookVerification.now() * 1000)\n : Date.now();\n if (!Number.isFinite(registration.createdAt) || !Number.isFinite(registration.expiresAt)) {\n return {\n ok: false,\n code: 'webhook_registration_store_unavailable',\n message: 'Webhook registration state contains invalid timestamps.',\n };\n }\n try {\n const registeredAgentUrl = new URL(registration.agentUrl);\n if (registeredAgentUrl.username || registeredAgentUrl.password) {\n throw new TypeError('Webhook registration seller URL contains userinfo.');\n }\n } catch (cause) {\n return {\n ok: false,\n code: 'webhook_registration_store_unavailable',\n message: 'Webhook registration state contains an invalid seller URL.',\n cause,\n };\n }\n if (registration.expiresAt <= nowMs) registration = undefined;\n }\n\n const trustedRouteTaskType = options.taskType && options.taskType !== 'unknown' ? options.taskType : undefined;\n if (\n !registration &&\n this.config.webhookSecret &&\n (trustedRouteTaskType === undefined || !RECORDLESS_HMAC_READ_ONLY_TASKS.has(trustedRouteTaskType))\n ) {\n return {\n ok: false,\n code: 'webhook_registration_store_unavailable',\n message: 'A trusted webhook registration is required for this task type.',\n };\n }\n\n if (authHeaders.hasRfc9421 && !trustedOperationId) {\n return {\n ok: false,\n code: 'webhook_verification_context_missing',\n message: 'RFC 9421 verification requires a trusted route operation id.',\n };\n }\n if (registration) {\n const routedTaskType = options.taskType === 'unknown' ? undefined : options.taskType;\n if (routedTaskType !== undefined && routedTaskType !== registration.taskType) {\n return {\n ok: false,\n code: 'webhook_registration_mismatch',\n message: 'Trusted webhook route does not match the registered task type.',\n };\n }\n const oppositeMode =\n (registration.mode === 'rfc9421' && authHeaders.hasLegacy) ||\n (registration.mode === 'hmac-sha256' && authHeaders.hasRfc9421);\n if (oppositeMode) {\n const cause = new WebhookSignatureError(\n 'webhook_mode_mismatch',\n 1,\n 'Received webhook authentication mode does not match the registered callback mode.'\n );\n return { ok: false, code: cause.code, message: cause.message, cause };\n }\n }\n if (!registration && this.config.webhookSecret && authHeaders.hasRfc9421) {\n const cause = new WebhookSignatureError(\n 'webhook_mode_mismatch',\n 1,\n 'RFC 9421 signature headers do not match the configured legacy HMAC receiver mode.'\n );\n return { ok: false, code: cause.code, message: cause.message, cause };\n }\n if (registration?.mode === 'rfc9421') {\n if (\n rawBody === undefined ||\n !options.headers ||\n !trustedOperationId ||\n !options.requestMethod ||\n !options.requestUrl\n ) {\n return {\n ok: false,\n code: 'webhook_verification_context_missing',\n message:\n 'RFC 9421 verification requires raw body bytes, all headers, POST method, an absolute trusted public URL, and a trusted route operation id.',\n };\n }\n if (options.requestMethod.toUpperCase() !== 'POST') {\n return {\n ok: false,\n code: 'webhook_verification_context_missing',\n message: 'Webhook request method must be POST.',\n };\n }\n try {\n if (canonicalTargetUri(options.requestUrl) !== canonicalTargetUri(registration.callbackUrl)) {\n const cause = new WebhookSignatureError(\n 'webhook_signature_invalid',\n 10,\n 'Trusted request URL does not match the registered callback URL.'\n );\n return { ok: false, code: cause.code, message: cause.message, cause };\n }\n } catch (cause) {\n return {\n ok: false,\n code: 'webhook_verification_context_missing',\n message: 'Webhook request URL must be a valid absolute public URL.',\n cause,\n };\n }\n const normalizedHeaders = normalizeRfc9421WebhookHeaders(options.headers);\n if (!normalizedHeaders.ok) return normalizedHeaders.failure;\n try {\n await verifyRfc9421WebhookSignature(\n {\n method: options.requestMethod,\n url: options.requestUrl,\n headers: normalizedHeaders.headers,\n body: rawBody,\n },\n {\n jwks: this.webhookJwksFor(registration),\n replayStore: this.webhookReplayStore,\n revocationStore: this.webhookRevocationStore,\n ...(this.config.webhookVerification?.now && { now: this.config.webhookVerification.now }),\n agentUrlForKeyid: () => registration.agentUrl,\n }\n );\n } catch (cause) {\n if (cause instanceof WebhookSignatureError) {\n return { ok: false, code: cause.code, message: cause.message, cause };\n }\n return {\n ok: false,\n code: 'webhook_verification_unavailable',\n message: 'Seller signing keys could not be resolved for webhook verification.',\n cause,\n };\n }\n } else if (registration?.mode === 'hmac-sha256' || (!registration && this.config.webhookSecret)) {\n if (rawBody === undefined) {\n return {\n ok: false,\n code: 'webhook_signature_invalid',\n message: 'Raw webhook body required for HMAC signature verification; capture bytes before JSON parsing.',\n };\n }\n let hmacSecret: string | undefined;\n try {\n hmacSecret = this.config.webhookSecret;\n } catch (cause) {\n return {\n ok: false,\n code: 'webhook_verification_unavailable',\n message: 'Legacy webhook key material is temporarily unavailable.',\n cause,\n };\n }\n if (!hmacSecret) {\n return {\n ok: false,\n code: 'webhook_verification_unavailable',\n message: 'Legacy webhook key material is unavailable for this registration.',\n };\n }\n const check = verifyWebhookRequest({\n rawBody,\n secret: hmacSecret,\n headers: options.headers,\n signature: options.signature,\n timestamp: options.timestamp,\n });\n if (!check.ok) {\n return {\n ok: false,\n code:\n check.reason === 'invalid_timestamp' || check.reason === 'stale_timestamp'\n ? 'webhook_timestamp_invalid'\n : 'webhook_signature_invalid',\n message: check.message,\n };\n }\n } else if (\n this.config.allowUnauthenticatedWebhooks === true &&\n !registration &&\n !authHeaders.hasRfc9421 &&\n !authHeaders.hasLegacy\n ) {\n warnUnverifiedWebhookReceive();\n } else {\n return {\n ok: false,\n code: authHeaders.hasRfc9421 ? 'webhook_registration_not_found' : 'webhook_unverifiable',\n message: 'Refusing a webhook without trusted registration provenance or a configured legacy HMAC secret.',\n };\n }\n\n const payloadSource =\n (registration || this.config.webhookSecret) && rawBody !== undefined\n ? rawBody\n : (options.payload ?? options.body ?? rawBody);\n const parsedPayload = parseWebhookBody(payloadSource);\n if (!parsedPayload.ok) {\n return parsedPayload;\n }\n\n const topLevelTaskType =\n isObjectRecord(parsedPayload.payload) && typeof parsedPayload.payload.task_type === 'string'\n ? parsedPayload.payload.task_type\n : undefined;\n const payloadRecord = isObjectRecord(parsedPayload.payload) ? parsedPayload.payload : undefined;\n const signedRoute = extractSignedWebhookRoute(parsedPayload.payload);\n if (!signedRoute.ok) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: signedRoute.message,\n };\n }\n const parsedTaskType = signedRoute.taskType ?? topLevelTaskType;\n if (!registration && this.config.webhookSecret && trustedOperationId === undefined) {\n return {\n ok: false,\n code: 'webhook_verification_context_missing',\n message: 'Legacy HMAC verification requires a trusted route operation id.',\n };\n }\n const hmacAuthenticated = registration?.mode === 'hmac-sha256' || (!registration && this.config.webhookSecret);\n if (\n hmacAuthenticated &&\n (signedRoute.operationId === undefined ||\n signedRoute.operationId !== trustedOperationId ||\n signedRoute.taskType === undefined ||\n signedRoute.taskType !== trustedRouteTaskType)\n ) {\n return {\n ok: false,\n code: 'webhook_registration_mismatch',\n message: 'Legacy HMAC webhook body is not bound to the trusted callback route.',\n };\n }\n if (\n registration &&\n ((signedRoute.operationId !== undefined && signedRoute.operationId !== registration.operationId) ||\n (signedRoute.taskType !== undefined && signedRoute.taskType !== registration.taskType) ||\n (signedRoute.agentId !== undefined && signedRoute.agentId !== registration.agentId))\n ) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Authenticated webhook routing fields do not match the trusted registration.',\n };\n }\n const associatedTaskTypes = new Set(\n [\n options.operationId,\n typeof payloadRecord?.operation_id === 'string' ? payloadRecord.operation_id : undefined,\n typeof payloadRecord?.task_id === 'string' ? payloadRecord.task_id : undefined,\n typeof payloadRecord?.context_id === 'string' ? payloadRecord.context_id : undefined,\n ].flatMap(id => {\n const taskType = this.canonicalCreativeTaskAssociation(id)?.taskType;\n return taskType ? [taskType] : [];\n })\n );\n const associatedTaskType = associatedTaskTypes.size === 1 ? [...associatedTaskTypes][0] : undefined;\n const routedTaskType = options.taskType === 'unknown' ? undefined : options.taskType;\n const declaredTaskType = routedTaskType ?? parsedTaskType;\n const previewOperationId =\n typeof payloadRecord?.operation_id === 'string' ? payloadRecord.operation_id : options.operationId;\n const localPreviewHandler =\n declaredTaskType === 'preview_creative' && previewOperationId\n ? this.previewCreativeHandlerForWebhook({\n operation_id: previewOperationId,\n task_id: '',\n context_id: '',\n task_type: 'preview_creative',\n })\n : undefined;\n // Durable registration provenance wins when available. During the legacy\n // HMAC store-outage fallback, the operation-scoped local marker must win\n // over a stale canonical association on a reused task or context id.\n const previewHandler = registration?.previewMode ?? localPreviewHandler;\n const authoritativePreviewTask = declaredTaskType === 'preview_creative' && previewHandler !== undefined;\n if (\n !authoritativePreviewTask &&\n (associatedTaskTypes.size > 1 ||\n (associatedTaskType !== undefined && declaredTaskType !== undefined && associatedTaskType !== declaredTaskType))\n ) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Webhook task_type does not match the locally tracked task association.',\n };\n }\n let normalizedTaskType = authoritativePreviewTask ? declaredTaskType : (associatedTaskType ?? declaredTaskType);\n try {\n const normalizedPayload = this.normalizeWebhookPayload(\n parsedPayload.payload,\n normalizedTaskType ?? 'unknown',\n options.operationId ?? 'unknown',\n registration?.mode === 'rfc9421'\n );\n normalizedTaskType = normalizedPayload.task_type;\n if (registration && (normalizedPayload.protocol ?? 'mcp') !== registration.protocol) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Authenticated webhook protocol does not match the trusted registration.',\n };\n }\n if (\n !authoritativePreviewTask &&\n associatedTaskType !== undefined &&\n normalizedPayload.task_type !== associatedTaskType\n ) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Webhook task_type does not match the locally tracked task association.',\n };\n }\n const metadata: WebhookMetadata = {\n operation_id: normalizedPayload.operation_id,\n context_id: normalizedPayload.context_id,\n task_id: normalizedPayload.task_id,\n agent_id: this.agent.id,\n task_type: normalizedPayload.task_type,\n status: normalizedPayload.status,\n message: normalizedPayload.message,\n timestamp: normalizedPayload.timestamp || new Date().toISOString(),\n idempotency_key: normalizedPayload.idempotency_key,\n notification_id: normalizedPayload.notification_id,\n protocol: normalizedPayload.protocol ?? 'mcp',\n };\n const canonicalCreativeTask =\n CANONICAL_CREATIVE_ACTIVITY_TASKS.has(normalizedPayload.task_type) ||\n (normalizedPayload.task_type === 'preview_creative' &&\n (previewHandler !== undefined ? previewHandler === 'canonical' : associatedTaskType === 'preview_creative'));\n const canonicalResult = this.canonicalizeWebhookCreativeResult(\n metadata,\n normalizedPayload.result,\n canonicalCreativeTask\n );\n const legacyFormatConverter = this.legacyFormatConverterForWebhook(metadata);\n const canonicalEnvelope = canonicalCreativeTask\n ? stripLegacyCreativeIdentity(\n projectCanonicalCreativeResponseValue(\n parsedPayload.payload,\n normalizedPayload.task_type,\n legacyFormatConverter\n )\n )\n : parsedPayload.payload;\n const canonicalMessage = canonicalCreativeTask\n ? (\n stripLegacyCreativeIdentity({\n message: normalizedPayload.message,\n legacySource: parsedPayload.payload,\n }) as { message?: string }\n ).message\n : normalizedPayload.message;\n return {\n ok: true,\n protocol: normalizedPayload.protocol ?? 'mcp',\n envelope: canonicalEnvelope as MCPWebhookPayload | A2ATask | TaskStatusUpdateEvent,\n result: canonicalResult,\n metadata: {\n operationId: normalizedPayload.operation_id,\n contextId: normalizedPayload.context_id,\n taskId: normalizedPayload.task_id,\n taskType: normalizedPayload.task_type,\n status: normalizedPayload.status,\n message: canonicalMessage,\n previewHandler,\n timestamp: normalizedPayload.timestamp,\n idempotencyKey: normalizedPayload.idempotency_key,\n notificationId: normalizedPayload.notification_id,\n requiresDurableSettlement: registration?.requiresDurableSettlement,\n },\n };\n } catch (error) {\n const canonicalCreativeTask =\n normalizedTaskType !== undefined &&\n (CANONICAL_CREATIVE_ACTIVITY_TASKS.has(normalizedTaskType) ||\n (normalizedTaskType === 'preview_creative' &&\n (previewHandler !== undefined\n ? previewHandler === 'canonical'\n : associatedTaskType === 'preview_creative')));\n if (error instanceof WebhookDispatchError) {\n if (!canonicalCreativeTask) {\n return { ok: false, code: error.code, message: error.message };\n }\n const safe = stripLegacyCreativeIdentity({\n message: error.message,\n legacySource: parsedPayload.payload,\n }) as { message: string };\n return { ok: false, code: error.code, message: safe.message };\n }\n const message = error instanceof Error ? error.message : 'Webhook payload could not be normalized.';\n if (canonicalCreativeTask) {\n const safe = stripLegacyCreativeIdentity({ message, legacySource: parsedPayload.payload }) as {\n message: string;\n };\n return { ok: false, code: 'webhook_result_invalid', message: safe.message };\n }\n return {\n ok: false,\n code: 'webhook_result_invalid',\n message: 'Webhook payload could not be normalized.',\n };\n }\n }\n\n private async dispatchParsedWebhook(parsed: WebhookParseSuccess): Promise<boolean> {\n if (parsed.metadata.taskType === 'preview_creative' && parsed.metadata.previewHandler) {\n for (const key of [parsed.metadata.operationId, parsed.metadata.taskId, parsed.metadata.contextId]) {\n if (!key) continue;\n this.rememberPreviewCreativeHandlerKey(key, parsed.metadata.previewHandler);\n if (parsed.metadata.previewHandler === 'canonical') {\n this.rememberCanonicalCreativeTaskAssociation(key, 'preview_creative');\n } else {\n this.canonicalCreativeTaskAssociations.delete(key);\n }\n }\n }\n const canonicalCreativeTask =\n parsed.metadata.taskType === 'preview_creative' && parsed.metadata.previewHandler !== undefined\n ? parsed.metadata.previewHandler === 'canonical'\n : this.isCanonicalCreativeWebhook({\n operation_id: parsed.metadata.operationId,\n context_id: parsed.metadata.contextId,\n task_id: parsed.metadata.taskId,\n task_type: parsed.metadata.taskType,\n });\n let metadata: WebhookMetadata = {\n operation_id: parsed.metadata.operationId,\n context_id: parsed.metadata.contextId,\n task_id: parsed.metadata.taskId,\n agent_id: this.agent.id,\n task_type: parsed.metadata.taskType,\n status: parsed.metadata.status,\n message: parsed.metadata.message,\n timestamp: parsed.metadata.timestamp || new Date().toISOString(),\n idempotency_key: parsed.metadata.idempotencyKey,\n notification_id: parsed.metadata.notificationId,\n protocol: parsed.protocol,\n rawHTTPPayload: canonicalCreativeTask ? stripLegacyCreativeIdentity(parsed.envelope) : parsed.envelope,\n };\n try {\n this.asyncHandler?.assertWebhookDedupInput(metadata);\n } catch (error) {\n if (error instanceof WebhookDedupInputError) {\n throw new WebhookDispatchError('webhook_envelope_invalid', error.message, error);\n }\n throw error;\n }\n this.rememberCanonicalCreativeWebhookContext(metadata);\n let externalStatus: ExternalTaskStatusResult | undefined;\n let forgetPolicyState = false;\n try {\n const canonicalResult = this.canonicalizeWebhookCreativeResult(metadata, parsed.result, canonicalCreativeTask);\n const dedupResult = canonicalResult as AdCPAsyncResponseData | undefined;\n const dedupMetadata = { ...metadata };\n let webhookResult = dedupResult;\n let suppressHandler = false;\n\n const dispatchClaimedWebhook = async (): Promise<boolean> => {\n try {\n const policyDispatch = await this.applyProductPropertyPolicyToWebhookResult(webhookResult, metadata);\n webhookResult = policyDispatch.result;\n metadata = policyDispatch.metadata;\n suppressHandler = policyDispatch.suppressHandler;\n\n if (metadata.task_type === 'request_proposals') {\n assertNativeRequestProposalsResult(webhookResult);\n }\n\n const observation = {\n status: metadata.status as import('./ConversationTypes').TaskStatus,\n result: webhookResult,\n serverTaskId: metadata.task_id,\n taskType: metadata.task_type,\n ...(metadata.idempotency_key !== undefined && { idempotencyKey: metadata.idempotency_key }),\n };\n if (parsed.metadata.requiresDurableSettlement === true) {\n const recovered = await this.recoverDurableSettlement(metadata.operation_id, observation);\n if (recovered) {\n const hasTerminalStatus =\n recovered.status !== undefined && DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(recovered.status);\n const validQueued =\n recovered.queued === true &&\n recovered.settled === false &&\n recovered.duplicate !== true &&\n recovered.status === undefined &&\n recovered.result === undefined &&\n recovered.error === undefined;\n const validDuplicate =\n recovered.duplicate === true &&\n recovered.settled === true &&\n recovered.queued !== true &&\n hasTerminalStatus;\n const validSettled =\n recovered.settled === true &&\n recovered.duplicate !== true &&\n recovered.queued !== true &&\n hasTerminalStatus &&\n (recovered.status !== 'completed' || recovered.result !== undefined);\n if (!validQueued && !validDuplicate && !validSettled) {\n throw new WebhookDispatchError(\n 'webhook_durable_settlement_unavailable',\n 'The durable settlement recoverer returned an invalid or contradictory callback outcome.'\n );\n }\n externalStatus = recovered;\n } else {\n throw new WebhookDispatchError(\n 'webhook_durable_settlement_unavailable',\n 'The callback requires durable mutation settlement, but no recoverable settlement route is available.'\n );\n }\n } else {\n externalStatus = await this.executor.observeExternalTaskStatus(\n metadata.operation_id,\n observation.status,\n observation.result,\n { serverTaskId: observation.serverTaskId, taskType: observation.taskType }\n );\n }\n if (!externalStatus) throw new Error('Webhook settlement did not produce an observable status.');\n if (externalStatus.queued) {\n externalStatus = undefined;\n return true;\n }\n if (externalStatus.duplicate) {\n metadata = {\n ...metadata,\n status: externalStatus.status ?? metadata.status,\n ...(externalStatus.error !== undefined && { message: externalStatus.error }),\n };\n const duplicateActivity: Activity = {\n type: 'webhook_duplicate',\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n idempotency_key: metadata.idempotency_key,\n timestamp: metadata.timestamp,\n };\n await this.config.onActivity?.(canonicalCreativeActivity(duplicateActivity));\n await this.asyncHandler?.handleDurableSettlementDuplicate(metadata);\n await externalStatus.afterDispatch?.();\n externalStatus = undefined;\n return true;\n }\n if (externalStatus.settled) {\n webhookResult = externalStatus.result as AdCPAsyncResponseData | undefined;\n metadata = {\n ...metadata,\n status: externalStatus.status ?? metadata.status,\n ...(externalStatus.error !== undefined && { message: externalStatus.error }),\n };\n }\n\n await this.config.onActivity?.(\n canonicalCreativeActivity({\n type: 'webhook_received',\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n payload: webhookResult,\n timestamp: metadata.timestamp,\n })\n );\n\n if (!suppressHandler && this.asyncHandler) {\n await this.asyncHandler.handleClaimedWebhook({\n result: webhookResult,\n metadata,\n previewHandler: parsed.metadata.previewHandler ?? this.previewCreativeHandlerForWebhook(metadata),\n });\n }\n await externalStatus.afterDispatch?.();\n externalStatus = undefined;\n return this.asyncHandler !== undefined || suppressHandler;\n } catch (error) {\n const rejectedStatus = externalStatus;\n externalStatus = undefined;\n if (rejectedStatus?.onDispatchError) {\n try {\n await rejectedStatus.onDispatchError();\n } catch (rejectionError) {\n throw new WebhookDedupClaimRetentionError(\n [error, rejectionError],\n 'Webhook dispatch failed and its durable settlement ownership could not be released.'\n );\n }\n }\n throw error;\n }\n };\n\n if (!this.asyncHandler) {\n let handled: boolean;\n try {\n handled = await dispatchClaimedWebhook();\n } catch (error) {\n if (error instanceof WebhookDedupClaimRetentionError) {\n throw new WebhookDispatchError(\n 'webhook_publication_in_progress',\n 'Webhook dispatch failed while durable publication ownership remained active.',\n error\n );\n }\n throw error;\n }\n forgetPolicyState = DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(\n metadata.status as import('./ConversationTypes').TaskStatus\n );\n return handled;\n }\n\n let deduped: {\n outcome: 'handled' | 'already_handled' | 'in_progress';\n value?: boolean;\n };\n try {\n deduped = await this.asyncHandler.runWebhookDeduplicated({\n result: dedupResult,\n metadata: dedupMetadata,\n dispatch: dispatchClaimedWebhook,\n });\n } catch (error) {\n if (error instanceof WebhookDedupClaimRetentionError) {\n throw new WebhookDispatchError(\n 'webhook_publication_in_progress',\n 'Webhook dispatch failed while durable publication ownership remained active.',\n error\n );\n }\n if (error instanceof WebhookDedupConflictError) {\n throw new WebhookDispatchError('webhook_idempotency_conflict', error.message, error);\n }\n if (error instanceof WebhookDedupInputError) {\n throw new WebhookDispatchError('webhook_envelope_invalid', error.message, error);\n }\n throw error;\n }\n if (deduped.outcome === 'in_progress') {\n throw new WebhookDispatchError(\n 'webhook_publication_in_progress',\n 'A matching callback publication is still in progress.'\n );\n }\n if (deduped.outcome === 'already_handled') {\n await this.config.onActivity?.(\n canonicalCreativeActivity({\n type: 'webhook_duplicate',\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n idempotency_key: metadata.idempotency_key,\n timestamp: metadata.timestamp,\n })\n );\n forgetPolicyState = DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(\n metadata.status as import('./ConversationTypes').TaskStatus\n );\n return true;\n }\n forgetPolicyState = DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(\n metadata.status as import('./ConversationTypes').TaskStatus\n );\n return deduped.value ?? true;\n } finally {\n if (forgetPolicyState) this.forgetProductPolicyRequestParams(metadata);\n }\n }\n\n private rememberCanonicalCreativeWebhookContext(metadata: WebhookMetadata): void {\n if (!metadata.context_id || !this.isCanonicalCreativeWebhook(metadata)) return;\n const association =\n this.canonicalCreativeTaskAssociation(metadata.operation_id) ??\n this.canonicalCreativeTaskAssociation(metadata.task_id) ??\n this.canonicalCreativeTaskAssociation(metadata.context_id);\n if (!association) return;\n this.rememberCanonicalCreativeTaskAssociation(\n metadata.context_id,\n association.taskType,\n association.legacyFormatConverter,\n association.routingSnapshot\n );\n const previewHandler = this.previewCreativeHandlerForWebhook(metadata);\n if (previewHandler) this.rememberPreviewCreativeHandlerKey(metadata.context_id, previewHandler);\n }\n\n private canonicalizeWebhookCreativeResult(\n metadata: WebhookMetadata,\n result: unknown,\n canonicalCreativeTask = this.isCanonicalCreativeWebhook(metadata)\n ): unknown {\n if (!result || typeof result !== 'object' || Array.isArray(result)) return result;\n const taskType = metadata.task_type;\n const legacyFormatConverter = this.legacyFormatConverterForWebhook(metadata);\n const response = result as Record<string, unknown>;\n if (taskType === 'get_products' && Array.isArray(response.products)) {\n const { response: canonical, diagnostics } = toCanonicalOnlyResponse(\n response as unknown as { products?: V1Product[] },\n { legacyFormatConverter }\n );\n const requestParams = this.productPolicyRequestParamsForWebhook(metadata);\n this.rememberCanonicalProductRoutes(canonical.products, requestParams.account, response.products);\n const { _message: _dropLegacyMessage, ...safe } = canonical as typeof canonical & { _message?: unknown };\n void _dropLegacyMessage;\n return stripLegacyCreativeIdentity({ ...safe, projection: { diagnostics } });\n }\n if (taskType === 'list_creatives' && Array.isArray(response.creatives)) {\n const { _message: _dropLegacyMessage, ...safe } = response;\n void _dropLegacyMessage;\n return stripLegacyCreativeIdentity({\n ...safe,\n creatives: response.creatives.map(creative =>\n projectCreativeForDelivery(creative as never, {}, 'canonical', 'list_creatives', legacyFormatConverter)\n ),\n });\n }\n const canonical = canonicalCreativeTask\n ? stripLegacyCreativeIdentity(projectCanonicalCreativeResponseValue(result, taskType, legacyFormatConverter))\n : result;\n const association =\n this.canonicalCreativeTaskAssociation(metadata.operation_id) ??\n this.canonicalCreativeTaskAssociation(metadata.task_id) ??\n this.canonicalCreativeTaskAssociation(metadata.context_id);\n if (metadata.status === 'completed') {\n this.rememberCanonicalPackageRoutesForTask(taskType, canonical, association?.routingSnapshot);\n }\n return canonical;\n }\n\n /**\n * Normalize webhook payload - handles both MCP and A2A webhook formats\n *\n * MCP: Uses MCPWebhookPayload envelope with AdCP data in .result field\n * A2A: Uses native Task/TaskStatusUpdateEvent messages with AdCP data in either:\n * - status.message.parts[].data (for status updates)\n * - artifacts (for task completion responses, per A2A spec)\n *\n * @param payload - Protocol-specific webhook payload (MCPWebhookPayload | Task | TaskStatusUpdateEvent)\n * @param taskType - Task type override\n * @param operationId - Operation id\n * @returns Normalized webhook payload with extracted AdCP response\n */\n private normalizeWebhookPayload(\n payload: unknown,\n taskType: string,\n operationId: string,\n allowLegacyA2AArtifactFallback = false\n ): NormalizedWebhookPayload {\n if (!isObjectRecord(payload)) {\n throw new WebhookDispatchError(\n 'webhook_unsupported_payload',\n 'Unsupported webhook payload format. Expected an MCP webhook envelope object or an A2A task/status event.'\n );\n }\n\n if (isBareDeliveryReport(payload)) {\n throw new WebhookDispatchError(\n 'webhook_unsupported_payload',\n 'Unsupported webhook payload format: received a bare delivery report result. Webhook POST bodies must be an MCP envelope with top-level idempotency_key, operation_id, task_id, task_type, status, timestamp, and result, or an A2A task/status event. Put delivery fields under result.'\n );\n }\n\n // 1. Check for A2A Task or TaskStatusUpdateEvent before considering MCP.\n // Native A2A events also carry a top-level `status`, so MCP's broad\n // candidate detector must never get first refusal.\n if ('kind' in payload && (payload.kind === 'task' || payload.kind === 'status-update')) {\n const a2aPayload = payload as unknown as A2ATask | TaskStatusUpdateEvent;\n const statusMessageData = latestA2AWebhookMessageData(a2aPayload.status?.message?.parts);\n const artifactExtraction = a2aPayload.kind === 'task' ? getLatestA2ADataPartFromTask(a2aPayload) : undefined;\n const artifactData = artifactExtraction?.data;\n // A terminal Task's artifacts are canonical. Its status.message can be\n // an earlier progress observation and must not shadow the final result.\n const adcpData = a2aPayload.kind === 'task' ? (artifactData ?? statusMessageData) : statusMessageData;\n const artifactMetadata = isObjectRecord(artifactExtraction?.artifact.metadata)\n ? artifactExtraction.artifact.metadata\n : undefined;\n const hasExplicitTaskEnvelope =\n adcpData !== undefined &&\n (Object.hasOwn(adcpData, 'result') || Object.hasOwn(adcpData, 'error') || Object.hasOwn(adcpData, 'errors'));\n const dataAdcpStatus =\n adcpData && hasExplicitTaskEnvelope && isAdcpStatus(adcpData.status)\n ? adcpData.status\n : extractAdcpTaskStatusFromPayload(adcpData);\n const metadataAdcpStatus = isAdcpStatus(artifactMetadata?.adcp_status) ? artifactMetadata.adcp_status : undefined;\n if (metadataAdcpStatus !== undefined && dataAdcpStatus !== undefined && metadataAdcpStatus !== dataAdcpStatus) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n 'Invalid A2A webhook envelope: artifact and structured AdCP work statuses do not match.'\n );\n }\n // Native A2A artifact metadata is the transport-safe work observation.\n // It must win over typed result payloads whose domain `status` can use\n // the same literals (for example a completed cancellation result).\n const legacyArtifactStatus = legacyA2AArtifactStatus(a2aPayload, artifactExtraction?.artifact);\n const usesLegacyArtifactFallback =\n allowLegacyA2AArtifactFallback &&\n metadataAdcpStatus === undefined &&\n dataAdcpStatus === undefined &&\n legacyArtifactStatus !== undefined;\n const adcpStatus =\n metadataAdcpStatus ?? dataAdcpStatus ?? (usesLegacyArtifactFallback ? legacyArtifactStatus : undefined);\n const isTerminalAdcpStatus =\n adcpStatus !== undefined &&\n DURABLE_SETTLEMENT_TERMINAL_STATUSES.has(adcpStatus as import('./ConversationTypes').TaskStatus);\n const hasTerminalEnvelope =\n adcpData !== undefined &&\n (!isTerminalAdcpStatus ||\n metadataAdcpStatus !== undefined ||\n usesLegacyArtifactFallback ||\n Object.hasOwn(adcpData, 'result') ||\n Object.hasOwn(adcpData, 'error') ||\n Object.hasOwn(adcpData, 'errors'));\n if (!adcpData || !adcpStatus || !WEBHOOK_TASK_STATUSES.has(adcpStatus) || !hasTerminalEnvelope) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n 'Invalid A2A webhook envelope: structured AdCP status data is required; transport Task state is not an AdCP work observation.'\n );\n }\n\n const wrapped = { result: a2aPayload };\n const artifactTaskId = responseParser.getTaskId({\n task_id: artifactMetadata?.adcp_task_id ?? artifactMetadata?.serverTaskId,\n });\n const dataTaskId = responseParser.getTaskId({ task_id: adcpData.task_id });\n if (artifactTaskId && dataTaskId && artifactTaskId !== dataTaskId) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n 'Invalid A2A webhook envelope: artifact and structured AdCP work task IDs do not match.'\n );\n }\n // Prefer seller-issued AdCP work identity. For synchronous native A2A\n // callbacks there may be no separate work handle; the authenticated,\n // buyer-issued callback route operation is then the trusted identity.\n // A2A transport Task.id is deliberately never used.\n const taskId = artifactTaskId ?? dataTaskId ?? (usesLegacyArtifactFallback ? operationId : undefined);\n if (!taskId) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n 'Invalid A2A webhook envelope: a structured AdCP work task_id is required; transport Task.id is not accepted.'\n );\n }\n\n const declaredTaskType = typeof adcpData.task_type === 'string' ? adcpData.task_type : undefined;\n if (declaredTaskType && taskType !== 'unknown' && declaredTaskType !== taskType) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n 'Invalid A2A webhook envelope: structured task_type does not match the trusted route.'\n );\n }\n\n const result = Object.hasOwn(adcpData, 'result')\n ? (adcpData.result as AdCPAsyncResponseData | undefined)\n : (adcpData as AdCPAsyncResponseData);\n const textParts = Array.isArray(a2aPayload.status?.message?.parts)\n ? a2aPayload.status.message.parts\n .filter(part => part.kind === 'text' && 'text' in part)\n .map(part => ('text' in part ? part.text : ''))\n : [];\n\n return {\n operation_id: operationId,\n context_id: responseParser.getContextId(wrapped),\n task_id: taskId,\n task_type: taskType !== 'unknown' ? taskType : (declaredTaskType ?? 'unknown'),\n status: adcpStatus,\n result,\n message: textParts.length > 0 ? textParts.join(' ') : undefined,\n timestamp: a2aPayload.status?.timestamp || new Date().toISOString(),\n ...(typeof adcpData.idempotency_key === 'string' && { idempotency_key: adcpData.idempotency_key }),\n ...(typeof adcpData.notification_id === 'string' && { notification_id: adcpData.notification_id }),\n protocol: 'a2a',\n };\n }\n\n // 2. Check for MCP Webhook Payload (has task_id, status, task_type fields)\n if (isMcpWebhookCandidate(payload)) {\n const missing = missingMcpWebhookFields(payload);\n if (missing.length > 0) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n `Invalid MCP webhook envelope: missing top-level field(s) ${missing.join(', ')}. Delivery result fields such as notification_type and media_buy_deliveries belong under result, not at the top level.`\n );\n }\n if (typeof payload.status !== 'string' || !WEBHOOK_TASK_STATUSES.has(payload.status)) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n `Invalid MCP webhook envelope: unsupported top-level status. Expected one of ${Array.from(WEBHOOK_TASK_STATUSES).join(', ')}.`\n );\n }\n if (typeof payload.timestamp !== 'string' || Number.isNaN(Date.parse(payload.timestamp))) {\n throw new WebhookDispatchError(\n 'webhook_envelope_invalid',\n 'Invalid MCP webhook envelope: timestamp must be an ISO 8601 date-time string.'\n );\n }\n const mcpPayload = payload as unknown as MCPWebhookPayload;\n return {\n operation_id: operationId && operationId !== 'unknown' ? operationId : mcpPayload.operation_id || 'unknown',\n context_id: mcpPayload.context_id ?? undefined,\n task_id: mcpPayload.task_id,\n task_type: taskType && taskType !== 'unknown' ? taskType : mcpPayload.task_type,\n status: mcpPayload.status,\n result: mcpPayload.result ?? undefined,\n message: mcpPayload.message ?? undefined,\n timestamp: mcpPayload.timestamp,\n idempotency_key: mcpPayload.idempotency_key,\n notification_id: mcpPayload.notification_id ?? undefined,\n protocol: 'mcp',\n };\n }\n\n // 3. Unknown payload format\n throw new WebhookDispatchError(\n 'webhook_unsupported_payload',\n 'Unsupported webhook payload format. Expected an MCP webhook envelope with top-level idempotency_key, operation_id, task_id, task_type, status, timestamp, and result, or an A2A Task/TaskStatusUpdateEvent with AdCP data nested in status.message.parts[].data or task artifacts.'\n );\n }\n\n /**\n * Generate webhook URL using macro substitution\n *\n * @param taskType - Type of task (e.g., 'get_products', 'media_buy_delivery')\n * @param operationId - Operation ID for this request\n * @returns Full webhook URL with macros replaced\n *\n * @example\n * ```typescript\n * // With template: \"https://myapp.com/webhook/{task_type}/{agent_id}/{operation_id}\"\n * const webhookUrl = client.getWebhookUrl('sync_creatives', 'op_123');\n * // Returns: https://myapp.com/webhook/sync_creatives/agent_x/op_123\n *\n * // With template: \"https://myapp.com/webhook?agent={agent_id}&op={operation_id}\"\n * const webhookUrl = client.getWebhookUrl('sync_creatives', 'op_123');\n * // Returns: https://myapp.com/webhook?agent=agent_x&op=op_123\n * ```\n */\n getWebhookUrl(taskType: string, operationId: string): string {\n if (!this.config.webhookUrlTemplate) {\n throw new Error('webhookUrlTemplate not configured - cannot generate webhook URL');\n }\n\n const webhookUrl = resolveWebhookUrl(this.config.webhookUrlTemplate, this.agent.id, taskType, operationId);\n if (!webhookUrl) {\n throw new Error(`webhookUrlTemplate not configured for task type '${taskType}'`);\n }\n return webhookUrl;\n }\n\n /**\n * Create an HTTP webhook handler that automatically verifies signatures\n *\n * This helper creates a standard HTTP handler (Express/Next.js/etc.) that:\n * - Reads the full header bag so duplicate/conflicting signature headers are rejected\n * - Verifies the registered RFC 9421 or legacy HMAC signature mode\n * - Validates signature freshness and RFC 9421 nonce replay\n * - Calls handleWebhook() with proper error handling\n *\n * @returns HTTP handler function compatible with Express-style adapters.\n *\n * @example Express\n * ```typescript\n * const client = new SingleAgentClient(agent, {\n * webhookUrlTemplate: 'https://buyer.example/webhook/{task_type}/{operation_id}',\n * handlers: {\n * onSyncCreativesStatusChange: async (result) => {\n * console.log('Creative synced:', result);\n * }\n * }\n * });\n *\n * app.post(\n * '/webhook/:task_type/:operation_id',\n * express.raw({ type: 'application/json' }),\n * client.createWebhookHandler({\n * getRequestUrl: req => `https://buyer.example${req.originalUrl}`,\n * }),\n * );\n * ```\n */\n createWebhookHandler(adapter: WebhookHandlerAdapter = {}) {\n return async (\n req: WebhookHandlerRequest,\n res: {\n status: (code: number) => { json: (body: unknown) => void };\n json?: unknown;\n writeHead: (code: number, headers: Record<string, string>) => void;\n end: (body: string) => void;\n }\n ) => {\n try {\n // Capture raw body bytes for signature verification, then parse.\n const rawBody =\n req.rawBody ??\n (typeof req.body === 'string' || Buffer.isBuffer(req.body) || req.body instanceof Uint8Array\n ? req.body\n : undefined);\n if (this.config.webhookSecret && rawBody === undefined) {\n throw new WebhookDispatchError(\n 'webhook_signature_invalid',\n 'Raw webhook body required for HMAC signature verification; capture bytes before JSON parsing.'\n );\n }\n const payload =\n typeof req.body === 'string' || Buffer.isBuffer(req.body) || req.body instanceof Uint8Array\n ? undefined\n : req.body;\n\n // Extract routing params if available (e.g., Express route params)\n const taskType =\n (await adapter.getTaskType?.(req)) || req.params?.task_type || req.params?.taskType || 'unknown';\n const operationId =\n (await adapter.getOperationId?.(req)) || req.params?.operation_id || req.params?.operationId || 'unknown';\n const requestMethod = (await adapter.getRequestMethod?.(req)) || req.method;\n const requestUrl = (await adapter.getRequestUrl?.(req)) || req.publicUrl;\n\n const parsed = await this.verifyAndParseWebhook({\n payload,\n body: req.body,\n rawBody,\n headers: req.headers,\n taskType,\n operationId,\n requestMethod,\n requestUrl,\n });\n if (!parsed.ok) {\n throw new WebhookDispatchError(parsed.code, parsed.message, parsed.cause);\n }\n\n const handled = await this.dispatchParsedWebhook(parsed);\n\n // Return success\n if (res.json) {\n res.status(202).json({ status: 'accepted', received: handled });\n } else {\n res.writeHead(202, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'accepted', received: handled }));\n }\n } catch (error: unknown) {\n // Stable verification/dispatch errors are safe for callers. Never\n // reflect arbitrary handler, storage, or infrastructure messages.\n const errorMessage = error instanceof WebhookDispatchError ? error.message : 'Webhook could not be processed.';\n const statusCode = webhookErrorHttpStatus(error);\n\n if (res.json) {\n res.status(statusCode).json({ error: errorMessage });\n } else {\n res.writeHead(statusCode, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: errorMessage }));\n }\n }\n };\n }\n\n /**\n * Verify webhook signature using HMAC-SHA256 per AdCP spec.\n *\n * HMAC is computed over the **raw HTTP body bytes** — the exact bytes received\n * on the wire, before JSON parsing. This ensures cross-language interop since\n * different JSON serializers may produce different byte representations of the\n * same logical payload.\n *\n * For backward compatibility, a parsed object is still accepted but will be\n * re-serialized with JSON.stringify, which may not match the sender's bytes.\n * Always prefer passing the raw body string.\n *\n * Signature format: sha256={hex_signature}\n * Message format: {timestamp}.{raw_body}\n *\n * @param rawBodyOrPayload - Raw HTTP body string (preferred) or parsed payload object (deprecated)\n * @param signature - X-ADCP-Signature header value (format: \"sha256=...\")\n * @param timestamp - X-ADCP-Timestamp header value (Unix timestamp)\n * @returns true if signature is valid\n */\n verifyWebhookSignature(\n rawBodyOrPayload: string | Buffer | Uint8Array | unknown,\n signature: WebhookHeaderValue,\n timestamp: WebhookHeaderValue\n ): boolean {\n if (!this.config.webhookSecret) {\n return false;\n }\n\n // Use raw body bytes when available; fall back to JSON.stringify for backward compat\n const rawBody =\n typeof rawBodyOrPayload === 'string' ||\n Buffer.isBuffer(rawBodyOrPayload) ||\n rawBodyOrPayload instanceof Uint8Array\n ? rawBodyOrPayload\n : String(JSON.stringify(rawBodyOrPayload));\n\n return verifyWebhookRequest({\n rawBody,\n secret: this.config.webhookSecret,\n signature,\n timestamp,\n }).ok;\n }\n\n /**\n * Execute task and call appropriate handler on completion\n *\n * Automatically adapts requests for v2 servers and normalizes responses.\n */\n private async executeAndHandle<T>(\n taskType: string,\n handlerName: keyof AsyncHandlerConfig,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions,\n transformCompletedResponse?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter,\n canonicalRequest?: unknown,\n projectionCatalogs?: readonly ProjectionCatalogSnapshot[]\n ): Promise<TaskResult<T>> {\n const requestParamsSnapshot = structuredClone(params);\n const canonicalRequestSnapshot = canonicalRequest === undefined ? undefined : structuredClone(canonicalRequest);\n const deferredProjectionCatalogs = projectionCatalogs ? structuredClone(projectionCatalogs) : undefined;\n const taskOptionsSnapshot = snapshotTaskOptions(options);\n return withTaskDeadline(taskOptionsSnapshot, effectiveOptions =>\n this.executeAndHandleWithinDeadline(\n taskType,\n handlerName,\n requestParamsSnapshot,\n inputHandler,\n effectiveOptions,\n transformCompletedResponse,\n legacyFormatConverter,\n canonicalRequestSnapshot,\n deferredProjectionCatalogs\n )\n );\n }\n\n private async executeAndHandleWithinDeadline<T>(\n taskType: string,\n handlerName: keyof AsyncHandlerConfig,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions,\n transformCompletedResponse?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter,\n canonicalRequest?: unknown,\n projectionCatalogs?: readonly ProjectionCatalogSnapshot[]\n ): Promise<TaskResult<T>> {\n throwIfAborted(options?.signal);\n const canonicalCreativeInvocation =\n CANONICAL_CREATIVE_ACTIVITY_TASKS.has(taskType) || canonicalRequest !== undefined;\n // Normalize params for backwards compatibility before validation\n let normalizedParams = normalizeRequestParams(taskType, params, {\n skipIdempotencyAutoInject: options?.skipIdempotencyAutoInject,\n skipAccountValidation: options?.skipAccountValidation,\n });\n this.assertRequestSupportedByConfiguredVersion(taskType, normalizedParams, options, canonicalCreativeInvocation);\n this.assertDurablePropertyListCredentialSupported(taskType, normalizedParams);\n\n // Inject an idempotency_key for mutating tools before schema validation\n // so callers don't have to supply one. TaskExecutor also guards against\n // missing keys, but validation happens here first — do the injection up\n // front so the request passes the spec's required-field check.\n // `options.skipIdempotencyAutoInject` disables this for compliance\n // testing that needs to exercise server-side missing-key behavior.\n if (\n !options?.skipIdempotencyAutoInject &&\n requestUsesIdempotency(taskType, normalizedParams) &&\n normalizedParams &&\n typeof normalizedParams === 'object' &&\n !normalizedParams.idempotency_key\n ) {\n normalizedParams = { ...normalizedParams, idempotency_key: generateIdempotencyKey() };\n }\n\n // Validate request params against schema. When compliance testing has\n // asked us to suppress idempotency auto-injection or account validation,\n // skip the entire Zod schema parse — the required field is intentionally\n // absent and Zod would fail on it too. This matches the pre-existing\n // `skipIdempotencyAutoInject` behavior and is acceptable because both\n // flags are @internal and only set by the storyboard runner for\n // schema_validation steps. An explicit external schema root also skips\n // this generated snapshot; TaskExecutor's AJV pass below validates the\n // same request against the caller-supplied current-source bundle.\n if (\n !options?.skipIdempotencyAutoInject &&\n !options?.skipAccountValidation &&\n !isExternalSchemaRootActive(this.resolvedAdcpVersion)\n ) {\n this.validateRequest(taskType, normalizedParams);\n }\n\n // Validate required features before sending request\n await this.validateTaskFeatures(taskType, options);\n throwIfAborted(options?.signal);\n\n // Guard mutating calls against pre-v3 sellers when opted in.\n if (this.config.requireV3ForMutations && requestUsesIdempotency(taskType, normalizedParams)) {\n await this.requireSupportedMajor(taskType, options);\n throwIfAborted(options?.signal);\n }\n\n // Check for v3 features used against v2 servers - return empty result if unsupported\n const earlyResult = await this.getEarlyResultForUnsupportedFeatures<T>(taskType, normalizedParams, options);\n throwIfAborted(options?.signal);\n if (earlyResult) {\n return attachMatch(earlyResult);\n }\n\n const agent = await this.ensureEndpointDiscovered(options);\n throwIfAborted(options?.signal);\n\n // Schema-driven pre-send validation runs on the unadapted v3 shape so\n // wire-format adapters (e.g. adaptGetProductsRequestForV2) don't strip\n // v3-only fields out from under the v3 bundled schema. Skip the entire\n // Zod parse when compliance testing has suppressed required-field\n // validation — the missing field is intentional and Zod would reject it.\n if (!options?.skipIdempotencyAutoInject && !options?.skipAccountValidation) {\n this.executor.validateRequest(taskType, normalizedParams);\n }\n\n // Adapt request for the detected server and AdCP protocol versions.\n const capabilityDiscoveryContext: CapabilityDiscoveryContext = {};\n const detectionOptions: InternalReadRequestOptions = {\n ...options,\n [CAPABILITY_DISCOVERY_CONTEXT]: capabilityDiscoveryContext,\n };\n const serverVersion = await this.detectServerVersion(detectionOptions);\n throwIfAborted(options?.signal);\n this.assertRequestSupportedByTargetVersion(\n taskType,\n normalizedParams,\n capabilityDiscoveryContext.capabilities,\n canonicalCreativeInvocation,\n serverVersion\n );\n const { options: effectiveOptions, driftLog: webhookDriftLog } = this.suppressPre31DiscoveryWebhook(\n taskType,\n options,\n capabilityDiscoveryContext.capabilities\n );\n const inputSchemaStripLogs: any[] = [];\n const { params: adaptedParams, driftLogs: adaptDriftLogs } = this.adaptRequest(\n taskType,\n normalizedParams,\n serverVersion,\n inputSchemaStripLogs,\n capabilityDiscoveryContext.toolSchemas,\n capabilityDiscoveryContext.capabilities\n );\n\n // Symmetric to the pre-adapter v3 pass above: when the adapter\n // rewrote the request for a v2 server, warn-validate the adapted\n // shape against the cached v2.5 schema bundle. Drift gets collected\n // here and merged into result.metadata.debug_logs after executeTask\n // returns — without that merge the warning would silently drop on\n // the floor and adapter drift would land in production unnoticed.\n const v25DriftLogs: any[] = [...adaptDriftLogs];\n if (webhookDriftLog) v25DriftLogs.push(webhookDriftLog);\n if (serverVersion === 'v2') {\n this.executor.validateAdaptedRequestAgainstV2(taskType, adaptedParams, v25DriftLogs);\n }\n\n const canonicalInputHandler = this.canonicalCreativeInputHandler(\n taskType,\n inputHandler,\n canonicalCreativeInvocation\n );\n const routingSnapshot = canonicalCreativeInvocation\n ? canonicalCreativeRoutingSnapshot(taskType, canonicalRequest ?? normalizedParams)\n : undefined;\n const deferredClientContext: DeferredClientFinalizationContext = {\n kind: 'single-agent',\n taskType,\n handlerName,\n canonical: canonicalCreativeInvocation,\n serverVersion,\n ...(capabilityDiscoveryContext.capabilities?._synthetic !== undefined && {\n serverVersionSynthetic: capabilityDiscoveryContext.capabilities._synthetic,\n }),\n productPolicyRequest: productPolicyRequestSnapshot(normalizedParams),\n ...(projectionCatalogs !== undefined && { projectionCatalogs }),\n ...(routingSnapshot !== undefined && { routingSnapshot }),\n ...(effectiveOptions?.taskId !== undefined && { optionTaskId: effectiveOptions.taskId }),\n ...(effectiveOptions?.contextId !== undefined && { optionContextId: effectiveOptions.contextId }),\n };\n let result = await canonicalCreativeExecutionStorage.run(\n {\n taskType,\n canonical: canonicalCreativeInvocation,\n legacyFormatConverter,\n canonicalRequest: canonicalRequest ?? normalizedParams,\n },\n () =>\n this.executor.executeTask<T>(\n agent,\n taskType,\n adaptedParams,\n canonicalInputHandler,\n effectiveOptions,\n serverVersion,\n capabilityDiscoveryContext.capabilities,\n undefined,\n deferredClientContext\n )\n );\n throwIfAborted(effectiveOptions?.signal);\n\n // Merge collected drift into the executor's debug_logs so adopters\n // reading result.debug_logs see input-schema stripping, post-adapter\n // v2.5 warnings, and any pre-3.1 webhook-degradation notice alongside\n // the executor's own logs. On error paths the executor may not surface\n // result.debug_logs at all; logs collected before the failure are\n // dropped, matching the executor's own debug-log behavior.\n const postAdapterLogs = [...inputSchemaStripLogs, ...v25DriftLogs];\n if (postAdapterLogs.length > 0) {\n result.debug_logs = [...(result.debug_logs ?? []), ...postAdapterLogs];\n }\n\n return this.finalizeTaskResult(\n result,\n deferredClientContext,\n effectiveOptions,\n transformCompletedResponse,\n legacyFormatConverter\n );\n }\n\n private async finalizeTaskResult<T>(\n result: TaskResult<T>,\n context: DeferredClientFinalizationContext,\n options?: TaskOptions,\n transformCompletedResponse?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter\n ): Promise<TaskResult<T>> {\n try {\n return await this.finalizeTaskResultInner(\n result,\n context,\n options,\n transformCompletedResponse,\n legacyFormatConverter\n );\n } catch (error) {\n await rejectDeferredSettlement(result);\n throw error;\n }\n }\n\n private async finalizeTaskResultInner<T>(\n result: TaskResult<T>,\n context: DeferredClientFinalizationContext,\n options?: TaskOptions,\n transformCompletedResponse?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter\n ): Promise<TaskResult<T>> {\n if (context.serverVersion !== undefined) {\n result.metadata = {\n ...result.metadata,\n serverVersion: context.serverVersion,\n ...(context.serverVersionSynthetic !== undefined && {\n serverVersionSynthetic: context.serverVersionSynthetic,\n }),\n };\n }\n const completionHandlerAlreadyPublished = hasCompletionHandlerAlreadyPublished(result);\n const settlementAcknowledger = (\n result as TaskResult<T> & {\n [DEFERRED_SETTLEMENT_ACK]?: (finalizedResult?: TaskResult<T>) => Promise<void>;\n }\n )[DEFERRED_SETTLEMENT_ACK];\n const taskType = context.taskType;\n const resumedOptions: TaskOptions = {\n ...(options ?? {}),\n ...(context.optionTaskId !== undefined && { taskId: context.optionTaskId }),\n ...(context.optionContextId !== undefined && { contextId: context.optionContextId }),\n };\n const rawDeferredResume = result.deferred?.resume;\n const rawSubmittedWaitForCompletion = result.submitted?.waitForCompletion;\n const finalizerLegacyFormatConverter =\n legacyFormatConverter ?? this.resolveLegacyFormatConverter(undefined, context.projectionCatalogs);\n\n if (result.success && result.data) {\n result.data = this.normalizeResponseToV3(taskType, result.data) as T;\n }\n\n result = this.wrapProductPolicySubmittedContinuation(\n result,\n taskType,\n context.productPolicyRequest,\n resumedOptions\n );\n if (result.status === 'working') {\n this.rememberProductPolicyRequestParams(taskType, context.productPolicyRequest, result, resumedOptions);\n }\n this.rememberLegacyFormatConverter(taskType, finalizerLegacyFormatConverter, result, resumedOptions);\n result = await this.applyProductPropertyPolicy(result, taskType, context.productPolicyRequest);\n throwIfAborted(options?.signal);\n\n if (context.canonical) {\n if (result.status === 'completed' && result.success && result.data) {\n this.rememberCanonicalProductRoutesForCompletion(\n taskType,\n result.data,\n finalizerLegacyFormatConverter,\n context.productPolicyRequest.account\n );\n }\n result = this.canonicalizeCreativeTaskResult(\n result,\n taskType,\n transformCompletedResponse,\n finalizerLegacyFormatConverter\n );\n result = this.wrapCanonicalCreativeContinuations(\n result,\n taskType,\n transformCompletedResponse,\n finalizerLegacyFormatConverter,\n context.routingSnapshot,\n context.productPolicyRequest.account\n );\n this.rememberCanonicalCreativeTaskIds(result, taskType, finalizerLegacyFormatConverter, context.routingSnapshot);\n if (result.success && result.status === 'completed' && result.data !== undefined) {\n this.rememberCanonicalPackageRoutesForTask(taskType, result.data, context.routingSnapshot);\n }\n } else if (result.status === 'completed' && result.success && result.data && transformCompletedResponse) {\n result = { ...result, data: transformCompletedResponse(result.data) };\n }\n\n if (context.handlerName) {\n this.rememberPreviewCreativeHandler(result, taskType, context.handlerName, resumedOptions);\n if (!completionHandlerAlreadyPublished) {\n await this.notifyCompletedStatusHandler(result, taskType, context.handlerName, resumedOptions);\n markCompletionHandlerAlreadyPublished(result);\n }\n }\n\n // Replace the canonical wrapper's recursive closure with the shared\n // finalizer. Durable tokens re-enter the public client path after restart;\n // in-process tokens keep their one-shot executor closure.\n if (result.deferred && rawDeferredResume) {\n result.deferred = {\n ...result.deferred,\n resume: input =>\n rawDeferredResume(input).then(next =>\n this.finalizeTaskResult(next, context, options, transformCompletedResponse, finalizerLegacyFormatConverter)\n ),\n };\n }\n if (result.submitted && rawSubmittedWaitForCompletion) {\n result.submitted = {\n ...result.submitted,\n waitForCompletion: async (pollInterval, signal) =>\n this.finalizeTaskResult(\n await rawSubmittedWaitForCompletion(pollInterval, signal),\n context,\n options,\n transformCompletedResponse,\n finalizerLegacyFormatConverter\n ),\n };\n }\n\n const finalized = attachMatch(result);\n await settlementAcknowledger?.(finalized);\n return finalized;\n }\n\n private async notifyCompletedStatusHandler<T>(\n result: TaskResult<T>,\n taskType: string,\n handlerName: keyof AsyncHandlerConfig,\n options?: TaskOptions\n ): Promise<void> {\n if (result.status !== 'completed' || !result.success || !this.asyncHandler) return;\n const handler = this.config.handlers?.[handlerName] as\n | ((data: unknown, metadata: Record<string, unknown>) => void | Promise<void>)\n | undefined;\n if (!handler) return;\n throwIfAborted(options?.signal);\n await handler(result.data, {\n operation_id: options?.contextId || 'sync',\n context_id: options?.contextId,\n task_id: result.metadata.taskId,\n agent_id: this.agent.id,\n task_type: taskType,\n status: result.status,\n timestamp: new Date().toISOString(),\n });\n throwIfAborted(options?.signal);\n }\n\n private canonicalCreativeInputHandler(\n taskType: string,\n inputHandler?: InputHandler,\n canonical = CANONICAL_CREATIVE_ACTIVITY_TASKS.has(taskType)\n ): InputHandler | undefined {\n if (!inputHandler || !canonical) return inputHandler;\n return async context => {\n const active = canonicalCreativeExecutionStorage.getStore();\n const converter = this.finalLegacyFormatConverter(\n active?.taskType === taskType ? active.legacyFormatConverter : undefined\n );\n const project = <T>(value: T): CanonicalCreativeResponse<T> =>\n projectCanonicalCreativeAncillaryValue(value, taskType, converter) as CanonicalCreativeResponse<T>;\n const messages = context.messages.map(message => ({\n ...message,\n content: project(message.content),\n })) as typeof context.messages;\n const safeContext = {\n ...context,\n messages,\n inputRequest: project(context.inputRequest) as typeof context.inputRequest,\n getSummary: () => messages.map(message => `${message.role}: ${JSON.stringify(message.content)}`).join('\\n'),\n getPreviousResponse: (field: string) => project(context.getPreviousResponse(field)),\n };\n return inputHandler(safeContext);\n };\n }\n\n private projectCanonicalCreativeData<T>(\n taskType: string,\n data: T,\n transform?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter\n ): CanonicalCreativeResponse<T> {\n let projected = this.normalizeResponseToV3(taskType, data) as T;\n const record = projected && typeof projected === 'object' ? (projected as Record<string, unknown>) : undefined;\n const canProjectRead =\n taskType === 'get_products'\n ? Array.isArray(record?.products)\n : taskType === 'list_creatives'\n ? Array.isArray(record?.creatives)\n : true;\n if (transform && canProjectRead) {\n projected = transform(projected);\n } else if (canProjectRead && taskType === 'get_products' && record) {\n const active = canonicalCreativeExecutionStorage.getStore();\n const converter = this.finalLegacyFormatConverter(\n legacyFormatConverter ?? (active?.taskType === taskType ? active.legacyFormatConverter : undefined)\n );\n const { response, diagnostics } = toCanonicalOnlyResponse(record as { products?: V1Product[] }, {\n legacyFormatConverter: converter,\n });\n const { _message: _dropLegacyMessage, ...canonical } = response as typeof response & { _message?: unknown };\n void _dropLegacyMessage;\n projected = { ...canonical, projection: { diagnostics } } as T;\n } else if (canProjectRead && taskType === 'list_creatives' && record) {\n const active = canonicalCreativeExecutionStorage.getStore();\n const activeLegacyFormatConverter = this.finalLegacyFormatConverter(\n legacyFormatConverter ?? (active?.taskType === taskType ? active.legacyFormatConverter : undefined)\n );\n const { _message: _dropLegacyMessage, ...safe } = record;\n void _dropLegacyMessage;\n projected = {\n ...safe,\n creatives: (record.creatives as unknown[]).map(creative =>\n projectCreativeForDelivery(\n creative as import('../types/tools.generated').CreativeAsset,\n {},\n 'canonical',\n 'list_creatives',\n activeLegacyFormatConverter\n )\n ),\n } as T;\n } else if (canProjectRead && CANONICAL_CREATIVE_ACTIVITY_TASKS.has(taskType)) {\n const active = canonicalCreativeExecutionStorage.getStore();\n projected = projectCanonicalCreativeResponseValue(\n projected,\n taskType,\n this.finalLegacyFormatConverter(\n legacyFormatConverter ?? (active?.taskType === taskType ? active.legacyFormatConverter : undefined)\n )\n ) as T;\n }\n return stripLegacyCreativeIdentity(projected);\n }\n\n private canonicalizeCreativeTaskResult<T>(\n result: TaskResult<T>,\n taskType: string,\n transform?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter\n ): TaskResult<T> {\n const projectedData =\n result.data !== undefined\n ? this.projectCanonicalCreativeData(taskType, result.data, transform, legacyFormatConverter)\n : undefined;\n const errorInstance = result.errorInstance;\n const converter = this.finalLegacyFormatConverter(legacyFormatConverter);\n const metadataRecord = result.metadata as TaskResult<T>['metadata'] & { inputRequest?: unknown };\n const semanticMetadata = {\n ...metadataRecord,\n ...(metadataRecord.inputRequest !== undefined && {\n inputRequest: projectCanonicalCreativeAncillaryValue(metadataRecord.inputRequest, taskType, converter),\n }),\n };\n const semanticConversation = result.conversation?.map(message => ({\n ...message,\n content: projectCanonicalCreativeAncillaryValue(message.content, taskType, converter),\n }));\n const safe = stripLegacyCreativeIdentity({\n data: projectedData,\n metadata: semanticMetadata,\n conversation: semanticConversation,\n debug_logs: result.debug_logs,\n adcpError: result.adcpError,\n error: result.error,\n governance: result.governance,\n governanceOutcome: result.governanceOutcome,\n governanceOutcomeError: result.governanceOutcomeError,\n deferredQuestion: result.deferred?.question,\n // Token source only: discarded below, but lets the sanitizer remove exact\n // legacy IDs/URLs when the seller repeats them in messages or diagnostics.\n legacySource: result.data,\n }) as Record<string, any>;\n\n const safeErrorInstance = errorInstance ? canonicalCreativeErrorInstance(errorInstance, result.data) : undefined;\n\n const safeDeferred = result.deferred\n ? { ...result.deferred, ...(result.deferred.question !== undefined && { question: safe.deferredQuestion }) }\n : undefined;\n\n return attachMatch({\n ...result,\n ...(result.data !== undefined && { data: safe.data as T }),\n metadata: safe.metadata,\n ...(result.conversation !== undefined && { conversation: safe.conversation }),\n ...(result.debug_logs !== undefined && { debug_logs: safe.debug_logs }),\n ...(result.adcpError !== undefined && { adcpError: safe.adcpError }),\n ...(result.error !== undefined && { error: safe.error }),\n ...(result.governance !== undefined && { governance: safe.governance }),\n ...(result.governanceOutcome !== undefined && { governanceOutcome: safe.governanceOutcome }),\n ...(result.governanceOutcomeError !== undefined && { governanceOutcomeError: safe.governanceOutcomeError }),\n ...(safeDeferred !== undefined && { deferred: safeDeferred }),\n ...(safeErrorInstance !== undefined && { errorInstance: safeErrorInstance }),\n } as TaskResult<T>);\n }\n\n private canonicalizeCreativeTaskInfo<T>(\n taskInfo: TaskInfo,\n taskType: string,\n transform?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter\n ): TaskInfo {\n const source = taskInfo.result;\n const projected =\n source !== undefined\n ? this.projectCanonicalCreativeData(taskType, source as T, transform, legacyFormatConverter)\n : undefined;\n const { legacySource: _dropLegacySource, ...safe } = stripLegacyCreativeIdentity({\n ...taskInfo,\n taskType,\n ...(source !== undefined && { result: projected }),\n legacySource: source,\n }) as TaskInfo & { legacySource?: unknown };\n void _dropLegacySource;\n return safe as TaskInfo;\n }\n\n private wrapCanonicalCreativeContinuations<T>(\n result: TaskResult<T>,\n taskType: string,\n transform?: (data: T) => T,\n legacyFormatConverter?: LegacyFormatConverter,\n routingRequest?: unknown,\n productAccount?: unknown\n ): TaskResult<T> {\n const routingSnapshot = canonicalCreativeRoutingSnapshot(taskType, routingRequest);\n if (result.submitted) {\n const submitted = result.submitted;\n result = {\n ...result,\n submitted: {\n ...submitted,\n track: async transport => {\n const tracked = await canonicalCreativeExecutionStorage.run(\n { taskType, canonical: true, legacyFormatConverter },\n () => submitted.track(transport)\n );\n if (tracked.status === 'completed' && tracked.result !== undefined) {\n this.rememberCanonicalProductRoutesForCompletion(\n taskType,\n tracked.result,\n legacyFormatConverter,\n productAccount\n );\n }\n const canonical = this.canonicalizeCreativeTaskInfo<T>(tracked, taskType, transform, legacyFormatConverter);\n if (canonical.status === 'completed' && canonical.result !== undefined) {\n this.rememberCanonicalPackageRoutesForTask(taskType, canonical.result, routingSnapshot);\n }\n return canonical;\n },\n waitForCompletion: async (pollInterval, signal) => {\n const completed = await canonicalCreativeExecutionStorage.run(\n { taskType, canonical: true, legacyFormatConverter },\n () => submitted.waitForCompletion(pollInterval, signal)\n );\n if (completed.success && completed.status === 'completed' && completed.data !== undefined) {\n this.rememberCanonicalProductRoutesForCompletion(\n taskType,\n completed.data,\n legacyFormatConverter,\n productAccount\n );\n }\n const canonical = this.canonicalizeCreativeTaskResult(\n completed,\n taskType,\n transform,\n legacyFormatConverter\n );\n if (canonical.success && canonical.status === 'completed' && canonical.data !== undefined) {\n this.rememberCanonicalPackageRoutesForTask(taskType, canonical.data, routingSnapshot);\n }\n this.rememberCanonicalCreativeTaskIds(canonical, taskType, legacyFormatConverter, routingSnapshot);\n return this.wrapCanonicalCreativeContinuations(\n canonical,\n taskType,\n transform,\n legacyFormatConverter,\n routingSnapshot,\n productAccount\n );\n },\n },\n } as TaskResult<T>;\n }\n if (result.deferred) {\n const deferred = result.deferred;\n result = {\n ...result,\n deferred: {\n ...deferred,\n resume: async input => {\n const resumed = await canonicalCreativeExecutionStorage.run(\n { taskType, canonical: true, legacyFormatConverter },\n () => deferred.resume(input)\n );\n const canonical = this.canonicalizeCreativeTaskResult(resumed, taskType, transform, legacyFormatConverter);\n if (canonical.success && canonical.status === 'completed' && canonical.data !== undefined) {\n this.rememberCanonicalPackageRoutesForTask(taskType, canonical.data, routingSnapshot);\n }\n this.rememberCanonicalCreativeTaskIds(canonical, taskType, legacyFormatConverter, routingSnapshot);\n return this.wrapCanonicalCreativeContinuations(\n canonical,\n taskType,\n transform,\n legacyFormatConverter,\n routingSnapshot,\n productAccount\n );\n },\n },\n } as TaskResult<T>;\n }\n return attachMatch(result);\n }\n\n private rememberCanonicalCreativeTaskIds<T>(\n result: TaskResult<T>,\n taskType: string,\n legacyFormatConverter?: LegacyFormatConverter,\n routingRequest?: unknown\n ): void {\n const routingSnapshot = canonicalCreativeRoutingSnapshot(taskType, routingRequest);\n const keys = [\n result.metadata.taskId,\n result.metadata.contextId,\n result.metadata.serverTaskId,\n result.submitted?.taskId,\n ];\n for (const key of keys) {\n if (!key) continue;\n this.rememberCanonicalCreativeTaskAssociation(key, taskType, legacyFormatConverter, routingSnapshot);\n }\n }\n\n private rememberPreviewCreativeHandler<T>(\n result: TaskResult<T>,\n taskType: string,\n handlerName: keyof AsyncHandlerConfig,\n options?: TaskOptions\n ): void {\n if (taskType !== 'preview_creative') return;\n const handler = handlerName === 'onPreviewCreativeLegacyStatusChange' ? 'legacy' : 'canonical';\n const metadata = result.metadata as typeof result.metadata & { operationId?: string };\n const keys = [\n metadata.operationId,\n metadata.taskId,\n metadata.contextId,\n metadata.serverTaskId,\n result.submitted?.taskId,\n options?.taskId,\n options?.contextId,\n ];\n for (const key of keys) {\n if (!key) continue;\n this.rememberPreviewCreativeHandlerKey(key, handler);\n if (handler === 'legacy') this.canonicalCreativeTaskAssociations.delete(key);\n }\n }\n\n private rememberPreviewCreativeHandlerKey(key: string, handler: 'canonical' | 'legacy'): void {\n this.previewCreativeHandlersByTask.delete(key);\n this.previewCreativeHandlersByTask.set(key, handler);\n while (this.previewCreativeHandlersByTask.size > TASK_SCOPED_STATE_LIMIT) {\n const oldest = this.previewCreativeHandlersByTask.keys().next().value;\n if (oldest === undefined) break;\n this.previewCreativeHandlersByTask.delete(oldest);\n }\n }\n\n private previewCreativeHandlerForWebhook(\n metadata: Pick<WebhookMetadata, 'operation_id' | 'task_id' | 'context_id' | 'task_type'>\n ): 'canonical' | 'legacy' | undefined {\n if (metadata.task_type !== 'preview_creative') return undefined;\n for (const key of [metadata.operation_id, metadata.task_id, metadata.context_id]) {\n if (!key) continue;\n const handler = this.previewCreativeHandlersByTask.get(key);\n if (!handler) continue;\n this.previewCreativeHandlersByTask.delete(key);\n this.previewCreativeHandlersByTask.set(key, handler);\n return handler;\n }\n return undefined;\n }\n\n private isCanonicalCreativeWebhook(\n metadata: Pick<WebhookMetadata, 'operation_id' | 'task_id' | 'context_id' | 'task_type'>\n ): boolean {\n if (CANONICAL_CREATIVE_ACTIVITY_TASKS.has(metadata.task_type)) return true;\n if (metadata.task_type !== 'preview_creative') return false;\n return [metadata.operation_id, metadata.task_id, metadata.context_id].some(\n key => this.canonicalCreativeTaskAssociation(key) !== undefined\n );\n }\n\n private rememberCanonicalCreativeTaskAssociation(\n key: string,\n taskType: string,\n legacyFormatConverter?: LegacyFormatConverter,\n canonicalRequest?: unknown\n ): void {\n const previous = this.canonicalCreativeTaskAssociations.get(key);\n const routingSnapshot = canonicalCreativeRoutingSnapshot(taskType, canonicalRequest);\n const effectiveRoutingSnapshot =\n routingSnapshot ?? (previous?.taskType === taskType ? previous.routingSnapshot : undefined);\n this.canonicalCreativeTaskAssociations.delete(key);\n this.canonicalCreativeTaskAssociations.set(key, {\n taskType,\n legacyFormatConverter,\n ...(effectiveRoutingSnapshot ? { routingSnapshot: effectiveRoutingSnapshot } : {}),\n });\n while (this.canonicalCreativeTaskAssociations.size > TASK_SCOPED_STATE_LIMIT) {\n const oldest = this.canonicalCreativeTaskAssociations.keys().next().value;\n if (oldest === undefined) break;\n this.canonicalCreativeTaskAssociations.delete(oldest);\n }\n }\n\n private canonicalCreativeTaskAssociation(key: string | undefined): CanonicalCreativeTaskAssociation | undefined {\n if (!key) return undefined;\n const association = this.canonicalCreativeTaskAssociations.get(key);\n if (!association) return undefined;\n // Touch the entry so actively-polled tasks and continued conversations\n // survive ahead of abandoned associations when the cache reaches its cap.\n this.canonicalCreativeTaskAssociations.delete(key);\n this.canonicalCreativeTaskAssociations.set(key, association);\n return association;\n }\n\n private forgetCanonicalCreativeTaskAssociationKeys(keys: Array<string | undefined>): void {\n for (const key of keys) {\n if (key) this.canonicalCreativeTaskAssociations.delete(key);\n }\n }\n\n /**\n * Drop products that arrive without a usable `pricing_options[]` array from a\n * completed `get_products` response. `pricing_options` is required and\n * non-empty in AdCP 3.1; a product with no pricing model can't be bought, so\n * the SDK rejects it before callers and completion handlers see the list.\n *\n * Controlled by `config.validation.rejectProductsWithoutPricingOptions`\n * (default `true`) and applied on every completion path via\n * {@link applyProductPropertyPolicy}, independent of the response validation\n * mode.\n */\n private enforceProductPricingOptions<T>(result: TaskResult<T>, taskType: string): TaskResult<T> {\n if (taskType !== 'get_products') return result;\n if (this.config.validation?.rejectProductsWithoutPricingOptions === false) return result;\n if (!result.success || result.status !== 'completed' || !result.data) return result;\n\n const response = result.data as unknown as GetProductsResponse;\n const products = (response as { products?: unknown }).products;\n if (!Array.isArray(products) || products.length === 0) return result;\n\n const kept: unknown[] = [];\n const rejected: Array<{ index: number; product_id?: string }> = [];\n products.forEach((product, index) => {\n if (productHasPricingOptions(product)) {\n kept.push(product);\n return;\n }\n const productId = productIdForPricingDiagnostics(product);\n rejected.push({ index, ...(productId ? { product_id: productId } : {}) });\n });\n\n if (rejected.length === 0) return result;\n\n const message = `Rejected ${rejected.length} product${rejected.length === 1 ? '' : 's'} without pricing_options`;\n\n // Mutate in place (like the property-policy filter path) so the\n // non-enumerable `match` accessor and result identity survive.\n result.data = { ...(response as unknown as Record<string, unknown>), products: kept } as T;\n result.metadata = {\n ...result.metadata,\n productPricingPolicy: {\n ok: true,\n accepted_count: kept.length,\n rejected_count: rejected.length,\n rejected_products: rejected,\n },\n };\n result.debug_logs = [\n ...(result.debug_logs ?? []),\n {\n type: 'warning',\n message,\n timestamp: new Date().toISOString(),\n details: {\n code: 'product_missing_pricing_options',\n task: taskType,\n agent_id: this.agent.id,\n rejected_count: rejected.length,\n rejected_products: rejected,\n },\n },\n ];\n return result;\n }\n\n private async applyProductPropertyPolicy<T>(\n result: TaskResult<T>,\n taskType: string,\n requestParams: Record<string, unknown>\n ): Promise<TaskResult<T>> {\n // Reject non-transactable products (no pricing_options) before any\n // property-policy evaluation, regardless of whether a property policy is\n // configured. This runs on the same completion chokepoint so it covers the\n // sync, polling, track, and webhook paths uniformly.\n result = this.enforceProductPricingOptions(result, taskType);\n\n const policyConfig = this.config.validation?.productPropertyPolicy;\n if (policyConfig === false || taskType !== 'get_products') return result;\n if (!result.success || result.status !== 'completed' || !result.data) return result;\n\n const response = result.data as unknown as GetProductsResponse;\n if (!Array.isArray(response.products)) return result;\n\n const requestPropertyList = propertyListReferenceFromRequest(requestParams);\n const {\n mode = 'filter',\n message = 'Property list not adhered to',\n enforceRequestPropertyList = true,\n propertyListResolveOptions,\n ...explicitPolicy\n } = policyConfig || {};\n const policy: BuyerPropertyPolicy = {\n ...explicitPolicy,\n };\n\n let resolvedRequestPropertyList:\n | {\n listId: string;\n agentUrl: string;\n identifierCount: number;\n cacheValidUntil?: string;\n }\n | undefined;\n\n if (requestPropertyList && enforceRequestPropertyList) {\n try {\n const resolved = await resolvePropertyList(requestPropertyList, propertyListResolveOptions);\n const comparableIdentifiers = comparablePropertyIdentifiers(resolved.identifiers);\n const unsupportedIdentifiers = unsupportedPropertyIdentifiers(resolved.identifiers);\n if (unsupportedIdentifiers.length > 0) {\n throw new Error('property_list_unsupported_identifier_types');\n }\n if (comparableIdentifiers.length > 0 || resolved.identifiers.length === 0) {\n policy.allowedPropertyIdentifiers = [...(policy.allowedPropertyIdentifiers ?? []), ...comparableIdentifiers];\n policy.requireAllowedPropertyMatch = true;\n }\n policy.strict = policy.strict ?? true;\n resolvedRequestPropertyList = {\n listId: resolved.listId,\n agentUrl: resolved.agentUrl,\n identifierCount: resolved.identifiers.length,\n ...(resolved.cacheValidUntil ? { cacheValidUntil: resolved.cacheValidUntil } : {}),\n };\n } catch (err) {\n const errorCode = propertyListResolutionErrorCode(err);\n const diagnosticAgentUrl = sanitizeDiagnosticUrl(requestPropertyList.agent_url);\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n data: response as unknown as T,\n error: `${message}: could not resolve property_list ${requestPropertyList.list_id}`,\n metadata: {\n ...result.metadata,\n status: 'failed',\n productPropertyPolicy: {\n mode,\n ok: false,\n accepted_count: 0,\n rejected_count: response.products.length,\n flagged_count: 0,\n message,\n diagnostics: [],\n request_property_list: {\n list_id: requestPropertyList.list_id,\n agent_url: diagnosticAgentUrl,\n resolution_error: errorCode,\n },\n },\n },\n conversation: result.conversation,\n debug_logs: [\n ...(result.debug_logs ?? []),\n {\n type: 'product_property_policy',\n message,\n mode,\n ok: false,\n request_property_list: {\n list_id: requestPropertyList.list_id,\n agent_url: diagnosticAgentUrl,\n resolution_error: errorCode,\n },\n },\n ],\n });\n }\n }\n\n if (!hasProductPropertyPolicyRules(policy)) return result;\n\n let validation: ProductPropertyPolicyValidationResult<ProductPolicyProductLike>;\n try {\n validation = validateProductsAgainstPropertyPolicy({\n products: response.products,\n policy,\n mode,\n });\n } catch (err) {\n if (!(err instanceof ProductPropertyPolicyError)) throw err;\n validation = err.result;\n }\n\n const summary = {\n mode,\n ok: validation.ok,\n accepted_count: validation.acceptedProducts.length,\n rejected_count: validation.rejectedProducts.length,\n flagged_count: validation.flaggedProducts.length,\n ...(validation.ok ? {} : { message }),\n ...(resolvedRequestPropertyList\n ? {\n request_property_list: {\n list_id: resolvedRequestPropertyList.listId,\n agent_url: sanitizeDiagnosticUrl(resolvedRequestPropertyList.agentUrl),\n identifier_count: resolvedRequestPropertyList.identifierCount,\n ...(resolvedRequestPropertyList.cacheValidUntil\n ? { cache_valid_until: resolvedRequestPropertyList.cacheValidUntil }\n : {}),\n },\n }\n : {}),\n diagnostics: validation.diagnostics as ProductPropertyPolicyDiagnostic[],\n };\n result.metadata.productPropertyPolicy = summary;\n\n if (validation.diagnostics.length > 0) {\n result.debug_logs = [\n ...(result.debug_logs ?? []),\n {\n type: 'product_property_policy',\n message: validation.ok ? 'Product property policy evaluated' : message,\n mode,\n ok: validation.ok,\n accepted_count: validation.acceptedProducts.length,\n rejected_count: validation.rejectedProducts.length,\n flagged_count: validation.flaggedProducts.length,\n ...(summary.request_property_list ? { request_property_list: summary.request_property_list } : {}),\n diagnostics: validation.diagnostics,\n },\n ];\n }\n\n if (mode === 'filter') {\n result.data = {\n ...(response as unknown as Record<string, unknown>),\n products: validation.products,\n } as T;\n return result;\n }\n\n if (mode === 'reject_response' && !validation.ok) {\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n data: response as unknown as T,\n error: message,\n metadata: {\n ...result.metadata,\n status: 'failed',\n productPropertyPolicy: summary,\n },\n conversation: result.conversation,\n debug_logs: result.debug_logs,\n });\n }\n\n return result;\n }\n\n private rememberProductPolicyRequestParams<T>(\n taskType: string,\n requestParams: Record<string, unknown>,\n result: TaskResult<T>,\n options?: TaskOptions\n ): void {\n this.rememberProductPolicyRequestState(\n taskType,\n { request: productPolicyRequestSnapshot(requestParams) },\n result,\n options\n );\n }\n\n private rememberProductPolicyRequestState<T>(\n taskType: string,\n requestState: ProductPolicyRequestState,\n result: TaskResult<T>,\n options?: TaskOptions\n ): void {\n if (taskType !== 'get_products') return;\n if (result.status !== 'submitted' && result.status !== 'working') return;\n\n const keys = new Set<string>();\n if (result.metadata.taskId) keys.add(result.metadata.taskId);\n if (result.metadata.contextId) keys.add(result.metadata.contextId);\n if (result.metadata.serverTaskId) keys.add(result.metadata.serverTaskId);\n if (result.submitted?.taskId) keys.add(result.submitted.taskId);\n if (options?.taskId) keys.add(options.taskId);\n if (options?.contextId) keys.add(options.contextId);\n\n for (const key of keys) {\n this.productPolicyRequestParamsByTask.delete(key);\n this.productPolicyRequestParamsByTask.set(key, requestState);\n while (this.productPolicyRequestParamsByTask.size > TASK_SCOPED_STATE_LIMIT) {\n const oldest = this.productPolicyRequestParamsByTask.keys().next().value;\n if (oldest === undefined) break;\n this.productPolicyRequestParamsByTask.delete(oldest);\n }\n }\n }\n\n private rememberLegacyFormatConverter<T>(\n taskType: string,\n converter: LegacyFormatConverter | undefined,\n result: TaskResult<T>,\n options?: TaskOptions\n ): void {\n if (!converter || (taskType !== 'get_products' && taskType !== 'list_creatives')) return;\n const metadata = result.metadata as typeof result.metadata & { operationId?: string };\n const keys = [\n metadata.operationId,\n metadata.taskId,\n metadata.contextId,\n metadata.serverTaskId,\n options?.taskId,\n options?.contextId,\n ];\n for (const key of keys) {\n if (key) this.rememberCanonicalCreativeTaskAssociation(key, taskType, converter);\n }\n }\n\n private legacyFormatConverterForWebhook(metadata: WebhookMetadata): LegacyFormatConverter | undefined {\n return (\n this.canonicalCreativeTaskAssociation(metadata.operation_id)?.legacyFormatConverter ??\n this.canonicalCreativeTaskAssociation(metadata.task_id)?.legacyFormatConverter ??\n this.canonicalCreativeTaskAssociation(metadata.context_id)?.legacyFormatConverter ??\n this.resolveLegacyFormatConverter()\n );\n }\n\n private forgetProductPolicyRequestParams(metadata: WebhookMetadata): void {\n const aliases = [metadata.operation_id, metadata.task_id, metadata.context_id];\n const states = new Set(\n aliases\n .filter((key): key is string => key !== undefined)\n .map(key => this.productPolicyRequestParamsByTask.get(key))\n .filter((value): value is ProductPolicyRequestState => value !== undefined)\n );\n for (const state of states) state.request = undefined;\n this.forgetProductPolicyRequestParamKeys(aliases);\n if (states.size === 0) return;\n // All aliases for one request share the same immutable snapshot. A webhook\n // may name only operation/task/context, so remove any caller-supplied A2A\n // aliases that point at that same snapshot as well.\n for (const [key, state] of this.productPolicyRequestParamsByTask) {\n if (states.has(state)) this.productPolicyRequestParamsByTask.delete(key);\n }\n }\n\n private forgetProductPolicyRequestParamKeys(keys: Array<string | undefined>): void {\n for (const key of keys) {\n if (!key) continue;\n this.productPolicyRequestParamsByTask.delete(key);\n }\n }\n\n private wrapProductPolicySubmittedContinuation<T>(\n result: TaskResult<T>,\n taskType: string,\n requestParams: Record<string, unknown>,\n options?: TaskOptions\n ): TaskResult<T> {\n if (taskType !== 'get_products' || result.status !== 'submitted' || !result.submitted) return result;\n\n const submitted = result.submitted;\n const policyState: { request?: Readonly<Record<string, unknown>> } = {\n request: productPolicyRequestSnapshot(requestParams),\n };\n this.rememberProductPolicyRequestState(taskType, policyState, result, options);\n const retainedKeys = [\n result.metadata.taskId,\n result.metadata.contextId,\n result.metadata.serverTaskId,\n submitted.taskId,\n options?.taskId,\n options?.contextId,\n ];\n result.submitted = {\n ...submitted,\n track: async transport => {\n const taskInfo = await submitted.track(transport);\n const terminal = ['completed', 'failed', 'rejected', 'canceled'].includes(taskInfo.status);\n try {\n return await this.applyProductPropertyPolicyToTaskInfo(\n taskInfo,\n taskType,\n (policyState.request ?? {}) as Record<string, unknown>\n );\n } finally {\n if (terminal) {\n policyState.request = undefined;\n this.forgetProductPolicyRequestParamKeys([...retainedKeys, taskInfo.taskId]);\n }\n }\n },\n waitForCompletion: async (pollInterval, signal) => {\n let completed = await submitted.waitForCompletion(pollInterval, signal);\n if (completed.success && completed.data) {\n completed.data = this.normalizeResponseToV3(taskType, completed.data) as T;\n }\n const terminal = completed.status === 'completed' || completed.status === 'failed';\n try {\n return await this.applyProductPropertyPolicy(\n completed,\n taskType,\n (policyState.request ?? {}) as Record<string, unknown>\n );\n } finally {\n if (terminal) {\n policyState.request = undefined;\n this.forgetProductPolicyRequestParamKeys([\n ...retainedKeys,\n completed.metadata.taskId,\n completed.metadata.serverTaskId,\n ]);\n }\n }\n },\n };\n\n return result;\n }\n\n private async applyProductPropertyPolicyToTaskInfo(\n taskInfo: TaskInfo,\n taskType: string,\n requestParams: Record<string, unknown>\n ): Promise<TaskInfo> {\n if (taskType !== 'get_products' || taskInfo.status !== 'completed' || !taskInfo.result) return taskInfo;\n\n const policyResult = await this.applyProductPropertyPolicy(\n attachMatch({\n success: true as const,\n status: 'completed' as const,\n data: this.normalizeResponseToV3(taskType, taskInfo.result),\n metadata: {\n taskId: taskInfo.taskId,\n taskName: taskInfo.taskType,\n agent: { id: this.agent.id, name: this.agent.name, protocol: this.agent.protocol },\n responseTimeMs: Math.max(0, Date.now() - taskInfo.createdAt),\n timestamp: new Date().toISOString(),\n clarificationRounds: 0,\n status: 'completed',\n },\n debug_logs: [],\n }),\n taskType,\n requestParams\n );\n\n if (policyResult.success) {\n return { ...taskInfo, result: policyResult.data };\n }\n\n return {\n ...taskInfo,\n status: 'failed',\n result: policyResult.data,\n error: policyResult.error,\n message: policyResult.error,\n };\n }\n\n private productPolicyRequestParamsForWebhook(metadata: WebhookMetadata): Record<string, unknown> {\n return (\n this.executor.getRequestParams(metadata.operation_id) ??\n this.executor.getRequestParams(metadata.task_id) ??\n this.productPolicyRequestParamsForKey(metadata.operation_id) ??\n this.productPolicyRequestParamsForKey(metadata.task_id) ??\n this.productPolicyRequestParamsForKey(metadata.context_id) ??\n {}\n );\n }\n\n private productPolicyRequestParamsForKey(key: string | undefined): Record<string, unknown> | undefined {\n if (!key) return undefined;\n const state = this.productPolicyRequestParamsByTask.get(key);\n if (!state?.request) return undefined;\n this.productPolicyRequestParamsByTask.delete(key);\n this.productPolicyRequestParamsByTask.set(key, state);\n return state.request as Record<string, unknown>;\n }\n\n private async applyProductPropertyPolicyToWebhookResult(\n result: AdCPAsyncResponseData | undefined,\n metadata: WebhookMetadata\n ): Promise<{ result: AdCPAsyncResponseData | undefined; metadata: WebhookMetadata; suppressHandler: boolean }> {\n if (metadata.task_type !== 'get_products' || metadata.status !== 'completed' || !result) {\n return { result, metadata, suppressHandler: false };\n }\n\n const policyResult = await this.applyProductPropertyPolicy<AdCPAsyncResponseData>(\n attachMatch({\n success: true as const,\n status: 'completed' as const,\n data: result,\n metadata: {\n taskId: metadata.operation_id,\n taskName: metadata.task_type,\n agent: { id: this.agent.id, name: this.agent.name, protocol: this.agent.protocol },\n responseTimeMs: 0,\n timestamp: metadata.timestamp,\n clarificationRounds: 0,\n status: 'completed',\n },\n debug_logs: [],\n }),\n metadata.task_type,\n this.productPolicyRequestParamsForWebhook(metadata)\n );\n\n const nextMetadata: WebhookMetadata = {\n ...metadata,\n status: policyResult.success ? metadata.status : 'failed',\n ...(policyResult.error ? { message: policyResult.error } : {}),\n ...(policyResult.metadata.productPropertyPolicy\n ? { productPropertyPolicy: policyResult.metadata.productPropertyPolicy }\n : {}),\n ...(policyResult.metadata.productPricingPolicy\n ? { productPricingPolicy: policyResult.metadata.productPricingPolicy }\n : {}),\n };\n\n return {\n result: policyResult.data as AdCPAsyncResponseData | undefined,\n metadata: nextMetadata,\n suppressHandler: !policyResult.success,\n };\n }\n\n /**\n * Adapt a request for the detected server wire version and the seller's\n * AdCP protocol version. Applies wire-format adapters (v2.5) when talking\n * to a v2 server, then applies protocol-version adapters (e.g. stripping\n * 3.1-only fields for a 3.0 seller). Returns the adapted params and any\n * drift log entries describing what was changed.\n *\n * Runs after `detectServerVersion` so capabilities are available and the\n * current call's tool schemas can be supplied without cross-tenant caching.\n */\n private adaptRequest(\n taskType: string,\n params: any,\n serverVersion: string,\n debugLogs?: any[],\n perCallToolSchemas?: ToolSchemaMap,\n perCallCapabilities?: AdcpCapabilities\n ): { params: any; driftLogs: Record<string, unknown>[] } {\n const driftLogs: Record<string, unknown>[] = [];\n let adapted = params;\n\n if (serverVersion !== 'v3') {\n // Dispatch through the legacy v2.5 adapter registry. Per-tool pairs\n // live in `src/lib/adapters/legacy/v2-5/<tool>.ts`. Tools without a\n // registered pair (or pairs whose request side is pass-through)\n // leave `adapted` unchanged. Adding a future legacy version means\n // adding a sibling `legacy/<version>/` directory, not editing\n // this dispatch.\n const pair = getV25Adapter(taskType);\n if (pair) adapted = pair.adaptRequest(adapted);\n }\n\n // Strip any top-level fields not declared in the agent's tool schema.\n // This handles partial implementations (agents that omit some fields)\n // and prevents unknown fields from causing validation errors on the\n // remote server.\n // Fails open when no schema is cached OR when the schema declares no\n // properties (JSON Schema semantics: an object with no properties\n // and no `additionalProperties: false` accepts any shape). Post-#909,\n // framework-registered agents publish `{ type: 'object', properties: {} }`\n // on tools/list — treating that as \"strip everything\" would silently\n // drop every field the buyer sent.\n // MCP-only in practice: A2A agents don't populate cachedToolSchemas.\n //\n // Note: the empty-properties state from framework agents is intentional\n // (LLM context-window economy — see `PASSTHROUGH_INPUT_SCHEMA` in\n // `create-adcp-server.ts`). Don't try to \"fix\" it by wiring per-tool\n // schemas into `tools/list`. If you genuinely need to know a tool's\n // shape (gating, validation, version adaptation), read raw JSON from\n // `schemas/cache/{version}/` via `schema-loader.ts`. The right defense\n // against unknown-field errors is to gate at the *injection site*\n // (e.g. `applyBrandInvariant` in the storyboard runner — see #940),\n // not to lean on this strip path as a backstop.\n const toolSchema = (perCallToolSchemas ?? this.cachedToolSchemas)?.get(taskType);\n if (toolSchema && Object.keys(toolSchema).length > 0) {\n const declaredFields = new Set(Object.keys(toolSchema));\n\n // The v2 adapter may rename fields (e.g. brand → brand_manifest) that a\n // v3 server — misdetected as v2 — doesn't declare. Reconcile known\n // adapter mappings so the value isn't silently dropped.\n //\n // CRITICAL: only alias when the JS type of the moved value is\n // compatible with the destination field's declared shape. v2.5 sellers\n // (e.g. Wonderstruck) declare `brand` in their tool schema as a\n // BrandReference object — v2 adapter produces a `brand_manifest` URL\n // string, and blindly aliasing the string into the object slot causes\n // the seller to reject with `Input should be a valid dictionary or\n // instance of BrandReference`. Skip the alias when shapes don't match\n // and let the field-stripping path drop the v2-shaped value cleanly.\n const adapterAliases: [string, string][] = [['brand_manifest', 'brand']];\n for (const [adapterField, schemaField] of adapterAliases) {\n if (\n adapted[adapterField] !== undefined &&\n !declaredFields.has(adapterField) &&\n declaredFields.has(schemaField) &&\n adapted[schemaField] === undefined &&\n valueMatchesSchemaType(adapted[adapterField], (toolSchema as Record<string, unknown>)[schemaField])\n ) {\n adapted[schemaField] = adapted[adapterField];\n delete adapted[adapterField];\n }\n }\n\n // Protocol envelope fields are always preserved — they live at the\n // protocol layer, not in individual tool schemas.\n const envelopeFields = ADCP_ENVELOPE_FIELDS;\n const filtered: Record<string, unknown> = {};\n const schemaStripped: string[] = [];\n\n // A field is preserved when it's declared by the agent's (possibly\n // partial) tool schema, OR it's a protocol envelope field, OR it's a\n // CANONICAL top-level field for this task in the resolved AdCP version.\n //\n // The canonical-schema union is the fix for partial-schema sellers\n // (e.g. \"Open Ads\", https://api.openads.ai/mcp): such agents\n // under-declare their `tools/list` inputSchema, so intersecting only\n // their self-declared fields silently dropped canonical — sometimes\n // REQUIRED — AdCP request fields (`media_buy_id` on update_media_buy,\n // `media_buy_ids` on get_media_buy_delivery, `creative_ids` on\n // sync_creatives) before the request left the client, breaking\n // media-buy updates and delivery polling. Only fields unknown to BOTH\n // the agent schema AND the canonical request schema are genuine junk\n // and get stripped.\n //\n // `taskType` is the snake_case tool name (e.g. `update_media_buy`),\n // which is exactly the `toolName` key `schemaAllowsTopLevelField` looks\n // up as `${toolName}::request` in the loader's fileIndex. The version\n // arg is the raw resolved pin (`this.resolvedAdcpVersion`); the loader\n // resolves the bundle key internally via `ensureInit`/`resolveBundleKey`\n // (same contract as `TaskExecutor.validateRequest`). The helper FAILS\n // OPEN (returns true) when no canonical schema is indexed for the tool,\n // which preserves the field rather than dropping something we can't\n // authoritatively rule out.\n for (const [key, value] of Object.entries(adapted)) {\n if (\n declaredFields.has(key) ||\n envelopeFields.has(key) ||\n schemaAllowsTopLevelField(taskType, key, this.resolvedAdcpVersion)\n ) {\n filtered[key] = value;\n } else {\n schemaStripped.push(key);\n }\n }\n\n if (schemaStripped.length > 0) {\n console.warn(\n `[AdCP] Stripping request fields not declared by either agent \"${this.agent.id}\" or canonical AdCP schemas ` +\n `for ${taskType}: ${schemaStripped.join(', ')}`\n );\n debugLogs?.push({\n type: 'warning',\n message:\n `Stripped request fields not declared by either the agent tool input schema or canonical AdCP schema ` +\n `for ${taskType}: ${schemaStripped.join(', ')}`,\n timestamp: new Date().toISOString(),\n details: {\n code: 'input_schema_field_stripped',\n task: taskType,\n fields: schemaStripped,\n agent_id: this.agent.id,\n },\n });\n }\n\n adapted = filtered;\n }\n\n // Protocol version adaptation: strip fields not accepted by the target\n // AdCP version. `resolveAdapterKey` returns the effective target version\n // based on the client pin and the seller's advertised caps; adapters live\n // in `src/lib/adapters/version/<target>/`.\n const adapterKey = resolveAdapterKey(this.resolvedAdcpVersion, perCallCapabilities ?? this.cachedCapabilities);\n if (adapterKey) {\n const versionAdapter = getVersionAdapter(adapterKey, taskType);\n if (versionAdapter) {\n const result = versionAdapter.adaptRequest(adapted);\n adapted = result.params;\n if (result.drift) {\n driftLogs.push({\n ...result.drift,\n taskName: taskType,\n clientVersion: this.resolvedAdcpVersion,\n targetVersion: adapterKey,\n timestamp: new Date().toISOString(),\n });\n }\n }\n }\n\n return { params: adapted, driftLogs };\n }\n\n /**\n * Normalize response to v3 format\n *\n * Converts v2 responses to v3 structure for consistent API surface.\n */\n private normalizeResponseToV3(taskType: string, data: any): any {\n // Dispatch through the legacy v2.5 adapter registry. The pair's\n // optional `normalizeResponse` runs when present; otherwise the\n // response is passed through unchanged.\n const pair = getV25Adapter(taskType);\n if (pair?.normalizeResponse) return pair.normalizeResponse(data);\n return data;\n }\n\n /**\n * Check if request uses v3 features that the server doesn't support\n *\n * Returns an early empty result if the request requires v3 features\n * that the server doesn't support. This treats \"products matching unsupported\n * capability\" as an empty result set rather than an error.\n *\n * @returns TaskResult with empty data if v3 features are unsupported, null to proceed normally\n */\n private async getEarlyResultForUnsupportedFeatures<T>(\n taskType: string,\n params: any,\n options?: ReadRequestOptions\n ): Promise<TaskResult<T> | null> {\n // Only check for tasks that have v3-specific features\n if (taskType !== 'get_products') {\n return null;\n }\n\n // Get capabilities to check what the server supports\n const capabilities = await this.getCapabilities(options);\n\n // If server is v3, all features are supported - proceed normally\n if (capabilities.version === 'v3') {\n return null;\n }\n\n // Check for v3-only features that would make this query return empty results.\n //\n // TODO: Once we remove backwards-compatibility stripping in adaptGetProductsRequestForV2,\n // re-enable these guards so v3-only requests fail fast against v2 servers:\n // (params.property_list && !capabilities.features.propertyListFiltering) ||\n // (params.filters?.required_features?.includes('property_list_filtering') &&\n // !capabilities.features.propertyListFiltering) ||\n //\n // TODO: Surface the reason for empty results to the caller (e.g. metadata or a\n // structured warning) so they can distinguish \"no products matched\" from \"server\n // lacks v3 feature support\" vs \"request failed\". Right now empty results from a\n // capability mismatch look identical to a seller that simply has no inventory.\n const usesUnsupportedFeature =\n // required_features: content_standards requires contentStandards\n params.filters?.required_features?.includes('content_standards') && !capabilities.features.contentStandards;\n\n if (!usesUnsupportedFeature) {\n return null; // Proceed normally\n }\n\n // Log warning about v2 downgrade\n console.warn(\n `[AdCP] v3-only features not supported by server \"${this.agent.id}\" (${capabilities.version}). Returning empty results.`\n );\n\n // Return empty result - semantically \"no products match this filter\"\n const emptyResponse = {\n products: [],\n property_list_applied: false,\n } as T;\n\n return {\n success: true,\n status: 'completed',\n data: emptyResponse,\n metadata: {\n taskId: `early_${Date.now()}`,\n taskName: taskType,\n agent: {\n id: this.agent.id,\n name: this.agent.name,\n protocol: this.normalizedAgent.protocol,\n },\n responseTimeMs: 0,\n timestamp: new Date().toISOString(),\n clarificationRounds: 0,\n status: 'completed',\n serverVersion: capabilities.version,\n serverVersionSynthetic: capabilities._synthetic,\n },\n };\n }\n\n // ====== MEDIA BUY TASKS ======\n\n /**\n * Discover available advertising products\n *\n * `brand` is optional when `catalog` is absent, including for the brief-only\n * request below. Requests with `catalog` must include `brand`; otherwise,\n * include it whenever discovery should account for a specific advertiser.\n *\n * @param params - Product discovery parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n *\n * @example\n * ```typescript\n * const products = await client.getProducts(\n * {\n * buying_mode: 'brief',\n * brief: 'Find podcast and streaming audio placements for an eco-friendly bike subscription launch'\n * },\n * (context) => {\n * if (context.inputRequest.field === 'budget') return 50000;\n * return context.deferToHuman();\n * }\n * );\n * ```\n */\n async getProducts(\n params: CanonicalGetProductsRequest,\n inputHandler?: InputHandler,\n options?: CanonicalReadTaskOptions\n ): Promise<TaskResult<CanonicalGetProductsResponse>> {\n const { legacyFormatConverter, projectionCatalogs, ...taskOptions } = options ?? {};\n this.assertDurableProjectionOverrideSupported(legacyFormatConverter);\n const effectiveLegacyFormatConverter = this.resolveLegacyFormatConverter(\n legacyFormatConverter,\n projectionCatalogs ?? this.config.projectionCatalogs\n );\n const account = canonicalAccountRoutingSnapshot(params.account);\n return this.executeAndHandle<CanonicalGetProductsResponse>(\n 'get_products',\n 'onGetProductsStatusChange',\n params,\n inputHandler,\n taskOptions,\n data => {\n const { response, diagnostics } = toCanonicalOnlyResponse(data as unknown as { products?: V1Product[] }, {\n legacyFormatConverter: effectiveLegacyFormatConverter,\n projectionCatalogs: projectionCatalogs ?? this.config.projectionCatalogs,\n });\n const authoritativeProducts = Array.isArray((data as unknown as { products?: unknown[] }).products)\n ? (data as unknown as { products: unknown[] }).products\n : response.products;\n this.rememberCanonicalProductRoutes(response.products, account, authoritativeProducts);\n const { _message: _dropLegacyMessage, ...canonical } = response as typeof response & { _message?: unknown };\n void _dropLegacyMessage;\n return { ...canonical, projection: { diagnostics } } as CanonicalGetProductsResponse;\n },\n effectiveLegacyFormatConverter,\n undefined,\n projectionCatalogs\n );\n }\n\n /** @deprecated Explicit raw-wire escape hatch for migration tooling. */\n async getProductsLegacy(\n params: GetProductsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetProductsResponse>> {\n return this.executeTaskUnprojected<GetProductsResponse>('get_products', params, inputHandler, options);\n }\n\n /** @internal Run final legacy get_products adaptation before an application-owned atomic mutation claim. */\n async getProductsLegacyWithPreDispatch(\n params: GetProductsRequest,\n beforeDispatch: UnprojectedPreDispatchHook<GetProductsResponse>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetProductsResponse>> {\n const requestSnapshot = structuredClone(params);\n return this.executeTaskUnprojected<GetProductsResponse>(\n 'get_products',\n requestSnapshot,\n inputHandler,\n options,\n undefined,\n beforeDispatch\n );\n }\n\n /**\n * List a legacy named-format catalog for migration tooling.\n *\n * @param params - Format listing parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n * @deprecated Canonical applications discover `format_options[]` through `getProducts()`.\n */\n async listCreativeFormatsLegacy(\n params: ListCreativeFormatsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListCreativeFormatsResponse>> {\n return this.executeAndHandle<ListCreativeFormatsResponse>(\n 'list_creative_formats',\n 'onListCreativeFormatsLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /** @deprecated Migration-only access to legacy creative transformer declarations. */\n async listTransformersLegacy(\n params: ListTransformersRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListTransformersResponse>> {\n return this.executeTaskUnprojected<ListTransformersResponse>('list_transformers', params, inputHandler, options);\n }\n\n /**\n * Create a new media buy\n *\n * @param params - Media buy creation parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async createMediaBuy(\n params: MutatingRequestInput<CanonicalCreateMediaBuyRequest>,\n inputHandler?: InputHandler,\n options?: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<CreateMediaBuyResponse>>> {\n this.assertDurableProjectionOverrideSupported(options?.legacyFormatConverter);\n const requestSnapshot = structuredCloneWithLegacyCreativeMetadata(params);\n const projectionCatalogs = options?.projectionCatalogs ? structuredClone(options.projectionCatalogs) : undefined;\n const snapshottedOptions = {\n ...snapshotTaskOptions(options),\n ...(projectionCatalogs !== undefined && { projectionCatalogs }),\n };\n return withTaskDeadline(snapshottedOptions, effectiveOptions =>\n this.createMediaBuyWithinDeadline(requestSnapshot, inputHandler, effectiveOptions)\n );\n }\n\n private async createMediaBuyWithinDeadline(\n params: MutatingRequestInput<CanonicalCreateMediaBuyRequest>,\n inputHandler: InputHandler | undefined,\n options: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<CreateMediaBuyResponse>>> {\n const { legacyFormatConverter, projectionCatalogs, canonicalFormatLegacyResolver, ...taskOptions } = options ?? {};\n const effectiveLegacyFormatConverter = this.resolveLegacyFormatConverter(\n legacyFormatConverter,\n projectionCatalogs ?? this.config.projectionCatalogs\n );\n const effectiveCanonicalFormatLegacyResolver = this.resolveCanonicalFormatLegacyResolver(\n canonicalFormatLegacyResolver,\n params.account\n );\n const hasCreativeFormatData = hasMediaBuyCreativeFormatData(params);\n if (hasCreativeFormatData) {\n this.validateBeforeCreativeCapabilityProbe('create_media_buy', params, taskOptions);\n }\n const wireMode = hasCreativeFormatData\n ? this.resolveCreativeFormatWireMode(\n 'create_media_buy',\n await this.getCapabilities({ signal: taskOptions.signal, transport: taskOptions.transport })\n )\n : 'canonical';\n // Merge library defaults with consumer-provided reporting_webhook config\n // Library provides url/auth/frequency defaults, consumer can override any field\n // Generates a media_buy_delivery webhook URL using operation_id pattern: delivery_report_{agent_id}_{YYYY-MM}\n if (this.config.webhookUrlTemplate && !options?.disableWebhook) {\n const now = new Date();\n const year = now.getUTCFullYear();\n const month = String(now.getUTCMonth() + 1).padStart(2, '0');\n const operationId = `delivery_report_${this.agent.id}_${year}-${month}`;\n const deliveryWebhookUrl = resolveWebhookUrl(\n this.config.webhookUrlTemplate,\n this.agent.id,\n 'media_buy_delivery',\n operationId,\n options\n );\n\n if (deliveryWebhookUrl) {\n const consumerAuth = params.reporting_webhook?.authentication;\n const defaultAuth = this.config.webhookSecret\n ? { schemes: ['HMAC-SHA256'] as const, credentials: this.config.webhookSecret }\n : undefined;\n\n // `reporting-webhook.json` requires `authentication` throughout AdCP 3.x\n // (the requirement lifts in 4.0 when RFC 9421 becomes the only path), so\n // unlike `push_notification_config` the block cannot simply be omitted.\n // With no configured secret and no caller-supplied credential there is\n // nothing real to put there — registering a placeholder would tell the\n // seller its delivery reports are authenticated by a constant that ships\n // in this file. Skip the auto-injection instead and say why.\n if (!consumerAuth && !defaultAuth) {\n // A caller who asked for a `reporting_webhook` explicitly gets an\n // error, not a silent edit: the request cannot be made spec-valid\n // without a credential, and quietly dropping a field the caller wrote\n // would make the SDK a translator of intent rather than a witness to\n // it. Only the library's OWN auto-injection is skipped silently.\n if (params.reporting_webhook) {\n throw new Error(\n 'reporting_webhook requires an `authentication` block for all of AdCP 3.x, and no credential ' +\n 'is available: set `webhookSecret` on the client, or pass `reporting_webhook.authentication` ' +\n 'explicitly. Remove `reporting_webhook` from the request if you do not need automated ' +\n 'delivery reports — the media buy itself does not require it.'\n );\n }\n warnReportingWebhookNeedsSecret();\n } else {\n // Library defaults\n const libraryDefaults = {\n url: deliveryWebhookUrl,\n reporting_frequency: (this.config.reportingWebhookFrequency || 'daily') as 'hourly' | 'daily' | 'monthly',\n };\n\n // Merge the envelope, but treat `authentication` as ATOMIC. A\n // field-level merge would cross `schemes` from the caller with\n // `credentials` from `webhookSecret` — a caller passing\n // `schemes: ['Bearer']` with no credential would have the HMAC shared\n // secret registered as a Bearer token, which the seller then sends in\n // cleartext on every delivery. `schemes` determines how `credentials`\n // travels, so the two must come from the same source.\n params = {\n ...params,\n reporting_webhook: {\n ...libraryDefaults,\n ...params.reporting_webhook,\n authentication: consumerAuth ?? defaultAuth,\n },\n } as CanonicalCreateMediaBuyRequest;\n }\n }\n }\n\n const result = await this.executeAndHandle<CreateMediaBuyResponse>(\n 'create_media_buy',\n 'onCreateMediaBuyStatusChange',\n projectMediaBuyCreativesForDelivery(\n params,\n wireMode,\n 'create_media_buy',\n effectiveLegacyFormatConverter,\n effectiveCanonicalFormatLegacyResolver\n ),\n inputHandler,\n taskOptions,\n undefined,\n effectiveLegacyFormatConverter,\n params,\n projectionCatalogs\n );\n if (result.data !== undefined) this.rememberCanonicalPackageRoutes(result.data, params);\n return result;\n }\n\n /**\n * @deprecated Compatibility-only entry point for callers still holding legacy creative `format_id` values.\n * Projection-only options are ignored because this method preserves the caller's legacy wire payload.\n */\n async createMediaBuyLegacy(\n params: MutatingRequestInput<CreateMediaBuyRequest>,\n inputHandler?: InputHandler,\n options?: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<CreateMediaBuyResponse>> {\n return this.executeTaskUnprojected<CreateMediaBuyResponse>(\n 'create_media_buy',\n params,\n inputHandler,\n options,\n 'onCreateMediaBuyStatusChange'\n );\n }\n\n /** @internal Run deterministic legacy-create preflight before the caller atomically claims its mutation. */\n async createMediaBuyLegacyWithPreDispatch(\n params: MutatingRequestInput<CreateMediaBuyRequest>,\n beforeDispatch: UnprojectedPreDispatchHook<CreateMediaBuyResponse>,\n inputHandler?: InputHandler,\n options?: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<CreateMediaBuyResponse>> {\n // Snapshot synchronously at the public boundary. Request validation and\n // endpoint/capability discovery contain awaits; callers must not be able to\n // mutate nested commercial terms between validation and durable dispatch.\n const requestSnapshot = structuredClone(params);\n return this.executeTaskUnprojected<CreateMediaBuyResponse>(\n 'create_media_buy',\n requestSnapshot,\n inputHandler,\n options,\n 'onCreateMediaBuyStatusChange',\n beforeDispatch\n );\n }\n\n /**\n * Update an existing media buy\n *\n * @param params - Media buy update parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async updateMediaBuy(\n params: MutatingRequestInput<CanonicalUpdateMediaBuyRequest>,\n inputHandler?: InputHandler,\n options?: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<UpdateMediaBuyResponse>>> {\n this.assertDurableProjectionOverrideSupported(options?.legacyFormatConverter);\n const requestSnapshot = structuredCloneWithLegacyCreativeMetadata(params);\n const projectionCatalogs = options?.projectionCatalogs ? structuredClone(options.projectionCatalogs) : undefined;\n const snapshottedOptions = {\n ...snapshotTaskOptions(options),\n ...(projectionCatalogs !== undefined && { projectionCatalogs }),\n };\n return withTaskDeadline(snapshottedOptions, effectiveOptions =>\n this.updateMediaBuyWithinDeadline(requestSnapshot, inputHandler, effectiveOptions)\n );\n }\n\n private async updateMediaBuyWithinDeadline(\n params: MutatingRequestInput<CanonicalUpdateMediaBuyRequest>,\n inputHandler: InputHandler | undefined,\n options: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<UpdateMediaBuyResponse>>> {\n const { legacyFormatConverter, projectionCatalogs, canonicalFormatLegacyResolver, ...taskOptions } = options ?? {};\n const effectiveLegacyFormatConverter = this.resolveLegacyFormatConverter(\n legacyFormatConverter,\n projectionCatalogs ?? this.config.projectionCatalogs\n );\n const effectiveCanonicalFormatLegacyResolver = this.resolveCanonicalFormatLegacyResolver(\n canonicalFormatLegacyResolver,\n params.account\n );\n const hasCreativeFormatData = hasMediaBuyCreativeFormatData(params);\n if (hasCreativeFormatData) {\n this.validateBeforeCreativeCapabilityProbe('update_media_buy', params, taskOptions);\n }\n const wireMode = hasCreativeFormatData\n ? this.resolveCreativeFormatWireMode(\n 'update_media_buy',\n await this.getCapabilities({ signal: taskOptions.signal, transport: taskOptions.transport })\n )\n : 'canonical';\n const result = await this.executeAndHandle<UpdateMediaBuyResponse>(\n 'update_media_buy',\n 'onUpdateMediaBuyStatusChange',\n projectMediaBuyCreativesForDelivery(\n params,\n wireMode,\n 'update_media_buy',\n effectiveLegacyFormatConverter,\n effectiveCanonicalFormatLegacyResolver\n ),\n inputHandler,\n taskOptions,\n undefined,\n effectiveLegacyFormatConverter,\n params,\n projectionCatalogs\n );\n if (result.data !== undefined) this.rememberCanonicalPackageRoutes(result.data, params);\n return result;\n }\n\n /**\n * @deprecated Compatibility-only entry point for callers still holding legacy creative `format_id` values.\n * Projection-only options are ignored because this method preserves the caller's legacy wire payload.\n */\n async updateMediaBuyLegacy(\n params: MutatingRequestInput<UpdateMediaBuyRequest>,\n inputHandler?: InputHandler,\n options?: CreativeDeliveryTaskOptions\n ): Promise<TaskResult<UpdateMediaBuyResponse>> {\n return this.executeTaskUnprojected<UpdateMediaBuyResponse>(\n 'update_media_buy',\n params,\n inputHandler,\n options,\n 'onUpdateMediaBuyStatusChange'\n );\n }\n\n /**\n * Sync creative assets\n *\n * @param params - Creative sync parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async syncCreatives(\n params: MutatingRequestInput<CanonicalSyncCreativesRequest>,\n inputHandler?: InputHandler,\n options?: SyncCreativesTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<SyncCreativesResponse>>> {\n this.assertDurableProjectionOverrideSupported(\n options?.creativeFormatProjection?.legacyFormatConverter ?? options?.legacyFormatConverter\n );\n const requestSnapshot = structuredCloneWithLegacyCreativeMetadata(params);\n const projectionCatalogs = options?.projectionCatalogs ? structuredClone(options.projectionCatalogs) : undefined;\n const creativeFormatProjection = options?.creativeFormatProjection\n ? {\n ...options.creativeFormatProjection,\n ...(options.creativeFormatProjection.selectorContainers !== undefined && {\n selectorContainers: structuredCloneWithLegacyCreativeMetadata(\n options.creativeFormatProjection.selectorContainers\n ),\n }),\n }\n : undefined;\n const snapshottedOptions = {\n ...snapshotTaskOptions(options),\n ...(projectionCatalogs !== undefined && { projectionCatalogs }),\n ...(creativeFormatProjection !== undefined && { creativeFormatProjection }),\n };\n return withTaskDeadline(snapshottedOptions, effectiveOptions =>\n this.syncCreativesWithinDeadline(requestSnapshot, inputHandler, effectiveOptions)\n );\n }\n\n private async syncCreativesWithinDeadline(\n params: MutatingRequestInput<CanonicalSyncCreativesRequest>,\n inputHandler: InputHandler | undefined,\n options: SyncCreativesTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<SyncCreativesResponse>>> {\n const {\n creativeFormatProjection,\n legacyFormatConverter,\n projectionCatalogs,\n canonicalFormatLegacyResolver,\n ...taskOptions\n } = options ?? {};\n const effectiveCanonicalFormatLegacyResolver = this.resolveCanonicalFormatLegacyResolver(\n canonicalFormatLegacyResolver,\n params.account\n );\n const effectiveLegacyFormatConverter = this.resolveLegacyFormatConverter(\n creativeFormatProjection?.legacyFormatConverter ?? legacyFormatConverter,\n projectionCatalogs ?? this.config.projectionCatalogs\n );\n this.validateBeforeCreativeCapabilityProbe('sync_creatives', params, taskOptions);\n const wireMode = this.resolveCreativeFormatWireMode(\n 'sync_creatives',\n await this.getCapabilities({ signal: taskOptions.signal, transport: taskOptions.transport })\n );\n const configuredSelectorContainers = [\n ...((creativeFormatProjection?.selectorContainers ?? []) as ReadonlyArray<CreativeFormatSelectorContainer>),\n ];\n const configuredPackageIds = new Set(\n configuredSelectorContainers.flatMap(container =>\n typeof container.package_id === 'string' ? [container.package_id] : []\n )\n );\n const assignmentPackageContainers = Array.isArray(params.assignments)\n ? params.assignments.flatMap(assignment =>\n typeof assignment.package_id === 'string' && !configuredPackageIds.has(assignment.package_id)\n ? [{ package_id: assignment.package_id }]\n : []\n )\n : [];\n const wireParams = projectSyncCreativesForDelivery(\n params,\n [...configuredSelectorContainers, ...assignmentPackageContainers],\n wireMode,\n effectiveLegacyFormatConverter,\n effectiveCanonicalFormatLegacyResolver\n );\n return this.executeAndHandle<SyncCreativesResponse>(\n 'sync_creatives',\n 'onSyncCreativesStatusChange',\n wireParams,\n inputHandler,\n taskOptions,\n undefined,\n effectiveLegacyFormatConverter,\n params,\n projectionCatalogs\n );\n }\n\n /**\n * @deprecated Compatibility-only entry point for callers still holding legacy creative `format_id` values.\n * Projection-only options are ignored because this method preserves the caller's legacy wire payload.\n */\n async syncCreativesLegacy(\n params: MutatingRequestInput<SyncCreativesRequest>,\n inputHandler?: InputHandler,\n options?: SyncCreativesTaskOptions\n ): Promise<TaskResult<SyncCreativesResponse>> {\n return this.executeTaskUnprojected<SyncCreativesResponse>(\n 'sync_creatives',\n params,\n inputHandler,\n options,\n 'onSyncCreativesStatusChange'\n );\n }\n\n private resolveCreativeFormatWireMode(taskType: string, capabilities: unknown): CreativeFormatWireMode {\n // Capabilities `adcp.build_version` is advisory deployment metadata. The\n // protocol schema explicitly forbids using it for negotiation, so wire\n // guarantees follow the release pin this client actually emits.\n const wireRelease = this.config.wireAdcpVersion ?? this.resolvedAdcpVersion;\n const declared = resolveCreativeFormatWireMode(capabilities, wireRelease);\n const schema = creativeSchemaSupport(this.cachedToolSchemas?.get(taskType));\n if (declared !== 'unknown' && schema !== 'unknown' && declared !== schema) {\n throw new CreativeFormatCapabilityError(\n `Seller capability and ${taskType} input schema disagree about canonical creative support`\n );\n }\n const resolved = declared !== 'unknown' ? declared : schema;\n const release = /^v?(\\d+)\\.(\\d+)(?:\\.|-|$)/.exec(wireRelease.trim());\n const canonicalRequiredByBuyerPin =\n release !== null && (Number(release[1]) > 3 || (Number(release[1]) === 3 && Number(release[2]) >= 2));\n if (resolved === 'unknown' && canonicalRequiredByBuyerPin) {\n throw new CreativeFormatCapabilityError(\n `Cannot prove which AdCP release the seller serves for ${taskType}; a 3.2+ client will not guess a legacy creative wire shape`\n );\n }\n return resolved;\n }\n\n /** Validate malformed creative payloads before capability discovery can perform I/O. */\n private validateBeforeCreativeCapabilityProbe(taskType: string, params: unknown, options: TaskOptions): void {\n if (options.skipIdempotencyAutoInject || options.skipAccountValidation) return;\n let normalizedParams = normalizeRequestParams(taskType, params);\n if (\n requestUsesIdempotency(taskType, normalizedParams) &&\n normalizedParams &&\n typeof normalizedParams === 'object' &&\n !normalizedParams.idempotency_key\n ) {\n normalizedParams = { ...normalizedParams, idempotency_key: generateIdempotencyKey() };\n }\n if (!isExternalSchemaRootActive(this.resolvedAdcpVersion)) {\n this.validateRequest(taskType, normalizedParams);\n }\n }\n\n /**\n * List creatives through the canonical SDK boundary.\n *\n * Legacy format filters are rejected and returned creative identities are\n * projected to `format_kind` / `format_option_ref`. Migration tooling that\n * needs the negotiated raw wire shape must call `listCreativesLegacy()`.\n *\n * @param params - Creative listing parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async listCreatives(\n params: CanonicalListCreativesRequest,\n inputHandler?: InputHandler,\n options?: CanonicalReadTaskOptions\n ): Promise<TaskResult<CanonicalListCreativesResponse>> {\n const { legacyFormatConverter, projectionCatalogs, ...taskOptions } = options ?? {};\n this.assertDurableProjectionOverrideSupported(legacyFormatConverter);\n const effectiveLegacyFormatConverter = this.resolveLegacyFormatConverter(\n legacyFormatConverter,\n projectionCatalogs ?? this.config.projectionCatalogs\n );\n return this.executeAndHandle<CanonicalListCreativesResponse>(\n 'list_creatives',\n 'onListCreativesStatusChange',\n params,\n inputHandler,\n taskOptions,\n data => {\n const { _message: _dropLegacyMessage, ...safe } = data as typeof data & { _message?: unknown };\n void _dropLegacyMessage;\n return {\n ...safe,\n creatives: data.creatives.map(creative =>\n projectCreativeForDelivery(\n creative as unknown as import('../types/tools.generated').CreativeAsset,\n {},\n 'canonical',\n 'list_creatives',\n effectiveLegacyFormatConverter\n )\n ),\n } as CanonicalListCreativesResponse;\n },\n effectiveLegacyFormatConverter,\n undefined,\n projectionCatalogs\n );\n }\n\n /** @deprecated Explicit raw-wire escape hatch for migration tooling. */\n async listCreativesLegacy(\n params: ListCreativesRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListCreativesResponse>> {\n return this.executeTaskUnprojected<ListCreativesResponse>('list_creatives', params, inputHandler, options);\n }\n\n /** Preview a creative using canonical capability or creative-library identity. */\n async previewCreative(\n params: CanonicalPreviewCreativeRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<CanonicalPreviewCreativeResponse>> {\n const legacyPath = legacyCreativeIdentityPath(params);\n if (legacyPath) {\n const suggestion = 'Move this request to previewCreativeLegacy(), or replace format_id with canonical identity.';\n throw new ProtocolFeatureUnsupportedError(['preview_creative.canonical_identity'], [], this.agent.agent_uri, {\n message: `previewCreative() does not accept legacy creative identity at ${legacyPath}. ${suggestion}`,\n field: legacyPath,\n suggestion,\n details: {\n feature: 'preview_creative.canonical_identity',\n tool: 'preview_creative',\n field: legacyPath,\n },\n });\n }\n return this.executeAndHandle<CanonicalPreviewCreativeResponse>(\n 'preview_creative',\n 'onPreviewCreativeStatusChange',\n params,\n inputHandler,\n options,\n undefined,\n undefined,\n params\n );\n }\n\n /** @deprecated Migration-only access to `format_id`-based creative preview. */\n async previewCreativeLegacy(\n params: PreviewCreativeRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<PreviewCreativeResponse>> {\n return this.executeAndHandle<PreviewCreativeResponse>(\n 'preview_creative',\n 'onPreviewCreativeLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Get media buy status, creative approvals, and optional delivery snapshots\n *\n * @param params - Request parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async getMediaBuys(\n params: GetMediaBuysRequest,\n inputHandler?: InputHandler,\n options?: CanonicalReadTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<GetMediaBuysResponse>>> {\n const { legacyFormatConverter, projectionCatalogs, ...taskOptions } = options ?? {};\n this.assertDurableProjectionOverrideSupported(legacyFormatConverter);\n const result = await this.executeAndHandle<GetMediaBuysResponse>(\n 'get_media_buys',\n 'onGetMediaBuysStatusChange',\n params,\n inputHandler,\n taskOptions,\n undefined,\n this.resolveLegacyFormatConverter(legacyFormatConverter, projectionCatalogs ?? this.config.projectionCatalogs),\n undefined,\n projectionCatalogs\n );\n if (result.data !== undefined) this.rememberCanonicalPackageRoutes(result.data, params);\n return result;\n }\n\n /**\n * Get media buy delivery information\n *\n * @param params - Delivery information parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async getMediaBuyDelivery(\n params: GetMediaBuyDeliveryRequest,\n inputHandler?: InputHandler,\n options?: CanonicalReadTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<GetMediaBuyDeliveryResponse>>> {\n const { legacyFormatConverter, projectionCatalogs, ...taskOptions } = options ?? {};\n this.assertDurableProjectionOverrideSupported(legacyFormatConverter);\n return this.executeAndHandle<GetMediaBuyDeliveryResponse>(\n 'get_media_buy_delivery',\n 'onGetMediaBuyDeliveryStatusChange',\n params,\n inputHandler,\n taskOptions,\n undefined,\n this.resolveLegacyFormatConverter(legacyFormatConverter, projectionCatalogs ?? this.config.projectionCatalogs),\n undefined,\n projectionCatalogs\n );\n }\n\n /** Retrieve canonical creative-level and variant-level delivery metrics. */\n async getCreativeDelivery(\n params: GetCreativeDeliveryRequest,\n inputHandler?: InputHandler,\n options?: CanonicalReadTaskOptions\n ): Promise<TaskResult<CanonicalCreativeResponse<GetCreativeDeliveryResponse>>> {\n const { legacyFormatConverter, projectionCatalogs, ...taskOptions } = options ?? {};\n this.assertDurableProjectionOverrideSupported(legacyFormatConverter);\n return this.executeAndHandle<GetCreativeDeliveryResponse>(\n 'get_creative_delivery',\n 'onGetCreativeDeliveryStatusChange',\n params,\n inputHandler,\n taskOptions,\n undefined,\n this.resolveLegacyFormatConverter(legacyFormatConverter, projectionCatalogs ?? this.config.projectionCatalogs),\n undefined,\n projectionCatalogs\n );\n }\n\n /**\n * Provide performance feedback\n *\n * @param params - Performance feedback parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async providePerformanceFeedback(\n params: MutatingRequestInput<ProvidePerformanceFeedbackRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ProvidePerformanceFeedbackResponse>> {\n return this.executeAndHandle<ProvidePerformanceFeedbackResponse>(\n 'provide_performance_feedback',\n 'onProvidePerformanceFeedbackStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== SIGNALS TASKS ======\n\n /**\n * Get audience signals\n *\n * @param params - Signals request parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async getSignals(\n params: GetSignalsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetSignalsResponse>> {\n return this.executeAndHandle<GetSignalsResponse>(\n 'get_signals',\n 'onGetSignalsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Activate audience signals\n *\n * @param params - Signal activation parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async activateSignal(\n params: MutatingRequestInput<ActivateSignalRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ActivateSignalResponse>> {\n return this.executeAndHandle<ActivateSignalResponse>(\n 'activate_signal',\n 'onActivateSignalStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== GOVERNANCE TASKS ======\n\n /**\n * Sync campaign plans to a governance agent.\n * Plans define authorized parameters: budget, channels, flight dates, markets, policies, delegations.\n *\n * Uses the governance agent from config.governance.campaign.agent by default.\n * Pass an explicit agent via options.agent to override.\n */\n async syncPlans(\n params: MutatingRequestInput<SyncPlansRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions & { agent?: AgentConfig }\n ): Promise<TaskResult<SyncPlansResponse>> {\n const agent = options?.agent ?? this.getGovernanceAgent();\n // Pre-send schema check on the unadapted shape, mirroring the public-task\n // executeTask path. Without this call, governance/protocol entry points\n // that bypass the executeTask seam silently round-trip malformed requests\n // to the server instead of failing locally.\n this.executor.validateRequest('sync_plans', params);\n return this.executor.executeTask<SyncPlansResponse>(agent, 'sync_plans', params, inputHandler, options);\n }\n\n /**\n * Get governance audit logs for one or more plans.\n * Returns budget state, channel allocation, per-campaign breakdown, and audit trail.\n *\n * Uses the governance agent from config.governance.campaign.agent by default.\n * Pass an explicit agent via options.agent to override.\n */\n async getPlanAuditLogs(\n params: GetPlanAuditLogsRequest,\n options?: TaskOptions & { agent?: AgentConfig }\n ): Promise<TaskResult<GetPlanAuditLogsResponse>> {\n const agent = options?.agent ?? this.getGovernanceAgent();\n this.executor.validateRequest('get_plan_audit_logs', params);\n return this.executor.executeTask<GetPlanAuditLogsResponse>(\n agent,\n 'get_plan_audit_logs',\n params,\n undefined,\n options\n );\n }\n\n /**\n * Report a governance outcome for an async task that has resolved.\n *\n * Use this when a task returned status 'submitted' or 'working' and\n * later resolves via polling or webhooks. The checkId is available\n * on the original TaskResult at result.governance.checkId. After a\n * TaskTimeoutError during governance postflight, pass the error's\n * governanceRecovery.outcomeIdempotencyKey in `options` to safely retry.\n */\n async reportGovernanceOutcome(\n checkId: string,\n outcome: OutcomeType,\n governanceContext?: string,\n sellerResponse?: Record<string, unknown>,\n error?: { code?: string; message: string },\n options?: { outcomeIdempotencyKey?: string; signal?: AbortSignal }\n ): Promise<import('./GovernanceTypes').GovernanceOutcome | undefined> {\n const middleware = this.executor.getGovernanceMiddleware();\n if (!middleware) {\n throw new Error('No governance middleware configured. Set config.governance.campaign to enable governance.');\n }\n return middleware.reportOutcome(\n checkId,\n outcome,\n sellerResponse,\n error,\n [],\n governanceContext,\n options?.signal,\n options?.outcomeIdempotencyKey\n );\n }\n\n private getGovernanceAgent(): AgentConfig {\n const agent = this.config.governance?.campaign?.agent;\n if (!agent) {\n throw new Error(\n 'No governance agent configured. Either pass an explicit agent via options.agent or set config.governance.campaign.agent.'\n );\n }\n return agent;\n }\n\n // ====== PROTOCOL TASKS ======\n\n /**\n * Get AdCP capabilities\n *\n * @param params - Capabilities request parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async getAdcpCapabilities(\n params: GetAdCPCapabilitiesRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetAdCPCapabilitiesResponse>> {\n return withTaskDeadline(options, effectiveOptions =>\n this.getAdcpCapabilitiesWithinDeadline(params, inputHandler, effectiveOptions)\n );\n }\n\n private async getAdcpCapabilitiesWithinDeadline(\n params: GetAdCPCapabilitiesRequest,\n inputHandler: InputHandler | undefined,\n options: TaskOptions\n ): Promise<TaskResult<GetAdCPCapabilitiesResponse>> {\n const agent = await this.ensureEndpointDiscovered(options);\n this.executor.validateRequest('get_adcp_capabilities', params);\n return this.executor.executeTask<GetAdCPCapabilitiesResponse>(\n agent,\n 'get_adcp_capabilities',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== CREATIVE BUILD TASKS ======\n\n /**\n * Build a creative through the legacy named-format protocol.\n * @deprecated Migration-only access to `target_format_id`-based creative building.\n */\n async buildCreativeLegacy(\n params: MutatingRequestInput<BuildCreativeRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<BuildCreativeResponse>> {\n return this.executeAndHandle<BuildCreativeResponse>(\n 'build_creative',\n 'onBuildCreativeLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== ACCOUNT & AUDIENCE TASKS ======\n\n /**\n * List accounts\n */\n async listAccounts(\n params: ListAccountsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListAccountsResponse>> {\n return this.executeAndHandle<ListAccountsResponse>(\n 'list_accounts',\n 'onListAccountsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Sync accounts\n */\n async syncAccounts(\n params: MutatingRequestInput<SyncAccountsRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SyncAccountsResponse>> {\n return this.executeAndHandle<SyncAccountsResponse>(\n 'sync_accounts',\n 'onSyncAccountsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Sync audiences\n */\n async syncAudiences(\n params: MutatingRequestInput<SyncAudiencesRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SyncAudiencesResponse>> {\n return this.executeAndHandle<SyncAudiencesResponse>(\n 'sync_audiences',\n 'onSyncAudiencesStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== GOVERNANCE TASKS ======\n\n /**\n * Create a property list\n */\n async createPropertyList(\n params: MutatingRequestInput<CreatePropertyListRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<CreatePropertyListResponse>> {\n return this.executeAndHandle<CreatePropertyListResponse>(\n 'create_property_list',\n 'onCreatePropertyListStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Get a property list\n */\n async getPropertyList(\n params: GetPropertyListRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetPropertyListResponse>> {\n return this.executeAndHandle<GetPropertyListResponse>(\n 'get_property_list',\n 'onGetPropertyListStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Update a property list\n */\n async updatePropertyList(\n params: MutatingRequestInput<UpdatePropertyListRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<UpdatePropertyListResponse>> {\n return this.executeAndHandle<UpdatePropertyListResponse>(\n 'update_property_list',\n 'onUpdatePropertyListStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * List property lists\n */\n async listPropertyLists(\n params: ListPropertyListsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListPropertyListsResponse>> {\n return this.executeAndHandle<ListPropertyListsResponse>(\n 'list_property_lists',\n 'onListPropertyListsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Delete a property list\n */\n async deletePropertyList(\n params: MutatingRequestInput<DeletePropertyListRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<DeletePropertyListResponse>> {\n return this.executeAndHandle<DeletePropertyListResponse>(\n 'delete_property_list',\n 'onDeletePropertyListStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * List content standards\n */\n async listContentStandardsLegacy(\n params: ListContentStandardsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListContentStandardsResponse>> {\n return this.executeAndHandle<ListContentStandardsResponse>(\n 'list_content_standards',\n 'onListContentStandardsLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Get content standards\n */\n async getContentStandardsLegacy(\n params: GetContentStandardsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetContentStandardsResponse>> {\n return this.executeAndHandle<GetContentStandardsResponse>(\n 'get_content_standards',\n 'onGetContentStandardsLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Calibrate content against standards\n */\n async calibrateContentLegacy(\n params: MutatingRequestInput<CalibrateContentRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<CalibrateContentResponse>> {\n return this.executeAndHandle<CalibrateContentResponse>(\n 'calibrate_content',\n 'onCalibrateContentLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Validate content delivery\n */\n async validateContentDeliveryLegacy(\n params: ValidateContentDeliveryRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ValidateContentDeliveryResponse>> {\n return this.executeAndHandle<ValidateContentDeliveryResponse>(\n 'validate_content_delivery',\n 'onValidateContentDeliveryLegacyStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== SPONSORED INTELLIGENCE TASKS ======\n\n /**\n * Get an SI offering\n */\n async siGetOffering(\n params: SIGetOfferingRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SIGetOfferingResponse>> {\n return this.executeAndHandle<SIGetOfferingResponse>(\n 'si_get_offering',\n 'onSIGetOfferingStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Initiate an SI session\n */\n async siInitiateSession(\n params: MutatingRequestInput<SIInitiateSessionRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SIInitiateSessionResponse>> {\n return this.executeAndHandle<SIInitiateSessionResponse>(\n 'si_initiate_session',\n 'onSIInitiateSessionStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Send a message in an SI session\n */\n async siSendMessage(\n params: MutatingRequestInput<SISendMessageRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SISendMessageResponse>> {\n return this.executeAndHandle<SISendMessageResponse>(\n 'si_send_message',\n 'onSISendMessageStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Terminate an SI session\n */\n async siTerminateSession(\n params: SITerminateSessionRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SITerminateSessionResponse>> {\n return this.executeAndHandle<SITerminateSessionResponse>(\n 'si_terminate_session',\n 'onSITerminateSessionStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n // ====== GENERIC TASK EXECUTION ======\n\n /**\n * Execute any task by name with type safety\n *\n * @param taskName - Name of the task to execute\n * @param params - Task parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n *\n * @example\n * ```typescript\n * const result = await client.executeTask(\n * 'get_products',\n * { brief: 'Coffee brands' },\n * handler\n * );\n * ```\n */\n async executeTask<K extends AdcpTaskName>(\n taskName: K,\n params: TaskRequestFor<K>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<TaskResponseTypeMap[K]>>;\n async executeTask(\n taskName: string,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<any>> {\n switch (taskName) {\n case 'get_products':\n return this.getProducts(params as CanonicalGetProductsRequest, inputHandler, options);\n case 'create_media_buy':\n return (await this.createMediaBuy(\n params as MutatingRequestInput<CanonicalCreateMediaBuyRequest>,\n inputHandler,\n options\n )) as TaskResult<any>;\n case 'update_media_buy':\n return (await this.updateMediaBuy(\n params as MutatingRequestInput<CanonicalUpdateMediaBuyRequest>,\n inputHandler,\n options\n )) as TaskResult<any>;\n case 'sync_creatives':\n return (await this.syncCreatives(\n params as MutatingRequestInput<CanonicalSyncCreativesRequest>,\n inputHandler,\n options\n )) as TaskResult<any>;\n case 'list_creatives':\n return this.listCreatives(params as CanonicalListCreativesRequest, inputHandler, options);\n case 'get_media_buys':\n return this.getMediaBuys(params as GetMediaBuysRequest, inputHandler, options);\n case 'get_media_buy_delivery':\n return this.getMediaBuyDelivery(params as GetMediaBuyDeliveryRequest, inputHandler, options);\n case 'get_creative_delivery':\n return this.getCreativeDelivery(params as GetCreativeDeliveryRequest, inputHandler, options);\n case 'request_proposals':\n return guardNativeRequestProposalsCompletion(\n await this.executeTaskUnprojected(taskName, params, inputHandler, options)\n );\n }\n return this.executeTaskUnprojected(taskName, params, inputHandler, options);\n }\n\n /**\n * Execute an extension task that is not part of the standard AdCP task set.\n *\n * Keeping custom tasks on an explicitly named API prevents a response-type\n * generic from weakening the canonical request types enforced by\n * `executeTask()` for standard creative-boundary tasks.\n */\n async executeCustomTask<T = unknown>(\n taskName: string,\n params: Record<string, unknown>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<T>> {\n if (STANDARD_ADCP_TASK_NAMES.has(taskName)) {\n throw new Error(\n `executeCustomTask() cannot execute standard AdCP task \"${taskName}\". ` +\n 'Use its typed primary method, or an explicitly named *Legacy method for legacy creative tools.'\n );\n }\n return this.executeTaskUnprojected<T>(taskName, params, inputHandler, options);\n }\n\n /**\n * Explicit raw-task compatibility escape hatch for conformance and migration tooling.\n * @deprecated Application code should use typed primary methods or `executeTask()`.\n */\n async executeTaskLegacy<T = any>(\n taskName: string,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<T>> {\n return this.executeTaskUnprojected<T>(taskName, params, inputHandler, options);\n }\n\n private async executeTaskUnprojected<T = any>(\n taskName: string,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions,\n handlerName?: keyof AsyncHandlerConfig,\n beforeDispatch?: UnprojectedPreDispatchHook<T>\n ): Promise<TaskResult<T>> {\n const requestParamsSnapshot = structuredClone(params);\n const taskOptionsSnapshot = snapshotTaskOptions(options);\n return withTaskDeadline(taskOptionsSnapshot, async effectiveOptions => {\n const result = await this.executeTaskUnprojectedWithinDeadline<T>(\n taskName,\n requestParamsSnapshot,\n inputHandler,\n effectiveOptions,\n beforeDispatch,\n handlerName\n );\n return result;\n });\n }\n\n private async executeTaskUnprojectedWithinDeadline<T = any>(\n taskName: string,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions,\n beforeDispatch?: UnprojectedPreDispatchHook<T>,\n handlerName?: keyof AsyncHandlerConfig\n ): Promise<TaskResult<T>> {\n throwIfAborted(options?.signal);\n const startTime = Date.now();\n let detectedServerVersion: 'v2' | 'v3' | undefined;\n let detectedServerVersionSynthetic: boolean | undefined;\n try {\n const normalizedParams = normalizeRequestParams(taskName, params, {\n skipIdempotencyAutoInject: options?.skipIdempotencyAutoInject,\n skipAccountValidation: options?.skipAccountValidation,\n });\n this.assertRequestSupportedByConfiguredVersion(taskName, normalizedParams, options);\n this.assertDurablePropertyListCredentialSupported(taskName, normalizedParams);\n\n await this.validateTaskFeatures(taskName, options);\n if (this.config.requireV3ForMutations && requestUsesIdempotency(taskName, normalizedParams)) {\n await this.requireSupportedMajor(taskName, options);\n }\n const agent = await this.ensureEndpointDiscovered(options);\n\n // Schema-driven pre-send validation runs on the unadapted v3 shape so\n // wire-format adapters (e.g. adaptGetProductsRequestForV2) don't strip\n // v3-only fields out from under the v3 bundled schema. Skip the entire\n // Zod parse when compliance testing has suppressed required-field\n // validation — the missing field is intentional and Zod would reject it.\n if (!options?.skipIdempotencyAutoInject && !options?.skipAccountValidation) {\n this.executor.validateRequest(taskName, normalizedParams);\n }\n\n // Adapt request for the detected server and AdCP protocol versions.\n const capabilityDiscoveryContext: CapabilityDiscoveryContext = {};\n const detectionOptions: InternalReadRequestOptions = {\n ...options,\n [CAPABILITY_DISCOVERY_CONTEXT]: capabilityDiscoveryContext,\n };\n const serverVersion = await this.detectServerVersion(detectionOptions);\n detectedServerVersion = serverVersion;\n detectedServerVersionSynthetic = capabilityDiscoveryContext.capabilities?._synthetic;\n this.assertRequestSupportedByTargetVersion(\n taskName,\n normalizedParams,\n capabilityDiscoveryContext.capabilities,\n false,\n serverVersion\n );\n const { options: effectiveOptions, driftLog: webhookDriftLog } = this.suppressPre31DiscoveryWebhook(\n taskName,\n options,\n capabilityDiscoveryContext.capabilities\n );\n const inputSchemaStripLogs: any[] = [];\n const { params: adaptedParams, driftLogs: adaptDriftLogs } = this.adaptRequest(\n taskName,\n normalizedParams,\n serverVersion,\n inputSchemaStripLogs,\n capabilityDiscoveryContext.toolSchemas,\n capabilityDiscoveryContext.capabilities\n );\n\n // Symmetric warn-only post-adapter pass against the v2.5 schema bundle.\n // Drift gets surfaced via result.metadata.debug_logs so adapter\n // regressions in production aren't silently swallowed.\n const v25DriftLogs: any[] = [...adaptDriftLogs];\n if (webhookDriftLog) v25DriftLogs.push(webhookDriftLog);\n if (serverVersion === 'v2') {\n this.executor.validateAdaptedRequestAgainstV2(taskName, adaptedParams, v25DriftLogs);\n }\n\n const deferredClientContext: DeferredClientFinalizationContext = {\n kind: 'single-agent',\n taskType: taskName,\n ...(handlerName !== undefined && { handlerName }),\n canonical: false,\n serverVersion,\n ...(capabilityDiscoveryContext.capabilities?._synthetic !== undefined && {\n serverVersionSynthetic: capabilityDiscoveryContext.capabilities._synthetic,\n }),\n productPolicyRequest: productPolicyRequestSnapshot(normalizedParams),\n ...(effectiveOptions?.taskId !== undefined && { optionTaskId: effectiveOptions.taskId }),\n ...(effectiveOptions?.contextId !== undefined && { optionContextId: effectiveOptions.contextId }),\n };\n let result = await this.executor.executeTask<T>(\n agent,\n taskName,\n adaptedParams,\n inputHandler,\n effectiveOptions,\n serverVersion,\n capabilityDiscoveryContext.capabilities,\n beforeDispatch,\n deferredClientContext\n );\n\n const postAdapterLogs = [...inputSchemaStripLogs, ...v25DriftLogs];\n if (postAdapterLogs.length > 0) {\n result.debug_logs = [...(result.debug_logs ?? []), ...postAdapterLogs];\n }\n\n return this.finalizeTaskResult(result, deferredClientContext, effectiveOptions);\n } catch (error) {\n if (error instanceof BeforeProtocolDispatchHookError || error instanceof AfterProtocolDispatchHookError) {\n throw error.original;\n }\n // Structured protocol errors carry typed fields (reason, actualVersion,\n // unsupportedFeatures, …) that callers use for recovery decisions. Auth\n // and timeout errors trigger OAuth flows / cancellation. All four are\n // established throws — rethrow so callers' existing catch sites work.\n if (\n error instanceof AuthenticationRequiredError ||\n error instanceof TaskTimeoutError ||\n error instanceof VersionUnsupportedError ||\n error instanceof FeatureUnsupportedError ||\n isAbortOrTimeoutError(error)\n ) {\n throw error;\n }\n // Unexpected pre-flight errors (e.g. a TypeError from response parsing\n // during version detection) surface as a structured TaskResult rather\n // than escaping as raw exceptions — matching the declared return type\n // and the contract the internal executor already upholds for network\n // errors. attachMatch ensures the fluent .match() API works on this path.\n const errorMessage = error instanceof Error ? error.message : String(error);\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n error: errorMessage,\n metadata: {\n taskId: crypto.randomUUID(),\n taskName,\n agent: {\n id: this.agent.id,\n name: this.agent.name,\n protocol: this.normalizedAgent.protocol,\n },\n responseTimeMs: Date.now() - startTime,\n timestamp: new Date().toISOString(),\n clarificationRounds: 0,\n status: 'failed',\n ...(detectedServerVersion !== undefined && { serverVersion: detectedServerVersion }),\n ...(detectedServerVersionSynthetic !== undefined && {\n serverVersionSynthetic: detectedServerVersionSynthetic,\n }),\n },\n conversation: [],\n debug_logs: [],\n });\n }\n }\n\n // ====== DEFERRED TASK MANAGEMENT ======\n\n /**\n * Resume a deferred task using its token\n *\n * @param token - Deferred task token\n * @param input - Human- or application-provided answer for the paused task\n *\n * @example\n * ```typescript\n * const paused = await client.createMediaBuy(params, handler);\n * if (paused.status === 'deferred') {\n * const result = await client.resumeDeferredTask(paused.deferred.token, humanProvidedValue);\n * }\n * ```\n */\n async resumeDeferredTask<T = any>(token: string, input: unknown): Promise<TaskResult<T>> {\n const { result, clientContext } = await this.executor.resumeDeferredTaskWithContext<T>(token, input);\n const finalized = isDeferredClientFinalizationContext(clientContext)\n ? await this.finalizeTaskResult(result, clientContext)\n : result;\n if (!isDeferredClientFinalizationContext(clientContext)) {\n await acknowledgeDeferredSettlement(finalized);\n }\n return finalized;\n }\n\n // ====== CONVERSATION MANAGEMENT ======\n\n /**\n * Continue an existing conversation with the agent\n *\n * @param message - Message to send to the agent\n * @param contextId - Conversation context ID to continue\n * @param inputHandler - Handler for any clarification requests\n *\n * @example\n * ```typescript\n * const agent = new ADCPClient(config);\n * const initial = await agent.getProducts({ brief: 'Tech products' });\n *\n * // Continue the conversation — use the server-returned contextId, not\n * // the client-minted correlation taskId.\n * const refined = await agent.continueConversation(\n * 'Focus only on laptops under $1000',\n * initial.metadata.contextId!\n * );\n * ```\n */\n async continueConversation<T = any>(\n message: string,\n contextId: string,\n inputHandler?: InputHandler\n ): Promise<TaskResult<T>> {\n const agent = await this.ensureEndpointDiscovered();\n const creativeAssociation = this.canonicalCreativeTaskAssociation(contextId);\n if (!creativeAssociation) {\n return this.executor.executeTask<T>(agent, 'continue_conversation', { message }, inputHandler, { contextId });\n }\n\n const { taskType: creativeTaskType } = creativeAssociation;\n const legacyFormatConverter = this.finalLegacyFormatConverter(creativeAssociation.legacyFormatConverter);\n const result = await canonicalCreativeExecutionStorage.run(\n { taskType: creativeTaskType, canonical: true, legacyFormatConverter },\n () =>\n this.executor.executeTask<T>(\n agent,\n 'continue_conversation',\n { message },\n this.canonicalCreativeInputHandler(creativeTaskType, inputHandler),\n { contextId }\n )\n );\n const canonical = this.canonicalizeCreativeTaskResult(result, creativeTaskType, undefined, legacyFormatConverter);\n this.rememberCanonicalCreativeTaskIds(\n canonical,\n creativeTaskType,\n legacyFormatConverter,\n creativeAssociation.routingSnapshot\n );\n return this.wrapCanonicalCreativeContinuations(\n canonical,\n creativeTaskType,\n undefined,\n legacyFormatConverter,\n creativeAssociation.routingSnapshot\n );\n }\n\n /**\n * Get conversation history for a task\n */\n getConversationHistory(taskId: string): Message[] | undefined {\n const history = this.executor.getConversationHistory(taskId);\n const association = this.canonicalCreativeTaskAssociation(taskId);\n if (!association) return history;\n const { taskType } = association;\n const converter = this.resolveLegacyFormatConverter(association.legacyFormatConverter);\n return history?.map(message => ({\n ...message,\n content: projectCanonicalCreativeAncillaryValue(message.content, taskType, converter),\n })) as Message[] | undefined;\n }\n\n /**\n * Clear conversation history for a task\n */\n clearConversationHistory(taskId: string): void {\n this.executor.clearConversationHistory(taskId);\n this.forgetCanonicalCreativeTaskAssociationKeys([taskId]);\n this.productPolicyRequestParamsByTask.delete(taskId);\n }\n\n // ====== AGENT INFORMATION ======\n\n /**\n * Get the agent configuration with normalized protocol\n *\n * Returns the agent config with:\n * - Protocol normalized (e.g., .well-known URLs switch to A2A)\n * - If canonical URL has been resolved, agent_uri will be the canonical URL\n *\n * For guaranteed canonical URL, use getResolvedAgent() instead.\n */\n getAgent(): AgentConfig {\n // If we have resolved the canonical URL, return config with it\n if (this.canonicalBaseUrl) {\n const { _needsDiscovery, _needsCanonicalUrl, ...cleanAgent } = this.normalizedAgent;\n return {\n ...cleanAgent,\n agent_uri: this.canonicalBaseUrl,\n };\n }\n\n // Return normalized agent without internal flags\n const { _needsDiscovery, _needsCanonicalUrl, ...cleanAgent } = this.normalizedAgent;\n return { ...cleanAgent };\n }\n\n /**\n * Get the fully resolved agent configuration\n *\n * This async method ensures the agent config has the canonical URL resolved:\n * - For A2A: Fetches the agent card and uses its 'url' field\n * - For MCP: Performs endpoint discovery\n *\n * @returns Promise resolving to agent config with canonical URL\n */\n async getResolvedAgent(): Promise<AgentConfig> {\n await this.resolveCanonicalUrl();\n return this.getAgent();\n }\n\n /**\n * Get the agent ID\n */\n getAgentId(): string {\n return this.agent.id;\n }\n\n /**\n * Get the agent name\n */\n getAgentName(): string {\n return this.agent.name;\n }\n\n /**\n * Get the agent protocol (may be normalized from original config)\n */\n getProtocol(): 'mcp' | 'a2a' {\n return this.normalizedAgent.protocol;\n }\n\n /**\n * Get the canonical base URL for this agent\n *\n * Returns the canonical URL if already resolved, or computes it synchronously\n * from the configured URL. For the most accurate canonical URL (especially for A2A\n * where the agent card contains the authoritative URL), use resolveCanonicalUrl() first.\n *\n * The canonical URL is:\n * - For A2A: The 'url' field from the agent card (if resolved), or base URL with\n * the well-known agent card path stripped\n * - For MCP: The discovered endpoint with /mcp stripped\n *\n * @returns The canonical base URL (synchronous, may not be fully resolved)\n */\n getCanonicalUrl(): string {\n // Return cached canonical URL if available\n if (this.canonicalBaseUrl) {\n return this.canonicalBaseUrl;\n }\n\n // Compute from configured URL (best effort without network call)\n return this.computeBaseUrl(this.normalizedAgent.agent_uri);\n }\n\n /**\n * Resolve and return the canonical base URL for this agent\n *\n * This async method ensures the canonical URL is properly resolved:\n * - For A2A: Fetches the agent card and uses its 'url' field\n * - For MCP: Performs endpoint discovery and strips /mcp suffix\n *\n * The result is cached, so subsequent calls are fast.\n *\n * @returns Promise resolving to the canonical base URL\n */\n async resolveCanonicalUrl(): Promise<string> {\n if (this.canonicalBaseUrl) {\n return this.canonicalBaseUrl;\n }\n\n if (this.normalizedAgent.protocol === 'a2a') {\n await this.ensureCanonicalUrlResolved();\n } else if (this.normalizedAgent.protocol === 'mcp') {\n await this.ensureEndpointDiscovered();\n }\n\n return this.canonicalBaseUrl || this.computeBaseUrl(this.normalizedAgent.agent_uri);\n }\n\n /**\n * Check if this agent is the same as another agent\n *\n * Compares agents by their canonical base URLs. Two agents are considered\n * the same if they have the same canonical URL, regardless of:\n * - Protocol (MCP vs A2A)\n * - URL format (with/without /mcp, with/without well-known agent card path)\n * - Trailing slashes\n *\n * @param other - Another agent configuration or SingleAgentClient to compare\n * @returns true if agents have the same canonical URL\n */\n isSameAgent(other: AgentConfig | SingleAgentClient): boolean {\n const thisUrl = this.getCanonicalUrl().toLowerCase();\n\n let otherUrl: string;\n if (other instanceof SingleAgentClient) {\n otherUrl = other.getCanonicalUrl().toLowerCase();\n } else {\n otherUrl = this.computeBaseUrl(other.agent_uri).toLowerCase();\n }\n\n return thisUrl === otherUrl;\n }\n\n /**\n * Async version of isSameAgent that resolves canonical URLs first\n *\n * This provides more accurate comparison for A2A agents since it fetches\n * the agent card to get the authoritative canonical URL.\n *\n * @param other - Another agent configuration or SingleAgentClient to compare\n * @returns Promise resolving to true if agents have the same canonical URL\n */\n async isSameAgentResolved(other: AgentConfig | SingleAgentClient): Promise<boolean> {\n const thisUrl = (await this.resolveCanonicalUrl()).toLowerCase();\n\n let otherUrl: string;\n if (other instanceof SingleAgentClient) {\n otherUrl = (await other.resolveCanonicalUrl()).toLowerCase();\n } else {\n // For raw AgentConfig, we can only compute from the URL\n otherUrl = this.computeBaseUrl(other.agent_uri).toLowerCase();\n }\n\n return thisUrl === otherUrl;\n }\n\n /**\n * Get active tasks for this agent\n */\n getActiveTasks() {\n return this.executor\n .getActiveTasks()\n .filter(task => task.agent.id === this.agent.id)\n .map(task => {\n assertNativeRequestProposalsTask(task);\n if (!CANONICAL_CREATIVE_ACTIVITY_TASKS.has(task.taskName)) return task;\n const converter = this.resolveLegacyFormatConverter(\n this.canonicalCreativeTaskAssociation(task.taskId)?.legacyFormatConverter\n );\n return stripLegacyCreativeIdentity({\n ...task,\n params: projectCanonicalCreativeAncillaryValue(task.params, task.taskName, converter),\n messages: task.messages.map(message => ({\n ...message,\n content: projectCanonicalCreativeAncillaryValue(message.content, task.taskName, converter),\n })),\n ...(task.pendingInput !== undefined && {\n pendingInput: projectCanonicalCreativeAncillaryValue(task.pendingInput, task.taskName, converter),\n }),\n }) as TaskState;\n });\n }\n\n // ====== TASK MANAGEMENT & NOTIFICATIONS ======\n\n /**\n * List all tasks for this agent with detailed information\n *\n * @returns Promise resolving to array of task information\n *\n * @example\n * ```typescript\n * const tasks = await client.listTasks();\n * tasks.forEach(task => {\n * console.log(`${task.taskName}: ${task.status}`);\n * });\n * ```\n */\n async listTasks(): Promise<TaskInfo[]> {\n const tasks = await this.executor.getTaskList(this.agent.id);\n return tasks.map(task =>\n assertNativeRequestProposalsTask(\n CANONICAL_CREATIVE_ACTIVITY_TASKS.has(task.taskType)\n ? this.canonicalizeCreativeTaskInfo(\n task,\n task.taskType,\n undefined,\n this.resolveLegacyFormatConverter(\n this.canonicalCreativeTaskAssociation(task.taskId)?.legacyFormatConverter\n )\n )\n : task\n )\n );\n }\n\n /**\n * Get detailed information about a specific task\n *\n * @param taskId - ID of the task to get information for\n * @returns Promise resolving to task information\n */\n async getTaskInfo(taskId: string): Promise<TaskInfo | null> {\n const task = await this.executor.getTaskInfo(taskId);\n if (!task) return null;\n return assertNativeRequestProposalsTask(\n CANONICAL_CREATIVE_ACTIVITY_TASKS.has(task.taskType)\n ? this.canonicalizeCreativeTaskInfo(\n task,\n task.taskType,\n undefined,\n this.resolveLegacyFormatConverter(this.canonicalCreativeTaskAssociation(task.taskId)?.legacyFormatConverter)\n )\n : task\n );\n }\n\n /**\n * Subscribe to task notifications for this agent\n *\n * @param callback - Function to call when task status changes\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * const unsubscribe = client.onTaskUpdate((task) => {\n * console.log(`Task ${task.taskName} is now ${task.status}`);\n * if (task.status === 'completed') {\n * // Handle completion\n * }\n * });\n *\n * // Later, stop listening\n * unsubscribe();\n * ```\n */\n onTaskUpdate(callback: (task: TaskInfo) => void): () => void {\n return this.executor.onTaskUpdate(this.agent.id, task =>\n callback(\n assertNativeRequestProposalsTask(\n CANONICAL_CREATIVE_ACTIVITY_TASKS.has(task.taskType)\n ? this.canonicalizeCreativeTaskInfo(\n task,\n task.taskType,\n undefined,\n this.resolveLegacyFormatConverter(\n this.canonicalCreativeTaskAssociation(task.taskId)?.legacyFormatConverter\n )\n )\n : task\n )\n )\n );\n }\n\n /**\n * Subscribe to all task events (create, update, complete, error)\n *\n * @param callbacks - Event callbacks for different task events\n * @returns Unsubscribe function\n */\n onTaskEvents(callbacks: {\n onTaskCreated?: (task: TaskInfo) => void;\n onTaskUpdated?: (task: TaskInfo) => void;\n onTaskCompleted?: (task: TaskInfo) => void;\n onTaskFailed?: (task: TaskInfo, error: string) => void;\n }): () => void {\n const safe = (task: TaskInfo): TaskInfo =>\n assertNativeRequestProposalsTask(\n CANONICAL_CREATIVE_ACTIVITY_TASKS.has(task.taskType)\n ? this.canonicalizeCreativeTaskInfo(\n task,\n task.taskType,\n undefined,\n this.resolveLegacyFormatConverter(\n this.canonicalCreativeTaskAssociation(task.taskId)?.legacyFormatConverter\n )\n )\n : task\n );\n return this.executor.onTaskEvents(this.agent.id, {\n ...(callbacks.onTaskCreated && { onTaskCreated: task => callbacks.onTaskCreated!(safe(task)) }),\n ...(callbacks.onTaskUpdated && { onTaskUpdated: task => callbacks.onTaskUpdated!(safe(task)) }),\n ...(callbacks.onTaskCompleted && { onTaskCompleted: task => callbacks.onTaskCompleted!(safe(task)) }),\n ...(callbacks.onTaskFailed && {\n onTaskFailed: (task, error) => {\n const safeTask = safe(task);\n callbacks.onTaskFailed!(safeTask, safeTask.error ?? stripLegacyCreativeIdentity(error));\n },\n }),\n });\n }\n\n /**\n * Register webhook URL for receiving task notifications\n *\n * @param webhookUrl - URL to receive webhook notifications\n * @param taskTypes - Optional array of task types to watch (defaults to all)\n *\n * @example\n * ```typescript\n * await client.registerWebhook('https://myapp.com/webhook', ['create_media_buy']);\n * ```\n */\n async registerWebhook(webhookUrl: string, taskTypes?: string[]): Promise<void> {\n const agent = await this.ensureEndpointDiscovered();\n return this.executor.registerWebhook(agent, webhookUrl, taskTypes);\n }\n\n /**\n * Unregister webhook notifications\n */\n async unregisterWebhook(): Promise<void> {\n const agent = await this.ensureEndpointDiscovered();\n return this.executor.unregisterWebhook(agent);\n }\n\n // ====== AGENT DISCOVERY METHODS ======\n\n /**\n * Get comprehensive agent information including name, description, and available tools/skills\n *\n * Works with both MCP (tools) and A2A (skills) protocols to discover what the agent can do.\n *\n * Auth resolution: this method forwards `agent.headers` as `customHeaders`\n * to the MCP transport so header-only auth (HTTP Basic via gateways like\n * Apigee/Kong, x-api-key, custom tenant routing) reaches the precheck\n * path. The invariant — **basic-auth credentials live entirely on\n * `headers.Authorization`; do not also set `auth_token`** — is documented\n * at `docs/guides/BASIC-AUTH.md`. See #1864 for the failure mode if it's\n * violated.\n *\n * @returns Promise resolving to agent information including tools\n *\n * @example\n * ```typescript\n * const client = new ADCPClient(agentConfig);\n * const info = await client.getAgentInfo();\n *\n * console.log(`${info.name}: ${info.description}`);\n * console.log(`Supports ${info.tools.length} tools`);\n *\n * info.tools.forEach(tool => {\n * console.log(` - ${tool.name}: ${tool.description}`);\n * });\n * ```\n */\n async getAgentInfo(options?: ReadRequestOptions): Promise<{\n name: string;\n description?: string;\n protocol: 'mcp' | 'a2a';\n url: string;\n tools: Array<{\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n parameters?: string[];\n }>;\n }> {\n // adcp-client#1799 — wrap every wire call in the response-size cap so\n // `transport.maxResponseBytes` extends to discovery / tools-list bodies.\n // `withResponseSizeLimit` is a no-op when no cap is configured.\n const { withResponseSizeLimit } = await import('../protocols/responseSizeLimit');\n throwIfAborted(options?.signal);\n const transport = normalizeTransportOptions(options?.transport ?? this.config.transport);\n const maxResponseBytes = transport?.maxResponseBytes;\n const requestTimeoutMs = resolveRequestTimeoutMs(transport?.requestTimeoutMs, DEFAULT_REQUEST_TIMEOUT_MS);\n const clientRequestTimeoutMs = resolveClientRequestTimeoutMs(transport?.requestTimeoutMs);\n const mcpRequestOptions = {\n ...(options?.signal && { signal: options.signal }),\n ...(clientRequestTimeoutMs !== undefined && { timeout: clientRequestTimeoutMs }),\n };\n const ensureReadAuthToken = async (): Promise<string | undefined> => {\n if (!this.normalizedAgent.oauth_client_credentials) return this.normalizedAgent.auth_token;\n const { ensureClientCredentialsTokens, getAgentStorage } = await import('../auth/oauth');\n await ensureClientCredentialsTokens(this.normalizedAgent, {\n storage: getAgentStorage(this.normalizedAgent),\n allowPrivateIp: transport?.allowPrivateIp ?? isLikelyPrivateUrl(this.normalizedAgent.agent_uri),\n fetch: transport?.trustedFetchFn,\n signal: options?.signal,\n });\n return this.normalizedAgent.oauth_tokens?.access_token;\n };\n if (this.normalizedAgent.protocol === 'mcp') {\n // In-process: use the pre-connected client instead of opening a new HTTP connection\n if (this.normalizedAgent._inProcessMcpClient) {\n const mcpClient = this.normalizedAgent._inProcessMcpClient;\n const toolsList = await withResponseSizeLimit(maxResponseBytes, () =>\n mcpClient.listTools(undefined, mcpRequestOptions)\n );\n const tools = toolsList.tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema as Record<string, unknown> | undefined,\n parameters: tool.inputSchema?.properties ? Object.keys(tool.inputSchema.properties as object) : [],\n }));\n return {\n name: this.normalizedAgent.name,\n description: undefined,\n protocol: this.normalizedAgent.protocol,\n url: this.normalizedAgent.agent_uri,\n tools,\n };\n }\n\n const readAuthToken = await ensureReadAuthToken();\n // Discover endpoint if needed\n const agent = await this.ensureEndpointDiscovered(options);\n\n // Use the shared connectMCP path so both static bearer AND saved OAuth\n // tokens work. OAuth takes the refresh-capable authProvider branch.\n // Header-only auth (basic, x-api-key, custom routing) lives on\n // `normalizedAgent.headers` and must be forwarded as `customHeaders` —\n // basic auth in particular suppresses `auth_token` on purpose so the\n // SDK doesn't emit a competing `Authorization: Bearer …`.\n const { connectMCP } = await import('../protocols/mcp');\n const { tryListModernMCPTools } = await import('../protocols/mcp-modern');\n const connectOptions: Parameters<typeof connectMCP>[0] = { agentUrl: agent.agent_uri };\n if (options?.signal) {\n connectOptions.signal = options.signal;\n }\n if (transport?.requestTimeoutMs !== undefined) {\n connectOptions.requestTimeoutMs = transport.requestTimeoutMs;\n }\n if (transport?.trustedFetchFn) {\n connectOptions.fetchFn = transport.trustedFetchFn;\n }\n if (transport?.allowPrivateIp !== undefined) {\n connectOptions.allowPrivateIp = transport.allowPrivateIp;\n }\n if (this.normalizedAgent.headers && Object.keys(this.normalizedAgent.headers).length > 0) {\n connectOptions.customHeaders = this.normalizedAgent.headers;\n }\n let authProvider: Parameters<typeof connectMCP>[0]['authProvider'];\n if (this.normalizedAgent.oauth_tokens && !this.normalizedAgent.oauth_client_credentials) {\n const { getAgentStorage } = await import('../auth/oauth');\n const { getNonInteractiveOAuthProvider } = await import('../auth/oauth/provider-cache');\n authProvider = getNonInteractiveOAuthProvider(this.normalizedAgent, {\n agentHint: this.normalizedAgent.id,\n storage: getAgentStorage(this.normalizedAgent),\n allowHttp: isLikelyPrivateUrl(this.normalizedAgent.agent_uri),\n });\n connectOptions.authProvider = authProvider;\n } else if (readAuthToken) {\n connectOptions.authToken = readAuthToken;\n }\n\n const modernTools =\n !transport?.trustedFetchFn &&\n this.discoveredMcpEra === 'legacy' &&\n Date.now() - this.discoveredMcpEraAt < 5 * 60 * 1000\n ? ({ handled: false } as const)\n : await withResponseSizeLimit(maxResponseBytes, () =>\n tryListModernMCPTools(agent.agent_uri, readAuthToken, this.normalizedAgent.headers, {\n authProvider,\n signal: options?.signal,\n requestTimeoutMs: transport?.requestTimeoutMs,\n fetchFn: transport?.trustedFetchFn,\n allowPrivateIp: transport?.allowPrivateIp,\n })\n );\n if (modernTools.handled) {\n const tools = modernTools.tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n parameters: tool.inputSchema?.properties ? Object.keys(tool.inputSchema.properties) : [],\n }));\n return {\n name: this.normalizedAgent.name,\n description: undefined,\n protocol: this.normalizedAgent.protocol,\n url: agent.agent_uri,\n tools,\n };\n }\n\n const { client: mcpClient } = await connectMCP(connectOptions);\n try {\n const toolsList = await withResponseSizeLimit(maxResponseBytes, () =>\n mcpClient.listTools(undefined, mcpRequestOptions)\n );\n\n const tools = toolsList.tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n parameters: tool.inputSchema?.properties ? Object.keys(tool.inputSchema.properties) : [],\n }));\n\n return {\n name: this.normalizedAgent.name,\n description: undefined,\n protocol: this.normalizedAgent.protocol,\n url: agent.agent_uri,\n tools,\n };\n } finally {\n try {\n await mcpClient.close();\n } catch {\n /* ignore */\n }\n }\n } else if (this.normalizedAgent.protocol === 'a2a') {\n // Use A2A SDK to get agent card\n\n // adcp-client#1799 — route the custom fetchImpl through\n // `wrapFetchWithSizeLimit` so the active ALS slot enforces the cap on\n // the card-discovery body. Without this, the auth-stamping wrapper\n // calls native `fetch` directly and ignores `transport.maxResponseBytes`.\n const { wrapFetchWithSizeLimit } = await import('../protocols/responseSizeLimit');\n const authToken = await ensureReadAuthToken();\n const agentHeaders = this.normalizedAgent.headers ?? {};\n const sizeLimitedFetch = wrapFetchWithSizeLimit((input, init) =>\n transport?.trustedFetchFn ? transport.trustedFetchFn(input, init) : fetch(input as RequestInfo | URL, init)\n );\n const normalizeHeaders = (headers?: HeadersInit): Record<string, string> => {\n const normalized: Record<string, string> = {};\n if (!headers) return normalized;\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n normalized[key] = value;\n });\n } else if (Array.isArray(headers)) {\n for (const [key, value] of headers) {\n normalized[key] = value;\n }\n } else {\n Object.assign(normalized, headers);\n }\n return normalized;\n };\n const buildHeaders = (requestInit?: RequestInit): Record<string, string> => ({\n ...normalizeHeaders(requestInit?.headers),\n ...agentHeaders,\n ...(authToken && {\n Authorization: `Bearer ${authToken}`,\n 'x-adcp-auth': authToken,\n }),\n });\n const fetchImpl = async (url: string | URL | Request, requestInit?: RequestInit) => {\n const headers = buildHeaders(requestInit);\n return withAbortSignal<Response>([options?.signal, requestInit?.signal], requestTimeoutMs, signal =>\n sizeLimitedFetch(url as RequestInfo | URL, { ...requestInit, headers, signal })\n );\n };\n\n const cardUrls = buildCardUrls(this.normalizedAgent.agent_uri);\n\n let client: InstanceType<typeof A2AClient> | undefined;\n let lastCardError: Error = new Error(`A2A agent card not found at ${cardUrls.join(', ')}`);\n for (const cardUrl of cardUrls) {\n try {\n // Wrap A2A card discovery so `transport.maxResponseBytes` applies\n // to agent-card fetches and the deferred `agentCardPromise` read\n // below — both fire fetches that would otherwise bypass the cap.\n client = await withResponseSizeLimit(maxResponseBytes, () => A2AClient.fromCardUrl(cardUrl, { fetchImpl }));\n break;\n } catch (err: unknown) {\n lastCardError = err as Error;\n }\n }\n if (!client) {\n throw lastCardError;\n }\n const agentCard = await withResponseSizeLimit(maxResponseBytes, async () =>\n client.agentCardPromise ? client.agentCardPromise : client.agentCard\n );\n\n const tools = agentCard?.skills\n ? agentCard.skills.map(\n (skill: {\n id?: string;\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n inputFormats?: string[];\n }) => ({\n name: skill.id || skill.name,\n description: skill.description,\n inputSchema: skill.inputSchema,\n parameters: skill.inputFormats || [],\n })\n )\n : [];\n\n return {\n name: agentCard?.displayName || agentCard?.name || this.normalizedAgent.name,\n description: agentCard?.description,\n protocol: this.normalizedAgent.protocol,\n url: this.normalizedAgent.agent_uri,\n tools,\n };\n }\n\n throw new Error(`Unsupported protocol: ${this.normalizedAgent.protocol}`);\n }\n\n /**\n * Get agent capabilities, including AdCP version support\n *\n * For v3 servers, calls get_adcp_capabilities tool.\n * For v2 servers, builds synthetic capabilities from available tools.\n *\n * @returns Promise resolving to normalized capabilities object\n *\n * @example\n * ```typescript\n * const capabilities = await client.getCapabilities();\n *\n * console.log(`Server version: ${capabilities.version}`);\n * console.log(`Protocols: ${capabilities.protocols.join(', ')}`);\n *\n * if (capabilities.features.propertyListFiltering) {\n * // Use v3 property list features\n * }\n * ```\n */\n async getCapabilities(options?: ReadRequestOptions): Promise<AdcpCapabilities> {\n throwIfAborted(options?.signal);\n const discoveryContext = (options as InternalReadRequestOptions | undefined)?.[CAPABILITY_DISCOVERY_CONTEXT];\n const transport = normalizeTransportOptions(options?.transport ?? this.config.transport);\n const usesScopedFetch = transport?.trustedFetchFn !== undefined;\n // Return cached if available\n if (!usesScopedFetch && this.cachedCapabilities) {\n if (discoveryContext) discoveryContext.toolSchemas = this.cachedToolSchemas;\n this.maybeWarnV2Sunset(this.cachedCapabilities);\n return this.cachedCapabilities;\n }\n\n // First get tool list to support both detection methods\n const agentInfo = await this.getAgentInfo(options);\n const tools: ToolInfo[] = agentInfo.tools.map(t => ({\n name: t.name,\n description: t.description,\n }));\n\n // Make raw tool schemas available for field-level compatibility checks\n // (e.g. buying_mode on get_products). Scoped fetch keeps them in the\n // request-local discovery context; unscoped calls may share the cache.\n const discoveredToolSchemas = new Map(\n agentInfo.tools\n .filter(t => t.inputSchema?.properties)\n .map(t => [t.name, t.inputSchema!.properties as Record<string, unknown>])\n );\n if (discoveryContext) discoveryContext.toolSchemas = discoveredToolSchemas;\n if (!usesScopedFetch) this.cachedToolSchemas = discoveredToolSchemas;\n\n // Check if agent supports get_adcp_capabilities (v3)\n const advertisesCapabilitiesTool = tools.some(t => t.name === 'get_adcp_capabilities');\n // The official A2A adapter omits discovery from the public skill card but\n // does advertise the framework task lifecycle. That combination is safe\n // evidence that get_adcp_capabilities is routable. Do not blindly probe\n // arbitrary A2A agents: an unadvertised call can consume application work\n // or change session state on non-AdCP routers.\n const officialA2ALifecycle =\n this.normalizedAgent.protocol === 'a2a' &&\n tools.some(tool => ['tasks/get', 'get_task_status', 'list_tasks'].includes(tool.name));\n const hasCapabilitiesTool = advertisesCapabilitiesTool || officialA2ALifecycle;\n\n if (hasCapabilitiesTool) {\n try {\n // ensureEndpointDiscovered is a no-op for in-process agents (_needsDiscovery is false\n // because normalizeAgentConfig returns early when _inProcessMcpClient is set). The\n // executor then hits ProtocolClient.callTool which reads _inProcessMcpClient directly,\n // so the sentinel adcp-in-process:// URI never reaches validateAgentUrl.\n const agent = await this.ensureEndpointDiscovered(options);\n const result = await this.executor.executeTask<any>(agent, 'get_adcp_capabilities', {}, undefined, options);\n throwIfAborted(options?.signal);\n const requestTimeoutMs = resolveRequestTimeoutMs(\n options?.transport?.requestTimeoutMs ?? this.config.transport?.requestTimeoutMs\n );\n if (\n !result.success &&\n requestTimeoutMs !== undefined &&\n /\\b(requesttimeout|timeout|timed out)\\b/i.test(result.error ?? '')\n ) {\n throw createTimeoutError(requestTimeoutMs);\n }\n\n if (result.success && result.data) {\n const capabilities = augmentCapabilitiesFromTools(parseCapabilitiesResponse(result.data), tools);\n if (!usesScopedFetch) this.cachedCapabilities = capabilities;\n this.maybeWarnV2Sunset(capabilities);\n return capabilities;\n }\n if (!advertisesCapabilitiesTool) {\n throw new Error('unadvertised official A2A capability probe was not supported');\n }\n // Tightened v2 fallback (issue #1189). When `result.success` is false\n // but `result.data` is structurally v3-shaped, the agent is a v3 agent\n // with a wire-shape bug — typically a single failed schema validation\n // on `get_adcp_capabilities`. Falling back to v2 in this case masks\n // the original bug behind cascading \"AdCP schema data for version v2.5\n // not found\" errors that nobody can debug. Parse the data anyway,\n // surface the validation failure loudly, and continue with the\n // v3 capabilities the agent actually returned.\n //\n // Override `version`/`majorVersions` after parse: when the response\n // doesn't carry an explicit `adcp.major_versions` block (one of the\n // valid v3-shape signals), `parseCapabilitiesResponse` defaults\n // majorVersions to [2] which would re-classify a known-v3 response\n // as v2 downstream. The heuristic established v3-shape; honor that.\n // CodeQL: deliberately omit `result.error` from the log (matches the\n // existing fallback log below) — it can carry transport-level agent\n // identifiers that flow through the clear-text-logging tracker.\n if (result.data && looksLikeV3Capabilities(result.data)) {\n console.warn(\n `[AdCP] Agent \"${this.agent.id}\" returned a get_adcp_capabilities response that ` +\n `failed validation, but the response is structurally v3-shaped. Treating as v3 ` +\n `(the agent has a wire-shape bug — that's the thing to fix).`,\n { hasError: !!result.error, hasData: !!result.data }\n );\n const parsed = parseCapabilitiesResponse(result.data);\n const v3Capabilities: AdcpCapabilities = {\n ...parsed,\n version: 'v3',\n majorVersions: parsed.majorVersions.includes(3) ? parsed.majorVersions : ([3] as AdcpMajorVersion[]),\n };\n const capabilities = augmentCapabilitiesFromTools(v3Capabilities, tools);\n if (!usesScopedFetch) this.cachedCapabilities = capabilities;\n this.maybeWarnV2Sunset(capabilities);\n return capabilities;\n }\n // The call returned non-success and the response wasn't even\n // structurally v3-shaped (so the heuristic above didn't catch it),\n // OR data is missing entirely. The agent still advertises the\n // v3-only `get_adcp_capabilities` tool, so it's verifiably v3 —\n // synthesize v3 capabilities from the tool list and continue\n // (issue #1217). Falling back to v2 here cascades into \"AdCP\n // schema data for version v2.5 not found\" errors that obscure\n // the real bug (the broken capabilities response).\n //\n // We deliberately omit `result.data` and `result.error` from the\n // log: they can carry OAuth metadata or transport-level identifiers\n // (CodeQL clear-text-logging tracker). Shape booleans + status are\n // enough to triage.\n console.warn(\n `[AdCP] Agent \"${this.agent.id}\" advertises get_adcp_capabilities but the call ` +\n `returned non-success and the response is not v3-shaped — treating as v3 (synthetic) ` +\n `since the agent has the v3-only discovery tool. ` +\n `This client routes to v3 adapters, but calls reading capability details ` +\n `(idempotency TTL, supported_versions, feature flags) will fail until the agent ` +\n `operator fixes the capabilities endpoint.`,\n {\n success: result.success,\n hasError: !!result.error,\n hasData: !!result.data,\n }\n );\n } catch (error: unknown) {\n // Re-throw errors that indicate real infrastructure problems —\n // only fall through for tool-execution failures (the agent\n // advertises get_adcp_capabilities but can't actually serve it).\n if (\n error instanceof AuthenticationRequiredError ||\n error instanceof ConfigurationError ||\n error instanceof TaskTimeoutError ||\n isAbortOrTimeoutError(error)\n ) {\n throw error;\n }\n if (advertisesCapabilitiesTool) {\n console.warn(\n `[AdCP] Agent \"${this.agent.id}\" advertises get_adcp_capabilities but the call ` +\n `threw — treating as v3 (synthetic) since the agent has the v3-only discovery tool. ` +\n `This client routes to v3 adapters, but calls reading capability details ` +\n `(idempotency TTL, supported_versions, feature flags) will fail until the agent ` +\n `operator fixes the capabilities endpoint.`\n );\n }\n }\n\n // Synthesize v3 capabilities from the tool list. Reached only when\n // the executor returned non-v3-shaped data, OR threw a non-auth\n // non-timeout error. The agent's v3-only tool list is the affirmative\n // signal that it's v3 even though we couldn't read details.\n if (advertisesCapabilitiesTool) {\n const capabilities = augmentCapabilitiesFromTools(buildSyntheticV3Capabilities(tools), tools);\n if (!usesScopedFetch) this.cachedCapabilities = capabilities;\n this.maybeWarnV2Sunset(capabilities);\n return capabilities;\n }\n }\n\n // No get_adcp_capabilities tool — the agent is verifiably v2 (the tool\n // is v3-only). Synthesize v2 capabilities from the tool list.\n console.warn(\n `[AdCP] Agent \"${this.agent.id}\" detected as v2 (no get_adcp_capabilities tool). ` +\n `Tools: [${tools.map(t => t.name).join(', ')}]`\n );\n const capabilities = buildSyntheticCapabilities(tools);\n if (!usesScopedFetch) this.cachedCapabilities = capabilities;\n return capabilities;\n }\n\n /**\n * Emit a one-time warning when the agent reports v2 capabilities.\n *\n * v2 went unsupported on 2026-04-20 (AdCP 3.0 GA — adcp#2220). We still\n * execute v2 code paths (no behaviour change), but clients integrating\n * against an unsupported agent should hear about it loudly.\n *\n * Synthetic capabilities (no `get_adcp_capabilities` tool available) don't\n * trigger the warning — we don't actually know the agent's version, and\n * shouting at legitimately-unversioned agents would be noise.\n *\n * Suppression: `process.env.ADCP_ALLOW_V2 === '1'`.\n */\n private maybeWarnV2Sunset(capabilities: AdcpCapabilities): void {\n if (this._v2WarningFired) return;\n if (capabilities.version === 'v3') return;\n if (capabilities._synthetic) return;\n if (process.env.ADCP_ALLOW_V2 === '1') return;\n\n this._v2WarningFired = true;\n console.warn(\n `[adcp] Warning: agent ${this.agent.agent_uri} reports v2 capabilities. ` +\n `v2 went unsupported on 2026-04-20 (AdCP 3.0 GA). ` +\n `Upgrade the agent to v3 or set ADCP_ALLOW_V2=1 to suppress this warning. ` +\n `See https://github.com/adcontextprotocol/adcp/issues/2220`\n );\n }\n\n /**\n * Warn once per client when `requireSupportedMajor` accepts synthetic v3\n * capabilities — the agent advertised the v3-only `get_adcp_capabilities`\n * tool but the call itself failed, so the version + idempotency-TTL\n * checks were skipped. Adopters who depend on TTL guarantees (BYOK retry\n * callers, idempotency replay logic) should know they're in a degraded\n * mode where the agent is verifiably v3 but specifics are unverifiable\n * until the agent's capabilities endpoint is fixed.\n *\n * One-shot via `_syntheticV3WarningFired` (matches `maybeWarnV2Sunset`\n * cadence). Issue #1217.\n */\n private maybeWarnSyntheticV3(): void {\n if (this._syntheticV3WarningFired) return;\n this._syntheticV3WarningFired = true;\n console.warn(\n `[adcp] Warning: agent ${this.agent.agent_uri} advertises get_adcp_capabilities (v3-only) ` +\n `but the call failed. Treating as v3 (synthetic) — version + idempotency-TTL checks skipped. ` +\n `Calls to getIdempotencyReplayTtlSeconds() will throw until the agent's capabilities ` +\n `endpoint is fixed. Report the wire-shape bug to the agent operator at ${this.agent.agent_uri}.`\n );\n }\n\n /**\n * Warn once per client when `requireSupportedMajor` routes a synthetic-v2\n * seller through the v2 adapter — the agent did not expose\n * `get_adcp_capabilities`, so the version was inferred from `tools/list`.\n * A compliant v3 seller would declare itself; absence of a declaration is\n * read as v2. Idempotency-TTL guarantees are unknown for these sellers,\n * so BYOK retry callers should treat them as such.\n *\n * One-shot via `_syntheticV2WarningFired` (matches `maybeWarnV2Sunset`\n * cadence).\n */\n private maybeWarnSyntheticV2(): void {\n if (this._syntheticV2WarningFired) return;\n this._syntheticV2WarningFired = true;\n console.warn(\n `[adcp] Warning: agent ${this.agent.agent_uri} does not expose get_adcp_capabilities. ` +\n `Routing as v2 (synthetic) — idempotency-TTL guarantee is unknown. ` +\n `Ask the agent operator to declare v3 via get_adcp_capabilities if v3 routing is intended. ` +\n `Branch on client.isSyntheticV2() to tighten retry policies for these sellers.`\n );\n }\n\n /**\n * Detect server AdCP version\n *\n * @returns 'v2' or 'v3' based on server capabilities\n */\n async detectServerVersion(options?: ReadRequestOptions): Promise<'v2' | 'v3'> {\n const capabilities = await this.getCapabilities(options);\n const discoveryContext = (options as InternalReadRequestOptions | undefined)?.[CAPABILITY_DISCOVERY_CONTEXT];\n if (discoveryContext) discoveryContext.capabilities = capabilities;\n return capabilities.version;\n }\n\n /**\n * Whether the seller's capabilities are synthesized from `tools/list`\n * with no authoritative `get_adcp_capabilities` response — i.e. the\n * dispatcher routes through the v2 adapter and idempotency-TTL is\n * unknown. Use this to gate retry behavior for sellers whose retry\n * safety can't be derived from declared capabilities (lower attempt\n * caps, longer backoff, or fall back to natural-key recovery).\n *\n * Returns `false` for declared v2 sellers, declared v3 sellers, and\n * synthetic v3 sellers (which advertise the v3 discovery tool even\n * when the call itself failed).\n *\n * Caveat for synthetic v3: the predicate returns `false`, but TTL is\n * still unknown for those sellers — `getIdempotencyReplayTtlSeconds()`\n * throws until the agent's capabilities endpoint is fixed (issue\n * #1217). Retry-policy consumers that need a complete \"TTL unknown\"\n * gate should additionally check `getCapabilities()._synthetic`.\n */\n async isSyntheticV2(): Promise<boolean> {\n const capabilities = await this.getCapabilities();\n return capabilities._synthetic === true && capabilities.version === 'v2';\n }\n\n /**\n * Check if server supports a specific AdCP major version\n */\n async supportsVersion(version: 2 | 3): Promise<boolean> {\n const capabilities = await this.getCapabilities();\n return capabilities.majorVersions.includes(version);\n }\n\n /**\n * Return the seller's declared `adcp.idempotency.replay_ttl_seconds`.\n *\n * BYOK callers use this to compare the age of persisted keys against the\n * seller's replay window — past the window, the safe recovery is a\n * natural-key lookup rather than reusing the key.\n *\n * Fails closed when the seller is v3 but does not declare the field: the\n * spec makes the declaration REQUIRED, and silently defaulting to 24h\n * would mislead buyers about retry safety. Callers on v2 servers get\n * `undefined` instead of a throw — v2 pre-dates the idempotency envelope.\n */\n async getIdempotencyReplayTtlSeconds(): Promise<number | undefined> {\n const capabilities = await this.getCapabilities();\n if (capabilities.idempotency?.supported === false) return undefined;\n if (capabilities.idempotency) {\n assertValidIdempotencyReplayTtlSeconds(capabilities.idempotency.replayTtlSeconds);\n return capabilities.idempotency.replayTtlSeconds;\n }\n if (capabilities.version !== 'v3') return undefined;\n throw new ConfigurationError(\n `Agent \"${this.agent.id}\" is v3 but does not declare adcp.idempotency.replay_ttl_seconds. ` +\n `The spec requires this for v3 sellers — treating the agent as non-compliant rather than ` +\n `defaulting to 24h, which would silently mislead retry-sensitive flows.`,\n 'adcp.idempotency.replay_ttl_seconds'\n );\n }\n\n /**\n * Check if the seller supports a feature.\n *\n * Feature names resolve as follows:\n * - Protocol names ('media_buy', 'signals', etc.) check supported_protocols\n * - 'ext:<name>' checks extensions_supported\n * - 'targeting.<name>' checks media_buy.execution.targeting\n * - Other names check media_buy.features (e.g., 'audience_targeting', 'conversion_tracking')\n *\n * Absent features return false.\n */\n async supports(feature: FeatureName): Promise<boolean> {\n const capabilities = await this.getCapabilities();\n return resolveFeature(capabilities, feature);\n }\n\n /**\n * Require that the seller supports all listed features.\n * Throws FeatureUnsupportedError if any are missing.\n *\n * Call this before making feature-dependent task calls to fail fast\n * with an actionable error message.\n */\n async require(...features: FeatureName[]): Promise<void> {\n const capabilities = await this.getCapabilities();\n const missing = features.filter(f => !resolveFeature(capabilities, f));\n if (missing.length > 0) {\n throw new FeatureUnsupportedError(missing, listDeclaredFeatures(capabilities), this.agent.agent_uri);\n }\n }\n\n /**\n * Force-refresh cached capabilities from the server.\n * Useful when seller capabilities may have changed.\n */\n async refreshCapabilities(): Promise<AdcpCapabilities> {\n this.cachedCapabilities = undefined;\n return this.getCapabilities();\n }\n\n /**\n * Validate that the seller supports all features required by a task.\n * Throws FeatureUnsupportedError if any required features are missing.\n *\n * Skipped when validateFeatures is false or the task has no feature requirements.\n */\n private async validateTaskFeatures(taskName: string, options?: ReadRequestOptions): Promise<void> {\n if (this.config.validateFeatures === false) return;\n\n const requiredFeatures = TASK_FEATURE_MAP[taskName];\n if (!requiredFeatures || requiredFeatures.length === 0) return;\n\n const capabilities = await this.getCapabilities(options);\n const missing = requiredFeatures.filter(f => !resolveFeature(capabilities, f));\n if (missing.length > 0) {\n throw new FeatureUnsupportedError(missing, listDeclaredFeatures(capabilities), this.agent.agent_uri);\n }\n }\n\n /**\n * Fail version-incompatible request shapes before schema validation.\n *\n * Some 3.1 request controls change behavior rather than merely filtering a\n * result set. A pre-3.1 client pin should not silently drop those controls\n * or let a generic schema error hide the recovery path.\n */\n private assertRequestSupportedByConfiguredVersion(\n taskName: string,\n params: unknown,\n _options?: TaskOptions,\n canonicalCreativeInvocation = false\n ): void {\n const configuredVersion = this.config.wireAdcpVersion ?? this.resolvedAdcpVersion;\n const beta6Issue = beta6ReportingRequestIssue(taskName, params);\n if (beta6Issue && !isAdcpVersionAtLeast(configuredVersion, '3.2.0-beta.6')) {\n this.throwBeta6ReportingUnsupported(taskName, beta6Issue, configuredVersion);\n }\n if (\n taskName === 'preview_creative' &&\n canonicalCreativeInvocation &&\n isPre32AdcpVersion(this.config.wireAdcpVersion ?? this.resolvedAdcpVersion)\n ) {\n this.throwCanonicalPreviewUnsupported(this.config.wireAdcpVersion ?? this.resolvedAdcpVersion);\n }\n if (!isPre31AdcpVersion(this.resolvedAdcpVersion)) return;\n const request =\n params && typeof params === 'object' && !Array.isArray(params) ? (params as Record<string, unknown>) : {};\n\n if (taskName === 'get_signals' && request.discovery_mode === 'wholesale') {\n this.throwPre31UnsupportedFeature(taskName, 'discovery_mode', 'get_signals.discovery_mode=wholesale', {\n capabilityPath: 'signals.discovery_modes',\n suffix: 'Probe get_adcp_capabilities at signals.discovery_modes before issuing wholesale calls.',\n });\n }\n\n // An EXPLICIT push_notification_config on a discovery task is caller misuse\n // while hard-pinned <3.1: surface it rather than silently dropping the\n // caller's webhook. An AUTO-injected discovery webhook (from\n // `webhookUrlTemplate`) is degraded to polling instead; see\n // `suppressPre31DiscoveryWebhook`.\n if ((taskName === 'get_products' || taskName === 'get_signals') && request.push_notification_config !== undefined) {\n this.throwPre31UnsupportedFeature(taskName, 'push_notification_config', `${taskName}.push_notification_config`, {\n capabilityPath: 'adcp.supported_versions',\n suffix: 'Probe get_adcp_capabilities at adcp.supported_versions before relying on discovery task webhooks.',\n });\n }\n\n // Intentionally do not guard `if_wholesale_feed_version` /\n // `if_pricing_version`: 3.1 defines them as optimistic conditional\n // probes, and pre-3.1 sellers may safely ignore them and return the full\n // payload.\n }\n\n /**\n * Degrade the auto-injected get_products / get_signals discovery webhook to\n * polling when the client is pinned below 3.1. Discovery-task\n * `push_notification_config` is an AdCP 3.1 feature; a pre-3.1 seller would\n * reject it. Rather than throwing on the library's own auto-injected webhook\n * (which the caller never asked for), suppress it via `disableWebhook` and\n * record a `pre31_webhook_degraded` drift entry so the loss of push is\n * visible in `debug_logs`.\n *\n * Returns the effective options (a `disableWebhook` copy when suppressing,\n * otherwise the caller's unchanged) and an optional drift log to merge into\n * the result. Explicit caller-supplied `push_notification_config` is handled\n * by `assertRequestSupportedByConfiguredVersion` (it throws) and never\n * reaches here.\n */\n private suppressPre31DiscoveryWebhook(\n taskName: string,\n options?: TaskOptions,\n capabilities?: AdcpCapabilities\n ): { options: TaskOptions | undefined; driftLog?: Record<string, unknown> } {\n if (resolveAdapterKey(this.resolvedAdcpVersion, capabilities) !== '3.0') return { options };\n if (taskName !== 'get_products' && taskName !== 'get_signals') return { options };\n if (options?.disableWebhook) return { options };\n if (selectWebhookTemplate(this.config.webhookUrlTemplate, taskName) === undefined) return { options };\n\n const clientPinnedPre31 = isPre31AdcpVersion(this.resolvedAdcpVersion);\n const targetVersions = capabilities?.supportedVersions ?? [];\n const reason = clientPinnedPre31\n ? `this client is pinned to ${this.resolvedAdcpVersion}`\n : targetVersions.length > 0\n ? `the target seller advertises only ${targetVersions.join(', ')}`\n : 'the target seller does not advertise AdCP 3.1 support';\n return {\n options: { ...options, disableWebhook: true },\n driftLog: {\n type: 'pre31_webhook_degraded',\n message:\n `${taskName} discovery webhook degraded to polling: discovery-task push_notification_config ` +\n `requires AdCP 3.1, but ${reason}. ` +\n 'The seller will not receive a push webhook; poll for the result instead.',\n timestamp: new Date().toISOString(),\n taskName,\n clientVersion: this.resolvedAdcpVersion,\n ...(targetVersions.length > 0 ? { targetVersions } : {}),\n },\n };\n }\n\n /**\n * Reject shape-changing 3.1 requests after seller capability discovery.\n * This second gate covers a modern client talking to a 3.0 seller on the\n * first (cold-cache) call; the configured-version gate above still catches\n * an explicitly pre-3.1 client before validation or network I/O.\n */\n private assertRequestSupportedByTargetVersion(\n taskName: string,\n params: unknown,\n capabilities: AdcpCapabilities | undefined,\n canonicalCreativeInvocation = false,\n serverVersion?: 'v2' | 'v3'\n ): void {\n const beta6Issue = beta6ReportingRequestIssue(taskName, params);\n if (beta6Issue) {\n const advertisedVersions = capabilities?.supportedVersions ?? [];\n const responseVersion =\n typeof capabilities?._raw?.adcp_version === 'string' ? capabilities._raw.adcp_version : undefined;\n const supportsBeta6 =\n advertisedVersions.some(version => isAdcpVersionAtLeast(version, '3.2.0-beta.6')) ||\n (advertisedVersions.length === 0 && isAdcpVersionAtLeast(responseVersion, '3.2.0-beta.6'));\n const hasAuthoritativeLegacyEvidence =\n serverVersion === 'v2' ||\n advertisedVersions.length > 0 ||\n responseVersion !== undefined ||\n (capabilities?._synthetic === false && capabilities?.version === 'v3');\n if (!supportsBeta6 && hasAuthoritativeLegacyEvidence) {\n this.throwBeta6ReportingUnsupported(\n taskName,\n beta6Issue,\n advertisedVersions.join(', ') || responseVersion || serverVersion || capabilities?.version || 'unknown',\n 'the target seller does not advertise AdCP 3.2.0-beta.6 support'\n );\n }\n }\n if (taskName === 'preview_creative' && canonicalCreativeInvocation) {\n const advertisedVersions = capabilities?.supportedVersions ?? [];\n const responseVersion =\n typeof capabilities?._raw?.adcp_version === 'string' ? capabilities._raw.adcp_version : undefined;\n const supports32 =\n advertisedVersions.some(version => !isPre32AdcpVersion(version)) ||\n (advertisedVersions.length === 0 && responseVersion !== undefined && !isPre32AdcpVersion(responseVersion));\n const hasAuthoritativeLegacyEvidence =\n serverVersion === 'v2' ||\n advertisedVersions.length > 0 ||\n responseVersion !== undefined ||\n (capabilities?._synthetic === false && capabilities?.version === 'v3');\n if (!supports32 && hasAuthoritativeLegacyEvidence) {\n this.throwCanonicalPreviewUnsupported(\n advertisedVersions.join(', ') || responseVersion || serverVersion || capabilities?.version || 'unknown',\n 'the target seller does not advertise AdCP 3.2 support'\n );\n }\n }\n if (isPre31AdcpVersion(this.resolvedAdcpVersion)) return;\n // supportedVersions is the authoritative negotiation field. Legacy 3.0\n // sellers omit it; buildVersion is advisory and must not select a newer\n // wire shape. Shape-breaking wholesale discovery therefore requires\n // positive 3.1+ support from a declared v3 seller. The response envelope's\n // adcp_version is also direct evidence of the wire release the seller just\n // served (distinct from advisory adcp.build_version). Synthetic discovery\n // alone is not enough evidence to classify the seller as 3.0.\n const advertisedVersions = capabilities?.supportedVersions ?? [];\n if (advertisedVersions.some(version => !isPre31AdcpVersion(version))) return;\n const responseVersion =\n typeof capabilities?._raw?.adcp_version === 'string' ? capabilities._raw.adcp_version : undefined;\n if (advertisedVersions.length === 0 && responseVersion !== undefined && !isPre31AdcpVersion(responseVersion)) {\n return;\n }\n const declaredLegacyV3 = capabilities?.version === 'v3' && capabilities._synthetic === false;\n if (advertisedVersions.length === 0 && !declaredLegacyV3) return;\n const request =\n params && typeof params === 'object' && !Array.isArray(params) ? (params as Record<string, unknown>) : {};\n if (taskName === 'get_signals' && request.discovery_mode === 'wholesale') {\n this.throwPre31UnsupportedFeature(taskName, 'discovery_mode', 'get_signals.discovery_mode=wholesale', {\n capabilityPath: 'signals.discovery_modes',\n currentVersion: advertisedVersions.join(', ') || responseVersion || '3.0 (not advertised)',\n incompatibility: 'the target seller does not advertise AdCP 3.1 support',\n suffix: 'Retry with a meaningful signal_spec, or probe signals.discovery_modes before issuing wholesale calls.',\n });\n }\n }\n\n private throwPre31UnsupportedFeature(\n taskName: string,\n field: string,\n feature: string,\n opts: { capabilityPath: string; suffix: string; currentVersion?: string; incompatibility?: string }\n ): never {\n const currentVersion = opts.currentVersion ?? this.resolvedAdcpVersion;\n const incompatibility = opts.incompatibility ?? `this client is pinned to ${this.resolvedAdcpVersion}`;\n throw new ProtocolFeatureUnsupportedError([feature], [], this.agent.agent_uri, {\n message: `${taskName} ${field} requires AdCP 3.1 or later; ` + `${incompatibility}. ${opts.suffix}`,\n field,\n suggestion: opts.suffix,\n details: {\n feature,\n required_version: '3.1',\n capability_path: opts.capabilityPath,\n current_version: currentVersion,\n tool: taskName,\n field,\n },\n });\n }\n\n private throwBeta6ReportingUnsupported(\n taskName: string,\n issue: Beta6DeliveryRequestIssue,\n currentVersion: string,\n incompatibility = `this client is pinned to ${currentVersion}`\n ): never {\n const suggestion = 'Negotiate AdCP 3.2.0-beta.6 or omit the beta.6 reporting field or metric.';\n throw new ProtocolFeatureUnsupportedError([`${taskName}.${issue.field}`], [], this.agent.agent_uri, {\n message: `${taskName} ${issue.field} requires AdCP 3.2.0-beta.6 or later; ${incompatibility}. ${suggestion}`,\n field: issue.field,\n suggestion,\n details: {\n feature: `${taskName}.${issue.field}`,\n required_version: '3.2.0-beta.6',\n capability_path: 'adcp.supported_versions',\n current_version: currentVersion,\n tool: taskName,\n field: issue.field,\n },\n });\n }\n\n private throwCanonicalPreviewUnsupported(currentVersion: string, incompatibility?: string): never {\n const suggestion =\n 'Use previewCreativeLegacy() for format_id-based sellers, or negotiate AdCP 3.2 before calling previewCreative().';\n throw new ProtocolFeatureUnsupportedError(['preview_creative.canonical_identity'], [], this.agent.agent_uri, {\n message:\n `preview_creative canonical identity requires AdCP 3.2 or later; ` +\n `${incompatibility ?? `this client is pinned to ${currentVersion}`}. ${suggestion}`,\n field: 'target_capability_id',\n suggestion,\n details: {\n feature: 'preview_creative.canonical_identity',\n required_version: '3.2',\n capability_path: 'adcp.supported_versions',\n current_version: currentVersion,\n tool: 'preview_creative',\n field: 'target_capability_id',\n },\n });\n }\n\n /**\n * Assert that the seller's capabilities corroborate the major this client\n * is pinned to (per `getAdcpVersion()`).\n *\n * A self-reported `version: 'v3'` is not enough — a hostile or\n * misconfigured seller can just string-claim the version. For sellers\n * that return an authoritative `get_adcp_capabilities` response, the\n * guard requires:\n *\n * 1. `capabilities.majorVersions.includes(<this client's major>)`\n * 2. `capabilities.idempotency.replayTtlSeconds` present (spec-required\n * for real major-3+ sellers)\n *\n * Sellers whose capabilities are synthesized from `tools/list` (no\n * authoritative `get_adcp_capabilities` response) are treated as v2: a\n * compliant v3 seller would declare itself, so absence of a declaration\n * is taken as evidence of v2. The dispatcher routes the request through\n * the v2 wire-shape adapter. A one-time warning surfaces the routing\n * decision so adopters can audit it; retry-safety (idempotency TTL) is\n * unknown for these sellers and BYOK callers should treat them as such.\n *\n * Per-client `allowV2: true` or, when that's undefined,\n * `ADCP_ALLOW_V2=1` in the environment bypasses the guard entirely.\n *\n * Throws `VersionUnsupportedError` with the specific reason on failure.\n */\n async requireSupportedMajor(taskType: string = 'request', options?: ReadRequestOptions): Promise<void> {\n if (this.isV2Allowed()) return;\n const capabilities = await this.getCapabilities(options);\n\n // Synthetic capabilities — no authoritative `get_adcp_capabilities`\n // response, so the version + idempotency-TTL fields couldn't be read.\n // Route as the synthesized version (v2 when the v3 discovery tool is\n // absent from tools/list, v3 when the tool is present but the call\n // failed). Emit a one-time per-client warning so adopters can audit\n // the routing decision and the skipped TTL guarantee.\n if (capabilities._synthetic) {\n if (capabilities.version === 'v3') {\n this.maybeWarnSyntheticV3();\n } else {\n this.maybeWarnSyntheticV2();\n }\n return;\n }\n // Prefer release-precision matching when the seller advertises\n // `supported_versions` (AdCP 3.1+ per spec PR `adcontextprotocol/adcp#3493`).\n // Fall back to the deprecated integer `major_versions` for legacy 3.0\n // sellers. Pre-release pins match exactly per spec — `'3.1.0-beta.1'`\n // matches only against another `'3.1.0-beta.1'`, not `'3.1'`.\n const supportedVersions = capabilities.supportedVersions;\n if (supportedVersions !== undefined && supportedVersions.length > 0) {\n if (!isAdcpVersionSupported(this.resolvedAdcpVersion, supportedVersions)) {\n throw new VersionUnsupportedError(taskType, 'version', capabilities.version, this.agent.agent_uri);\n }\n } else {\n // `AdcpMajorVersion` is currently `2 | 3` — cast through `number[]` because\n // the parsed major is a plain number; a future SDK release that supports\n // major 4 will widen the union.\n const expectedMajor = parseAdcpMajorVersion(this.resolvedAdcpVersion);\n const advertisedMajors = capabilities.majorVersions as readonly number[];\n if (!Number.isFinite(expectedMajor) || !advertisedMajors.includes(expectedMajor)) {\n throw new VersionUnsupportedError(taskType, 'version', capabilities.version, this.agent.agent_uri);\n }\n }\n if (capabilities.idempotency?.replayTtlSeconds === undefined) {\n throw new VersionUnsupportedError(taskType, 'idempotency', capabilities.version, this.agent.agent_uri);\n }\n assertValidIdempotencyReplayTtlSeconds(capabilities.idempotency.replayTtlSeconds);\n }\n\n /**\n * Deprecated alias for {@link requireSupportedMajor}. Original name from\n * the AdCP v2/v3 split; the function generalized in Stage 3 to check the\n * client's per-instance major instead of hardcoded 3, and `requireV3`\n * stopped reflecting what the function actually does.\n *\n * @deprecated Use `requireSupportedMajor()` instead.\n */\n async requireV3(taskType: string = 'request'): Promise<void> {\n return this.requireSupportedMajor(taskType);\n }\n\n private isV2Allowed(): boolean {\n if (this.config.allowV2 !== undefined) return this.config.allowV2 === true;\n return process.env.ADCP_ALLOW_V2 === '1';\n }\n\n // ====== STATIC HELPER METHODS ======\n\n /**\n * Query a legacy creative-agent named-format catalog.\n *\n * Canonical applications discover seller-supported declarations through\n * `AgentClient.getProducts()` and consume `format_options[]` instead.\n *\n * @param creativeAgentUrl - URL of the creative agent (e.g., 'https://creative.adcontextprotocol.org/mcp')\n * @param protocol - Protocol to use ('mcp' or 'a2a'), defaults to 'mcp'\n * @returns Promise resolving to the list of available formats\n *\n * @deprecated Migration-only helper for the legacy named-format protocol.\n */\n static async discoverCreativeFormatsLegacy(\n creativeAgentUrl: string,\n protocol: 'mcp' | 'a2a' = 'mcp'\n ): Promise<Format[]> {\n const client = new SingleAgentClient(\n {\n id: 'creative_agent_discovery',\n name: 'Creative Agent',\n agent_uri: creativeAgentUrl,\n protocol,\n },\n {}\n );\n\n const result = await client.listCreativeFormatsLegacy({});\n\n if (!result.success || !result.data) {\n throw new Error(`Failed to discover creative formats: ${result.error || 'Unknown error'}`);\n }\n\n return result.data.formats || [];\n }\n\n /**\n * Validate request parameters against AdCP schema.\n *\n * Uses default (non-strict) parsing so required fields are still enforced\n * but unknown top-level keys pass through. This matters because callers —\n * including the storyboard runner's `applyBrandInvariant` — inject\n * scoping fields (`brand`, `account`) onto every outgoing request, and\n * `adaptRequest` strips those fields downstream for tools\n * whose schema doesn't declare them. A strict parse here rejects the\n * injected fields before the adapter gets a chance to clean them up, so\n * the two passes have to agree on \"extra keys are fine.\"\n */\n private validateRequest(taskType: string, params: any): void {\n const schema = this.getRequestSchema(taskType);\n if (!schema) {\n return; // No schema available for this task type\n }\n\n try {\n schema.parse(params);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const issues = error.issues.map(i => `${i.path.join('.')}: ${i.message}`).join('; ');\n throw new Error(`Request validation failed for ${taskType}: ${issues}`);\n }\n throw error;\n }\n }\n\n /**\n * Get request schema for a given task type.\n *\n * Note: Schema validation is not available for all task types. The following\n * tasks use complex discriminated unions that cannot be represented in Zod\n * without significant runtime overhead:\n *\n * - `update_media_buy`: Uses conditional package update operations\n *\n * For these tasks, TypeScript compile-time checking is still enforced via\n * the generated types, but runtime validation falls back to basic type checks.\n * Invalid requests will still be rejected by the server with descriptive errors.\n *\n * @internal\n */\n private getRequestSchema(taskType: string): z.ZodSchema | null {\n const schemaMap: Partial<Record<string, z.ZodSchema>> = {\n get_products: schemas.GetProductsRequestSchema,\n list_creative_formats: schemas.ListCreativeFormatsRequestSchema,\n create_media_buy: schemas.CreateMediaBuyRequestSchema,\n // update_media_buy: excluded - complex discriminated unions (package operations)\n sync_creatives: schemas.SyncCreativesRequestSchema,\n list_creatives: schemas.ListCreativesRequestSchema,\n get_media_buys: schemas.GetMediaBuysRequestSchema,\n get_creative_features: schemas.GetCreativeFeaturesRequestSchema,\n get_media_buy_delivery: schemas.GetMediaBuyDeliveryRequestSchema,\n get_signals: schemas.GetSignalsRequestSchema,\n activate_signal: schemas.ActivateSignalRequestSchema,\n };\n\n return schemaMap[taskType] || null;\n }\n}\n\nlet hasWarnedAboutUnverifiedWebhookReceive = false;\n\n/**\n * Warn once when a webhook is accepted with no authenticity check at all.\n *\n * This path is available only through the explicit\n * `allowUnauthenticatedWebhooks` escape hatch and only when no trusted push\n * registration or legacy HMAC secret is available.\n */\nfunction warnUnverifiedWebhookReceive(): void {\n if (hasWarnedAboutUnverifiedWebhookReceive) return;\n hasWarnedAboutUnverifiedWebhookReceive = true;\n console.warn(\n '[adcp] Webhook accepted WITHOUT authenticity verification because ' +\n '`allowUnauthenticatedWebhooks` is enabled and no trusted registration was found. ' +\n 'Any caller able to reach this receiver can forge task completions and status changes.'\n );\n}\n\nlet hasWarnedAboutReportingWebhookSecret = false;\n\n/**\n * Warn once when an automatic `reporting_webhook` registration is skipped.\n *\n * `reporting-webhook.json` makes `authentication` required for all of AdCP 3.x,\n * so the registration cannot be sent without a credential — and the only\n * credential available without `webhookSecret` would be a hardcoded placeholder,\n * which would misrepresent the channel as authenticated.\n */\nfunction warnReportingWebhookNeedsSecret(): void {\n if (hasWarnedAboutReportingWebhookSecret) return;\n hasWarnedAboutReportingWebhookSecret = true;\n console.warn(\n '[adcp] Skipping automatic `reporting_webhook` registration: AdCP 3.x requires an `authentication` ' +\n 'block and no `webhookSecret` is configured. Set `webhookSecret` on the client, or pass an explicit ' +\n '`reporting_webhook.authentication` on the request. The media buy itself is unaffected.'\n );\n}\n\nfunction rawBodyFromUnknown(value: unknown): string | Buffer | Uint8Array | undefined {\n return typeof value === 'string' || Buffer.isBuffer(value) || value instanceof Uint8Array ? value : undefined;\n}\n\nfunction parseWebhookBody(value: unknown): { ok: true; payload: unknown } | WebhookParseFailure {\n if (value === undefined) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Webhook body is required.',\n };\n }\n if (typeof value === 'string' || Buffer.isBuffer(value) || value instanceof Uint8Array) {\n const raw = Buffer.isBuffer(value) || value instanceof Uint8Array ? Buffer.from(value).toString('utf8') : value;\n try {\n return { ok: true, payload: JSON.parse(raw) };\n } catch {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Webhook body must be valid JSON.',\n };\n }\n }\n return { ok: true, payload: value };\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction inspectWebhookAuthenticationHeaders(\n headers: WebhookHeadersLike | undefined,\n explicitSignature: WebhookHeaderValue,\n explicitTimestamp: WebhookHeaderValue\n): { hasLegacy: boolean; hasRfc9421: boolean } {\n const hasHeader = (name: string): boolean => {\n if (!headers) return false;\n if (typeof (headers as Headers).get === 'function') return (headers as Headers).get(name) !== null;\n return Object.entries(headers).some(\n ([key, value]) => key.toLowerCase() === name && value !== null && value !== undefined\n );\n };\n return {\n hasLegacy:\n explicitSignature != null ||\n explicitTimestamp != null ||\n hasHeader('x-adcp-signature') ||\n hasHeader('x-adcp-timestamp'),\n hasRfc9421: hasHeader('signature') || hasHeader('signature-input'),\n };\n}\n\nfunction normalizeRfc9421WebhookHeaders(\n headers: WebhookHeadersLike\n): { ok: true; headers: Record<string, string | string[] | undefined> } | { ok: false; failure: WebhookParseFailure } {\n const normalized: Record<string, string | string[] | undefined> = {};\n if (typeof (headers as Headers).forEach === 'function') {\n (headers as Headers).forEach((value, key) => {\n normalized[key] = value;\n });\n return { ok: true, headers: normalized };\n }\n\n const singletonHeaders = new Set([\n 'signature',\n 'signature-input',\n 'content-digest',\n 'content-type',\n 'x-adcp-signature',\n 'x-adcp-timestamp',\n ]);\n const seen = new Set<string>();\n for (const [key, value] of Object.entries(headers)) {\n const lower = key.toLowerCase();\n if (singletonHeaders.has(lower)) {\n if (seen.has(lower) || Array.isArray(value)) {\n const cause = new WebhookSignatureError(\n 'webhook_signature_header_malformed',\n 1,\n `Webhook header ${lower} must have exactly one unambiguous value.`\n );\n return { ok: false, failure: { ok: false, code: cause.code, message: cause.message, cause } };\n }\n seen.add(lower);\n }\n if (value === null || value === undefined) continue;\n normalized[key] = Array.isArray(value) ? value.map(String) : String(value);\n }\n return { ok: true, headers: normalized };\n}\n\nfunction isBareDeliveryReport(payload: Record<string, unknown>): boolean {\n return (\n typeof payload.notification_type === 'string' &&\n ('media_buy_deliveries' in payload || 'creative_deliveries' in payload || 'reporting_period' in payload) &&\n !('result' in payload) &&\n !('task_id' in payload)\n );\n}\n\nfunction latestA2AWebhookMessageData(parts: unknown): Record<string, unknown> | undefined {\n if (!Array.isArray(parts)) return undefined;\n for (let index = parts.length - 1; index >= 0; index -= 1) {\n const part = parts[index];\n if (!isObjectRecord(part) || part.kind !== 'data' || !isObjectRecord(part.data)) continue;\n return part.data;\n }\n return undefined;\n}\n\ntype SignedWebhookRoute = {\n operationId?: string;\n taskType?: string;\n agentId?: string;\n};\n\nfunction extractSignedWebhookRoute(\n payload: unknown\n): ({ ok: true } & SignedWebhookRoute) | { ok: false; message: string } {\n if (!isObjectRecord(payload)) return { ok: true };\n const records: Record<string, unknown>[] = [payload];\n if (payload.kind === 'task' || payload.kind === 'status-update') {\n records.length = 0;\n const status = isObjectRecord(payload.status) ? payload.status : undefined;\n const message = isObjectRecord(status?.message) ? status.message : undefined;\n const messageData = latestA2AWebhookMessageData(message?.parts);\n if (messageData) records.push(messageData);\n if (payload.kind === 'task') {\n const artifactData = getLatestA2ADataPartFromTask(payload as unknown as A2ATask)?.data;\n if (artifactData) records.push(artifactData);\n }\n }\n\n const oneValue = (field: 'operation_id' | 'task_type' | 'agent_id'): string | undefined | null => {\n const values = new Set(\n records\n .map(record => record[field])\n .filter((value): value is string => typeof value === 'string' && value.length > 0)\n );\n return values.size > 1 ? null : values.values().next().value;\n };\n const operationId = oneValue('operation_id');\n const taskType = oneValue('task_type');\n const agentId = oneValue('agent_id');\n if (operationId === null || taskType === null || agentId === null) {\n return {\n ok: false,\n message: 'Authenticated webhook contains contradictory signed routing fields.',\n };\n }\n return {\n ok: true,\n ...(operationId !== undefined && { operationId }),\n ...(taskType !== undefined && { taskType }),\n ...(agentId !== undefined && { agentId }),\n };\n}\n\nfunction legacyA2AArtifactStatus(\n payload: A2ATask | TaskStatusUpdateEvent,\n artifact: unknown\n): NormalizedWebhookPayload['status'] | undefined {\n if (payload.kind !== 'task' || !isObjectRecord(artifact) || typeof artifact.name !== 'string') return undefined;\n const transportState = payload.status?.state;\n if (artifact.name === 'result' && transportState === 'completed') return 'completed';\n if (artifact.name !== 'error') return undefined;\n if (transportState === 'failed' || transportState === 'rejected' || transportState === 'canceled') {\n return transportState;\n }\n return undefined;\n}\n\nfunction isMcpWebhookCandidate(payload: Record<string, unknown>): boolean {\n return (\n MCP_WEBHOOK_REQUIRED_FIELDS.some(field => field in payload) ||\n 'result' in payload ||\n 'context_id' in payload ||\n 'notification_id' in payload\n );\n}\n\nfunction missingMcpWebhookFields(payload: Record<string, unknown>): string[] {\n return MCP_WEBHOOK_REQUIRED_FIELDS.filter(field => {\n const value = payload[field];\n return typeof value !== 'string' || value.length === 0;\n });\n}\n\nfunction webhookErrorHttpStatus(error: unknown): number {\n if (error instanceof WebhookDispatchError) {\n if (error.code === 'webhook_signature_replayed') return 409;\n if (error.code === 'webhook_idempotency_conflict') return 409;\n if (error.code === 'webhook_signature_rate_abuse') return 429;\n if (\n error.code === 'webhook_registration_store_unavailable' ||\n error.code === 'webhook_verification_unavailable' ||\n error.code === 'webhook_durable_settlement_unavailable' ||\n error.code === 'webhook_publication_in_progress' ||\n error.code === 'webhook_signature_revocation_stale'\n ) {\n return 503;\n }\n if (error.code === 'webhook_verification_context_missing') return 500;\n if (\n error.code.startsWith('webhook_signature_') ||\n error.code === 'webhook_timestamp_invalid' ||\n error.code === 'webhook_mode_mismatch' ||\n error.code === 'webhook_registration_not_found' ||\n error.code === 'webhook_registration_mismatch' ||\n error.code === 'webhook_unverifiable'\n ) {\n return 401;\n }\n return 400;\n }\n return 500;\n}\n\n/**\n * Factory function to create a single-agent client.\n *\n * @param agent - Agent configuration\n * @param config - Client configuration\n * @returns Configured SingleAgentClient instance\n */\nexport function createSingleAgentClient(agent: AgentConfig, config?: SingleAgentClientConfig): SingleAgentClient {\n return new SingleAgentClient(agent, config);\n}\n"],"mappings":"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","names":["import_version","import_abort","A2AClientImpl","legacy","canonicalizeJson","isWellKnownCardUrl","routedTaskType","verifyRfc9421WebhookSignature","canonical","_needsDiscovery","_needsCanonicalUrl","cleanAgent","mcpClient","capabilities","advertisedVersions","responseVersion"]}