@adcp/sdk 12.0.0 → 12.0.2

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 (959) hide show
  1. package/dist/lib/adapters/content-standards-adapter.mjs +0 -6
  2. package/dist/lib/adapters/content-standards-adapter.mjs.map +1 -1
  3. package/dist/lib/adapters/derived-account-store.mjs +0 -6
  4. package/dist/lib/adapters/derived-account-store.mjs.map +1 -1
  5. package/dist/lib/adapters/governance-adapter.mjs +0 -6
  6. package/dist/lib/adapters/governance-adapter.mjs.map +1 -1
  7. package/dist/lib/adapters/implicit-account-store.mjs +0 -6
  8. package/dist/lib/adapters/implicit-account-store.mjs.map +1 -1
  9. package/dist/lib/adapters/index.mjs +0 -6
  10. package/dist/lib/adapters/index.mjs.map +1 -1
  11. package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs +0 -6
  12. package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs.map +1 -1
  13. package/dist/lib/adapters/legacy/v2-5/get_products.mjs +0 -6
  14. package/dist/lib/adapters/legacy/v2-5/get_products.mjs.map +1 -1
  15. package/dist/lib/adapters/legacy/v2-5/index.mjs +0 -6
  16. package/dist/lib/adapters/legacy/v2-5/index.mjs.map +1 -1
  17. package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs +0 -6
  18. package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs.map +1 -1
  19. package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs +0 -6
  20. package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs.map +1 -1
  21. package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs +0 -6
  22. package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs.map +1 -1
  23. package/dist/lib/adapters/legacy/v2-5/types.mjs +0 -6
  24. package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs +0 -6
  25. package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs.map +1 -1
  26. package/dist/lib/adapters/oauth-passthrough-resolver.mjs +0 -6
  27. package/dist/lib/adapters/oauth-passthrough-resolver.mjs.map +1 -1
  28. package/dist/lib/adapters/property-list-adapter.mjs +0 -6
  29. package/dist/lib/adapters/property-list-adapter.mjs.map +1 -1
  30. package/dist/lib/adapters/roster-account-store.mjs +0 -6
  31. package/dist/lib/adapters/roster-account-store.mjs.map +1 -1
  32. package/dist/lib/adapters/si-session-manager.mjs +0 -6
  33. package/dist/lib/adapters/si-session-manager.mjs.map +1 -1
  34. package/dist/lib/adapters/version/3.0/brand-fields.mjs +0 -6
  35. package/dist/lib/adapters/version/3.0/brand-fields.mjs.map +1 -1
  36. package/dist/lib/adapters/version/3.0/get-products.mjs +0 -6
  37. package/dist/lib/adapters/version/3.0/get-products.mjs.map +1 -1
  38. package/dist/lib/adapters/version/3.0/index.mjs +0 -6
  39. package/dist/lib/adapters/version/3.0/index.mjs.map +1 -1
  40. package/dist/lib/adapters/version/3.0/sync-accounts.mjs +0 -6
  41. package/dist/lib/adapters/version/3.0/sync-accounts.mjs.map +1 -1
  42. package/dist/lib/adapters/version/index.mjs +0 -6
  43. package/dist/lib/adapters/version/index.mjs.map +1 -1
  44. package/dist/lib/adapters/version/types.mjs +0 -6
  45. package/dist/lib/advanced.mjs +0 -6
  46. package/dist/lib/advanced.mjs.map +1 -1
  47. package/dist/lib/agents/index.generated.mjs +0 -6
  48. package/dist/lib/agents/index.generated.mjs.map +1 -1
  49. package/dist/lib/auth/index.mjs +0 -6
  50. package/dist/lib/auth/index.mjs.map +1 -1
  51. package/dist/lib/auth/oauth/CLIFlowHandler.mjs +0 -6
  52. package/dist/lib/auth/oauth/CLIFlowHandler.mjs.map +1 -1
  53. package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs +0 -6
  54. package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs.map +1 -1
  55. package/dist/lib/auth/oauth/MCPOAuthProvider.mjs +0 -6
  56. package/dist/lib/auth/oauth/MCPOAuthProvider.mjs.map +1 -1
  57. package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs +0 -6
  58. package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs.map +1 -1
  59. package/dist/lib/auth/oauth/authorization-required.mjs +0 -6
  60. package/dist/lib/auth/oauth/authorization-required.mjs.map +1 -1
  61. package/dist/lib/auth/oauth/diagnose.mjs +0 -6
  62. package/dist/lib/auth/oauth/diagnose.mjs.map +1 -1
  63. package/dist/lib/auth/oauth/diagnostics.mjs +0 -6
  64. package/dist/lib/auth/oauth/diagnostics.mjs.map +1 -1
  65. package/dist/lib/auth/oauth/discovery.mjs +0 -6
  66. package/dist/lib/auth/oauth/discovery.mjs.map +1 -1
  67. package/dist/lib/auth/oauth/file-storage.mjs +0 -6
  68. package/dist/lib/auth/oauth/file-storage.mjs.map +1 -1
  69. package/dist/lib/auth/oauth/index.mjs +0 -6
  70. package/dist/lib/auth/oauth/index.mjs.map +1 -1
  71. package/dist/lib/auth/oauth/secret-resolver.mjs +0 -6
  72. package/dist/lib/auth/oauth/secret-resolver.mjs.map +1 -1
  73. package/dist/lib/auth/oauth/storage-registry.mjs +0 -6
  74. package/dist/lib/auth/oauth/storage-registry.mjs.map +1 -1
  75. package/dist/lib/auth/oauth/types.mjs +0 -6
  76. package/dist/lib/auth/oauth/types.mjs.map +1 -1
  77. package/dist/lib/auth/oauth/web-flow.mjs +0 -6
  78. package/dist/lib/auth/oauth/web-flow.mjs.map +1 -1
  79. package/dist/lib/brand/index.mjs +0 -6
  80. package/dist/lib/brand/index.mjs.map +1 -1
  81. package/dist/lib/canonical-references/index.mjs +6 -7
  82. package/dist/lib/canonical-references/index.mjs.map +1 -1
  83. package/dist/lib/client/index.mjs +0 -6
  84. package/dist/lib/client/index.mjs.map +1 -1
  85. package/dist/lib/compliance/index.mjs +0 -6
  86. package/dist/lib/compliance/index.mjs.map +1 -1
  87. package/dist/lib/compliance-fixtures/index.mjs +0 -6
  88. package/dist/lib/compliance-fixtures/index.mjs.map +1 -1
  89. package/dist/lib/compliance-fixtures/test-authorization-server.mjs +0 -6
  90. package/dist/lib/compliance-fixtures/test-authorization-server.mjs.map +1 -1
  91. package/dist/lib/conformance/index.mjs +0 -6
  92. package/dist/lib/conformance/index.mjs.map +1 -1
  93. package/dist/lib/conformance/invariants/uniformError.mjs +0 -6
  94. package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
  95. package/dist/lib/conformance/invariants/uniformErrorComparator.mjs +0 -6
  96. package/dist/lib/conformance/invariants/uniformErrorComparator.mjs.map +1 -1
  97. package/dist/lib/conformance/oracle.mjs +0 -6
  98. package/dist/lib/conformance/oracle.mjs.map +1 -1
  99. package/dist/lib/conformance/runConformance.mjs +0 -6
  100. package/dist/lib/conformance/runConformance.mjs.map +1 -1
  101. package/dist/lib/conformance/runners.mjs +0 -6
  102. package/dist/lib/conformance/runners.mjs.map +1 -1
  103. package/dist/lib/conformance/schemaArbitrary.mjs +0 -6
  104. package/dist/lib/conformance/schemaArbitrary.mjs.map +1 -1
  105. package/dist/lib/conformance/schemaLoader.mjs +5 -6
  106. package/dist/lib/conformance/schemaLoader.mjs.map +1 -1
  107. package/dist/lib/conformance/seeder.mjs +0 -6
  108. package/dist/lib/conformance/seeder.mjs.map +1 -1
  109. package/dist/lib/conformance/types.mjs +0 -6
  110. package/dist/lib/conformance/types.mjs.map +1 -1
  111. package/dist/lib/conformance/webhook.mjs +0 -6
  112. package/dist/lib/conformance/webhook.mjs.map +1 -1
  113. package/dist/lib/core/ADCPMultiAgentClient.mjs +0 -6
  114. package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
  115. package/dist/lib/core/AgentClient.mjs +0 -6
  116. package/dist/lib/core/AgentClient.mjs.map +1 -1
  117. package/dist/lib/core/AsyncHandler.mjs +0 -6
  118. package/dist/lib/core/AsyncHandler.mjs.map +1 -1
  119. package/dist/lib/core/ConfigurationManager.mjs +0 -6
  120. package/dist/lib/core/ConfigurationManager.mjs.map +1 -1
  121. package/dist/lib/core/ConversationTypes.mjs +0 -6
  122. package/dist/lib/core/CreativeAgentClient.mjs +0 -6
  123. package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
  124. package/dist/lib/core/GovernanceMiddleware.mjs +0 -6
  125. package/dist/lib/core/GovernanceMiddleware.mjs.map +1 -1
  126. package/dist/lib/core/GovernanceTypes.mjs +0 -6
  127. package/dist/lib/core/GovernanceTypes.mjs.map +1 -1
  128. package/dist/lib/core/ProtocolResponseParser.mjs +0 -6
  129. package/dist/lib/core/ProtocolResponseParser.mjs.map +1 -1
  130. package/dist/lib/core/ResponseValidator.mjs +0 -6
  131. package/dist/lib/core/ResponseValidator.mjs.map +1 -1
  132. package/dist/lib/core/SingleAgentClient.mjs +0 -6
  133. package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
  134. package/dist/lib/core/TaskEventTypes.mjs +0 -6
  135. package/dist/lib/core/TaskEventTypes.mjs.map +1 -1
  136. package/dist/lib/core/TaskExecutor.mjs +0 -6
  137. package/dist/lib/core/TaskExecutor.mjs.map +1 -1
  138. package/dist/lib/core/match.mjs +0 -6
  139. package/dist/lib/core/match.mjs.map +1 -1
  140. package/dist/lib/core/task-status.mjs +0 -6
  141. package/dist/lib/core/task-status.mjs.map +1 -1
  142. package/dist/lib/core/webhook-url.mjs +0 -6
  143. package/dist/lib/core/webhook-url.mjs.map +1 -1
  144. package/dist/lib/discovery/adagents-redirects.mjs +0 -6
  145. package/dist/lib/discovery/adagents-redirects.mjs.map +1 -1
  146. package/dist/lib/discovery/agent-directory.mjs +0 -6
  147. package/dist/lib/discovery/agent-directory.mjs.map +1 -1
  148. package/dist/lib/discovery/inline-publisher-properties.mjs +0 -6
  149. package/dist/lib/discovery/inline-publisher-properties.mjs.map +1 -1
  150. package/dist/lib/discovery/network-consistency-checker.mjs +0 -6
  151. package/dist/lib/discovery/network-consistency-checker.mjs.map +1 -1
  152. package/dist/lib/discovery/property-crawler.mjs +0 -6
  153. package/dist/lib/discovery/property-crawler.mjs.map +1 -1
  154. package/dist/lib/discovery/property-index.mjs +0 -6
  155. package/dist/lib/discovery/property-index.mjs.map +1 -1
  156. package/dist/lib/discovery/publisher-property-selector.mjs +0 -6
  157. package/dist/lib/discovery/publisher-property-selector.mjs.map +1 -1
  158. package/dist/lib/discovery/resolve-agent-properties.mjs +0 -6
  159. package/dist/lib/discovery/resolve-agent-properties.mjs.map +1 -1
  160. package/dist/lib/discovery/types.mjs +0 -6
  161. package/dist/lib/discovery/validate-adagents.mjs +0 -6
  162. package/dist/lib/discovery/validate-adagents.mjs.map +1 -1
  163. package/dist/lib/enums.mjs +0 -6
  164. package/dist/lib/enums.mjs.map +1 -1
  165. package/dist/lib/errors/index.mjs +0 -6
  166. package/dist/lib/errors/index.mjs.map +1 -1
  167. package/dist/lib/express-mcp/index.mjs +0 -6
  168. package/dist/lib/express-mcp/index.mjs.map +1 -1
  169. package/dist/lib/governance/index.mjs +0 -6
  170. package/dist/lib/governance/index.mjs.map +1 -1
  171. package/dist/lib/handlers/types.mjs +0 -6
  172. package/dist/lib/handlers/types.mjs.map +1 -1
  173. package/dist/lib/index.d.mts +1 -1
  174. package/dist/lib/index.d.ts +1 -1
  175. package/dist/lib/index.d.ts.map +1 -1
  176. package/dist/lib/index.js.map +1 -1
  177. package/dist/lib/index.mjs +0 -6
  178. package/dist/lib/index.mjs.map +1 -1
  179. package/dist/lib/media-buy/available-actions.mjs +0 -6
  180. package/dist/lib/media-buy/available-actions.mjs.map +1 -1
  181. package/dist/lib/media-buy/index.mjs +0 -6
  182. package/dist/lib/media-buy/index.mjs.map +1 -1
  183. package/dist/lib/media-buy/preflight.mjs +0 -6
  184. package/dist/lib/media-buy/preflight.mjs.map +1 -1
  185. package/dist/lib/media-buy/property-policy.mjs +0 -6
  186. package/dist/lib/media-buy/property-policy.mjs.map +1 -1
  187. package/dist/lib/media-buy/types.mjs +0 -6
  188. package/dist/lib/media-buy/types.mjs.map +1 -1
  189. package/dist/lib/media-buy/update-fields.generated.mjs +0 -6
  190. package/dist/lib/media-buy/update-fields.generated.mjs.map +1 -1
  191. package/dist/lib/mock-server/creative-ad-server/seed-data.mjs +0 -6
  192. package/dist/lib/mock-server/creative-ad-server/seed-data.mjs.map +1 -1
  193. package/dist/lib/mock-server/creative-ad-server/server.mjs +0 -6
  194. package/dist/lib/mock-server/creative-ad-server/server.mjs.map +1 -1
  195. package/dist/lib/mock-server/creative-template/seed-data.mjs +0 -6
  196. package/dist/lib/mock-server/creative-template/seed-data.mjs.map +1 -1
  197. package/dist/lib/mock-server/creative-template/server.mjs +0 -6
  198. package/dist/lib/mock-server/creative-template/server.mjs.map +1 -1
  199. package/dist/lib/mock-server/index.mjs +0 -6
  200. package/dist/lib/mock-server/index.mjs.map +1 -1
  201. package/dist/lib/mock-server/sales-guaranteed/recipe.mjs +0 -6
  202. package/dist/lib/mock-server/sales-guaranteed/recipe.mjs.map +1 -1
  203. package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs +0 -6
  204. package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs.map +1 -1
  205. package/dist/lib/mock-server/sales-guaranteed/server.mjs +0 -6
  206. package/dist/lib/mock-server/sales-guaranteed/server.mjs.map +1 -1
  207. package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs +0 -6
  208. package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs.map +1 -1
  209. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs +0 -6
  210. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs.map +1 -1
  211. package/dist/lib/mock-server/sales-non-guaranteed/server.mjs +0 -6
  212. package/dist/lib/mock-server/sales-non-guaranteed/server.mjs.map +1 -1
  213. package/dist/lib/mock-server/sales-social/seed-data.mjs +0 -6
  214. package/dist/lib/mock-server/sales-social/seed-data.mjs.map +1 -1
  215. package/dist/lib/mock-server/sales-social/server.mjs +0 -6
  216. package/dist/lib/mock-server/sales-social/server.mjs.map +1 -1
  217. package/dist/lib/mock-server/scenario.mjs +0 -6
  218. package/dist/lib/mock-server/scenario.mjs.map +1 -1
  219. package/dist/lib/mock-server/signal-marketplace/seed-data.mjs +0 -6
  220. package/dist/lib/mock-server/signal-marketplace/seed-data.mjs.map +1 -1
  221. package/dist/lib/mock-server/signal-marketplace/server.mjs +0 -6
  222. package/dist/lib/mock-server/signal-marketplace/server.mjs.map +1 -1
  223. package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs +0 -6
  224. package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs.map +1 -1
  225. package/dist/lib/mock-server/sponsored-intelligence/server.mjs +0 -6
  226. package/dist/lib/mock-server/sponsored-intelligence/server.mjs.map +1 -1
  227. package/dist/lib/net/address-guards.mjs +0 -6
  228. package/dist/lib/net/address-guards.mjs.map +1 -1
  229. package/dist/lib/net/index.mjs +0 -6
  230. package/dist/lib/net/index.mjs.map +1 -1
  231. package/dist/lib/net/ssrf-fetch.mjs +0 -6
  232. package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
  233. package/dist/lib/observability/index.mjs +0 -6
  234. package/dist/lib/observability/index.mjs.map +1 -1
  235. package/dist/lib/observability/tracing.mjs +6 -7
  236. package/dist/lib/observability/tracing.mjs.map +1 -1
  237. package/dist/lib/protocols/a2a.mjs +0 -6
  238. package/dist/lib/protocols/a2a.mjs.map +1 -1
  239. package/dist/lib/protocols/abort.mjs +0 -6
  240. package/dist/lib/protocols/abort.mjs.map +1 -1
  241. package/dist/lib/protocols/index.mjs +0 -6
  242. package/dist/lib/protocols/index.mjs.map +1 -1
  243. package/dist/lib/protocols/mcp-modern.mjs +0 -6
  244. package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
  245. package/dist/lib/protocols/mcp-tasks.mjs +0 -6
  246. package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
  247. package/dist/lib/protocols/mcp.mjs +0 -6
  248. package/dist/lib/protocols/mcp.mjs.map +1 -1
  249. package/dist/lib/protocols/rawResponseCapture.mjs +0 -6
  250. package/dist/lib/protocols/rawResponseCapture.mjs.map +1 -1
  251. package/dist/lib/protocols/responseSizeLimit.mjs +0 -6
  252. package/dist/lib/protocols/responseSizeLimit.mjs.map +1 -1
  253. package/dist/lib/protocols/transportDiagnostics.mjs +0 -6
  254. package/dist/lib/protocols/transportDiagnostics.mjs.map +1 -1
  255. package/dist/lib/registry/cursor-store.mjs +0 -6
  256. package/dist/lib/registry/cursor-store.mjs.map +1 -1
  257. package/dist/lib/registry/feed-stream.mjs +0 -6
  258. package/dist/lib/registry/feed-stream.mjs.map +1 -1
  259. package/dist/lib/registry/index.mjs +0 -6
  260. package/dist/lib/registry/index.mjs.map +1 -1
  261. package/dist/lib/registry/property-registry.mjs +0 -6
  262. package/dist/lib/registry/property-registry.mjs.map +1 -1
  263. package/dist/lib/registry/sync.mjs +0 -6
  264. package/dist/lib/registry/sync.mjs.map +1 -1
  265. package/dist/lib/registry/types.generated.mjs +0 -6
  266. package/dist/lib/registry/types.mjs +0 -6
  267. package/dist/lib/schemas/index.mjs +0 -6
  268. package/dist/lib/schemas/index.mjs.map +1 -1
  269. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  270. package/dist/lib/server/a2a-adapter.mjs +0 -6
  271. package/dist/lib/server/a2a-adapter.mjs.map +1 -1
  272. package/dist/lib/server/account-mode.mjs +0 -6
  273. package/dist/lib/server/account-mode.mjs.map +1 -1
  274. package/dist/lib/server/adcp-server.mjs +0 -6
  275. package/dist/lib/server/adcp-server.mjs.map +1 -1
  276. package/dist/lib/server/auth-introspection.mjs +0 -6
  277. package/dist/lib/server/auth-introspection.mjs.map +1 -1
  278. package/dist/lib/server/auth-signature.mjs +0 -6
  279. package/dist/lib/server/auth-signature.mjs.map +1 -1
  280. package/dist/lib/server/auth.mjs +0 -6
  281. package/dist/lib/server/auth.mjs.map +1 -1
  282. package/dist/lib/server/create-adcp-server.d.mts +13 -0
  283. package/dist/lib/server/create-adcp-server.d.ts +13 -0
  284. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  285. package/dist/lib/server/create-adcp-server.js +3 -2
  286. package/dist/lib/server/create-adcp-server.js.map +1 -1
  287. package/dist/lib/server/create-adcp-server.mjs +3 -8
  288. package/dist/lib/server/create-adcp-server.mjs.map +1 -1
  289. package/dist/lib/server/credential-policy.mjs +0 -6
  290. package/dist/lib/server/credential-policy.mjs.map +1 -1
  291. package/dist/lib/server/ctx-metadata/backends/memory.mjs +0 -6
  292. package/dist/lib/server/ctx-metadata/backends/memory.mjs.map +1 -1
  293. package/dist/lib/server/ctx-metadata/backends/pg.mjs +0 -6
  294. package/dist/lib/server/ctx-metadata/backends/pg.mjs.map +1 -1
  295. package/dist/lib/server/ctx-metadata/backends/redis.mjs +0 -6
  296. package/dist/lib/server/ctx-metadata/backends/redis.mjs.map +1 -1
  297. package/dist/lib/server/ctx-metadata/index.mjs +0 -6
  298. package/dist/lib/server/ctx-metadata/index.mjs.map +1 -1
  299. package/dist/lib/server/ctx-metadata/store.mjs +0 -6
  300. package/dist/lib/server/ctx-metadata/store.mjs.map +1 -1
  301. package/dist/lib/server/ctx-metadata/wire-shape.mjs +0 -6
  302. package/dist/lib/server/ctx-metadata/wire-shape.mjs.map +1 -1
  303. package/dist/lib/server/decisioning/account.mjs +0 -6
  304. package/dist/lib/server/decisioning/account.mjs.map +1 -1
  305. package/dist/lib/server/decisioning/admin-router.mjs +0 -6
  306. package/dist/lib/server/decisioning/admin-router.mjs.map +1 -1
  307. package/dist/lib/server/decisioning/assembly-helpers.mjs +0 -6
  308. package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
  309. package/dist/lib/server/decisioning/async-outcome.mjs +0 -6
  310. package/dist/lib/server/decisioning/async-outcome.mjs.map +1 -1
  311. package/dist/lib/server/decisioning/buyer-agent.mjs +0 -6
  312. package/dist/lib/server/decisioning/buyer-agent.mjs.map +1 -1
  313. package/dist/lib/server/decisioning/capabilities.mjs +0 -6
  314. package/dist/lib/server/decisioning/capabilities.mjs.map +1 -1
  315. package/dist/lib/server/decisioning/compose.mjs +0 -6
  316. package/dist/lib/server/decisioning/compose.mjs.map +1 -1
  317. package/dist/lib/server/decisioning/context.mjs +0 -6
  318. package/dist/lib/server/decisioning/errors-typed.mjs +0 -6
  319. package/dist/lib/server/decisioning/errors-typed.mjs.map +1 -1
  320. package/dist/lib/server/decisioning/helpers.mjs +0 -6
  321. package/dist/lib/server/decisioning/helpers.mjs.map +1 -1
  322. package/dist/lib/server/decisioning/index.mjs +0 -6
  323. package/dist/lib/server/decisioning/index.mjs.map +1 -1
  324. package/dist/lib/server/decisioning/list-helpers.mjs +0 -6
  325. package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
  326. package/dist/lib/server/decisioning/manifest-helpers.mjs +0 -6
  327. package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
  328. package/dist/lib/server/decisioning/pagination.mjs +0 -6
  329. package/dist/lib/server/decisioning/platform-helpers.mjs +0 -6
  330. package/dist/lib/server/decisioning/platform-helpers.mjs.map +1 -1
  331. package/dist/lib/server/decisioning/platform.mjs +0 -6
  332. package/dist/lib/server/decisioning/proposal/dispatch.mjs +0 -6
  333. package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
  334. package/dist/lib/server/decisioning/proposal/index.mjs +0 -6
  335. package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
  336. package/dist/lib/server/decisioning/proposal/lifecycle.mjs +0 -6
  337. package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
  338. package/dist/lib/server/decisioning/proposal/mock-manager.mjs +0 -6
  339. package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
  340. package/dist/lib/server/decisioning/proposal/store.mjs +0 -6
  341. package/dist/lib/server/decisioning/proposal/store.mjs.map +1 -1
  342. package/dist/lib/server/decisioning/proposal/types.mjs +0 -6
  343. package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
  344. package/dist/lib/server/decisioning/resolve-presets.mjs +0 -6
  345. package/dist/lib/server/decisioning/resolve-presets.mjs.map +1 -1
  346. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs +0 -6
  347. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
  348. package/dist/lib/server/decisioning/runtime/from-platform.mjs +0 -6
  349. package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
  350. package/dist/lib/server/decisioning/runtime/observed-modes.mjs +0 -6
  351. package/dist/lib/server/decisioning/runtime/observed-modes.mjs.map +1 -1
  352. package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs +0 -6
  353. package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs.map +1 -1
  354. package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs +0 -6
  355. package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs.map +1 -1
  356. package/dist/lib/server/decisioning/runtime/task-registry.mjs +0 -6
  357. package/dist/lib/server/decisioning/runtime/task-registry.mjs.map +1 -1
  358. package/dist/lib/server/decisioning/runtime/to-context.mjs +0 -6
  359. package/dist/lib/server/decisioning/runtime/to-context.mjs.map +1 -1
  360. package/dist/lib/server/decisioning/runtime/validate-platform.mjs +0 -6
  361. package/dist/lib/server/decisioning/runtime/validate-platform.mjs.map +1 -1
  362. package/dist/lib/server/decisioning/specialisms/audiences.mjs +0 -6
  363. package/dist/lib/server/decisioning/specialisms/brand-rights.mjs +0 -6
  364. package/dist/lib/server/decisioning/specialisms/campaign-governance.mjs +0 -6
  365. package/dist/lib/server/decisioning/specialisms/content-standards.mjs +0 -6
  366. package/dist/lib/server/decisioning/specialisms/creative-ad-server.mjs +0 -6
  367. package/dist/lib/server/decisioning/specialisms/creative.mjs +0 -6
  368. package/dist/lib/server/decisioning/specialisms/lists.mjs +0 -6
  369. package/dist/lib/server/decisioning/specialisms/sales.mjs +0 -6
  370. package/dist/lib/server/decisioning/specialisms/signals.mjs +0 -6
  371. package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.mjs +0 -6
  372. package/dist/lib/server/decisioning/start-time.mjs +0 -6
  373. package/dist/lib/server/decisioning/start-time.mjs.map +1 -1
  374. package/dist/lib/server/decisioning/status-changes.mjs +0 -6
  375. package/dist/lib/server/decisioning/status-changes.mjs.map +1 -1
  376. package/dist/lib/server/decisioning/status-mappers.mjs +0 -6
  377. package/dist/lib/server/decisioning/status-mappers.mjs.map +1 -1
  378. package/dist/lib/server/decisioning/tenant-registry.mjs +0 -6
  379. package/dist/lib/server/decisioning/tenant-registry.mjs.map +1 -1
  380. package/dist/lib/server/decisioning/tenant-store.mjs +0 -6
  381. package/dist/lib/server/decisioning/tenant-store.mjs.map +1 -1
  382. package/dist/lib/server/decisioning/validate-specialisms.mjs +0 -6
  383. package/dist/lib/server/decisioning/validate-specialisms.mjs.map +1 -1
  384. package/dist/lib/server/dynamic-registry.mjs +0 -6
  385. package/dist/lib/server/dynamic-registry.mjs.map +1 -1
  386. package/dist/lib/server/envelope-allowlist.mjs +0 -6
  387. package/dist/lib/server/envelope-allowlist.mjs.map +1 -1
  388. package/dist/lib/server/error-arm-tools.mjs +5 -6
  389. package/dist/lib/server/error-arm-tools.mjs.map +1 -1
  390. package/dist/lib/server/errors.mjs +0 -6
  391. package/dist/lib/server/errors.mjs.map +1 -1
  392. package/dist/lib/server/example-tld-guard.mjs +0 -6
  393. package/dist/lib/server/example-tld-guard.mjs.map +1 -1
  394. package/dist/lib/server/express-adapter.mjs +0 -6
  395. package/dist/lib/server/express-adapter.mjs.map +1 -1
  396. package/dist/lib/server/governance.mjs +0 -6
  397. package/dist/lib/server/governance.mjs.map +1 -1
  398. package/dist/lib/server/idempotency/backends/lazy.mjs +0 -6
  399. package/dist/lib/server/idempotency/backends/lazy.mjs.map +1 -1
  400. package/dist/lib/server/idempotency/backends/memory.mjs +0 -6
  401. package/dist/lib/server/idempotency/backends/memory.mjs.map +1 -1
  402. package/dist/lib/server/idempotency/backends/pg.mjs +0 -6
  403. package/dist/lib/server/idempotency/backends/pg.mjs.map +1 -1
  404. package/dist/lib/server/idempotency/backends/redis.mjs +0 -6
  405. package/dist/lib/server/idempotency/backends/redis.mjs.map +1 -1
  406. package/dist/lib/server/idempotency/index.mjs +0 -6
  407. package/dist/lib/server/idempotency/index.mjs.map +1 -1
  408. package/dist/lib/server/idempotency/store.mjs +0 -6
  409. package/dist/lib/server/idempotency/store.mjs.map +1 -1
  410. package/dist/lib/server/index.d.mts +1 -1
  411. package/dist/lib/server/index.d.ts +1 -1
  412. package/dist/lib/server/index.d.ts.map +1 -1
  413. package/dist/lib/server/index.js.map +1 -1
  414. package/dist/lib/server/index.mjs +0 -6
  415. package/dist/lib/server/index.mjs.map +1 -1
  416. package/dist/lib/server/legacy/v5/index.d.mts +1 -1
  417. package/dist/lib/server/legacy/v5/index.d.ts +1 -1
  418. package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
  419. package/dist/lib/server/legacy/v5/index.js.map +1 -1
  420. package/dist/lib/server/legacy/v5/index.mjs +0 -6
  421. package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
  422. package/dist/lib/server/mcp-modern-server.mjs +0 -6
  423. package/dist/lib/server/mcp-modern-server.mjs.map +1 -1
  424. package/dist/lib/server/media-buy-actions.mjs +0 -6
  425. package/dist/lib/server/media-buy-actions.mjs.map +1 -1
  426. package/dist/lib/server/media-buy-helpers.mjs +0 -6
  427. package/dist/lib/server/media-buy-helpers.mjs.map +1 -1
  428. package/dist/lib/server/media-buy-store.mjs +0 -6
  429. package/dist/lib/server/media-buy-store.mjs.map +1 -1
  430. package/dist/lib/server/normalize-errors.mjs +0 -6
  431. package/dist/lib/server/normalize-errors.mjs.map +1 -1
  432. package/dist/lib/server/operational-platform.mjs +0 -6
  433. package/dist/lib/server/operational-platform.mjs.map +1 -1
  434. package/dist/lib/server/pick-safe-details.mjs +0 -6
  435. package/dist/lib/server/pick-safe-details.mjs.map +1 -1
  436. package/dist/lib/server/pin-and-bind-fetch.mjs +0 -6
  437. package/dist/lib/server/pin-and-bind-fetch.mjs.map +1 -1
  438. package/dist/lib/server/postgres-state-store.mjs +0 -6
  439. package/dist/lib/server/postgres-state-store.mjs.map +1 -1
  440. package/dist/lib/server/postgres-task-store.mjs +0 -6
  441. package/dist/lib/server/postgres-task-store.mjs.map +1 -1
  442. package/dist/lib/server/product-defaults.mjs +0 -6
  443. package/dist/lib/server/product-defaults.mjs.map +1 -1
  444. package/dist/lib/server/redact.mjs +0 -6
  445. package/dist/lib/server/redact.mjs.map +1 -1
  446. package/dist/lib/server/responses.mjs +0 -6
  447. package/dist/lib/server/responses.mjs.map +1 -1
  448. package/dist/lib/server/serve.mjs +0 -6
  449. package/dist/lib/server/serve.mjs.map +1 -1
  450. package/dist/lib/server/socket-mode/conformance-client.mjs +0 -6
  451. package/dist/lib/server/socket-mode/conformance-client.mjs.map +1 -1
  452. package/dist/lib/server/socket-mode/index.mjs +0 -6
  453. package/dist/lib/server/socket-mode/index.mjs.map +1 -1
  454. package/dist/lib/server/socket-mode/ws-transport.mjs +0 -6
  455. package/dist/lib/server/socket-mode/ws-transport.mjs.map +1 -1
  456. package/dist/lib/server/state-machine.mjs +0 -6
  457. package/dist/lib/server/state-machine.mjs.map +1 -1
  458. package/dist/lib/server/state-store.mjs +0 -6
  459. package/dist/lib/server/state-store.mjs.map +1 -1
  460. package/dist/lib/server/structured-serialize.mjs +0 -6
  461. package/dist/lib/server/structured-serialize.mjs.map +1 -1
  462. package/dist/lib/server/targeting-helpers.mjs +0 -6
  463. package/dist/lib/server/targeting-helpers.mjs.map +1 -1
  464. package/dist/lib/server/tasks.mjs +0 -6
  465. package/dist/lib/server/tasks.mjs.map +1 -1
  466. package/dist/lib/server/test-controller-bridge.mjs +0 -6
  467. package/dist/lib/server/test-controller-bridge.mjs.map +1 -1
  468. package/dist/lib/server/test-controller.mjs +0 -6
  469. package/dist/lib/server/test-controller.mjs.map +1 -1
  470. package/dist/lib/server/upstream-helpers.mjs +0 -6
  471. package/dist/lib/server/upstream-helpers.mjs.map +1 -1
  472. package/dist/lib/server/webhook-emitter.mjs +0 -6
  473. package/dist/lib/server/webhook-emitter.mjs.map +1 -1
  474. package/dist/lib/server/wire-safe.mjs +0 -6
  475. package/dist/lib/server/wire-safe.mjs.map +1 -1
  476. package/dist/lib/server/wire-spec-fields.generated.mjs +0 -6
  477. package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
  478. package/dist/lib/server/wrap-envelope.mjs +0 -6
  479. package/dist/lib/server/wrap-envelope.mjs.map +1 -1
  480. package/dist/lib/signing/agent-context.mjs +0 -6
  481. package/dist/lib/signing/agent-context.mjs.map +1 -1
  482. package/dist/lib/signing/agent-fetch.mjs +0 -6
  483. package/dist/lib/signing/agent-fetch.mjs.map +1 -1
  484. package/dist/lib/signing/agent-resolver/canonicalize.mjs +0 -6
  485. package/dist/lib/signing/agent-resolver/canonicalize.mjs.map +1 -1
  486. package/dist/lib/signing/agent-resolver/capabilities-types.mjs +0 -6
  487. package/dist/lib/signing/agent-resolver/capabilities-types.mjs.map +1 -1
  488. package/dist/lib/signing/agent-resolver/consistency.mjs +0 -6
  489. package/dist/lib/signing/agent-resolver/consistency.mjs.map +1 -1
  490. package/dist/lib/signing/agent-resolver/errors.mjs +0 -6
  491. package/dist/lib/signing/agent-resolver/errors.mjs.map +1 -1
  492. package/dist/lib/signing/agent-resolver/etld.mjs +0 -6
  493. package/dist/lib/signing/agent-resolver/etld.mjs.map +1 -1
  494. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs +0 -6
  495. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs.map +1 -1
  496. package/dist/lib/signing/agent-resolver/index.mjs +0 -6
  497. package/dist/lib/signing/agent-resolver/index.mjs.map +1 -1
  498. package/dist/lib/signing/agent-resolver/jwks-set.mjs +0 -6
  499. package/dist/lib/signing/agent-resolver/jwks-set.mjs.map +1 -1
  500. package/dist/lib/signing/agent-resolver/resolve-agent.mjs +0 -6
  501. package/dist/lib/signing/agent-resolver/resolve-agent.mjs.map +1 -1
  502. package/dist/lib/signing/agent-resolver/select-agent.mjs +0 -6
  503. package/dist/lib/signing/agent-resolver/select-agent.mjs.map +1 -1
  504. package/dist/lib/signing/agent-resolver/strict-json.mjs +0 -6
  505. package/dist/lib/signing/agent-resolver/strict-json.mjs.map +1 -1
  506. package/dist/lib/signing/brand-jwks.mjs +0 -6
  507. package/dist/lib/signing/brand-jwks.mjs.map +1 -1
  508. package/dist/lib/signing/canonicalize.mjs +0 -6
  509. package/dist/lib/signing/canonicalize.mjs.map +1 -1
  510. package/dist/lib/signing/capability-cache.mjs +0 -6
  511. package/dist/lib/signing/capability-cache.mjs.map +1 -1
  512. package/dist/lib/signing/capability-priming.mjs +0 -6
  513. package/dist/lib/signing/capability-priming.mjs.map +1 -1
  514. package/dist/lib/signing/client.mjs +0 -6
  515. package/dist/lib/signing/client.mjs.map +1 -1
  516. package/dist/lib/signing/content-digest.mjs +0 -6
  517. package/dist/lib/signing/content-digest.mjs.map +1 -1
  518. package/dist/lib/signing/crypto.mjs +0 -6
  519. package/dist/lib/signing/crypto.mjs.map +1 -1
  520. package/dist/lib/signing/ecdsa-encoding.mjs +0 -6
  521. package/dist/lib/signing/ecdsa-encoding.mjs.map +1 -1
  522. package/dist/lib/signing/errors.mjs +0 -6
  523. package/dist/lib/signing/errors.mjs.map +1 -1
  524. package/dist/lib/signing/fetch-async.mjs +0 -6
  525. package/dist/lib/signing/fetch-async.mjs.map +1 -1
  526. package/dist/lib/signing/fetch.mjs +0 -6
  527. package/dist/lib/signing/fetch.mjs.map +1 -1
  528. package/dist/lib/signing/index.mjs +0 -6
  529. package/dist/lib/signing/index.mjs.map +1 -1
  530. package/dist/lib/signing/jwks-helpers.mjs +0 -6
  531. package/dist/lib/signing/jwks-helpers.mjs.map +1 -1
  532. package/dist/lib/signing/jwks-https.mjs +0 -6
  533. package/dist/lib/signing/jwks-https.mjs.map +1 -1
  534. package/dist/lib/signing/jwks.mjs +0 -6
  535. package/dist/lib/signing/jwks.mjs.map +1 -1
  536. package/dist/lib/signing/middleware.mjs +0 -6
  537. package/dist/lib/signing/middleware.mjs.map +1 -1
  538. package/dist/lib/signing/parser.mjs +0 -6
  539. package/dist/lib/signing/parser.mjs.map +1 -1
  540. package/dist/lib/signing/postgres-replay-store.mjs +0 -6
  541. package/dist/lib/signing/postgres-replay-store.mjs.map +1 -1
  542. package/dist/lib/signing/protocol-response.mjs +0 -6
  543. package/dist/lib/signing/protocol-response.mjs.map +1 -1
  544. package/dist/lib/signing/provider.mjs +0 -6
  545. package/dist/lib/signing/redis-replay-store.mjs +0 -6
  546. package/dist/lib/signing/redis-replay-store.mjs.map +1 -1
  547. package/dist/lib/signing/replay.mjs +0 -6
  548. package/dist/lib/signing/replay.mjs.map +1 -1
  549. package/dist/lib/signing/request-context.mjs +0 -6
  550. package/dist/lib/signing/request-context.mjs.map +1 -1
  551. package/dist/lib/signing/revocation-https.mjs +0 -6
  552. package/dist/lib/signing/revocation-https.mjs.map +1 -1
  553. package/dist/lib/signing/revocation.mjs +0 -6
  554. package/dist/lib/signing/revocation.mjs.map +1 -1
  555. package/dist/lib/signing/server.mjs +0 -6
  556. package/dist/lib/signing/server.mjs.map +1 -1
  557. package/dist/lib/signing/signer-async.mjs +0 -6
  558. package/dist/lib/signing/signer-async.mjs.map +1 -1
  559. package/dist/lib/signing/signer.mjs +0 -6
  560. package/dist/lib/signing/signer.mjs.map +1 -1
  561. package/dist/lib/signing/testing.mjs +0 -6
  562. package/dist/lib/signing/testing.mjs.map +1 -1
  563. package/dist/lib/signing/types.mjs +0 -6
  564. package/dist/lib/signing/types.mjs.map +1 -1
  565. package/dist/lib/signing/verifier.mjs +0 -6
  566. package/dist/lib/signing/verifier.mjs.map +1 -1
  567. package/dist/lib/signing/webhook-auth-detection.mjs +0 -6
  568. package/dist/lib/signing/webhook-auth-detection.mjs.map +1 -1
  569. package/dist/lib/signing/webhook-verifier.mjs +0 -6
  570. package/dist/lib/signing/webhook-verifier.mjs.map +1 -1
  571. package/dist/lib/storage/MemoryStorage.mjs +0 -6
  572. package/dist/lib/storage/MemoryStorage.mjs.map +1 -1
  573. package/dist/lib/storage/interfaces.mjs +0 -6
  574. package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs +0 -6
  575. package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs.map +1 -1
  576. package/dist/lib/substitution/encoder/index.mjs +0 -6
  577. package/dist/lib/substitution/encoder/index.mjs.map +1 -1
  578. package/dist/lib/substitution/index.mjs +0 -6
  579. package/dist/lib/substitution/index.mjs.map +1 -1
  580. package/dist/lib/substitution/observer/SubstitutionObserver.mjs +0 -6
  581. package/dist/lib/substitution/observer/SubstitutionObserver.mjs.map +1 -1
  582. package/dist/lib/substitution/observer/alignment.mjs +0 -6
  583. package/dist/lib/substitution/observer/alignment.mjs.map +1 -1
  584. package/dist/lib/substitution/observer/assertions.mjs +0 -6
  585. package/dist/lib/substitution/observer/assertions.mjs.map +1 -1
  586. package/dist/lib/substitution/observer/html-parser.mjs +0 -6
  587. package/dist/lib/substitution/observer/html-parser.mjs.map +1 -1
  588. package/dist/lib/substitution/observer/index.mjs +0 -6
  589. package/dist/lib/substitution/observer/index.mjs.map +1 -1
  590. package/dist/lib/substitution/observer/ssrf.mjs +0 -6
  591. package/dist/lib/substitution/observer/ssrf.mjs.map +1 -1
  592. package/dist/lib/substitution/rfc3986.mjs +0 -6
  593. package/dist/lib/substitution/rfc3986.mjs.map +1 -1
  594. package/dist/lib/substitution/translate.mjs +0 -6
  595. package/dist/lib/substitution/translate.mjs.map +1 -1
  596. package/dist/lib/substitution/types.mjs +0 -6
  597. package/dist/lib/substitution/vectors.mjs +0 -6
  598. package/dist/lib/substitution/vectors.mjs.map +1 -1
  599. package/dist/lib/testing/agent-tester.mjs +0 -6
  600. package/dist/lib/testing/agent-tester.mjs.map +1 -1
  601. package/dist/lib/testing/client.mjs +0 -6
  602. package/dist/lib/testing/client.mjs.map +1 -1
  603. package/dist/lib/testing/compliance/briefs.mjs +0 -6
  604. package/dist/lib/testing/compliance/briefs.mjs.map +1 -1
  605. package/dist/lib/testing/compliance/comply.mjs +0 -6
  606. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  607. package/dist/lib/testing/compliance/index.mjs +0 -6
  608. package/dist/lib/testing/compliance/index.mjs.map +1 -1
  609. package/dist/lib/testing/compliance/spec-conformance.mjs +0 -6
  610. package/dist/lib/testing/compliance/spec-conformance.mjs.map +1 -1
  611. package/dist/lib/testing/compliance/storyboard-tracks.mjs +0 -6
  612. package/dist/lib/testing/compliance/storyboard-tracks.mjs.map +1 -1
  613. package/dist/lib/testing/compliance/summary.mjs +0 -6
  614. package/dist/lib/testing/compliance/summary.mjs.map +1 -1
  615. package/dist/lib/testing/compliance/types.mjs +0 -6
  616. package/dist/lib/testing/comply-controller.mjs +0 -6
  617. package/dist/lib/testing/comply-controller.mjs.map +1 -1
  618. package/dist/lib/testing/controller-assertions.mjs +0 -6
  619. package/dist/lib/testing/controller-assertions.mjs.map +1 -1
  620. package/dist/lib/testing/formatter.mjs +0 -6
  621. package/dist/lib/testing/formatter.mjs.map +1 -1
  622. package/dist/lib/testing/index.mjs +0 -6
  623. package/dist/lib/testing/index.mjs.map +1 -1
  624. package/dist/lib/testing/local-agent-runner.mjs +0 -6
  625. package/dist/lib/testing/local-agent-runner.mjs.map +1 -1
  626. package/dist/lib/testing/orchestrator.mjs +0 -6
  627. package/dist/lib/testing/orchestrator.mjs.map +1 -1
  628. package/dist/lib/testing/personas/index.mjs +0 -6
  629. package/dist/lib/testing/personas/index.mjs.map +1 -1
  630. package/dist/lib/testing/scenarios/brand-rights.mjs +0 -6
  631. package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
  632. package/dist/lib/testing/scenarios/capabilities.mjs +0 -6
  633. package/dist/lib/testing/scenarios/capabilities.mjs.map +1 -1
  634. package/dist/lib/testing/scenarios/creative.mjs +0 -6
  635. package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
  636. package/dist/lib/testing/scenarios/deterministic.mjs +0 -6
  637. package/dist/lib/testing/scenarios/deterministic.mjs.map +1 -1
  638. package/dist/lib/testing/scenarios/discovery.mjs +0 -6
  639. package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
  640. package/dist/lib/testing/scenarios/edge-cases.mjs +0 -6
  641. package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
  642. package/dist/lib/testing/scenarios/error-compliance.mjs +0 -6
  643. package/dist/lib/testing/scenarios/error-compliance.mjs.map +1 -1
  644. package/dist/lib/testing/scenarios/governance.mjs +0 -6
  645. package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
  646. package/dist/lib/testing/scenarios/health.mjs +0 -6
  647. package/dist/lib/testing/scenarios/health.mjs.map +1 -1
  648. package/dist/lib/testing/scenarios/index.mjs +0 -6
  649. package/dist/lib/testing/scenarios/index.mjs.map +1 -1
  650. package/dist/lib/testing/scenarios/media-buy.mjs +0 -6
  651. package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
  652. package/dist/lib/testing/scenarios/schema-compliance.mjs +0 -6
  653. package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
  654. package/dist/lib/testing/scenarios/signals.mjs +0 -6
  655. package/dist/lib/testing/scenarios/signals.mjs.map +1 -1
  656. package/dist/lib/testing/scenarios/sponsored-intelligence.mjs +0 -6
  657. package/dist/lib/testing/scenarios/sponsored-intelligence.mjs.map +1 -1
  658. package/dist/lib/testing/scenarios/trusted-match.mjs +0 -6
  659. package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
  660. package/dist/lib/testing/seed-merge.mjs +0 -6
  661. package/dist/lib/testing/seed-merge.mjs.map +1 -1
  662. package/dist/lib/testing/storyboard/agent-routing.mjs +0 -6
  663. package/dist/lib/testing/storyboard/agent-routing.mjs.map +1 -1
  664. package/dist/lib/testing/storyboard/assertions.mjs +0 -6
  665. package/dist/lib/testing/storyboard/assertions.mjs.map +1 -1
  666. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +0 -6
  667. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs.map +1 -1
  668. package/dist/lib/testing/storyboard/compliance.mjs +5 -6
  669. package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
  670. package/dist/lib/testing/storyboard/context.mjs +0 -6
  671. package/dist/lib/testing/storyboard/context.mjs.map +1 -1
  672. package/dist/lib/testing/storyboard/default-invariants.mjs +0 -6
  673. package/dist/lib/testing/storyboard/default-invariants.mjs.map +1 -1
  674. package/dist/lib/testing/storyboard/index.mjs +0 -6
  675. package/dist/lib/testing/storyboard/index.mjs.map +1 -1
  676. package/dist/lib/testing/storyboard/junit.mjs +0 -6
  677. package/dist/lib/testing/storyboard/junit.mjs.map +1 -1
  678. package/dist/lib/testing/storyboard/loader.mjs +0 -6
  679. package/dist/lib/testing/storyboard/loader.mjs.map +1 -1
  680. package/dist/lib/testing/storyboard/parallel-dispatch.mjs +0 -6
  681. package/dist/lib/testing/storyboard/parallel-dispatch.mjs.map +1 -1
  682. package/dist/lib/testing/storyboard/path.mjs +0 -6
  683. package/dist/lib/testing/storyboard/path.mjs.map +1 -1
  684. package/dist/lib/testing/storyboard/probes.mjs +0 -6
  685. package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
  686. package/dist/lib/testing/storyboard/rate-limit-trip.mjs +0 -6
  687. package/dist/lib/testing/storyboard/rate-limit-trip.mjs.map +1 -1
  688. package/dist/lib/testing/storyboard/rejection-hints.mjs +0 -6
  689. package/dist/lib/testing/storyboard/rejection-hints.mjs.map +1 -1
  690. package/dist/lib/testing/storyboard/request-builder.mjs +0 -6
  691. package/dist/lib/testing/storyboard/request-builder.mjs.map +1 -1
  692. package/dist/lib/testing/storyboard/request-signing/builder.mjs +0 -6
  693. package/dist/lib/testing/storyboard/request-signing/builder.mjs.map +1 -1
  694. package/dist/lib/testing/storyboard/request-signing/grader.mjs +0 -6
  695. package/dist/lib/testing/storyboard/request-signing/grader.mjs.map +1 -1
  696. package/dist/lib/testing/storyboard/request-signing/index.mjs +0 -6
  697. package/dist/lib/testing/storyboard/request-signing/index.mjs.map +1 -1
  698. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +0 -6
  699. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs.map +1 -1
  700. package/dist/lib/testing/storyboard/request-signing/probe.mjs +0 -6
  701. package/dist/lib/testing/storyboard/request-signing/probe.mjs.map +1 -1
  702. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs +0 -6
  703. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs.map +1 -1
  704. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs +0 -6
  705. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs.map +1 -1
  706. package/dist/lib/testing/storyboard/request-signing/types.mjs +0 -6
  707. package/dist/lib/testing/storyboard/request-signing/types.mjs.map +1 -1
  708. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +0 -6
  709. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
  710. package/dist/lib/testing/storyboard/runner.mjs +0 -6
  711. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  712. package/dist/lib/testing/storyboard/sandbox-entities.mjs +0 -6
  713. package/dist/lib/testing/storyboard/sandbox-entities.mjs.map +1 -1
  714. package/dist/lib/testing/storyboard/seeding.mjs +0 -6
  715. package/dist/lib/testing/storyboard/seeding.mjs.map +1 -1
  716. package/dist/lib/testing/storyboard/shape-drift-hints.mjs +0 -6
  717. package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
  718. package/dist/lib/testing/storyboard/signer-grader/grader.mjs +0 -6
  719. package/dist/lib/testing/storyboard/signer-grader/grader.mjs.map +1 -1
  720. package/dist/lib/testing/storyboard/signer-grader/index.mjs +0 -6
  721. package/dist/lib/testing/storyboard/signer-grader/index.mjs.map +1 -1
  722. package/dist/lib/testing/storyboard/signer-grader/types.mjs +0 -6
  723. package/dist/lib/testing/storyboard/strict-validation-hints.mjs +0 -6
  724. package/dist/lib/testing/storyboard/strict-validation-hints.mjs.map +1 -1
  725. package/dist/lib/testing/storyboard/task-map.mjs +0 -6
  726. package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
  727. package/dist/lib/testing/storyboard/test-kit.mjs +0 -6
  728. package/dist/lib/testing/storyboard/test-kit.mjs.map +1 -1
  729. package/dist/lib/testing/storyboard/types.mjs +0 -6
  730. package/dist/lib/testing/storyboard/types.mjs.map +1 -1
  731. package/dist/lib/testing/storyboard/validations.mjs +0 -6
  732. package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
  733. package/dist/lib/testing/storyboard/webhook-assertions.mjs +0 -6
  734. package/dist/lib/testing/storyboard/webhook-assertions.mjs.map +1 -1
  735. package/dist/lib/testing/storyboard/webhook-receiver.mjs +0 -6
  736. package/dist/lib/testing/storyboard/webhook-receiver.mjs.map +1 -1
  737. package/dist/lib/testing/stubs/governance-agent-stub.mjs +0 -6
  738. package/dist/lib/testing/stubs/governance-agent-stub.mjs.map +1 -1
  739. package/dist/lib/testing/stubs/index.mjs +0 -6
  740. package/dist/lib/testing/stubs/index.mjs.map +1 -1
  741. package/dist/lib/testing/test-controller.mjs +0 -6
  742. package/dist/lib/testing/test-controller.mjs.map +1 -1
  743. package/dist/lib/testing/test-helpers.mjs +0 -6
  744. package/dist/lib/testing/test-helpers.mjs.map +1 -1
  745. package/dist/lib/testing/types.mjs +0 -6
  746. package/dist/lib/types/adcp.mjs +0 -6
  747. package/dist/lib/types/adcp.mjs.map +1 -1
  748. package/dist/lib/types/asset-instances.mjs +0 -6
  749. package/dist/lib/types/compat.mjs +0 -6
  750. package/dist/lib/types/compat.mjs.map +1 -1
  751. package/dist/lib/types/core.generated.mjs +0 -6
  752. package/dist/lib/types/enums.generated.mjs +0 -6
  753. package/dist/lib/types/enums.generated.mjs.map +1 -1
  754. package/dist/lib/types/error-codes.mjs +0 -6
  755. package/dist/lib/types/error-codes.mjs.map +1 -1
  756. package/dist/lib/types/error-details.aliases.mjs +0 -6
  757. package/dist/lib/types/error-details.aliases.mjs.map +1 -1
  758. package/dist/lib/types/format-asset-slots.mjs +0 -6
  759. package/dist/lib/types/forward-compat-error-codes.mjs +0 -6
  760. package/dist/lib/types/forward-compat-error-codes.mjs.map +1 -1
  761. package/dist/lib/types/index.mjs +0 -6
  762. package/dist/lib/types/index.mjs.map +1 -1
  763. package/dist/lib/types/inline-enums.aliases.mjs +0 -6
  764. package/dist/lib/types/inline-enums.aliases.mjs.map +1 -1
  765. package/dist/lib/types/inline-enums.generated.mjs +0 -6
  766. package/dist/lib/types/inline-enums.generated.mjs.map +1 -1
  767. package/dist/lib/types/manifest.generated.mjs +0 -6
  768. package/dist/lib/types/manifest.generated.mjs.map +1 -1
  769. package/dist/lib/types/schemas.generated.mjs +0 -6
  770. package/dist/lib/types/schemas.generated.mjs.map +1 -1
  771. package/dist/lib/types/server-payload-aliases.mjs +0 -6
  772. package/dist/lib/types/server-payload.mjs +0 -6
  773. package/dist/lib/types/sync-rows.mjs +0 -6
  774. package/dist/lib/types/tools.generated.mjs +0 -6
  775. package/dist/lib/types/v2-5/index.mjs +0 -6
  776. package/dist/lib/types/v2-5/index.mjs.map +1 -1
  777. package/dist/lib/types/v2-5/tools.generated.mjs +0 -6
  778. package/dist/lib/types/v3-1-beta/index.mjs +0 -6
  779. package/dist/lib/types/v3-1-beta/index.mjs.map +1 -1
  780. package/dist/lib/types/v3-1-beta/tools.generated.mjs +0 -6
  781. package/dist/lib/types/wellknown-schemas.generated.mjs +0 -6
  782. package/dist/lib/types/wellknown-schemas.generated.mjs.map +1 -1
  783. package/dist/lib/upstream-recorder/constants.mjs +0 -6
  784. package/dist/lib/upstream-recorder/constants.mjs.map +1 -1
  785. package/dist/lib/upstream-recorder/index.mjs +0 -6
  786. package/dist/lib/upstream-recorder/index.mjs.map +1 -1
  787. package/dist/lib/upstream-recorder/recorder.mjs +0 -6
  788. package/dist/lib/upstream-recorder/recorder.mjs.map +1 -1
  789. package/dist/lib/upstream-recorder/types.mjs +0 -6
  790. package/dist/lib/upstream-recorder/types.mjs.map +1 -1
  791. package/dist/lib/utils/a2a-artifacts.mjs +0 -6
  792. package/dist/lib/utils/a2a-artifacts.mjs.map +1 -1
  793. package/dist/lib/utils/a2a-discovery.mjs +0 -6
  794. package/dist/lib/utils/a2a-discovery.mjs.map +1 -1
  795. package/dist/lib/utils/activation-key-builders.mjs +0 -6
  796. package/dist/lib/utils/activation-key-builders.mjs.map +1 -1
  797. package/dist/lib/utils/adcp-version-config.mjs +0 -6
  798. package/dist/lib/utils/adcp-version-config.mjs.map +1 -1
  799. package/dist/lib/utils/asset-builders.mjs +0 -6
  800. package/dist/lib/utils/asset-builders.mjs.map +1 -1
  801. package/dist/lib/utils/build-creative-return-builders.mjs +0 -6
  802. package/dist/lib/utils/build-creative-return-builders.mjs.map +1 -1
  803. package/dist/lib/utils/buyer-retry-policy.mjs +0 -6
  804. package/dist/lib/utils/buyer-retry-policy.mjs.map +1 -1
  805. package/dist/lib/utils/capabilities.mjs +0 -6
  806. package/dist/lib/utils/capabilities.mjs.map +1 -1
  807. package/dist/lib/utils/capability-rollups.mjs +0 -6
  808. package/dist/lib/utils/capability-rollups.mjs.map +1 -1
  809. package/dist/lib/utils/creative-adapter.mjs +0 -6
  810. package/dist/lib/utils/creative-adapter.mjs.map +1 -1
  811. package/dist/lib/utils/creative-delivery.mjs +0 -6
  812. package/dist/lib/utils/creative-delivery.mjs.map +1 -1
  813. package/dist/lib/utils/deprecation.mjs +0 -6
  814. package/dist/lib/utils/deprecation.mjs.map +1 -1
  815. package/dist/lib/utils/envelope-status-compat.mjs +0 -6
  816. package/dist/lib/utils/envelope-status-compat.mjs.map +1 -1
  817. package/dist/lib/utils/error-extraction.mjs +0 -6
  818. package/dist/lib/utils/error-extraction.mjs.map +1 -1
  819. package/dist/lib/utils/extract-result.mjs +0 -6
  820. package/dist/lib/utils/extract-result.mjs.map +1 -1
  821. package/dist/lib/utils/format-asset-slot-builders.mjs +0 -6
  822. package/dist/lib/utils/format-asset-slot-builders.mjs.map +1 -1
  823. package/dist/lib/utils/format-assets.mjs +0 -6
  824. package/dist/lib/utils/format-assets.mjs.map +1 -1
  825. package/dist/lib/utils/format-render-builders.mjs +0 -6
  826. package/dist/lib/utils/format-render-builders.mjs.map +1 -1
  827. package/dist/lib/utils/format-renders.mjs +0 -6
  828. package/dist/lib/utils/format-renders.mjs.map +1 -1
  829. package/dist/lib/utils/get-products-cache-scope.mjs +0 -6
  830. package/dist/lib/utils/get-products-cache-scope.mjs.map +1 -1
  831. package/dist/lib/utils/glob.mjs +0 -6
  832. package/dist/lib/utils/glob.mjs.map +1 -1
  833. package/dist/lib/utils/global-async-local-storage.mjs +0 -6
  834. package/dist/lib/utils/global-async-local-storage.mjs.map +1 -1
  835. package/dist/lib/utils/idempotency.mjs +0 -6
  836. package/dist/lib/utils/idempotency.mjs.map +1 -1
  837. package/dist/lib/utils/index.mjs +0 -6
  838. package/dist/lib/utils/index.mjs.map +1 -1
  839. package/dist/lib/utils/jcs.mjs +0 -6
  840. package/dist/lib/utils/jcs.mjs.map +1 -1
  841. package/dist/lib/utils/json-depth.mjs +0 -6
  842. package/dist/lib/utils/json-depth.mjs.map +1 -1
  843. package/dist/lib/utils/logger.mjs +0 -6
  844. package/dist/lib/utils/logger.mjs.map +1 -1
  845. package/dist/lib/utils/media-buy-delivery-notification-builders.mjs +0 -6
  846. package/dist/lib/utils/media-buy-delivery-notification-builders.mjs.map +1 -1
  847. package/dist/lib/utils/media-buy-status.mjs +0 -6
  848. package/dist/lib/utils/media-buy-status.mjs.map +1 -1
  849. package/dist/lib/utils/pagination.mjs +0 -6
  850. package/dist/lib/utils/pagination.mjs.map +1 -1
  851. package/dist/lib/utils/preview-creative-builders.mjs +0 -6
  852. package/dist/lib/utils/preview-creative-builders.mjs.map +1 -1
  853. package/dist/lib/utils/preview-normalizer.mjs +0 -6
  854. package/dist/lib/utils/preview-normalizer.mjs.map +1 -1
  855. package/dist/lib/utils/preview-utils.mjs +0 -6
  856. package/dist/lib/utils/preview-utils.mjs.map +1 -1
  857. package/dist/lib/utils/pricing-adapter.mjs +0 -6
  858. package/dist/lib/utils/pricing-adapter.mjs.map +1 -1
  859. package/dist/lib/utils/probe-policy.mjs +0 -6
  860. package/dist/lib/utils/probe-policy.mjs.map +1 -1
  861. package/dist/lib/utils/protocol-detection.mjs +0 -6
  862. package/dist/lib/utils/protocol-detection.mjs.map +1 -1
  863. package/dist/lib/utils/redact-secrets.mjs +0 -6
  864. package/dist/lib/utils/redact-secrets.mjs.map +1 -1
  865. package/dist/lib/utils/redis-default-prefix-warn.mjs +0 -6
  866. package/dist/lib/utils/redis-default-prefix-warn.mjs.map +1 -1
  867. package/dist/lib/utils/render-builders.mjs +0 -6
  868. package/dist/lib/utils/render-builders.mjs.map +1 -1
  869. package/dist/lib/utils/request-normalizer.mjs +0 -6
  870. package/dist/lib/utils/request-normalizer.mjs.map +1 -1
  871. package/dist/lib/utils/response-schemas.mjs +0 -6
  872. package/dist/lib/utils/response-schemas.mjs.map +1 -1
  873. package/dist/lib/utils/response-unwrapper.mjs +0 -6
  874. package/dist/lib/utils/response-unwrapper.mjs.map +1 -1
  875. package/dist/lib/utils/retry.mjs +0 -6
  876. package/dist/lib/utils/retry.mjs.map +1 -1
  877. package/dist/lib/utils/signal-discovery-helpers.mjs +0 -6
  878. package/dist/lib/utils/signal-discovery-helpers.mjs.map +1 -1
  879. package/dist/lib/utils/signal-id-builders.mjs +0 -6
  880. package/dist/lib/utils/signal-id-builders.mjs.map +1 -1
  881. package/dist/lib/utils/sync-creatives-adapter.mjs +0 -6
  882. package/dist/lib/utils/sync-creatives-adapter.mjs.map +1 -1
  883. package/dist/lib/utils/task-state.mjs +0 -6
  884. package/dist/lib/utils/task-state.mjs.map +1 -1
  885. package/dist/lib/utils/tool-request-schemas.mjs +0 -6
  886. package/dist/lib/utils/tool-request-schemas.mjs.map +1 -1
  887. package/dist/lib/utils/typeGuards.mjs +0 -6
  888. package/dist/lib/utils/typeGuards.mjs.map +1 -1
  889. package/dist/lib/utils/union-errors.mjs +0 -6
  890. package/dist/lib/utils/union-errors.mjs.map +1 -1
  891. package/dist/lib/utils/validate-user-agent.mjs +0 -6
  892. package/dist/lib/utils/validate-user-agent.mjs.map +1 -1
  893. package/dist/lib/v2/format-schema/fetch.mjs +0 -6
  894. package/dist/lib/v2/format-schema/fetch.mjs.map +1 -1
  895. package/dist/lib/v2/format-schema/index.mjs +0 -6
  896. package/dist/lib/v2/format-schema/index.mjs.map +1 -1
  897. package/dist/lib/v2/format-schema/regex-safety.mjs +0 -6
  898. package/dist/lib/v2/format-schema/regex-safety.mjs.map +1 -1
  899. package/dist/lib/v2/format-schema/resolver.mjs +7 -8
  900. package/dist/lib/v2/format-schema/resolver.mjs.map +1 -1
  901. package/dist/lib/v2/format-schema/sandbox-refs.mjs +0 -6
  902. package/dist/lib/v2/format-schema/sandbox-refs.mjs.map +1 -1
  903. package/dist/lib/v2/projection/augment-response.mjs +0 -6
  904. package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
  905. package/dist/lib/v2/projection/builders.mjs +0 -6
  906. package/dist/lib/v2/projection/builders.mjs.map +1 -1
  907. package/dist/lib/v2/projection/cache-versions.mjs +0 -6
  908. package/dist/lib/v2/projection/cache-versions.mjs.map +1 -1
  909. package/dist/lib/v2/projection/canonical-properties.mjs +5 -6
  910. package/dist/lib/v2/projection/canonical-properties.mjs.map +1 -1
  911. package/dist/lib/v2/projection/catalog.mjs +5 -6
  912. package/dist/lib/v2/projection/catalog.mjs.map +1 -1
  913. package/dist/lib/v2/projection/constants.mjs +0 -6
  914. package/dist/lib/v2/projection/constants.mjs.map +1 -1
  915. package/dist/lib/v2/projection/index.mjs +0 -6
  916. package/dist/lib/v2/projection/index.mjs.map +1 -1
  917. package/dist/lib/v2/projection/registry.mjs +5 -6
  918. package/dist/lib/v2/projection/registry.mjs.map +1 -1
  919. package/dist/lib/v2/projection/types.mjs +0 -6
  920. package/dist/lib/v2/projection/v1-to-v2.mjs +0 -6
  921. package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
  922. package/dist/lib/v2/projection/v2-to-v1.mjs +0 -6
  923. package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
  924. package/dist/lib/v2/projection/write-side.mjs +0 -6
  925. package/dist/lib/v2/projection/write-side.mjs.map +1 -1
  926. package/dist/lib/v2/publisher-catalog/formats.mjs +0 -6
  927. package/dist/lib/v2/publisher-catalog/formats.mjs.map +1 -1
  928. package/dist/lib/v2/publisher-catalog/index.mjs +0 -6
  929. package/dist/lib/v2/publisher-catalog/index.mjs.map +1 -1
  930. package/dist/lib/validation/client-hooks.mjs +0 -6
  931. package/dist/lib/validation/client-hooks.mjs.map +1 -1
  932. package/dist/lib/validation/hints.mjs +0 -6
  933. package/dist/lib/validation/hints.mjs.map +1 -1
  934. package/dist/lib/validation/index.mjs +0 -6
  935. package/dist/lib/validation/index.mjs.map +1 -1
  936. package/dist/lib/validation/schema-errors.mjs +0 -6
  937. package/dist/lib/validation/schema-errors.mjs.map +1 -1
  938. package/dist/lib/validation/schema-loader.mjs +5 -6
  939. package/dist/lib/validation/schema-loader.mjs.map +1 -1
  940. package/dist/lib/validation/schema-validator.mjs +0 -6
  941. package/dist/lib/validation/schema-validator.mjs.map +1 -1
  942. package/dist/lib/validation/sync-creatives.mjs +0 -6
  943. package/dist/lib/validation/sync-creatives.mjs.map +1 -1
  944. package/dist/lib/version.d.mts +3 -3
  945. package/dist/lib/version.d.ts +3 -3
  946. package/dist/lib/version.js +3 -3
  947. package/dist/lib/version.js.map +1 -1
  948. package/dist/lib/version.mjs +3 -9
  949. package/dist/lib/version.mjs.map +1 -1
  950. package/dist/lib/webhooks/index.mjs +0 -6
  951. package/dist/lib/webhooks/index.mjs.map +1 -1
  952. package/dist/lib/wholesale-feed-sync/index.mjs +0 -6
  953. package/dist/lib/wholesale-feed-sync/index.mjs.map +1 -1
  954. package/dist/lib/wholesale-feed-sync/sync.mjs +0 -6
  955. package/dist/lib/wholesale-feed-sync/sync.mjs.map +1 -1
  956. package/dist/lib/wholesale-feed-sync/types.mjs +0 -6
  957. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs +0 -6
  958. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs.map +1 -1
  959. package/package.json +2 -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 { isAdcpVersionSupported, isPre31AdcpVersion, resolveAdcpVersion } from '../utils/adcp-version-config';\nimport { getVersionAdapter, resolveAdapterKey } from '../adapters/version';\nimport { schemaAllowsTopLevelField } from '../validation/schema-loader';\nimport type {\n GetProductsRequest,\n GetProductsResponse,\n PropertyListReference,\n ListCreativeFormatsRequest,\n ListCreativeFormatsResponse,\n CreateMediaBuyRequest,\n UpdateMediaBuyRequest,\n UpdateMediaBuyResponse,\n SyncCreativesRequest,\n SyncCreativesResponse,\n ListCreativesRequest,\n ListCreativesResponse,\n GetMediaBuysRequest,\n GetMediaBuysResponse,\n GetMediaBuyDeliveryRequest,\n GetMediaBuyDeliveryResponse,\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, isMutatingTask } from '../utils/idempotency';\n\nimport type {\n MCPWebhookPayload,\n AdCPAsyncResponseData,\n TaskStatus,\n CreateMediaBuyResponse,\n} 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 { TaskExecutor, DeferredTaskError } from './TaskExecutor';\nimport { attachMatch } from './match';\nimport { createMCPAuthHeaders } from '../auth';\nimport { isAbortOrTimeoutError } from '../protocols/abort';\nimport {\n AuthenticationRequiredError,\n ConfigurationError,\n FeatureUnsupportedError,\n ProtocolFeatureUnsupportedError,\n TaskTimeoutError,\n VersionUnsupportedError,\n is401Error,\n} from '../errors';\nimport { 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 TaskOptions,\n TaskResult,\n ConversationConfig,\n TaskInfo,\n WebhookUrlTemplate,\n} from './ConversationTypes';\nimport type { Activity, AsyncHandlerConfig, WebhookMetadata } from './AsyncHandler';\nimport { AsyncHandler } from './AsyncHandler';\nimport { verifyWebhookRequest, type WebhookHeaderValue, type WebhookHeadersLike } from '../webhooks';\nimport { unwrapProtocolResponse } from '../utils/response-unwrapper';\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} from '../utils/capabilities';\n\nimport { normalizeRequestParams } from '../utils/request-normalizer';\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';\n\ntype ReadRequestOptions = Pick<TaskOptions, 'signal' | 'transport'>;\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 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 | 'webhook_signature_invalid'\n | 'webhook_timestamp_invalid'\n | 'webhook_unsupported_payload'\n | 'webhook_envelope_invalid'\n | 'webhook_result_invalid';\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 /** Explicit legacy HMAC signature header value. */\n signature?: WebhookHeaderValue;\n /** Explicit legacy HMAC timestamp header value. */\n timestamp?: WebhookHeaderValue;\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 status: TaskStatus;\n timestamp?: string;\n message?: string;\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]);\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 /**\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 /** Webhook secret for signature verification (recommended for production) */\n webhookSecret?: string;\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 * Log all schema validation violations to debug logs (default: true)\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 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, Record<string, unknown>>();\n private readonly resolvedAdcpVersion: string;\n\n constructor(\n private agent: AgentConfig,\n private config: SingleAgentClientConfig = {}\n ) {\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\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 webhookUrlTemplate: config.webhookUrlTemplate,\n agentId: agent.id,\n webhookSecret: config.webhookSecret,\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,\n onTransportActivity: config.onTransportActivity,\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 /**\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 /**\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\n if (!needsDiscovery) {\n return this.normalizedAgent;\n }\n\n // Already discovered? Use cached value\n if (this.discoveredAgent) {\n return this.discoveredAgent;\n }\n if (this.discoveredEndpoint) {\n this.discoveredAgent = {\n ...this.normalizedAgent,\n agent_uri: this.discoveredEndpoint,\n };\n return this.discoveredAgent;\n }\n\n // Perform discovery\n this.discoveredEndpoint = await this.discoverMCPEndpoint(this.normalizedAgent.agent_uri, options);\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 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\n if (!needsCanonicalUrl) {\n return this.normalizedAgent;\n }\n\n // Already resolved? Use cached value\n if (this.canonicalBaseUrl) {\n return {\n ...this.normalizedAgent,\n agent_uri: this.canonicalBaseUrl,\n };\n }\n\n // Fetch agent card to get canonical URL\n const canonicalUrl = await this.fetchA2ACanonicalUrl(this.normalizedAgent.agent_uri, options);\n 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 = readOptions?.transport ?? this.config.transport;\n const maxResponseBytes = transport?.maxResponseBytes;\n const requestTimeoutMs = resolveRequestTimeoutMs(transport?.requestTimeoutMs, DEFAULT_REQUEST_TIMEOUT_MS);\n const sizeLimitedFetch = wrapFetchWithSizeLimit((input, init) => fetch(input as RequestInfo | URL, init));\n\n const authToken = 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: isLikelyPrivateUrl(agentUri),\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, { allowPrivateIp: isLikelyPrivateUrl(agentUri) });\n const oauthMetadata = await discoverOAuthMetadata(agentUri);\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\n const authToken = this.agent.auth_token;\n const agentHeaders = this.agent.headers;\n const authHeaders = { ...agentHeaders, ...createMCPAuthHeaders(authToken) };\n const authProvider = this.normalizedAgent.oauth_tokens\n ? (await import('../auth/oauth')).createNonInteractiveOAuthProvider(this.normalizedAgent, {\n agentHint: this.normalizedAgent.id,\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: options?.transport?.requestTimeoutMs ?? this.config.transport?.requestTimeoutMs,\n });\n if (modern.connected) {\n this.discoveredMcpEra = modern.era;\n this.discoveredMcpEraAt = Date.now();\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(new URL(url), authHeaders, [], 'endpoint discovery', undefined, {\n signal: options?.signal,\n requestTimeoutMs: options?.transport?.requestTimeoutMs ?? this.config.transport?.requestTimeoutMs,\n });\n await client.close();\n this.discoveredMcpEra = 'legacy';\n this.discoveredMcpEraAt = Date.now();\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: isLikelyPrivateUrl(providedUri),\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, { allowPrivateIp: isLikelyPrivateUrl(providedUri) });\n const oauthMetadata = await discoverOAuthMetadata(providedUri);\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 * import { verifyWebhookRequest } from '@adcp/sdk/webhooks';\n *\n * app.post('/webhook/:taskType', async (req, res) => {\n * try {\n * const check = verifyWebhookRequest({\n * rawBody: req.rawBody,\n * headers: req.headers,\n * globalSecret: process.env.WEBHOOK_SECRET,\n * });\n * if (!check.ok) return res.status(401).json({ error: check.reason });\n *\n * const handled = await client.handleWebhook(\n * req.body,\n * req.params.taskType,\n * req.params.operationId,\n * check.signature,\n * check.timestamp,\n * req.rawBody\n * );\n * res.status(200).json({ received: handled });\n * } catch (error) {\n * res.status(401).json({ error: error.message });\n * }\n * });\n * ```\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 legacy\n * HMAC profile when `webhookSecret` is configured, parses raw JSON bodies,\n * validates the transport envelope shape, and returns the unwrapped AdCP\n * result plus routing metadata.\n */\n async verifyAndParseWebhook(options: VerifyAndParseWebhookOptions): Promise<WebhookParseResult> {\n const rawBody = options.rawBody ?? rawBodyFromUnknown(options.body);\n\n if (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 const check = verifyWebhookRequest({\n rawBody,\n secret: this.config.webhookSecret,\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 }\n\n const payloadSource =\n this.config.webhookSecret && rawBody !== undefined ? rawBody : (options.payload ?? options.body ?? rawBody);\n const parsedPayload = parseWebhookBody(payloadSource);\n if (!parsedPayload.ok) {\n return parsedPayload;\n }\n\n try {\n const normalizedPayload = this.normalizeWebhookPayload(\n parsedPayload.payload,\n options.taskType ?? 'unknown',\n options.operationId ?? 'unknown'\n );\n return {\n ok: true,\n protocol: normalizedPayload.protocol ?? 'mcp',\n envelope: parsedPayload.payload as MCPWebhookPayload | A2ATask | TaskStatusUpdateEvent,\n result: normalizedPayload.result,\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: normalizedPayload.message,\n timestamp: normalizedPayload.timestamp,\n idempotencyKey: normalizedPayload.idempotency_key,\n },\n };\n } catch (error) {\n if (error instanceof WebhookDispatchError) {\n return { ok: false, code: error.code, message: error.message, cause: error.cause };\n }\n return {\n ok: false,\n code: 'webhook_result_invalid',\n message: error instanceof Error ? error.message : 'Webhook payload could not be normalized.',\n cause: error,\n };\n }\n }\n\n private async dispatchParsedWebhook(parsed: WebhookParseSuccess): Promise<boolean> {\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 protocol: parsed.protocol,\n rawHTTPPayload: parsed.envelope,\n };\n const policyDispatch = await this.applyProductPropertyPolicyToWebhookResult(\n parsed.result as AdCPAsyncResponseData | undefined,\n metadata\n );\n const webhookResult = policyDispatch.result;\n metadata = policyDispatch.metadata;\n\n // Emit activity\n await this.config.onActivity?.({\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: parsed.result,\n timestamp: metadata.timestamp,\n });\n\n if (policyDispatch.suppressHandler) {\n this.forgetProductPolicyRequestParams(metadata);\n return true;\n }\n\n // Handle through async handler if configured\n if (this.asyncHandler) {\n await this.asyncHandler.handleWebhook({ result: webhookResult, metadata });\n this.forgetProductPolicyRequestParams(metadata);\n return true;\n }\n\n this.forgetProductPolicyRequestParams(metadata);\n return false;\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(payload: unknown, taskType: string, operationId: string): 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 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 ${JSON.stringify(payload.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: mcpPayload.operation_id || operationId || '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 protocol: 'mcp',\n };\n }\n\n // 2. Check for A2A Task or TaskStatusUpdateEvent\n if ('kind' in payload && (payload.kind === 'task' || payload.kind === 'status-update')) {\n const a2aPayload = payload as unknown as A2ATask | TaskStatusUpdateEvent;\n const a2aStatus = a2aPayload.status?.state || 'unknown';\n let result: AdCPAsyncResponseData | undefined = undefined;\n\n // Try to extract data from status.message.parts first (for status updates)\n const parts = a2aPayload.status?.message?.parts;\n if (parts && Array.isArray(parts)) {\n const dataPart = parts.find(p => 'data' in p && p.kind === 'data');\n if (dataPart && 'data' in dataPart) {\n result = dataPart.data as AdCPAsyncResponseData;\n }\n }\n\n // If not found in parts, check artifacts (standard A2A task output location)\n if (!result && 'artifacts' in a2aPayload && a2aPayload.artifacts && a2aPayload.artifacts.length > 0) {\n try {\n // Try to unwrap artifacts for all statuses\n result = unwrapProtocolResponse({ result: a2aPayload }, taskType, 'a2a') as AdCPAsyncResponseData;\n } catch (error) {\n throw new WebhookDispatchError(\n 'webhook_result_invalid',\n `Failed to unwrap A2A webhook payload artifacts: ${error instanceof Error ? error.message : 'unknown error'}`,\n error\n );\n }\n }\n\n // Extract message part from status.message.parts (A2A Message structure)\n let message: string | undefined = undefined;\n if (a2aPayload.status?.message?.parts) {\n const textParts = a2aPayload.status.message.parts\n .filter(p => p.kind === 'text' && 'text' in p)\n .map(p => ('text' in p ? p.text : ''));\n if (textParts.length > 0) {\n message = textParts.join(' ');\n }\n }\n\n // Get task_id ensuring it's a string\n let taskId = 'unknown';\n if ('id' in a2aPayload && a2aPayload.id) {\n taskId = String(a2aPayload.id);\n } else if ('taskId' in a2aPayload && a2aPayload.taskId) {\n taskId = String(a2aPayload.taskId);\n }\n\n return {\n operation_id: operationId,\n context_id: 'contextId' in a2aPayload ? a2aPayload.contextId : undefined,\n task_id: taskId,\n task_type: taskType,\n status: a2aStatus,\n result,\n message: message,\n timestamp: a2aPayload.status?.timestamp || new Date().toISOString(),\n protocol: 'a2a',\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 `Received: ${safeJsonPreview(payload)}`\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 HMAC signature (if webhookSecret configured)\n * - Validates timestamp freshness\n * - Calls handleWebhook() with proper error handling\n *\n * @returns HTTP handler function compatible with Express, Next.js, etc.\n *\n * @example Express\n * ```typescript\n * const client = new ADCPClient(agent, {\n * webhookSecret: 'your-secret-key',\n * handlers: {\n * onSyncCreativesStatusChange: async (result) => {\n * console.log('Creative synced:', result);\n * }\n * }\n * });\n *\n * app.post('/webhook', client.createWebhookHandler());\n * ```\n *\n * @example Next.js API Route\n * ```typescript\n * export default client.createWebhookHandler();\n * ```\n */\n createWebhookHandler() {\n return async (\n req: {\n headers: Record<string, WebhookHeaderValue>;\n body: unknown;\n rawBody?: string | Buffer | Uint8Array;\n params?: Record<string, string>;\n },\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 = req.params?.task_type || req.params?.taskType || 'unknown';\n const operationId = req.params?.operation_id || req.params?.operationId || 'unknown';\n\n const parsed = await this.verifyAndParseWebhook({\n payload,\n body: req.body,\n rawBody,\n headers: req.headers,\n taskType,\n operationId,\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 // Return error\n const errorMessage = error instanceof Error ? error.message : String(error);\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 ): Promise<TaskResult<T>> {\n throwIfAborted(options?.signal);\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);\n\n // Degrade an auto-injected discovery webhook to polling for pre-3.1 pins\n // (get_products / get_signals). `effectiveOptions` carries disableWebhook\n // so no push_notification_config reaches a seller that can't accept it.\n const { options: effectiveOptions, driftLog: webhookDriftLog } = this.suppressPre31DiscoveryWebhook(\n taskType,\n options\n );\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 isMutatingTask(taskType) &&\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.\n if (!options?.skipIdempotencyAutoInject && !options?.skipAccountValidation) {\n this.validateRequest(taskType, normalizedParams);\n }\n\n // Validate required features before sending request\n await this.validateTaskFeatures(taskType, options);\n\n // Guard mutating calls against pre-v3 sellers when opted in.\n if (this.config.requireV3ForMutations && isMutatingTask(taskType)) {\n await this.requireSupportedMajor(taskType, options);\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 if (earlyResult) {\n return attachMatch(earlyResult);\n }\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(taskType, normalizedParams);\n }\n\n // Adapt request for the detected server and AdCP protocol versions.\n const serverVersion = await this.detectServerVersion(options);\n const inputSchemaStripLogs: any[] = [];\n const { params: adaptedParams, driftLogs: adaptDriftLogs } = this.adaptRequest(\n taskType,\n normalizedParams,\n serverVersion,\n inputSchemaStripLogs\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 let result = await this.executor.executeTask<T>(\n agent,\n taskType,\n adaptedParams,\n inputHandler,\n effectiveOptions,\n serverVersion\n );\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 // Normalize response to v3 format\n if (result.success && result.data) {\n result.data = this.normalizeResponseToV3(taskType, result.data) as T;\n }\n\n result = this.wrapProductPolicySubmittedContinuation(result, taskType, normalizedParams);\n this.rememberProductPolicyRequestParams(taskType, normalizedParams, result, options);\n result = await this.applyProductPropertyPolicy(result, taskType, normalizedParams);\n\n // Call handler if task completed successfully and handler is configured\n if (result.status === 'completed' && result.success && this.asyncHandler) {\n const handler = this.config.handlers?.[handlerName] as\n | ((data: unknown, metadata: Record<string, unknown>) => Promise<void>)\n | undefined;\n if (handler) {\n const metadata = {\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 timestamp: new Date().toISOString(),\n };\n await handler(result.data, metadata);\n }\n }\n\n return result;\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 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 (options?.taskId) keys.add(options.taskId);\n if (options?.contextId) keys.add(options.contextId);\n\n for (const key of keys) {\n this.productPolicyRequestParamsByTask.set(key, requestParams);\n }\n }\n\n private forgetProductPolicyRequestParams(metadata: WebhookMetadata): void {\n this.forgetProductPolicyRequestParamKeys([metadata.operation_id, metadata.task_id, metadata.context_id]);\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 ): TaskResult<T> {\n if (taskType !== 'get_products' || result.status !== 'submitted' || !result.submitted) return result;\n\n const submitted = result.submitted;\n result.submitted = {\n ...submitted,\n track: async transport => {\n const taskInfo = await submitted.track(transport);\n const processed = await this.applyProductPropertyPolicyToTaskInfo(taskInfo, taskType, requestParams);\n if (['completed', 'failed', 'rejected', 'canceled'].includes(processed.status)) {\n this.forgetProductPolicyRequestParamKeys([\n result.metadata.taskId,\n result.metadata.serverTaskId,\n processed.taskId,\n ]);\n }\n return processed;\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 processed = await this.applyProductPropertyPolicy(completed, taskType, requestParams);\n if (processed.status === 'completed' || processed.status === 'failed') {\n this.forgetProductPolicyRequestParamKeys([\n result.metadata.taskId,\n result.metadata.serverTaskId,\n processed.metadata.taskId,\n processed.metadata.serverTaskId,\n ]);\n }\n return processed;\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.productPolicyRequestParamsByTask.get(metadata.operation_id) ??\n this.productPolicyRequestParamsByTask.get(metadata.task_id) ??\n (metadata.context_id ? this.productPolicyRequestParamsByTask.get(metadata.context_id) : undefined) ??\n {}\n );\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 `cachedCapabilities` is populated\n * and the protocol-version adapters see the seller's declared caps.\n */\n private adaptRequest(\n taskType: string,\n params: any,\n serverVersion: string,\n debugLogs?: any[]\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 = 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 fields not declared in agent \"${this.agent.id}\" schema for ${taskType}: ${schemaStripped.join(', ')}`\n );\n debugLogs?.push({\n type: 'warning',\n message: `Stripped fields not declared in agent tool input schema 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, 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 * @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 * brief: 'Premium coffee brands for millennials',\n * promoted_offering: 'Artisan coffee blends'\n * },\n * (context) => {\n * if (context.inputRequest.field === 'budget') return 50000;\n * return context.deferToHuman();\n * }\n * );\n * ```\n */\n async getProducts(\n params: GetProductsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetProductsResponse>> {\n return this.executeAndHandle<GetProductsResponse>(\n 'get_products',\n 'onGetProductsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * List available creative formats\n *\n * @param params - Format listing parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async listCreativeFormats(\n params: ListCreativeFormatsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListCreativeFormatsResponse>> {\n return this.executeAndHandle<ListCreativeFormatsResponse>(\n 'list_creative_formats',\n 'onListCreativeFormatsStatusChange',\n params,\n inputHandler,\n options\n );\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<CreateMediaBuyRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<CreateMediaBuyResponse>> {\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 // Library defaults\n const libraryDefaults = {\n url: deliveryWebhookUrl,\n authentication: {\n schemes: ['HMAC-SHA256'] as const,\n credentials: this.config.webhookSecret || 'placeholder_secret_min_32_characters_required',\n },\n reporting_frequency: (this.config.reportingWebhookFrequency || 'daily') as 'hourly' | 'daily' | 'monthly',\n };\n\n // Deep merge: consumer overrides library defaults\n params = {\n ...params,\n reporting_webhook: {\n ...libraryDefaults,\n ...params.reporting_webhook,\n authentication: {\n ...libraryDefaults.authentication,\n ...params.reporting_webhook?.authentication,\n },\n },\n } as CreateMediaBuyRequest;\n }\n }\n\n return this.executeAndHandle<CreateMediaBuyResponse>(\n 'create_media_buy',\n 'onCreateMediaBuyStatusChange',\n params,\n inputHandler,\n options\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<UpdateMediaBuyRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<UpdateMediaBuyResponse>> {\n return this.executeAndHandle<UpdateMediaBuyResponse>(\n 'update_media_buy',\n 'onUpdateMediaBuyStatusChange',\n params,\n inputHandler,\n options\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<SyncCreativesRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SyncCreativesResponse>> {\n return this.executeAndHandle<SyncCreativesResponse>(\n 'sync_creatives',\n 'onSyncCreativesStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * List creative assets\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: ListCreativesRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListCreativesResponse>> {\n return this.executeAndHandle<ListCreativesResponse>(\n 'list_creatives',\n 'onListCreativesStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Preview a creative\n *\n * @param params - Preview creative parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async previewCreative(\n params: PreviewCreativeRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<PreviewCreativeResponse>> {\n return this.executeAndHandle<PreviewCreativeResponse>(\n 'preview_creative',\n 'onPreviewCreativeStatusChange',\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?: TaskOptions\n ): Promise<TaskResult<GetMediaBuysResponse>> {\n return this.executeAndHandle<GetMediaBuysResponse>(\n 'get_media_buys',\n 'onGetMediaBuysStatusChange',\n params,\n inputHandler,\n options\n );\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?: TaskOptions\n ): Promise<TaskResult<GetMediaBuyDeliveryResponse>> {\n return this.executeAndHandle<GetMediaBuyDeliveryResponse>(\n 'get_media_buy_delivery',\n 'onGetMediaBuyDeliveryStatusChange',\n params,\n inputHandler,\n options\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.\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 ): 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(checkId, outcome, sellerResponse, error, [], governanceContext);\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 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 from a format and brand context\n */\n async buildCreative(\n params: MutatingRequestInput<BuildCreativeRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<BuildCreativeResponse>> {\n return this.executeAndHandle<BuildCreativeResponse>(\n 'build_creative',\n 'onBuildCreativeStatusChange',\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 listContentStandards(\n params: ListContentStandardsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListContentStandardsResponse>> {\n return this.executeAndHandle<ListContentStandardsResponse>(\n 'list_content_standards',\n 'onListContentStandardsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Get content standards\n */\n async getContentStandards(\n params: GetContentStandardsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetContentStandardsResponse>> {\n return this.executeAndHandle<GetContentStandardsResponse>(\n 'get_content_standards',\n 'onGetContentStandardsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Calibrate content against standards\n */\n async calibrateContent(\n params: MutatingRequestInput<CalibrateContentRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<CalibrateContentResponse>> {\n return this.executeAndHandle<CalibrateContentResponse>(\n 'calibrate_content',\n 'onCalibrateContentStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Validate content delivery\n */\n async validateContentDelivery(\n params: ValidateContentDeliveryRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ValidateContentDeliveryResponse>> {\n return this.executeAndHandle<ValidateContentDeliveryResponse>(\n 'validate_content_delivery',\n 'onValidateContentDeliveryStatusChange',\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<T = any>(\n taskName: string,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions\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\n // Degrade an auto-injected discovery webhook to polling for pre-3.1 pins\n // (get_products / get_signals). `effectiveOptions` carries disableWebhook\n // so no push_notification_config reaches a seller that can't accept it.\n const { options: effectiveOptions, driftLog: webhookDriftLog } = this.suppressPre31DiscoveryWebhook(\n taskName,\n options\n );\n\n await this.validateTaskFeatures(taskName, options);\n if (this.config.requireV3ForMutations && isMutatingTask(taskName)) {\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 serverVersion = await this.detectServerVersion(options);\n const inputSchemaStripLogs: any[] = [];\n const { params: adaptedParams, driftLogs: adaptDriftLogs } = this.adaptRequest(\n taskName,\n normalizedParams,\n serverVersion,\n inputSchemaStripLogs\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 let result = await this.executor.executeTask<T>(\n agent,\n taskName,\n adaptedParams,\n inputHandler,\n effectiveOptions,\n serverVersion\n );\n\n const postAdapterLogs = [...inputSchemaStripLogs, ...v25DriftLogs];\n if (postAdapterLogs.length > 0) {\n result.debug_logs = [...(result.debug_logs ?? []), ...postAdapterLogs];\n }\n\n // Normalize response to v3 format for consistent API surface\n if (result.success && result.data) {\n result.data = this.normalizeResponseToV3(taskName, result.data) as T;\n }\n\n result = this.wrapProductPolicySubmittedContinuation(result, taskName, normalizedParams);\n this.rememberProductPolicyRequestParams(taskName, normalizedParams, result, options);\n result = await this.applyProductPropertyPolicy(result, taskName, normalizedParams);\n\n return result;\n } catch (error) {\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 inputHandler - Handler to provide the missing input\n *\n * @example\n * ```typescript\n * try {\n * await client.createMediaBuy(params, handler);\n * } catch (error) {\n * if (error instanceof DeferredTaskError) {\n * // Get human input and resume\n * const result = await client.resumeDeferredTask(\n * error.token,\n * (context) => humanProvidedValue\n * );\n * }\n * }\n * ```\n */\n async resumeDeferredTask<T = any>(token: string, inputHandler: InputHandler): Promise<TaskResult<T>> {\n // This is a simplified implementation\n // In a full implementation, you'd need to store deferred task state\n // and restore it here\n throw new Error('Deferred task resumption requires storage configuration');\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 return this.executor.executeTask<T>(agent, 'continue_conversation', { message }, inputHandler, { contextId });\n }\n\n /**\n * Get conversation history for a task\n */\n getConversationHistory(taskId: string) {\n return this.executor.getConversationHistory(taskId);\n }\n\n /**\n * Clear conversation history for a task\n */\n clearConversationHistory(taskId: string): void {\n this.executor.clearConversationHistory(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.getActiveTasks().filter(task => task.agent.id === this.agent.id);\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 return this.executor.getTaskList(this.agent.id);\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 return this.executor.getTaskInfo(taskId);\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, callback);\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 return this.executor.onTaskEvents(this.agent.id, callbacks);\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 = 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 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 // 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 (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) {\n const { createNonInteractiveOAuthProvider } = await import('../auth/oauth');\n authProvider = createNonInteractiveOAuthProvider(this.normalizedAgent, {\n agentHint: this.normalizedAgent.id,\n });\n connectOptions.authProvider = authProvider;\n } else if (this.normalizedAgent.auth_token) {\n connectOptions.authToken = this.normalizedAgent.auth_token;\n }\n\n const modernTools =\n this.discoveredMcpEra === 'legacy' && Date.now() - this.discoveredMcpEraAt < 5 * 60 * 1000\n ? ({ handled: false } as const)\n : await withResponseSizeLimit(maxResponseBytes, () =>\n tryListModernMCPTools(agent.agent_uri, this.normalizedAgent.auth_token, this.normalizedAgent.headers, {\n authProvider,\n signal: options?.signal,\n requestTimeoutMs: transport?.requestTimeoutMs,\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 = this.normalizedAgent.auth_token;\n const agentHeaders = this.normalizedAgent.headers ?? {};\n const sizeLimitedFetch = wrapFetchWithSizeLimit((input, init) => fetch(input as RequestInfo | URL, init));\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 // Return cached if available\n if (this.cachedCapabilities) {\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 // Cache raw tool schemas for field-level compatibility checks (e.g. buying_mode on get_products).\n // INVARIANT: must be assigned before cachedCapabilities below so that any code path\n // reaching adaptRequest always finds the schemas populated.\n this.cachedToolSchemas = 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\n // Check if agent supports get_adcp_capabilities (v3)\n const hasCapabilitiesTool = tools.some(t => t.name === 'get_adcp_capabilities');\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 this.cachedCapabilities = augmentCapabilitiesFromTools(parseCapabilitiesResponse(result.data), tools);\n this.maybeWarnV2Sunset(this.cachedCapabilities);\n return this.cachedCapabilities;\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 this.cachedCapabilities = augmentCapabilitiesFromTools(v3Capabilities, tools);\n this.maybeWarnV2Sunset(this.cachedCapabilities);\n return this.cachedCapabilities;\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 TaskTimeoutError ||\n isAbortOrTimeoutError(error)\n ) {\n throw error;\n }\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 // 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 this.cachedCapabilities = augmentCapabilitiesFromTools(buildSyntheticV3Capabilities(tools), tools);\n this.maybeWarnV2Sunset(this.cachedCapabilities);\n return this.cachedCapabilities;\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 this.cachedCapabilities = buildSyntheticCapabilities(tools);\n return this.cachedCapabilities;\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 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) return capabilities.idempotency.replayTtlSeconds;\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(taskName: string, params: unknown, _options?: TaskOptions): void {\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 ): { options: TaskOptions | undefined; driftLog?: Record<string, unknown> } {\n if (!isPre31AdcpVersion(this.resolvedAdcpVersion)) 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 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 this client is pinned to ${this.resolvedAdcpVersion}. ` +\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 },\n };\n }\n\n private throwPre31UnsupportedFeature(\n taskName: string,\n field: string,\n feature: string,\n opts: { capabilityPath: string; suffix: string }\n ): never {\n throw new ProtocolFeatureUnsupportedError([feature], [], this.agent.agent_uri, {\n message:\n `${taskName} ${field} requires AdCP 3.1 or later; ` +\n `this client is pinned to ${this.resolvedAdcpVersion}. ${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: this.resolvedAdcpVersion,\n tool: taskName,\n field,\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) {\n throw new VersionUnsupportedError(taskType, 'idempotency', capabilities.version, this.agent.agent_uri);\n }\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 creative agent to discover available creative formats\n *\n * This is a static utility method that allows you to query any creative agent\n * (like creative.adcontextprotocol.org) to discover what formats are available\n * before creating a media buy.\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 * @example\n * ```typescript\n * // Discover formats from the standard creative agent\n * const formats = await SingleAgentClient.discoverCreativeFormats(\n * 'https://creative.adcontextprotocol.org/mcp'\n * );\n *\n * // Find a specific format\n * const banner = formats.find(f => f.format_id.id === 'display_300x250_image');\n *\n * // Use the format in a media buy\n * await salesAgent.createMediaBuy({\n * packages: [{\n * format_ids: [{\n * agent_url: banner.format_id.agent_url,\n * id: banner.format_id.id\n * }]\n * }]\n * });\n * ```\n */\n static async discoverCreativeFormats(creativeAgentUrl: string, protocol: 'mcp' | 'a2a' = 'mcp'): 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.listCreativeFormats({});\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\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 (error) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Webhook body must be valid JSON.',\n cause: error,\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 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 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 safeJsonPreview(value: unknown): string {\n try {\n return JSON.stringify(value).substring(0, 200);\n } catch {\n return '[unserializable payload]';\n }\n}\n\nfunction webhookErrorHttpStatus(error: unknown): number {\n if (error instanceof WebhookDispatchError) {\n if (error.code === 'webhook_signature_invalid' || error.code === 'webhook_timestamp_invalid') {\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":["_needsDiscovery","_needsCanonicalUrl","cleanAgent","mcpClient"]}
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 { isAdcpVersionSupported, isPre31AdcpVersion, resolveAdcpVersion } from '../utils/adcp-version-config';\nimport { getVersionAdapter, resolveAdapterKey } from '../adapters/version';\nimport { schemaAllowsTopLevelField } from '../validation/schema-loader';\nimport type {\n GetProductsRequest,\n GetProductsResponse,\n PropertyListReference,\n ListCreativeFormatsRequest,\n ListCreativeFormatsResponse,\n CreateMediaBuyRequest,\n UpdateMediaBuyRequest,\n UpdateMediaBuyResponse,\n SyncCreativesRequest,\n SyncCreativesResponse,\n ListCreativesRequest,\n ListCreativesResponse,\n GetMediaBuysRequest,\n GetMediaBuysResponse,\n GetMediaBuyDeliveryRequest,\n GetMediaBuyDeliveryResponse,\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, isMutatingTask } from '../utils/idempotency';\n\nimport type {\n MCPWebhookPayload,\n AdCPAsyncResponseData,\n TaskStatus,\n CreateMediaBuyResponse,\n} 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 { TaskExecutor, DeferredTaskError } from './TaskExecutor';\nimport { attachMatch } from './match';\nimport { createMCPAuthHeaders } from '../auth';\nimport { isAbortOrTimeoutError } from '../protocols/abort';\nimport {\n AuthenticationRequiredError,\n ConfigurationError,\n FeatureUnsupportedError,\n ProtocolFeatureUnsupportedError,\n TaskTimeoutError,\n VersionUnsupportedError,\n is401Error,\n} from '../errors';\nimport { 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 TaskOptions,\n TaskResult,\n ConversationConfig,\n TaskInfo,\n WebhookUrlTemplate,\n} from './ConversationTypes';\nimport type { Activity, AsyncHandlerConfig, WebhookMetadata } from './AsyncHandler';\nimport { AsyncHandler } from './AsyncHandler';\nimport { verifyWebhookRequest, type WebhookHeaderValue, type WebhookHeadersLike } from '../webhooks';\nimport { unwrapProtocolResponse } from '../utils/response-unwrapper';\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} from '../utils/capabilities';\n\nimport { normalizeRequestParams } from '../utils/request-normalizer';\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';\n\ntype ReadRequestOptions = Pick<TaskOptions, 'signal' | 'transport'>;\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 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 | 'webhook_signature_invalid'\n | 'webhook_timestamp_invalid'\n | 'webhook_unsupported_payload'\n | 'webhook_envelope_invalid'\n | 'webhook_result_invalid';\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 /** Explicit legacy HMAC signature header value. */\n signature?: WebhookHeaderValue;\n /** Explicit legacy HMAC timestamp header value. */\n timestamp?: WebhookHeaderValue;\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 status: TaskStatus;\n timestamp?: string;\n message?: string;\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]);\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 /**\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 /** Webhook secret for signature verification (recommended for production) */\n webhookSecret?: string;\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 * Log all schema validation violations to debug logs (default: true)\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 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, Record<string, unknown>>();\n private readonly resolvedAdcpVersion: string;\n\n constructor(\n private agent: AgentConfig,\n private config: SingleAgentClientConfig = {}\n ) {\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\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 webhookUrlTemplate: config.webhookUrlTemplate,\n agentId: agent.id,\n webhookSecret: config.webhookSecret,\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,\n onTransportActivity: config.onTransportActivity,\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 /**\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 /**\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\n if (!needsDiscovery) {\n return this.normalizedAgent;\n }\n\n // Already discovered? Use cached value\n if (this.discoveredAgent) {\n return this.discoveredAgent;\n }\n if (this.discoveredEndpoint) {\n this.discoveredAgent = {\n ...this.normalizedAgent,\n agent_uri: this.discoveredEndpoint,\n };\n return this.discoveredAgent;\n }\n\n // Perform discovery\n this.discoveredEndpoint = await this.discoverMCPEndpoint(this.normalizedAgent.agent_uri, options);\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 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\n if (!needsCanonicalUrl) {\n return this.normalizedAgent;\n }\n\n // Already resolved? Use cached value\n if (this.canonicalBaseUrl) {\n return {\n ...this.normalizedAgent,\n agent_uri: this.canonicalBaseUrl,\n };\n }\n\n // Fetch agent card to get canonical URL\n const canonicalUrl = await this.fetchA2ACanonicalUrl(this.normalizedAgent.agent_uri, options);\n 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 = readOptions?.transport ?? this.config.transport;\n const maxResponseBytes = transport?.maxResponseBytes;\n const requestTimeoutMs = resolveRequestTimeoutMs(transport?.requestTimeoutMs, DEFAULT_REQUEST_TIMEOUT_MS);\n const sizeLimitedFetch = wrapFetchWithSizeLimit((input, init) => fetch(input as RequestInfo | URL, init));\n\n const authToken = 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: isLikelyPrivateUrl(agentUri),\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, { allowPrivateIp: isLikelyPrivateUrl(agentUri) });\n const oauthMetadata = await discoverOAuthMetadata(agentUri);\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\n const authToken = this.agent.auth_token;\n const agentHeaders = this.agent.headers;\n const authHeaders = { ...agentHeaders, ...createMCPAuthHeaders(authToken) };\n const authProvider = this.normalizedAgent.oauth_tokens\n ? (await import('../auth/oauth')).createNonInteractiveOAuthProvider(this.normalizedAgent, {\n agentHint: this.normalizedAgent.id,\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: options?.transport?.requestTimeoutMs ?? this.config.transport?.requestTimeoutMs,\n });\n if (modern.connected) {\n this.discoveredMcpEra = modern.era;\n this.discoveredMcpEraAt = Date.now();\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(new URL(url), authHeaders, [], 'endpoint discovery', undefined, {\n signal: options?.signal,\n requestTimeoutMs: options?.transport?.requestTimeoutMs ?? this.config.transport?.requestTimeoutMs,\n });\n await client.close();\n this.discoveredMcpEra = 'legacy';\n this.discoveredMcpEraAt = Date.now();\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: isLikelyPrivateUrl(providedUri),\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, { allowPrivateIp: isLikelyPrivateUrl(providedUri) });\n const oauthMetadata = await discoverOAuthMetadata(providedUri);\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 * import { verifyWebhookRequest } from '@adcp/sdk/webhooks';\n *\n * app.post('/webhook/:taskType', async (req, res) => {\n * try {\n * const check = verifyWebhookRequest({\n * rawBody: req.rawBody,\n * headers: req.headers,\n * globalSecret: process.env.WEBHOOK_SECRET,\n * });\n * if (!check.ok) return res.status(401).json({ error: check.reason });\n *\n * const handled = await client.handleWebhook(\n * req.body,\n * req.params.taskType,\n * req.params.operationId,\n * check.signature,\n * check.timestamp,\n * req.rawBody\n * );\n * res.status(200).json({ received: handled });\n * } catch (error) {\n * res.status(401).json({ error: error.message });\n * }\n * });\n * ```\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 legacy\n * HMAC profile when `webhookSecret` is configured, parses raw JSON bodies,\n * validates the transport envelope shape, and returns the unwrapped AdCP\n * result plus routing metadata.\n */\n async verifyAndParseWebhook(options: VerifyAndParseWebhookOptions): Promise<WebhookParseResult> {\n const rawBody = options.rawBody ?? rawBodyFromUnknown(options.body);\n\n if (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 const check = verifyWebhookRequest({\n rawBody,\n secret: this.config.webhookSecret,\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 }\n\n const payloadSource =\n this.config.webhookSecret && rawBody !== undefined ? rawBody : (options.payload ?? options.body ?? rawBody);\n const parsedPayload = parseWebhookBody(payloadSource);\n if (!parsedPayload.ok) {\n return parsedPayload;\n }\n\n try {\n const normalizedPayload = this.normalizeWebhookPayload(\n parsedPayload.payload,\n options.taskType ?? 'unknown',\n options.operationId ?? 'unknown'\n );\n return {\n ok: true,\n protocol: normalizedPayload.protocol ?? 'mcp',\n envelope: parsedPayload.payload as MCPWebhookPayload | A2ATask | TaskStatusUpdateEvent,\n result: normalizedPayload.result,\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: normalizedPayload.message,\n timestamp: normalizedPayload.timestamp,\n idempotencyKey: normalizedPayload.idempotency_key,\n },\n };\n } catch (error) {\n if (error instanceof WebhookDispatchError) {\n return { ok: false, code: error.code, message: error.message, cause: error.cause };\n }\n return {\n ok: false,\n code: 'webhook_result_invalid',\n message: error instanceof Error ? error.message : 'Webhook payload could not be normalized.',\n cause: error,\n };\n }\n }\n\n private async dispatchParsedWebhook(parsed: WebhookParseSuccess): Promise<boolean> {\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 protocol: parsed.protocol,\n rawHTTPPayload: parsed.envelope,\n };\n const policyDispatch = await this.applyProductPropertyPolicyToWebhookResult(\n parsed.result as AdCPAsyncResponseData | undefined,\n metadata\n );\n const webhookResult = policyDispatch.result;\n metadata = policyDispatch.metadata;\n\n // Emit activity\n await this.config.onActivity?.({\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: parsed.result,\n timestamp: metadata.timestamp,\n });\n\n if (policyDispatch.suppressHandler) {\n this.forgetProductPolicyRequestParams(metadata);\n return true;\n }\n\n // Handle through async handler if configured\n if (this.asyncHandler) {\n await this.asyncHandler.handleWebhook({ result: webhookResult, metadata });\n this.forgetProductPolicyRequestParams(metadata);\n return true;\n }\n\n this.forgetProductPolicyRequestParams(metadata);\n return false;\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(payload: unknown, taskType: string, operationId: string): 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 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 ${JSON.stringify(payload.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: mcpPayload.operation_id || operationId || '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 protocol: 'mcp',\n };\n }\n\n // 2. Check for A2A Task or TaskStatusUpdateEvent\n if ('kind' in payload && (payload.kind === 'task' || payload.kind === 'status-update')) {\n const a2aPayload = payload as unknown as A2ATask | TaskStatusUpdateEvent;\n const a2aStatus = a2aPayload.status?.state || 'unknown';\n let result: AdCPAsyncResponseData | undefined = undefined;\n\n // Try to extract data from status.message.parts first (for status updates)\n const parts = a2aPayload.status?.message?.parts;\n if (parts && Array.isArray(parts)) {\n const dataPart = parts.find(p => 'data' in p && p.kind === 'data');\n if (dataPart && 'data' in dataPart) {\n result = dataPart.data as AdCPAsyncResponseData;\n }\n }\n\n // If not found in parts, check artifacts (standard A2A task output location)\n if (!result && 'artifacts' in a2aPayload && a2aPayload.artifacts && a2aPayload.artifacts.length > 0) {\n try {\n // Try to unwrap artifacts for all statuses\n result = unwrapProtocolResponse({ result: a2aPayload }, taskType, 'a2a') as AdCPAsyncResponseData;\n } catch (error) {\n throw new WebhookDispatchError(\n 'webhook_result_invalid',\n `Failed to unwrap A2A webhook payload artifacts: ${error instanceof Error ? error.message : 'unknown error'}`,\n error\n );\n }\n }\n\n // Extract message part from status.message.parts (A2A Message structure)\n let message: string | undefined = undefined;\n if (a2aPayload.status?.message?.parts) {\n const textParts = a2aPayload.status.message.parts\n .filter(p => p.kind === 'text' && 'text' in p)\n .map(p => ('text' in p ? p.text : ''));\n if (textParts.length > 0) {\n message = textParts.join(' ');\n }\n }\n\n // Get task_id ensuring it's a string\n let taskId = 'unknown';\n if ('id' in a2aPayload && a2aPayload.id) {\n taskId = String(a2aPayload.id);\n } else if ('taskId' in a2aPayload && a2aPayload.taskId) {\n taskId = String(a2aPayload.taskId);\n }\n\n return {\n operation_id: operationId,\n context_id: 'contextId' in a2aPayload ? a2aPayload.contextId : undefined,\n task_id: taskId,\n task_type: taskType,\n status: a2aStatus,\n result,\n message: message,\n timestamp: a2aPayload.status?.timestamp || new Date().toISOString(),\n protocol: 'a2a',\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 `Received: ${safeJsonPreview(payload)}`\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 HMAC signature (if webhookSecret configured)\n * - Validates timestamp freshness\n * - Calls handleWebhook() with proper error handling\n *\n * @returns HTTP handler function compatible with Express, Next.js, etc.\n *\n * @example Express\n * ```typescript\n * const client = new ADCPClient(agent, {\n * webhookSecret: 'your-secret-key',\n * handlers: {\n * onSyncCreativesStatusChange: async (result) => {\n * console.log('Creative synced:', result);\n * }\n * }\n * });\n *\n * app.post('/webhook', client.createWebhookHandler());\n * ```\n *\n * @example Next.js API Route\n * ```typescript\n * export default client.createWebhookHandler();\n * ```\n */\n createWebhookHandler() {\n return async (\n req: {\n headers: Record<string, WebhookHeaderValue>;\n body: unknown;\n rawBody?: string | Buffer | Uint8Array;\n params?: Record<string, string>;\n },\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 = req.params?.task_type || req.params?.taskType || 'unknown';\n const operationId = req.params?.operation_id || req.params?.operationId || 'unknown';\n\n const parsed = await this.verifyAndParseWebhook({\n payload,\n body: req.body,\n rawBody,\n headers: req.headers,\n taskType,\n operationId,\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 // Return error\n const errorMessage = error instanceof Error ? error.message : String(error);\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 ): Promise<TaskResult<T>> {\n throwIfAborted(options?.signal);\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);\n\n // Degrade an auto-injected discovery webhook to polling for pre-3.1 pins\n // (get_products / get_signals). `effectiveOptions` carries disableWebhook\n // so no push_notification_config reaches a seller that can't accept it.\n const { options: effectiveOptions, driftLog: webhookDriftLog } = this.suppressPre31DiscoveryWebhook(\n taskType,\n options\n );\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 isMutatingTask(taskType) &&\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.\n if (!options?.skipIdempotencyAutoInject && !options?.skipAccountValidation) {\n this.validateRequest(taskType, normalizedParams);\n }\n\n // Validate required features before sending request\n await this.validateTaskFeatures(taskType, options);\n\n // Guard mutating calls against pre-v3 sellers when opted in.\n if (this.config.requireV3ForMutations && isMutatingTask(taskType)) {\n await this.requireSupportedMajor(taskType, options);\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 if (earlyResult) {\n return attachMatch(earlyResult);\n }\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(taskType, normalizedParams);\n }\n\n // Adapt request for the detected server and AdCP protocol versions.\n const serverVersion = await this.detectServerVersion(options);\n const inputSchemaStripLogs: any[] = [];\n const { params: adaptedParams, driftLogs: adaptDriftLogs } = this.adaptRequest(\n taskType,\n normalizedParams,\n serverVersion,\n inputSchemaStripLogs\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 let result = await this.executor.executeTask<T>(\n agent,\n taskType,\n adaptedParams,\n inputHandler,\n effectiveOptions,\n serverVersion\n );\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 // Normalize response to v3 format\n if (result.success && result.data) {\n result.data = this.normalizeResponseToV3(taskType, result.data) as T;\n }\n\n result = this.wrapProductPolicySubmittedContinuation(result, taskType, normalizedParams);\n this.rememberProductPolicyRequestParams(taskType, normalizedParams, result, options);\n result = await this.applyProductPropertyPolicy(result, taskType, normalizedParams);\n\n // Call handler if task completed successfully and handler is configured\n if (result.status === 'completed' && result.success && this.asyncHandler) {\n const handler = this.config.handlers?.[handlerName] as\n | ((data: unknown, metadata: Record<string, unknown>) => Promise<void>)\n | undefined;\n if (handler) {\n const metadata = {\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 timestamp: new Date().toISOString(),\n };\n await handler(result.data, metadata);\n }\n }\n\n return result;\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 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 (options?.taskId) keys.add(options.taskId);\n if (options?.contextId) keys.add(options.contextId);\n\n for (const key of keys) {\n this.productPolicyRequestParamsByTask.set(key, requestParams);\n }\n }\n\n private forgetProductPolicyRequestParams(metadata: WebhookMetadata): void {\n this.forgetProductPolicyRequestParamKeys([metadata.operation_id, metadata.task_id, metadata.context_id]);\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 ): TaskResult<T> {\n if (taskType !== 'get_products' || result.status !== 'submitted' || !result.submitted) return result;\n\n const submitted = result.submitted;\n result.submitted = {\n ...submitted,\n track: async transport => {\n const taskInfo = await submitted.track(transport);\n const processed = await this.applyProductPropertyPolicyToTaskInfo(taskInfo, taskType, requestParams);\n if (['completed', 'failed', 'rejected', 'canceled'].includes(processed.status)) {\n this.forgetProductPolicyRequestParamKeys([\n result.metadata.taskId,\n result.metadata.serverTaskId,\n processed.taskId,\n ]);\n }\n return processed;\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 processed = await this.applyProductPropertyPolicy(completed, taskType, requestParams);\n if (processed.status === 'completed' || processed.status === 'failed') {\n this.forgetProductPolicyRequestParamKeys([\n result.metadata.taskId,\n result.metadata.serverTaskId,\n processed.metadata.taskId,\n processed.metadata.serverTaskId,\n ]);\n }\n return processed;\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.productPolicyRequestParamsByTask.get(metadata.operation_id) ??\n this.productPolicyRequestParamsByTask.get(metadata.task_id) ??\n (metadata.context_id ? this.productPolicyRequestParamsByTask.get(metadata.context_id) : undefined) ??\n {}\n );\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 `cachedCapabilities` is populated\n * and the protocol-version adapters see the seller's declared caps.\n */\n private adaptRequest(\n taskType: string,\n params: any,\n serverVersion: string,\n debugLogs?: any[]\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 = 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 fields not declared in agent \"${this.agent.id}\" schema for ${taskType}: ${schemaStripped.join(', ')}`\n );\n debugLogs?.push({\n type: 'warning',\n message: `Stripped fields not declared in agent tool input schema 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, 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 * @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 * brief: 'Premium coffee brands for millennials',\n * promoted_offering: 'Artisan coffee blends'\n * },\n * (context) => {\n * if (context.inputRequest.field === 'budget') return 50000;\n * return context.deferToHuman();\n * }\n * );\n * ```\n */\n async getProducts(\n params: GetProductsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetProductsResponse>> {\n return this.executeAndHandle<GetProductsResponse>(\n 'get_products',\n 'onGetProductsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * List available creative formats\n *\n * @param params - Format listing parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async listCreativeFormats(\n params: ListCreativeFormatsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListCreativeFormatsResponse>> {\n return this.executeAndHandle<ListCreativeFormatsResponse>(\n 'list_creative_formats',\n 'onListCreativeFormatsStatusChange',\n params,\n inputHandler,\n options\n );\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<CreateMediaBuyRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<CreateMediaBuyResponse>> {\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 // Library defaults\n const libraryDefaults = {\n url: deliveryWebhookUrl,\n authentication: {\n schemes: ['HMAC-SHA256'] as const,\n credentials: this.config.webhookSecret || 'placeholder_secret_min_32_characters_required',\n },\n reporting_frequency: (this.config.reportingWebhookFrequency || 'daily') as 'hourly' | 'daily' | 'monthly',\n };\n\n // Deep merge: consumer overrides library defaults\n params = {\n ...params,\n reporting_webhook: {\n ...libraryDefaults,\n ...params.reporting_webhook,\n authentication: {\n ...libraryDefaults.authentication,\n ...params.reporting_webhook?.authentication,\n },\n },\n } as CreateMediaBuyRequest;\n }\n }\n\n return this.executeAndHandle<CreateMediaBuyResponse>(\n 'create_media_buy',\n 'onCreateMediaBuyStatusChange',\n params,\n inputHandler,\n options\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<UpdateMediaBuyRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<UpdateMediaBuyResponse>> {\n return this.executeAndHandle<UpdateMediaBuyResponse>(\n 'update_media_buy',\n 'onUpdateMediaBuyStatusChange',\n params,\n inputHandler,\n options\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<SyncCreativesRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<SyncCreativesResponse>> {\n return this.executeAndHandle<SyncCreativesResponse>(\n 'sync_creatives',\n 'onSyncCreativesStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * List creative assets\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: ListCreativesRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListCreativesResponse>> {\n return this.executeAndHandle<ListCreativesResponse>(\n 'list_creatives',\n 'onListCreativesStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Preview a creative\n *\n * @param params - Preview creative parameters\n * @param inputHandler - Handler for clarification requests\n * @param options - Task execution options\n */\n async previewCreative(\n params: PreviewCreativeRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<PreviewCreativeResponse>> {\n return this.executeAndHandle<PreviewCreativeResponse>(\n 'preview_creative',\n 'onPreviewCreativeStatusChange',\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?: TaskOptions\n ): Promise<TaskResult<GetMediaBuysResponse>> {\n return this.executeAndHandle<GetMediaBuysResponse>(\n 'get_media_buys',\n 'onGetMediaBuysStatusChange',\n params,\n inputHandler,\n options\n );\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?: TaskOptions\n ): Promise<TaskResult<GetMediaBuyDeliveryResponse>> {\n return this.executeAndHandle<GetMediaBuyDeliveryResponse>(\n 'get_media_buy_delivery',\n 'onGetMediaBuyDeliveryStatusChange',\n params,\n inputHandler,\n options\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.\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 ): 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(checkId, outcome, sellerResponse, error, [], governanceContext);\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 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 from a format and brand context\n */\n async buildCreative(\n params: MutatingRequestInput<BuildCreativeRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<BuildCreativeResponse>> {\n return this.executeAndHandle<BuildCreativeResponse>(\n 'build_creative',\n 'onBuildCreativeStatusChange',\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 listContentStandards(\n params: ListContentStandardsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ListContentStandardsResponse>> {\n return this.executeAndHandle<ListContentStandardsResponse>(\n 'list_content_standards',\n 'onListContentStandardsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Get content standards\n */\n async getContentStandards(\n params: GetContentStandardsRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<GetContentStandardsResponse>> {\n return this.executeAndHandle<GetContentStandardsResponse>(\n 'get_content_standards',\n 'onGetContentStandardsStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Calibrate content against standards\n */\n async calibrateContent(\n params: MutatingRequestInput<CalibrateContentRequest>,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<CalibrateContentResponse>> {\n return this.executeAndHandle<CalibrateContentResponse>(\n 'calibrate_content',\n 'onCalibrateContentStatusChange',\n params,\n inputHandler,\n options\n );\n }\n\n /**\n * Validate content delivery\n */\n async validateContentDelivery(\n params: ValidateContentDeliveryRequest,\n inputHandler?: InputHandler,\n options?: TaskOptions\n ): Promise<TaskResult<ValidateContentDeliveryResponse>> {\n return this.executeAndHandle<ValidateContentDeliveryResponse>(\n 'validate_content_delivery',\n 'onValidateContentDeliveryStatusChange',\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<T = any>(\n taskName: string,\n params: any,\n inputHandler?: InputHandler,\n options?: TaskOptions\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\n // Degrade an auto-injected discovery webhook to polling for pre-3.1 pins\n // (get_products / get_signals). `effectiveOptions` carries disableWebhook\n // so no push_notification_config reaches a seller that can't accept it.\n const { options: effectiveOptions, driftLog: webhookDriftLog } = this.suppressPre31DiscoveryWebhook(\n taskName,\n options\n );\n\n await this.validateTaskFeatures(taskName, options);\n if (this.config.requireV3ForMutations && isMutatingTask(taskName)) {\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 serverVersion = await this.detectServerVersion(options);\n const inputSchemaStripLogs: any[] = [];\n const { params: adaptedParams, driftLogs: adaptDriftLogs } = this.adaptRequest(\n taskName,\n normalizedParams,\n serverVersion,\n inputSchemaStripLogs\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 let result = await this.executor.executeTask<T>(\n agent,\n taskName,\n adaptedParams,\n inputHandler,\n effectiveOptions,\n serverVersion\n );\n\n const postAdapterLogs = [...inputSchemaStripLogs, ...v25DriftLogs];\n if (postAdapterLogs.length > 0) {\n result.debug_logs = [...(result.debug_logs ?? []), ...postAdapterLogs];\n }\n\n // Normalize response to v3 format for consistent API surface\n if (result.success && result.data) {\n result.data = this.normalizeResponseToV3(taskName, result.data) as T;\n }\n\n result = this.wrapProductPolicySubmittedContinuation(result, taskName, normalizedParams);\n this.rememberProductPolicyRequestParams(taskName, normalizedParams, result, options);\n result = await this.applyProductPropertyPolicy(result, taskName, normalizedParams);\n\n return result;\n } catch (error) {\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 inputHandler - Handler to provide the missing input\n *\n * @example\n * ```typescript\n * try {\n * await client.createMediaBuy(params, handler);\n * } catch (error) {\n * if (error instanceof DeferredTaskError) {\n * // Get human input and resume\n * const result = await client.resumeDeferredTask(\n * error.token,\n * (context) => humanProvidedValue\n * );\n * }\n * }\n * ```\n */\n async resumeDeferredTask<T = any>(token: string, inputHandler: InputHandler): Promise<TaskResult<T>> {\n // This is a simplified implementation\n // In a full implementation, you'd need to store deferred task state\n // and restore it here\n throw new Error('Deferred task resumption requires storage configuration');\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 return this.executor.executeTask<T>(agent, 'continue_conversation', { message }, inputHandler, { contextId });\n }\n\n /**\n * Get conversation history for a task\n */\n getConversationHistory(taskId: string) {\n return this.executor.getConversationHistory(taskId);\n }\n\n /**\n * Clear conversation history for a task\n */\n clearConversationHistory(taskId: string): void {\n this.executor.clearConversationHistory(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.getActiveTasks().filter(task => task.agent.id === this.agent.id);\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 return this.executor.getTaskList(this.agent.id);\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 return this.executor.getTaskInfo(taskId);\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, callback);\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 return this.executor.onTaskEvents(this.agent.id, callbacks);\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 = 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 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 // 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 (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) {\n const { createNonInteractiveOAuthProvider } = await import('../auth/oauth');\n authProvider = createNonInteractiveOAuthProvider(this.normalizedAgent, {\n agentHint: this.normalizedAgent.id,\n });\n connectOptions.authProvider = authProvider;\n } else if (this.normalizedAgent.auth_token) {\n connectOptions.authToken = this.normalizedAgent.auth_token;\n }\n\n const modernTools =\n this.discoveredMcpEra === 'legacy' && Date.now() - this.discoveredMcpEraAt < 5 * 60 * 1000\n ? ({ handled: false } as const)\n : await withResponseSizeLimit(maxResponseBytes, () =>\n tryListModernMCPTools(agent.agent_uri, this.normalizedAgent.auth_token, this.normalizedAgent.headers, {\n authProvider,\n signal: options?.signal,\n requestTimeoutMs: transport?.requestTimeoutMs,\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 = this.normalizedAgent.auth_token;\n const agentHeaders = this.normalizedAgent.headers ?? {};\n const sizeLimitedFetch = wrapFetchWithSizeLimit((input, init) => fetch(input as RequestInfo | URL, init));\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 // Return cached if available\n if (this.cachedCapabilities) {\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 // Cache raw tool schemas for field-level compatibility checks (e.g. buying_mode on get_products).\n // INVARIANT: must be assigned before cachedCapabilities below so that any code path\n // reaching adaptRequest always finds the schemas populated.\n this.cachedToolSchemas = 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\n // Check if agent supports get_adcp_capabilities (v3)\n const hasCapabilitiesTool = tools.some(t => t.name === 'get_adcp_capabilities');\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 this.cachedCapabilities = augmentCapabilitiesFromTools(parseCapabilitiesResponse(result.data), tools);\n this.maybeWarnV2Sunset(this.cachedCapabilities);\n return this.cachedCapabilities;\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 this.cachedCapabilities = augmentCapabilitiesFromTools(v3Capabilities, tools);\n this.maybeWarnV2Sunset(this.cachedCapabilities);\n return this.cachedCapabilities;\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 TaskTimeoutError ||\n isAbortOrTimeoutError(error)\n ) {\n throw error;\n }\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 // 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 this.cachedCapabilities = augmentCapabilitiesFromTools(buildSyntheticV3Capabilities(tools), tools);\n this.maybeWarnV2Sunset(this.cachedCapabilities);\n return this.cachedCapabilities;\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 this.cachedCapabilities = buildSyntheticCapabilities(tools);\n return this.cachedCapabilities;\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 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) return capabilities.idempotency.replayTtlSeconds;\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(taskName: string, params: unknown, _options?: TaskOptions): void {\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 ): { options: TaskOptions | undefined; driftLog?: Record<string, unknown> } {\n if (!isPre31AdcpVersion(this.resolvedAdcpVersion)) 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 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 this client is pinned to ${this.resolvedAdcpVersion}. ` +\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 },\n };\n }\n\n private throwPre31UnsupportedFeature(\n taskName: string,\n field: string,\n feature: string,\n opts: { capabilityPath: string; suffix: string }\n ): never {\n throw new ProtocolFeatureUnsupportedError([feature], [], this.agent.agent_uri, {\n message:\n `${taskName} ${field} requires AdCP 3.1 or later; ` +\n `this client is pinned to ${this.resolvedAdcpVersion}. ${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: this.resolvedAdcpVersion,\n tool: taskName,\n field,\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) {\n throw new VersionUnsupportedError(taskType, 'idempotency', capabilities.version, this.agent.agent_uri);\n }\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 creative agent to discover available creative formats\n *\n * This is a static utility method that allows you to query any creative agent\n * (like creative.adcontextprotocol.org) to discover what formats are available\n * before creating a media buy.\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 * @example\n * ```typescript\n * // Discover formats from the standard creative agent\n * const formats = await SingleAgentClient.discoverCreativeFormats(\n * 'https://creative.adcontextprotocol.org/mcp'\n * );\n *\n * // Find a specific format\n * const banner = formats.find(f => f.format_id.id === 'display_300x250_image');\n *\n * // Use the format in a media buy\n * await salesAgent.createMediaBuy({\n * packages: [{\n * format_ids: [{\n * agent_url: banner.format_id.agent_url,\n * id: banner.format_id.id\n * }]\n * }]\n * });\n * ```\n */\n static async discoverCreativeFormats(creativeAgentUrl: string, protocol: 'mcp' | 'a2a' = 'mcp'): 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.listCreativeFormats({});\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\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 (error) {\n return {\n ok: false,\n code: 'webhook_envelope_invalid',\n message: 'Webhook body must be valid JSON.',\n cause: error,\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 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 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 safeJsonPreview(value: unknown): string {\n try {\n return JSON.stringify(value).substring(0, 200);\n } catch {\n return '[unserializable payload]';\n }\n}\n\nfunction webhookErrorHttpStatus(error: unknown): number {\n if (error instanceof WebhookDispatchError) {\n if (error.code === 'webhook_signature_invalid' || error.code === 'webhook_timestamp_invalid') {\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":["_needsDiscovery","_needsCanonicalUrl","cleanAgent","mcpClient"]}