@adcp/sdk 12.1.0 → 13.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (464) hide show
  1. package/README.md +19 -3
  2. package/bin/adcp-fuzz.js +3 -1
  3. package/dist/lib/adapters/content-standards-adapter.d.mts +9 -9
  4. package/dist/lib/adapters/content-standards-adapter.d.ts +9 -9
  5. package/dist/lib/adapters/content-standards-adapter.d.ts.map +1 -1
  6. package/dist/lib/adapters/content-standards-adapter.js +22 -22
  7. package/dist/lib/adapters/content-standards-adapter.js.map +1 -1
  8. package/dist/lib/adapters/content-standards-adapter.mjs +18 -18
  9. package/dist/lib/adapters/content-standards-adapter.mjs.map +1 -1
  10. package/dist/lib/adapters/index.d.mts +2 -2
  11. package/dist/lib/adapters/index.d.ts +2 -2
  12. package/dist/lib/adapters/index.d.ts.map +1 -1
  13. package/dist/lib/adapters/index.js +10 -10
  14. package/dist/lib/adapters/index.js.map +1 -1
  15. package/dist/lib/adapters/index.mjs +9 -9
  16. package/dist/lib/adapters/index.mjs.map +1 -1
  17. package/dist/lib/auth/oauth/authorization-required.d.mts +3 -0
  18. package/dist/lib/auth/oauth/authorization-required.d.ts +3 -0
  19. package/dist/lib/auth/oauth/authorization-required.d.ts.map +1 -1
  20. package/dist/lib/auth/oauth/authorization-required.js +12 -9
  21. package/dist/lib/auth/oauth/authorization-required.js.map +1 -1
  22. package/dist/lib/auth/oauth/authorization-required.mjs +12 -9
  23. package/dist/lib/auth/oauth/authorization-required.mjs.map +1 -1
  24. package/dist/lib/auth/oauth/provider-cache.d.mts +7 -0
  25. package/dist/lib/auth/oauth/provider-cache.d.ts +8 -0
  26. package/dist/lib/auth/oauth/provider-cache.d.ts.map +1 -0
  27. package/dist/lib/auth/oauth/provider-cache.js +44 -0
  28. package/dist/lib/auth/oauth/provider-cache.js.map +1 -0
  29. package/dist/lib/auth/oauth/provider-cache.mjs +19 -0
  30. package/dist/lib/auth/oauth/provider-cache.mjs.map +1 -0
  31. package/dist/lib/conformance/invariants/uniformError.js +1 -1
  32. package/dist/lib/conformance/invariants/uniformError.js.map +1 -1
  33. package/dist/lib/conformance/invariants/uniformError.mjs +1 -1
  34. package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
  35. package/dist/lib/conformance/runners.js +1 -1
  36. package/dist/lib/conformance/runners.js.map +1 -1
  37. package/dist/lib/conformance/runners.mjs +1 -1
  38. package/dist/lib/conformance/runners.mjs.map +1 -1
  39. package/dist/lib/conformance/seeder.js +5 -5
  40. package/dist/lib/conformance/seeder.js.map +1 -1
  41. package/dist/lib/conformance/seeder.mjs +5 -5
  42. package/dist/lib/conformance/seeder.mjs.map +1 -1
  43. package/dist/lib/core/ADCPMultiAgentClient.d.mts +26 -29
  44. package/dist/lib/core/ADCPMultiAgentClient.d.ts +26 -29
  45. package/dist/lib/core/ADCPMultiAgentClient.d.ts.map +1 -1
  46. package/dist/lib/core/ADCPMultiAgentClient.js +27 -19
  47. package/dist/lib/core/ADCPMultiAgentClient.js.map +1 -1
  48. package/dist/lib/core/ADCPMultiAgentClient.mjs +27 -19
  49. package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
  50. package/dist/lib/core/AgentClient.d.mts +148 -138
  51. package/dist/lib/core/AgentClient.d.ts +148 -138
  52. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  53. package/dist/lib/core/AgentClient.js +174 -85
  54. package/dist/lib/core/AgentClient.js.map +1 -1
  55. package/dist/lib/core/AgentClient.mjs +174 -85
  56. package/dist/lib/core/AgentClient.mjs.map +1 -1
  57. package/dist/lib/core/AsyncHandler.d.mts +18 -16
  58. package/dist/lib/core/AsyncHandler.d.ts +18 -16
  59. package/dist/lib/core/AsyncHandler.d.ts.map +1 -1
  60. package/dist/lib/core/AsyncHandler.js +22 -1
  61. package/dist/lib/core/AsyncHandler.js.map +1 -1
  62. package/dist/lib/core/AsyncHandler.mjs +22 -1
  63. package/dist/lib/core/AsyncHandler.mjs.map +1 -1
  64. package/dist/lib/core/ConversationTypes.d.mts +6 -2
  65. package/dist/lib/core/ConversationTypes.d.ts +6 -2
  66. package/dist/lib/core/ConversationTypes.d.ts.map +1 -1
  67. package/dist/lib/core/ConversationTypes.js.map +1 -1
  68. package/dist/lib/core/CreativeAgentClient.d.mts +41 -17
  69. package/dist/lib/core/CreativeAgentClient.d.ts +41 -17
  70. package/dist/lib/core/CreativeAgentClient.d.ts.map +1 -1
  71. package/dist/lib/core/CreativeAgentClient.js +39 -12
  72. package/dist/lib/core/CreativeAgentClient.js.map +1 -1
  73. package/dist/lib/core/CreativeAgentClient.mjs +39 -12
  74. package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
  75. package/dist/lib/core/SingleAgentClient.d.mts +129 -52
  76. package/dist/lib/core/SingleAgentClient.d.ts +129 -52
  77. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  78. package/dist/lib/core/SingleAgentClient.js +1748 -218
  79. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  80. package/dist/lib/core/SingleAgentClient.mjs +1758 -218
  81. package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
  82. package/dist/lib/core/TaskExecutor.d.mts +9 -0
  83. package/dist/lib/core/TaskExecutor.d.ts +9 -0
  84. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  85. package/dist/lib/core/TaskExecutor.js +137 -44
  86. package/dist/lib/core/TaskExecutor.js.map +1 -1
  87. package/dist/lib/core/TaskExecutor.mjs +137 -44
  88. package/dist/lib/core/TaskExecutor.mjs.map +1 -1
  89. package/dist/lib/index.d.mts +111 -17
  90. package/dist/lib/index.d.ts +111 -17
  91. package/dist/lib/index.d.ts.map +1 -1
  92. package/dist/lib/index.js +94 -94
  93. package/dist/lib/index.js.map +1 -1
  94. package/dist/lib/index.mjs +93 -94
  95. package/dist/lib/index.mjs.map +1 -1
  96. package/dist/lib/net/ssrf-fetch.d.mts +13 -1
  97. package/dist/lib/net/ssrf-fetch.d.ts +13 -1
  98. package/dist/lib/net/ssrf-fetch.d.ts.map +1 -1
  99. package/dist/lib/net/ssrf-fetch.js +14 -7
  100. package/dist/lib/net/ssrf-fetch.js.map +1 -1
  101. package/dist/lib/net/ssrf-fetch.mjs +14 -7
  102. package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
  103. package/dist/lib/protocols/a2a.d.mts +2 -2
  104. package/dist/lib/protocols/a2a.d.ts +2 -2
  105. package/dist/lib/protocols/a2a.d.ts.map +1 -1
  106. package/dist/lib/protocols/a2a.js +14 -9
  107. package/dist/lib/protocols/a2a.js.map +1 -1
  108. package/dist/lib/protocols/a2a.mjs +14 -9
  109. package/dist/lib/protocols/a2a.mjs.map +1 -1
  110. package/dist/lib/protocols/index.d.mts +20 -3
  111. package/dist/lib/protocols/index.d.ts +20 -3
  112. package/dist/lib/protocols/index.d.ts.map +1 -1
  113. package/dist/lib/protocols/index.js +44 -31
  114. package/dist/lib/protocols/index.js.map +1 -1
  115. package/dist/lib/protocols/index.mjs +44 -32
  116. package/dist/lib/protocols/index.mjs.map +1 -1
  117. package/dist/lib/protocols/mcp-modern.d.ts.map +1 -1
  118. package/dist/lib/protocols/mcp-modern.js +87 -12
  119. package/dist/lib/protocols/mcp-modern.js.map +1 -1
  120. package/dist/lib/protocols/mcp-modern.mjs +89 -12
  121. package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
  122. package/dist/lib/protocols/mcp-tasks.d.mts +3 -0
  123. package/dist/lib/protocols/mcp-tasks.d.ts +3 -0
  124. package/dist/lib/protocols/mcp-tasks.d.ts.map +1 -1
  125. package/dist/lib/protocols/mcp-tasks.js +21 -11
  126. package/dist/lib/protocols/mcp-tasks.js.map +1 -1
  127. package/dist/lib/protocols/mcp-tasks.mjs +21 -11
  128. package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
  129. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  130. package/dist/lib/server/create-adcp-server.d.mts +6 -0
  131. package/dist/lib/server/create-adcp-server.d.ts +6 -0
  132. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  133. package/dist/lib/server/create-adcp-server.js +295 -48
  134. package/dist/lib/server/create-adcp-server.js.map +1 -1
  135. package/dist/lib/server/create-adcp-server.mjs +301 -50
  136. package/dist/lib/server/create-adcp-server.mjs.map +1 -1
  137. package/dist/lib/server/decisioning/assembly-helpers.d.mts +27 -13
  138. package/dist/lib/server/decisioning/assembly-helpers.d.ts +27 -13
  139. package/dist/lib/server/decisioning/assembly-helpers.d.ts.map +1 -1
  140. package/dist/lib/server/decisioning/assembly-helpers.js +136 -14
  141. package/dist/lib/server/decisioning/assembly-helpers.js.map +1 -1
  142. package/dist/lib/server/decisioning/assembly-helpers.mjs +134 -13
  143. package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
  144. package/dist/lib/server/decisioning/index.d.mts +13 -12
  145. package/dist/lib/server/decisioning/index.d.ts +13 -12
  146. package/dist/lib/server/decisioning/index.d.ts.map +1 -1
  147. package/dist/lib/server/decisioning/index.js +6 -0
  148. package/dist/lib/server/decisioning/index.js.map +1 -1
  149. package/dist/lib/server/decisioning/index.mjs +9 -3
  150. package/dist/lib/server/decisioning/index.mjs.map +1 -1
  151. package/dist/lib/server/decisioning/list-helpers.d.mts +13 -3
  152. package/dist/lib/server/decisioning/list-helpers.d.ts +13 -3
  153. package/dist/lib/server/decisioning/list-helpers.d.ts.map +1 -1
  154. package/dist/lib/server/decisioning/list-helpers.js +13 -3
  155. package/dist/lib/server/decisioning/list-helpers.js.map +1 -1
  156. package/dist/lib/server/decisioning/list-helpers.mjs +11 -2
  157. package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
  158. package/dist/lib/server/decisioning/manifest-helpers.d.mts +5 -3
  159. package/dist/lib/server/decisioning/manifest-helpers.d.ts +5 -3
  160. package/dist/lib/server/decisioning/manifest-helpers.d.ts.map +1 -1
  161. package/dist/lib/server/decisioning/manifest-helpers.js.map +1 -1
  162. package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
  163. package/dist/lib/server/decisioning/proposal/dispatch.d.mts +2 -2
  164. package/dist/lib/server/decisioning/proposal/dispatch.d.ts +2 -2
  165. package/dist/lib/server/decisioning/proposal/dispatch.d.ts.map +1 -1
  166. package/dist/lib/server/decisioning/proposal/dispatch.js.map +1 -1
  167. package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
  168. package/dist/lib/server/decisioning/proposal/index.d.mts +1 -1
  169. package/dist/lib/server/decisioning/proposal/index.d.ts +1 -1
  170. package/dist/lib/server/decisioning/proposal/index.d.ts.map +1 -1
  171. package/dist/lib/server/decisioning/proposal/index.js.map +1 -1
  172. package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
  173. package/dist/lib/server/decisioning/proposal/lifecycle.d.mts +3 -2
  174. package/dist/lib/server/decisioning/proposal/lifecycle.d.ts +3 -2
  175. package/dist/lib/server/decisioning/proposal/lifecycle.d.ts.map +1 -1
  176. package/dist/lib/server/decisioning/proposal/lifecycle.js.map +1 -1
  177. package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
  178. package/dist/lib/server/decisioning/proposal/mock-manager.d.mts +3 -3
  179. package/dist/lib/server/decisioning/proposal/mock-manager.d.ts +3 -3
  180. package/dist/lib/server/decisioning/proposal/mock-manager.d.ts.map +1 -1
  181. package/dist/lib/server/decisioning/proposal/mock-manager.js.map +1 -1
  182. package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
  183. package/dist/lib/server/decisioning/proposal/types.d.mts +10 -6
  184. package/dist/lib/server/decisioning/proposal/types.d.ts +10 -6
  185. package/dist/lib/server/decisioning/proposal/types.d.ts.map +1 -1
  186. package/dist/lib/server/decisioning/proposal/types.js.map +1 -1
  187. package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
  188. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +21 -2
  189. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +21 -2
  190. package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
  191. package/dist/lib/server/decisioning/runtime/from-platform.js +754 -81
  192. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
  193. package/dist/lib/server/decisioning/runtime/from-platform.mjs +763 -81
  194. package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
  195. package/dist/lib/server/decisioning/specialisms/brand-rights.d.mts +9 -9
  196. package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts +9 -9
  197. package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts.map +1 -1
  198. package/dist/lib/server/decisioning/specialisms/brand-rights.js.map +1 -1
  199. package/dist/lib/server/decisioning/specialisms/content-standards.d.mts +16 -16
  200. package/dist/lib/server/decisioning/specialisms/content-standards.d.ts +16 -16
  201. package/dist/lib/server/decisioning/specialisms/content-standards.d.ts.map +1 -1
  202. package/dist/lib/server/decisioning/specialisms/content-standards.js.map +1 -1
  203. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.mts +15 -13
  204. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts +15 -13
  205. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts.map +1 -1
  206. package/dist/lib/server/decisioning/specialisms/creative-ad-server.js.map +1 -1
  207. package/dist/lib/server/decisioning/specialisms/creative.d.mts +12 -11
  208. package/dist/lib/server/decisioning/specialisms/creative.d.ts +12 -11
  209. package/dist/lib/server/decisioning/specialisms/creative.d.ts.map +1 -1
  210. package/dist/lib/server/decisioning/specialisms/creative.js.map +1 -1
  211. package/dist/lib/server/decisioning/specialisms/sales.d.mts +25 -15
  212. package/dist/lib/server/decisioning/specialisms/sales.d.ts +25 -15
  213. package/dist/lib/server/decisioning/specialisms/sales.d.ts.map +1 -1
  214. package/dist/lib/server/decisioning/specialisms/sales.js.map +1 -1
  215. package/dist/lib/server/index.d.mts +3 -3
  216. package/dist/lib/server/index.d.ts +3 -3
  217. package/dist/lib/server/index.d.ts.map +1 -1
  218. package/dist/lib/server/index.js +72 -72
  219. package/dist/lib/server/index.js.map +1 -1
  220. package/dist/lib/server/index.mjs +36 -36
  221. package/dist/lib/server/index.mjs.map +1 -1
  222. package/dist/lib/server/legacy/v5/index.d.mts +1 -0
  223. package/dist/lib/server/legacy/v5/index.d.ts +1 -0
  224. package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
  225. package/dist/lib/server/legacy/v5/index.js +74 -1
  226. package/dist/lib/server/legacy/v5/index.js.map +1 -1
  227. package/dist/lib/server/legacy/v5/index.mjs +75 -1
  228. package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
  229. package/dist/lib/server/responses.d.mts +2 -2
  230. package/dist/lib/server/responses.d.ts +2 -2
  231. package/dist/lib/server/responses.js.map +1 -1
  232. package/dist/lib/server/responses.mjs.map +1 -1
  233. package/dist/lib/testing/client.d.ts.map +1 -1
  234. package/dist/lib/testing/client.js +13 -5
  235. package/dist/lib/testing/client.js.map +1 -1
  236. package/dist/lib/testing/client.mjs +13 -5
  237. package/dist/lib/testing/client.mjs.map +1 -1
  238. package/dist/lib/testing/compliance/comply.d.mts +1 -1
  239. package/dist/lib/testing/compliance/comply.d.ts +1 -1
  240. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  241. package/dist/lib/testing/compliance/comply.js +16 -6
  242. package/dist/lib/testing/compliance/comply.js.map +1 -1
  243. package/dist/lib/testing/compliance/comply.mjs +16 -6
  244. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  245. package/dist/lib/testing/scenarios/brand-rights.js +6 -6
  246. package/dist/lib/testing/scenarios/brand-rights.js.map +1 -1
  247. package/dist/lib/testing/scenarios/brand-rights.mjs +6 -6
  248. package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
  249. package/dist/lib/testing/scenarios/creative.js +7 -7
  250. package/dist/lib/testing/scenarios/creative.js.map +1 -1
  251. package/dist/lib/testing/scenarios/creative.mjs +7 -7
  252. package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
  253. package/dist/lib/testing/scenarios/discovery.js +2 -2
  254. package/dist/lib/testing/scenarios/discovery.js.map +1 -1
  255. package/dist/lib/testing/scenarios/discovery.mjs +2 -2
  256. package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
  257. package/dist/lib/testing/scenarios/edge-cases.js +11 -11
  258. package/dist/lib/testing/scenarios/edge-cases.js.map +1 -1
  259. package/dist/lib/testing/scenarios/edge-cases.mjs +11 -11
  260. package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
  261. package/dist/lib/testing/scenarios/governance.d.ts.map +1 -1
  262. package/dist/lib/testing/scenarios/governance.js +16 -22
  263. package/dist/lib/testing/scenarios/governance.js.map +1 -1
  264. package/dist/lib/testing/scenarios/governance.mjs +16 -22
  265. package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
  266. package/dist/lib/testing/scenarios/media-buy.js +5 -5
  267. package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
  268. package/dist/lib/testing/scenarios/media-buy.mjs +5 -5
  269. package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
  270. package/dist/lib/testing/scenarios/schema-compliance.js +1 -1
  271. package/dist/lib/testing/scenarios/schema-compliance.js.map +1 -1
  272. package/dist/lib/testing/scenarios/schema-compliance.mjs +1 -1
  273. package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
  274. package/dist/lib/testing/scenarios/trusted-match.d.ts.map +1 -1
  275. package/dist/lib/testing/scenarios/trusted-match.js +4 -3
  276. package/dist/lib/testing/scenarios/trusted-match.js.map +1 -1
  277. package/dist/lib/testing/scenarios/trusted-match.mjs +4 -3
  278. package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
  279. package/dist/lib/testing/storyboard/probes.d.mts +6 -0
  280. package/dist/lib/testing/storyboard/probes.d.ts +6 -0
  281. package/dist/lib/testing/storyboard/probes.d.ts.map +1 -1
  282. package/dist/lib/testing/storyboard/probes.js +16 -5
  283. package/dist/lib/testing/storyboard/probes.js.map +1 -1
  284. package/dist/lib/testing/storyboard/probes.mjs +16 -5
  285. package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
  286. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  287. package/dist/lib/testing/storyboard/runner.js +6 -2
  288. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  289. package/dist/lib/testing/storyboard/runner.mjs +6 -2
  290. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  291. package/dist/lib/testing/storyboard/shape-drift-hints.d.mts +3 -4
  292. package/dist/lib/testing/storyboard/shape-drift-hints.d.ts +3 -4
  293. package/dist/lib/testing/storyboard/shape-drift-hints.d.ts.map +1 -1
  294. package/dist/lib/testing/storyboard/shape-drift-hints.js +27 -27
  295. package/dist/lib/testing/storyboard/shape-drift-hints.js.map +1 -1
  296. package/dist/lib/testing/storyboard/shape-drift-hints.mjs +27 -27
  297. package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
  298. package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
  299. package/dist/lib/testing/storyboard/task-map.js +43 -5
  300. package/dist/lib/testing/storyboard/task-map.js.map +1 -1
  301. package/dist/lib/testing/storyboard/task-map.mjs +43 -5
  302. package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
  303. package/dist/lib/testing/test-helpers.d.mts +2 -2
  304. package/dist/lib/testing/test-helpers.d.ts +2 -2
  305. package/dist/lib/testing/test-helpers.js.map +1 -1
  306. package/dist/lib/testing/test-helpers.mjs.map +1 -1
  307. package/dist/lib/testing/types.d.mts +7 -1
  308. package/dist/lib/testing/types.d.ts +7 -1
  309. package/dist/lib/testing/types.d.ts.map +1 -1
  310. package/dist/lib/testing/types.js.map +1 -1
  311. package/dist/lib/types/adcp.d.mts +14 -14
  312. package/dist/lib/types/adcp.d.ts +14 -14
  313. package/dist/lib/types/adcp.d.ts.map +1 -1
  314. package/dist/lib/types/adcp.js.map +1 -1
  315. package/dist/lib/types/adcp.mjs.map +1 -1
  316. package/dist/lib/types/index.d.mts +2 -2
  317. package/dist/lib/types/index.d.ts +2 -2
  318. package/dist/lib/types/index.d.ts.map +1 -1
  319. package/dist/lib/types/index.js.map +1 -1
  320. package/dist/lib/types/index.mjs.map +1 -1
  321. package/dist/lib/utils/capabilities.d.mts +6 -0
  322. package/dist/lib/utils/capabilities.d.ts +6 -0
  323. package/dist/lib/utils/capabilities.d.ts.map +1 -1
  324. package/dist/lib/utils/capabilities.js +4 -0
  325. package/dist/lib/utils/capabilities.js.map +1 -1
  326. package/dist/lib/utils/capabilities.mjs +4 -0
  327. package/dist/lib/utils/capabilities.mjs.map +1 -1
  328. package/dist/lib/utils/creative-delivery.d.mts +52 -10
  329. package/dist/lib/utils/creative-delivery.d.ts +52 -10
  330. package/dist/lib/utils/creative-delivery.d.ts.map +1 -1
  331. package/dist/lib/utils/creative-delivery.js +104 -9
  332. package/dist/lib/utils/creative-delivery.js.map +1 -1
  333. package/dist/lib/utils/creative-delivery.mjs +104 -8
  334. package/dist/lib/utils/creative-delivery.mjs.map +1 -1
  335. package/dist/lib/utils/format-assets.d.mts +41 -38
  336. package/dist/lib/utils/format-assets.d.ts +41 -38
  337. package/dist/lib/utils/format-assets.d.ts.map +1 -1
  338. package/dist/lib/utils/format-assets.js +3 -1
  339. package/dist/lib/utils/format-assets.js.map +1 -1
  340. package/dist/lib/utils/format-assets.mjs +3 -1
  341. package/dist/lib/utils/format-assets.mjs.map +1 -1
  342. package/dist/lib/utils/index.d.mts +8 -8
  343. package/dist/lib/utils/index.d.ts +8 -8
  344. package/dist/lib/utils/index.d.ts.map +1 -1
  345. package/dist/lib/utils/index.js +11 -9
  346. package/dist/lib/utils/index.js.map +1 -1
  347. package/dist/lib/utils/index.mjs +9 -8
  348. package/dist/lib/utils/index.mjs.map +1 -1
  349. package/dist/lib/utils/preview-utils.d.mts +11 -8
  350. package/dist/lib/utils/preview-utils.d.ts +11 -8
  351. package/dist/lib/utils/preview-utils.d.ts.map +1 -1
  352. package/dist/lib/utils/preview-utils.js +4 -4
  353. package/dist/lib/utils/preview-utils.js.map +1 -1
  354. package/dist/lib/utils/preview-utils.mjs +3 -3
  355. package/dist/lib/utils/preview-utils.mjs.map +1 -1
  356. package/dist/lib/utils/tool-request-schemas.d.mts +2 -2
  357. package/dist/lib/utils/tool-request-schemas.d.ts +2 -2
  358. package/dist/lib/v2/projection/aao-reference-formats.json +492 -0
  359. package/dist/lib/v2/projection/augment-response.d.mts +31 -11
  360. package/dist/lib/v2/projection/augment-response.d.ts +31 -11
  361. package/dist/lib/v2/projection/augment-response.d.ts.map +1 -1
  362. package/dist/lib/v2/projection/augment-response.js +233 -27
  363. package/dist/lib/v2/projection/augment-response.js.map +1 -1
  364. package/dist/lib/v2/projection/augment-response.mjs +232 -27
  365. package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
  366. package/dist/lib/v2/projection/builders.d.mts +7 -6
  367. package/dist/lib/v2/projection/builders.d.ts +7 -6
  368. package/dist/lib/v2/projection/builders.d.ts.map +1 -1
  369. package/dist/lib/v2/projection/builders.js +11 -8
  370. package/dist/lib/v2/projection/builders.js.map +1 -1
  371. package/dist/lib/v2/projection/builders.mjs +9 -6
  372. package/dist/lib/v2/projection/builders.mjs.map +1 -1
  373. package/dist/lib/v2/projection/catalog-snapshot.d.mts +47 -0
  374. package/dist/lib/v2/projection/catalog-snapshot.d.ts +48 -0
  375. package/dist/lib/v2/projection/catalog-snapshot.d.ts.map +1 -0
  376. package/dist/lib/v2/projection/catalog-snapshot.js +291 -0
  377. package/dist/lib/v2/projection/catalog-snapshot.js.map +1 -0
  378. package/dist/lib/v2/projection/catalog-snapshot.mjs +265 -0
  379. package/dist/lib/v2/projection/catalog-snapshot.mjs.map +1 -0
  380. package/dist/lib/v2/projection/catalog.d.mts +23 -2
  381. package/dist/lib/v2/projection/catalog.d.ts +23 -2
  382. package/dist/lib/v2/projection/catalog.d.ts.map +1 -1
  383. package/dist/lib/v2/projection/catalog.js +34 -10
  384. package/dist/lib/v2/projection/catalog.js.map +1 -1
  385. package/dist/lib/v2/projection/catalog.mjs +33 -10
  386. package/dist/lib/v2/projection/catalog.mjs.map +1 -1
  387. package/dist/lib/v2/projection/creative-delivery.d.mts +157 -0
  388. package/dist/lib/v2/projection/creative-delivery.d.ts +158 -0
  389. package/dist/lib/v2/projection/creative-delivery.d.ts.map +1 -0
  390. package/dist/lib/v2/projection/creative-delivery.js +967 -0
  391. package/dist/lib/v2/projection/creative-delivery.js.map +1 -0
  392. package/dist/lib/v2/projection/creative-delivery.mjs +941 -0
  393. package/dist/lib/v2/projection/creative-delivery.mjs.map +1 -0
  394. package/dist/lib/v2/projection/index.d.mts +8 -6
  395. package/dist/lib/v2/projection/index.d.ts +8 -6
  396. package/dist/lib/v2/projection/index.d.ts.map +1 -1
  397. package/dist/lib/v2/projection/index.js +26 -4
  398. package/dist/lib/v2/projection/index.js.map +1 -1
  399. package/dist/lib/v2/projection/index.mjs +28 -4
  400. package/dist/lib/v2/projection/index.mjs.map +1 -1
  401. package/dist/lib/v2/projection/legacy-metadata.d.mts +21 -0
  402. package/dist/lib/v2/projection/legacy-metadata.d.ts +22 -0
  403. package/dist/lib/v2/projection/legacy-metadata.d.ts.map +1 -0
  404. package/dist/lib/v2/projection/legacy-metadata.js +73 -0
  405. package/dist/lib/v2/projection/legacy-metadata.js.map +1 -0
  406. package/dist/lib/v2/projection/legacy-metadata.mjs +45 -0
  407. package/dist/lib/v2/projection/legacy-metadata.mjs.map +1 -0
  408. package/dist/lib/v2/projection/types.d.mts +29 -23
  409. package/dist/lib/v2/projection/types.d.ts +29 -23
  410. package/dist/lib/v2/projection/types.d.ts.map +1 -1
  411. package/dist/lib/v2/projection/types.js.map +1 -1
  412. package/dist/lib/v2/projection/v1-to-v2.d.mts +29 -6
  413. package/dist/lib/v2/projection/v1-to-v2.d.ts +29 -6
  414. package/dist/lib/v2/projection/v1-to-v2.d.ts.map +1 -1
  415. package/dist/lib/v2/projection/v1-to-v2.js +218 -9
  416. package/dist/lib/v2/projection/v1-to-v2.js.map +1 -1
  417. package/dist/lib/v2/projection/v1-to-v2.mjs +219 -10
  418. package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
  419. package/dist/lib/v2/projection/v2-to-v1.d.mts +31 -2
  420. package/dist/lib/v2/projection/v2-to-v1.d.ts +31 -2
  421. package/dist/lib/v2/projection/v2-to-v1.d.ts.map +1 -1
  422. package/dist/lib/v2/projection/v2-to-v1.js +138 -7
  423. package/dist/lib/v2/projection/v2-to-v1.js.map +1 -1
  424. package/dist/lib/v2/projection/v2-to-v1.mjs +135 -6
  425. package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
  426. package/dist/lib/v2/projection/write-side.d.mts +12 -13
  427. package/dist/lib/v2/projection/write-side.d.ts +12 -13
  428. package/dist/lib/v2/projection/write-side.d.ts.map +1 -1
  429. package/dist/lib/v2/projection/write-side.js +16 -12
  430. package/dist/lib/v2/projection/write-side.js.map +1 -1
  431. package/dist/lib/v2/projection/write-side.mjs +16 -12
  432. package/dist/lib/v2/projection/write-side.mjs.map +1 -1
  433. package/dist/lib/version.d.mts +3 -3
  434. package/dist/lib/version.d.ts +3 -3
  435. package/dist/lib/version.d.ts.map +1 -1
  436. package/dist/lib/version.js +3 -3
  437. package/dist/lib/version.js.map +1 -1
  438. package/dist/lib/version.mjs +3 -3
  439. package/dist/lib/version.mjs.map +1 -1
  440. package/docs/guides/BUILD-AN-AGENT.md +7 -2
  441. package/docs/guides/PREVIEW-ASSET-DURABILITY.md +6 -2
  442. package/docs/llms.txt +1 -0
  443. package/examples/README.md +1 -1
  444. package/examples/batch-preview-test.ts +3 -3
  445. package/examples/conversation-client.ts +2 -2
  446. package/examples/debug-preview-response.ts +1 -1
  447. package/examples/decisioning-platform-broadcast-tv.ts +10 -4
  448. package/examples/decisioning-platform-mock-seller.ts +16 -9
  449. package/examples/decisioning-platform-programmatic.ts +18 -7
  450. package/examples/error-compliant-server.ts +26 -16
  451. package/examples/generative-creative-demo.ts +7 -19
  452. package/examples/hello_creative_adapter_ad_server.ts +37 -16
  453. package/examples/hello_creative_adapter_template.ts +12 -10
  454. package/examples/hello_seller_adapter_guaranteed.ts +52 -23
  455. package/examples/hello_seller_adapter_multi_tenant.ts +6 -3
  456. package/examples/hello_seller_adapter_non_guaranteed.ts +54 -26
  457. package/examples/hello_seller_adapter_proposal_mode.ts +40 -14
  458. package/examples/hello_seller_adapter_social.ts +2 -7
  459. package/examples/inspect-card-formats.ts +1 -1
  460. package/examples/simple-getting-started.ts +1 -1
  461. package/examples/test-helpers-demo.ts +1 -1
  462. package/package.json +2 -2
  463. package/skills/build-decisioning-creative-template/SKILL.md +11 -11
  464. package/skills/build-decisioning-platform/advanced/REFERENCE.md +8 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/testing/scenarios/media-buy.ts"],"sourcesContent":["/**\n * Media Buy Testing Scenarios\n *\n * Tests sales agent media buy capabilities including:\n * - create_media_buy\n * - update_media_buy\n * - get_media_buy_delivery\n * - sync_creatives\n */\n\nimport type {\n AccountReference,\n SyncCreativesSuccess,\n ListCreativesResponse,\n SyncAudiencesSuccess,\n ListAccountsResponse,\n} from '../../types/tools.generated';\nimport type { Product, PricingOption, FormatReferenceStructuredObject as FormatID } from '../../types/core.generated';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport {\n getOrCreateClient,\n runStep,\n getOrDiscoverProfile,\n resolveBrand,\n resolveAccount,\n validateResponseSchema,\n} from '../client';\nimport { testDiscovery } from './discovery';\nimport { getAuthoritativeMediaBuyStatus } from '../../utils/media-buy-status';\n\n/**\n * Find a suitable product for testing based on options\n */\nexport function selectProduct(products: Product[], options: TestOptions): Product | null {\n // If channels specified, filter to matching products\n let candidates = products;\n\n if (options.channels?.length) {\n candidates = products.filter(p => p.channels?.some(ch => options.channels!.includes(ch)));\n }\n\n // If pricing models specified, filter further\n if (options.pricing_models?.length) {\n candidates = candidates.filter(p =>\n p.pricing_options?.some((po: PricingOption) => options.pricing_models!.includes(po.pricing_model))\n );\n }\n\n // Return first matching or first product\n return candidates[0] || products[0] || null;\n}\n\n/**\n * Select a pricing option from a product\n */\nexport function selectPricingOption(product: Product, preferredModels?: string[]): PricingOption | null {\n const options = product.pricing_options || [];\n\n if (preferredModels?.length) {\n const preferred = options.find((po: PricingOption) => preferredModels.includes(po.pricing_model));\n if (preferred) return preferred;\n }\n\n return options[0] || null;\n}\n\n/**\n * Build a create_media_buy request\n */\nexport function buildCreateMediaBuyRequest(\n product: Product,\n pricingOption: PricingOption,\n options: TestOptions,\n extras: {\n inline_creatives?: Record<string, unknown>[];\n creative_ids?: string[];\n accountRef?: AccountReference;\n } = {}\n): Record<string, unknown> {\n const minSpend = pricingOption.min_spend_per_package || 0;\n const budget = options.budget || Math.max(1000, minSpend);\n const now = new Date();\n const startTime = new Date(now.getTime() + 24 * 60 * 60 * 1000); // Tomorrow\n const endTime = new Date(startTime.getTime() + 7 * 24 * 60 * 60 * 1000); // 7 days later\n\n const isAuction =\n !('fixed_price' in pricingOption) &&\n (pricingOption.floor_price !== undefined || pricingOption.price_guidance !== undefined);\n\n const packageRequest: Record<string, unknown> = {\n product_id: product.product_id,\n budget,\n pricing_option_id: pricingOption.pricing_option_id,\n };\n\n // Add bid_price if auction-based\n if (isAuction && pricingOption.floor_price) {\n packageRequest.bid_price = pricingOption.floor_price * 1.5;\n }\n\n // Add inline creatives if provided\n if (extras.inline_creatives?.length) {\n packageRequest.creatives = extras.inline_creatives;\n }\n\n // Add creative references if provided\n if (extras.creative_ids?.length) {\n packageRequest.creative_ids = extras.creative_ids;\n }\n\n const hasAccountRef = Object.prototype.hasOwnProperty.call(extras, 'accountRef');\n const account = hasAccountRef ? extras.accountRef : resolveAccount(options);\n if (!account) {\n throw new Error(\n 'buildCreateMediaBuyRequest received accountRef: undefined. Resolve an account before building the request.'\n );\n }\n\n return {\n account,\n brand: resolveBrand(options),\n start_time: startTime.toISOString(),\n end_time: endTime.toISOString(),\n packages: [packageRequest],\n };\n}\n\nfunction getDefaultFormatId(): FormatID {\n return { agent_url: 'https://creative.adcontextprotocol.org', id: 'display_300x250' };\n}\n\nfunction formatIdToString(formatId: FormatID): string {\n return formatId.id;\n}\n\nfunction selectFormatId(product: Product, fallback: FormatID = getDefaultFormatId()): FormatID {\n if (!product?.format_ids?.length) {\n return fallback;\n }\n\n const format = product.format_ids[0] as unknown as string | FormatID | { format_id?: FormatID };\n if (typeof format === 'string') {\n return { ...fallback, id: format };\n }\n\n const nested = format as { format_id?: FormatID };\n if (nested.format_id) {\n return nested.format_id;\n }\n\n const direct = format as Partial<FormatID>;\n if (typeof direct.agent_url === 'string' && typeof direct.id === 'string') {\n return direct as FormatID;\n }\n\n return fallback;\n}\n\nfunction buildStaticInlineCreative(formatId: FormatID) {\n const ts = Date.now();\n return {\n creative_id: `test-inline-${ts}`,\n name: `Inline Test Creative ${ts}`,\n format_id: formatId,\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250?text=Inline+Creative',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n };\n}\n\nfunction extractCreativeManifest(data: any): any | undefined {\n return data?.creative_manifest || data?.creative_manifests?.[0];\n}\n\nfunction buildSyncCreativeFromManifest(manifest: any, fallbackFormatId: FormatID) {\n const creativeId = manifest?.creative_id || `test-creative-${Date.now()}`;\n return {\n creative_id: creativeId,\n name: manifest?.name || `Generated Creative ${creativeId}`,\n format_id: manifest?.format_id || fallbackFormatId,\n assets: manifest?.assets || buildStaticInlineCreative(fallbackFormatId).assets,\n };\n}\n\n/**\n * Test: Create Media Buy\n * Discovers products, then creates a test media buy\n */\nexport async function testCreateMediaBuy(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile; mediaBuyId?: string }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // First run discovery\n const { steps: discoverySteps, profile } = await testDiscovery(agentUrl, options);\n steps.push(...discoverySteps);\n\n if (!profile?.tools.includes('create_media_buy')) {\n steps.push({\n step: 'Create media buy',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support create_media_buy',\n });\n return { steps, profile };\n }\n\n const { accountRef, steps: accountSteps } = await resolveAccountForMediaBuy(\n options,\n profile.tools,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n async params => client.listAccounts(params as any) as Promise<TaskResult>,\n getMediaBuyAccountResolutionHints(profile)\n );\n steps.push(...accountSteps);\n\n if (!accountRef) {\n steps.push({\n step: 'Resolve account for media buy',\n task: 'list_accounts',\n passed: false,\n duration_ms: 0,\n error:\n 'No account available. Provide media_buy_account_id/account_id, use sandbox: true, or ensure list_accounts returns an account.',\n });\n return { steps, profile };\n }\n\n // Get products\n const { result: productsResult } = await runStep<TaskResult>(\n 'Fetch products for media buy',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: options.brief || 'Looking for display advertising products',\n brand: resolveBrand(options),\n account: accountRef,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n const productsData = productsResult?.data as Record<string, unknown> | undefined;\n const products = productsData?.products as Product[] | undefined;\n if (!productsResult?.success || !products?.length) {\n steps.push({\n step: 'Create media buy',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'No products available to create media buy',\n });\n return { steps, profile };\n }\n\n const product = selectProduct(products, options);\n if (!product) {\n steps.push({\n step: 'Create media buy',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'No suitable product found',\n });\n return { steps, profile };\n }\n const pricingOption = selectPricingOption(product, options.pricing_models);\n\n if (!pricingOption) {\n steps.push({\n step: 'Create media buy',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: `Product \"${product.name}\" has no pricing options`,\n });\n return { steps, profile };\n }\n\n const createRequest = buildCreateMediaBuyRequest(product, pricingOption, options, { accountRef });\n\n // Create the media buy\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Create media buy',\n 'create_media_buy',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n async () => client.createMediaBuy(createRequest as any) as Promise<TaskResult>\n );\n\n let mediaBuyId: string | undefined;\n\n if (createResult?.success && createResult?.data) {\n steps.push(validateResponseSchema('create_media_buy', createResult.data));\n const mediaBuy = createResult.data as unknown as Record<string, unknown>;\n const nested = mediaBuy.media_buy as Record<string, unknown> | undefined;\n mediaBuyId = (mediaBuy.media_buy_id || nested?.media_buy_id) as string | undefined;\n const status = extractStatus(mediaBuy);\n const packages = (mediaBuy.packages || nested?.packages) as unknown[] | undefined;\n createStep.details = `Created media buy: ${mediaBuyId}, status: ${status}`;\n createStep.created_id = mediaBuyId;\n const confirmedAt = (mediaBuy.confirmed_at ?? nested?.confirmed_at) as string | undefined;\n const revision = (mediaBuy.revision ?? nested?.revision) as number | undefined;\n const validActions = (mediaBuy.valid_actions ?? nested?.valid_actions) as string[] | undefined;\n createStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuyId,\n status,\n confirmed_at: confirmedAt,\n revision,\n valid_actions: validActions,\n packages_count: packages?.length,\n pricing_model: pricingOption.pricing_model,\n product_name: product.name,\n },\n null,\n 2\n );\n createStep.observation_data = { confirmed_at: confirmedAt, revision };\n } else if (createResult && !createResult.success) {\n createStep.passed = false;\n createStep.error = createResult.error || 'create_media_buy returned unsuccessful result';\n }\n steps.push(createStep);\n\n return { steps, profile, mediaBuyId };\n}\n\n/**\n * Test: Full Sales Flow\n * Complete lifecycle: discovery -> create -> update -> delivery\n */\nexport async function testFullSalesFlow(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Run create media buy flow first\n const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId) {\n return { steps, profile };\n }\n\n // Test update_media_buy if available\n if (profile?.tools.includes('update_media_buy')) {\n const { result: updateResult, step: updateStep } = await runStep<TaskResult>(\n 'Update media buy (increase budget)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n packages: [\n {\n package_id: 'pkg-0',\n budget: (options.budget || 1000) * 1.5,\n },\n ],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (updateResult?.success && updateResult?.data) {\n const data = updateResult.data as unknown as Record<string, unknown>;\n const nested = data.media_buy as Record<string, unknown> | undefined;\n const status = extractStatus(data);\n updateStep.details = `Updated media buy, status: ${status}`;\n updateStep.response_preview = JSON.stringify(\n {\n media_buy_id: (data.media_buy_id || nested?.media_buy_id) as string | undefined,\n status,\n },\n null,\n 2\n );\n } else if (updateResult && !updateResult.success) {\n updateStep.passed = false;\n updateStep.error = updateResult.error || 'update_media_buy returned unsuccessful result';\n }\n steps.push(updateStep);\n }\n\n if (profile?.tools.includes('get_media_buys')) {\n const { result: snapshotResult, step: snapshotStep } = await runStep<TaskResult>(\n 'Get media buy status with delivery snapshots',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n media_buy_ids: [mediaBuyId],\n include_snapshot: true,\n }) as Promise<TaskResult>\n );\n\n if (snapshotResult?.success && snapshotResult?.data) {\n steps.push(validateResponseSchema('get_media_buys', snapshotResult.data));\n const mediaBuys = snapshotResult.data.media_buys || [];\n const mediaBuy = mediaBuys.find((item: any) => item.media_buy_id === mediaBuyId) || mediaBuys[0];\n const packages = mediaBuy?.packages || [];\n const invalidPackages = packages.filter((pkg: any) => {\n if (pkg.snapshot) {\n return !pkg.snapshot.as_of || pkg.snapshot.staleness_seconds === undefined;\n }\n return !pkg.snapshot_unavailable_reason;\n });\n\n if (!mediaBuy) {\n snapshotStep.passed = false;\n snapshotStep.error = 'get_media_buys did not return the created media buy';\n } else if (invalidPackages.length > 0) {\n snapshotStep.passed = false;\n snapshotStep.error =\n 'include_snapshot=true must return either snapshot data or snapshot_unavailable_reason for each package';\n } else {\n snapshotStep.details = `Retrieved ${packages.length} package snapshot(s)`;\n snapshotStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuy.media_buy_id,\n package_count: packages.length,\n snapshots_returned: packages.filter((pkg: any) => !!pkg.snapshot).length,\n snapshot_unavailable: packages\n .filter((pkg: any) => !!pkg.snapshot_unavailable_reason)\n .map((pkg: any) => ({ package_id: pkg.package_id, reason: pkg.snapshot_unavailable_reason })),\n },\n null,\n 2\n );\n // Provide observation data so collectObservations can check valid_actions/sandbox\n // even when media_buy_lifecycle doesn't run (e.g., agent lacks update_media_buy).\n const status = extractStatus(mediaBuy);\n snapshotStep.observation_data = {\n valid_actions: mediaBuy.valid_actions,\n sandbox: mediaBuy.sandbox,\n status,\n has_creative_deadline: packages.some((p: any) => p.creative_deadline) || !!mediaBuy.creative_deadline,\n };\n }\n } else if (snapshotResult && !snapshotResult.success) {\n snapshotStep.passed = false;\n snapshotStep.error = snapshotResult.error || 'get_media_buys returned unsuccessful result';\n }\n steps.push(snapshotStep);\n }\n\n // Test get_media_buy_delivery if available\n if (profile?.tools.includes('get_media_buy_delivery')) {\n const { result: deliveryResult, step: deliveryStep } = await runStep<TaskResult>(\n 'Get delivery metrics',\n 'get_media_buy_delivery',\n async () =>\n client.getMediaBuyDelivery({\n media_buy_ids: [mediaBuyId],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (deliveryResult?.success && deliveryResult?.data) {\n const delivery = deliveryResult.data as unknown as Record<string, unknown>;\n const deliveries = delivery.deliveries as unknown[] | undefined;\n const mediaBuys = delivery.media_buys as unknown[] | undefined;\n deliveryStep.details = `Retrieved delivery metrics`;\n deliveryStep.response_preview = JSON.stringify(\n {\n has_deliveries: !!(deliveries?.length || mediaBuys?.length),\n },\n null,\n 2\n );\n } else if (deliveryResult && !deliveryResult.success) {\n deliveryStep.passed = false;\n deliveryStep.error = deliveryResult.error || 'get_media_buy_delivery returned unsuccessful result';\n }\n steps.push(deliveryStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Reporting Flow\n * Validates reporting capabilities:\n * - Agent has get_media_buy_delivery tool\n * - Products declare reporting_capabilities (frequencies, webhook support)\n * - get_media_buy_delivery returns valid structure or reporting_delayed with expected_availability\n * - Currency field is present in delivery data\n *\n * The protocol favors async webhook-based report delivery over buyer polling.\n * This scenario checks that the agent advertises webhook support and properly\n * handles the reporting_delayed status for data not yet available.\n */\nexport async function testReportingFlow(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profile.tools.includes('get_media_buy_delivery')) {\n steps.push({\n step: 'Check get_media_buy_delivery tool',\n task: 'get_media_buy_delivery',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support get_media_buy_delivery',\n });\n return { steps, profile };\n }\n\n // Check supported_protocols includes 'reporting'\n const hasReporting = profile.supported_protocols?.includes('reporting') ?? false;\n steps.push({\n step: 'Check reporting protocol declaration',\n passed: true,\n duration_ms: 0,\n details: hasReporting\n ? 'Agent declares reporting in supported_protocols'\n : 'Agent does not declare reporting in supported_protocols (tool is present but protocol not declared)',\n warnings: hasReporting\n ? undefined\n : ['Agent has get_media_buy_delivery but does not declare reporting in supported_protocols'],\n });\n\n // Discover products to check reporting_capabilities\n const { result: productsResult, step: productsStep } = await runStep<TaskResult>(\n 'Check product reporting capabilities',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: options.brief || 'Looking for advertising products with reporting',\n brand: resolveBrand(options),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n const productsData = productsResult?.data as Record<string, unknown> | undefined;\n const products = (productsData?.products ?? []) as Array<Record<string, unknown>>;\n\n // Evaluate reporting_capabilities on discovered products\n const withReporting = products.filter(p => p.reporting_capabilities);\n const withWebhooks = withReporting.filter(p => {\n const rc = p.reporting_capabilities as Record<string, unknown> | undefined;\n return rc?.supports_webhooks === true;\n });\n\n if (products.length > 0) {\n const webhookWarnings: string[] = [];\n if (withReporting.length === 0) {\n webhookWarnings.push(\n 'No products declare reporting_capabilities — buyers cannot discover reporting frequency or webhook support'\n );\n } else if (withWebhooks.length === 0) {\n webhookWarnings.push(\n 'No products declare supports_webhooks: true — buyers must poll get_media_buy_delivery instead of receiving async reports'\n );\n }\n\n // Check for available_reporting_frequencies\n const withFrequencies = withReporting.filter(p => {\n const rc = p.reporting_capabilities as Record<string, unknown> | undefined;\n const freqs = rc?.available_reporting_frequencies as unknown[] | undefined;\n return freqs && freqs.length > 0;\n });\n\n productsStep.details = [\n `${products.length} product(s) discovered`,\n `${withReporting.length} with reporting_capabilities`,\n `${withWebhooks.length} with webhook support`,\n `${withFrequencies.length} with reporting frequencies`,\n ].join(', ');\n productsStep.response_preview = JSON.stringify(\n {\n product_count: products.length,\n with_reporting_capabilities: withReporting.length,\n with_webhook_support: withWebhooks.length,\n with_frequencies: withFrequencies.length,\n sample_capabilities: withReporting.slice(0, 2).map(p => ({\n product_id: p.product_id,\n reporting_capabilities: p.reporting_capabilities,\n })),\n },\n null,\n 2\n );\n productsStep.warnings = webhookWarnings.length > 0 ? webhookWarnings : undefined;\n }\n steps.push(productsStep);\n\n // Create a media buy to report on\n const { steps: createSteps, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId) {\n steps.push({\n step: 'Find media buy for delivery report',\n passed: false,\n duration_ms: 0,\n error: 'No media_buy_id — cannot test delivery reporting',\n });\n return { steps, profile };\n }\n\n // Call get_media_buy_delivery\n const { result: deliveryResult, step: deliveryStep } = await runStep<TaskResult>(\n 'Get delivery metrics',\n 'get_media_buy_delivery',\n async () =>\n client.getMediaBuyDelivery({\n media_buy_ids: [mediaBuyId],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (deliveryResult?.success && deliveryResult?.data) {\n const delivery = deliveryResult.data as unknown as Record<string, unknown>;\n const deliveries = delivery.deliveries as unknown[] | undefined;\n const mediaBuys = delivery.media_buys as unknown[] | undefined;\n const mediaBuyDeliveries = delivery.media_buy_deliveries as Record<string, unknown>[] | undefined;\n\n const allEntries = (mediaBuyDeliveries ?? mediaBuys ?? deliveries ?? []) as Record<string, unknown>[];\n const hasData = allEntries.length > 0;\n\n // Split entries: some may be delayed while others have actual data\n const delayedEntries = allEntries.filter(e => e.status === 'reporting_delayed');\n const readyEntries = allEntries.filter(e => e.status !== 'reporting_delayed');\n\n // Check for currency on entry objects (not via string search)\n const hasCurrency = readyEntries.some(\n e => 'currency' in e || (e.totals as Record<string, unknown> | undefined)?.currency !== undefined\n );\n\n // Extract metrics info for diagnostics\n const firstReady = readyEntries[0];\n const totals = (firstReady?.totals ?? undefined) as Record<string, unknown> | undefined;\n const summary = delivery.summary as Record<string, unknown> | undefined;\n const impressions = (totals?.impressions ?? delivery.impressions ?? summary?.impressions) as number | undefined;\n const clicks = (totals?.clicks ?? delivery.clicks ?? summary?.clicks) as number | undefined;\n\n const details: string[] = [];\n const warnings: string[] = [];\n\n // Validate delayed entries\n if (delayedEntries.length > 0) {\n const withAvailability = delayedEntries.filter(e => e.expected_availability);\n details.push(`${delayedEntries.length} media buy(s) reporting_delayed`);\n if (withAvailability.length < delayedEntries.length) {\n warnings.push(\n 'reporting_delayed entries should include expected_availability so buyers know when to expect data'\n );\n }\n }\n\n // Validate ready entries\n if (readyEntries.length > 0) {\n details.push(`${readyEntries.length} media buy(s) with delivery data`);\n if (!hasCurrency) {\n warnings.push('No currency field found in delivery entries');\n }\n }\n\n if (!hasData) {\n deliveryStep.passed = false;\n deliveryStep.error = 'Expected delivery data or reporting_delayed status in response but found neither';\n } else {\n deliveryStep.details = details.join(', ');\n }\n\n if (warnings.length > 0) {\n deliveryStep.warnings = [...(deliveryStep.warnings || []), ...warnings];\n }\n\n const KNOWN_DELIVERY_KEYS = [\n 'media_buy_deliveries',\n 'media_buys',\n 'deliveries',\n 'currency',\n 'summary',\n 'reporting_period',\n 'notification_type',\n 'partial_data',\n ];\n deliveryStep.response_preview = JSON.stringify(\n {\n has_data: hasData,\n delayed_count: delayedEntries.length,\n ready_count: readyEntries.length,\n has_currency: hasCurrency,\n impressions,\n clicks,\n known_keys: Object.keys(delivery).filter(k => KNOWN_DELIVERY_KEYS.includes(k)),\n },\n null,\n 2\n );\n } else if (deliveryResult && !deliveryResult.success) {\n deliveryStep.passed = false;\n deliveryStep.error = deliveryResult.error || 'get_media_buy_delivery returned unsuccessful result';\n } else if (!deliveryResult) {\n deliveryStep.passed = false;\n deliveryStep.error = 'get_media_buy_delivery returned no result';\n }\n steps.push(deliveryStep);\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Sync Flow\n * Tests sync_creatives separately from create_media_buy\n */\nexport async function testCreativeSync(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profile.tools.includes('sync_creatives')) {\n steps.push({\n step: 'Sync creatives',\n task: 'sync_creatives',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support sync_creatives',\n });\n return { steps, profile };\n }\n\n const { accountRef, steps: accountSteps } = await resolveAccountForMediaBuy(\n options,\n profile.tools,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n async params => client.listAccounts(params as any) as Promise<TaskResult>,\n getMediaBuyAccountResolutionHints(profile)\n );\n steps.push(...accountSteps);\n\n if (!accountRef) {\n steps.push({\n step: 'Resolve account for creative sync',\n task: 'list_accounts',\n passed: false,\n duration_ms: 0,\n error:\n 'No account available. Provide media_buy_account_id/account_id, use sandbox: true, or ensure list_accounts returns an account.',\n });\n return { steps, profile };\n }\n\n // Get format info first\n let formatId: Record<string, unknown> = {\n agent_url: 'https://creative.adcontextprotocol.org',\n id: 'display_300x250',\n };\n if (profile.tools.includes('list_creative_formats')) {\n const { result: formatsResult } = await runStep<TaskResult>(\n 'Get formats for creative',\n 'list_creative_formats',\n async () => client.listCreativeFormats({}) as Promise<TaskResult>\n );\n\n if (formatsResult?.success && formatsResult?.data) {\n const data = formatsResult.data as unknown as Record<string, unknown>;\n const formatIds = data.format_ids as unknown[] | undefined;\n const formats = data.formats as Record<string, unknown>[] | undefined;\n const firstFormat = formatIds?.[0] || formats?.[0];\n if (firstFormat) {\n if (typeof firstFormat === 'string') {\n formatId = { id: firstFormat };\n } else {\n const formatObj = firstFormat as Record<string, unknown>;\n formatId = (formatObj.format_id as Record<string, unknown>) || formatObj;\n }\n }\n }\n }\n\n // Test sync_creatives with a simple creative\n // Assets must be an object keyed by asset_role, not an array\n const testCreative = {\n creative_id: `test-creative-${Date.now()}`,\n name: 'E2E Test Creative',\n format_id: formatId,\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n };\n\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n 'Sync creative to library',\n 'sync_creatives',\n async () =>\n client.syncCreatives({\n account: accountRef,\n creatives: [testCreative],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (syncResult?.success && syncResult?.data) {\n const data = syncResult.data as unknown as SyncCreativesSuccess;\n const creatives = data.creatives || [];\n const actions = creatives.map(c => c.action);\n syncStep.details = `Synced ${creatives.length} creative(s), actions: ${actions.join(', ')}`;\n syncStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n actions: actions,\n creative_ids: creatives.map(c => c.creative_id),\n },\n null,\n 2\n );\n } else if (syncResult && !syncResult.success) {\n syncStep.passed = false;\n syncStep.error = syncResult.error || 'sync_creatives returned unsuccessful result';\n }\n steps.push(syncStep);\n\n // Test list_creatives if available\n if (profile.tools.includes('list_creatives')) {\n const { result: listResult, step: listStep } = await runStep<TaskResult>(\n 'List creatives in library',\n 'list_creatives',\n async () => client.listCreatives({}) as Promise<TaskResult>\n );\n\n if (listResult?.success && listResult?.data) {\n const data = listResult.data as unknown as ListCreativesResponse;\n const creatives = data.creatives || [];\n const querySummary = data.query_summary;\n const totalMatching = querySummary?.total_matching;\n const returned = querySummary?.returned ?? creatives.length;\n\n // Check for pagination bug: total_matching > 0 but returned = 0\n if (totalMatching !== undefined && totalMatching > 0 && returned === 0) {\n listStep.passed = false;\n listStep.error = `Pagination bug: query_summary shows ${totalMatching} total_matching but returned ${returned} creatives`;\n listStep.response_preview = JSON.stringify(\n {\n total_matching: totalMatching,\n returned,\n creatives_count: creatives.length,\n pagination: data.pagination,\n },\n null,\n 2\n );\n } else {\n listStep.details = `Found ${creatives.length} creative(s) in library`;\n listStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n total_matching: totalMatching,\n statuses: Array.from(new Set(creatives.map(c => c.status))),\n },\n null,\n 2\n );\n }\n } else if (listResult && !listResult.success) {\n listStep.passed = false;\n listStep.error = listResult.error || 'list_creatives returned unsuccessful result';\n }\n steps.push(listStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Inline Flow\n * Tests providing creatives inline in create_media_buy\n */\nexport async function testCreativeInline(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discovery first\n const { steps: discoverySteps, profile } = await testDiscovery(agentUrl, options);\n steps.push(...discoverySteps);\n\n if (!profile?.tools.includes('create_media_buy')) {\n steps.push({\n step: 'Create media buy with inline creatives',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support create_media_buy',\n });\n return { steps, profile };\n }\n\n // Check if agent declares inline creative support via capabilities\n if (profile.tools.includes('get_adcp_capabilities')) {\n try {\n const capResult = (await client.getAdcpCapabilities({})) as TaskResult | undefined;\n const capData = capResult?.data as Record<string, any> | undefined;\n if (capData?.media_buy?.features?.inline_creative_management === false) {\n steps.push({\n step: 'Create media buy with inline creative',\n task: 'create_media_buy',\n passed: true,\n duration_ms: 0,\n details: 'Skipped: agent declares inline_creative_management: false',\n });\n return { steps, profile };\n }\n } catch {\n // If capabilities check fails, proceed with the test\n }\n }\n\n // Get products\n const { result: productsResult } = await runStep<TaskResult>(\n 'Fetch products for inline creative test',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: options.brief || 'Looking for display advertising products',\n brand: resolveBrand(options),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n const inlineProductsData = productsResult?.data as Record<string, unknown> | undefined;\n const products = inlineProductsData?.products as Product[] | undefined;\n if (!productsResult?.success || !products?.length) {\n steps.push({\n step: 'Create media buy with inline creatives',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'No products available to test inline creatives',\n });\n return { steps, profile };\n }\n\n const product = selectProduct(products, options);\n if (!product) {\n steps.push({\n step: 'Create media buy with inline creatives',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'No suitable product found',\n });\n return { steps, profile };\n }\n const pricingOption = selectPricingOption(product, options.pricing_models);\n\n if (!pricingOption) {\n steps.push({\n step: 'Create media buy with inline creatives',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: `Product \"${product.name}\" has no pricing options`,\n });\n return { steps, profile };\n }\n\n const formatId = selectFormatId(product);\n let inlineCreative = buildStaticInlineCreative(formatId);\n\n if (profile.tools.includes('build_creative')) {\n const { result: buildResult, step: buildStep } = await runStep<TaskResult>(\n `Build creative for inline flow (${formatIdToString(formatId)})`,\n 'build_creative',\n async () =>\n client.executeTask('build_creative', {\n target_format_id: formatId,\n brand: resolveBrand(options),\n message: `Create an ad creative for the ${formatIdToString(formatId)} format that can be attached to a media buy`,\n quality: 'draft',\n }) as Promise<TaskResult>\n );\n\n if (buildResult?.success && buildResult?.data) {\n const manifest = extractCreativeManifest(buildResult.data);\n if (manifest?.assets) {\n inlineCreative = buildSyncCreativeFromManifest(manifest, formatId);\n buildStep.details = `Built creative manifest for ${inlineCreative.format_id}`;\n buildStep.response_preview = JSON.stringify(\n {\n format_id: inlineCreative.format_id,\n asset_keys: Object.keys(inlineCreative.assets || {}),\n },\n null,\n 2\n );\n } else {\n buildStep.passed = false;\n buildStep.error = 'build_creative succeeded but returned no creative_manifest';\n }\n } else if (buildResult && !buildResult.success) {\n buildStep.passed = false;\n buildStep.error = buildResult.error || 'build_creative failed';\n }\n steps.push(buildStep);\n }\n\n const createRequest = buildCreateMediaBuyRequest(product, pricingOption, options, {\n inline_creatives: [inlineCreative],\n });\n\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Create media buy with inline creative',\n 'create_media_buy',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n async () => client.createMediaBuy(createRequest as any) as Promise<TaskResult>\n );\n\n if (createResult?.success && createResult?.data) {\n steps.push(validateResponseSchema('create_media_buy', createResult.data));\n const mediaBuy = createResult.data as unknown as Record<string, unknown>;\n const nested = mediaBuy.media_buy as Record<string, unknown> | undefined;\n const mediaBuyId = (mediaBuy.media_buy_id || nested?.media_buy_id) as string | undefined;\n const status = extractStatus(mediaBuy);\n const packages = (mediaBuy.packages || nested?.packages) as Record<string, unknown>[] | undefined;\n const hasCreatives = packages?.some(p => {\n const creatives = p.creatives as unknown[] | undefined;\n const creativeIds = p.creative_ids as unknown[] | undefined;\n return creatives?.length || creativeIds?.length;\n });\n\n createStep.details = `Created media buy with inline creative: ${mediaBuyId}`;\n createStep.created_id = mediaBuyId;\n createStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuyId,\n status,\n has_creatives: hasCreatives,\n packages_count: packages?.length,\n },\n null,\n 2\n );\n } else if (createResult && !createResult.success) {\n createStep.passed = false;\n createStep.error = createResult.error || 'create_media_buy with inline creatives failed';\n }\n steps.push(createStep);\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Reference Flow\n * Builds a creative manifest, syncs it into the seller's library, then references it in create_media_buy.\n */\nexport async function testCreativeReference(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { steps: discoverySteps, profile } = await testDiscovery(agentUrl, options);\n steps.push(...discoverySteps);\n\n if (!profile?.tools.includes('build_creative') || !profile.tools.includes('sync_creatives')) {\n steps.push({\n step: 'Build and reference creative',\n task: 'build_creative',\n passed: false,\n duration_ms: 0,\n error: 'Agent must support both build_creative and sync_creatives',\n });\n return { steps, profile };\n }\n\n const { result: productsResult } = await runStep<TaskResult>(\n 'Fetch products for creative reference test',\n 'get_products',\n async () =>\n client.executeTask('get_products', {\n buying_mode: 'brief',\n brief: options.brief || 'Looking for products that support generated creative attachments',\n brand: resolveBrand(options),\n }) as Promise<TaskResult>\n );\n\n const products = productsResult?.data?.products as any[] | undefined;\n if (!productsResult?.success || !products?.length) {\n steps.push({\n step: 'Build and reference creative',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'No products available to test creative references',\n });\n return { steps, profile };\n }\n\n const product = selectProduct(products, options);\n if (!product) {\n steps.push({\n step: 'Build and reference creative',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'No suitable product found for creative reference test',\n });\n return { steps, profile };\n }\n\n const pricingOption = selectPricingOption(product, options.pricing_models);\n const formatId = selectFormatId(product);\n\n if (!pricingOption) {\n steps.push({\n step: 'Build and reference creative',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: `Product \"${product.name}\" has no pricing options`,\n });\n return { steps, profile };\n }\n\n const { result: buildResult, step: buildStep } = await runStep<TaskResult>(\n `Build creative for reference flow (${formatIdToString(formatId)})`,\n 'build_creative',\n async () =>\n client.executeTask('build_creative', {\n target_format_id: formatId,\n brand: resolveBrand(options),\n message: `Create a reusable ad creative for the ${formatIdToString(formatId)} format`,\n quality: 'draft',\n }) as Promise<TaskResult>\n );\n\n if (!buildResult?.success || !buildResult?.data) {\n buildStep.passed = false;\n buildStep.error = buildResult?.error || 'build_creative failed';\n steps.push(buildStep);\n return { steps, profile };\n }\n\n const manifest = extractCreativeManifest(buildResult.data);\n if (!manifest?.assets) {\n buildStep.passed = false;\n buildStep.error = 'build_creative returned no creative_manifest';\n steps.push(buildStep);\n return { steps, profile };\n }\n\n const syncedCreative = buildSyncCreativeFromManifest(manifest, formatId);\n buildStep.details = `Built creative manifest for ${syncedCreative.format_id}`;\n buildStep.response_preview = JSON.stringify(\n {\n creative_id: syncedCreative.creative_id,\n format_id: syncedCreative.format_id,\n asset_keys: Object.keys(syncedCreative.assets || {}),\n },\n null,\n 2\n );\n steps.push(buildStep);\n\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n 'Sync generated creative to library',\n 'sync_creatives',\n async () =>\n client.executeTask('sync_creatives', {\n creatives: [syncedCreative],\n }) as Promise<TaskResult>\n );\n\n if (!syncResult?.success || !syncResult?.data) {\n syncStep.passed = false;\n syncStep.error = syncResult?.error || 'sync_creatives failed';\n steps.push(syncStep);\n return { steps, profile };\n }\n\n syncStep.details = `Synced creative ${syncedCreative.creative_id} to seller library`;\n syncStep.created_id = syncedCreative.creative_id;\n syncStep.response_preview = JSON.stringify(\n {\n creative_id: syncedCreative.creative_id,\n synced_count: (syncResult.data.creatives || []).length,\n },\n null,\n 2\n );\n steps.push(syncStep);\n\n const createRequest = buildCreateMediaBuyRequest(product, pricingOption, options, {\n creative_ids: [syncedCreative.creative_id],\n });\n\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Create media buy with referenced creative',\n 'create_media_buy',\n async () => client.executeTask('create_media_buy', createRequest) as Promise<TaskResult>\n );\n\n if (createResult?.success && createResult?.data) {\n steps.push(validateResponseSchema('create_media_buy', createResult.data));\n const mediaBuy = createResult.data;\n const mediaBuyId = mediaBuy.media_buy_id || mediaBuy.media_buy?.media_buy_id;\n const packages = mediaBuy.packages || mediaBuy.media_buy?.packages;\n const referenced = packages?.some((pkg: any) => pkg.creative_ids?.includes(syncedCreative.creative_id));\n createStep.details = `Created media buy with referenced creative ${syncedCreative.creative_id}`;\n createStep.created_id = mediaBuyId;\n createStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuyId,\n creative_id: syncedCreative.creative_id,\n referenced,\n },\n null,\n 2\n );\n } else if (createResult && !createResult.success) {\n createStep.passed = false;\n createStep.error = createResult.error || 'create_media_buy with creative_ids failed';\n }\n steps.push(createStep);\n\n return { steps, profile };\n}\n\n// SHA-256 lookalike placeholder for test email/phone hashes (not a real hash)\nconst TEST_HASHED_EMAIL = 'a' + '0'.repeat(63);\nconst TEST_HASHED_PHONE = 'b' + '0'.repeat(63);\n\ninterface MediaBuyAccountResolutionHints {\n requireOperatorAuth?: boolean;\n}\n\n/**\n * Resolve which account reference to use for media-buy and creative-library\n * test calls.\n *\n * Priority: media_buy_account_id > account_id > explicit-account discovery >\n * implicit/sandbox natural key. When account capabilities are unavailable,\n * list_accounts support is treated as an explicit-account hint for backwards\n * compatibility with older agents.\n *\n * Extracted for testability — the listAccounts callback abstracts the client call.\n */\nexport async function resolveAccountForMediaBuy(\n options: TestOptions,\n tools: string[],\n listAccounts: (params: Record<string, unknown>) => Promise<TaskResult>,\n hints: MediaBuyAccountResolutionHints = {}\n): Promise<{ accountRef: AccountReference | undefined; steps: TestStepResult[] }> {\n const steps: TestStepResult[] = [];\n\n const explicitAccountId = options.media_buy_account_id ?? options.account_id;\n if (explicitAccountId) {\n return { accountRef: { account_id: explicitAccountId }, steps };\n }\n\n const hasListAccounts = tools.includes('list_accounts');\n const shouldDiscoverExplicitAccount = hasListAccounts && hints.requireOperatorAuth !== false;\n\n if (options.sandbox && shouldDiscoverExplicitAccount) {\n const { result: sandboxResult, step: sandboxStep } = await runStep<TaskResult>(\n 'Discover sandbox accounts for media buy',\n 'list_accounts',\n async () => listAccounts({ sandbox: true, status: 'active' })\n );\n\n const sandboxData = sandboxResult?.success\n ? (sandboxResult.data as unknown as ListAccountsResponse | undefined)\n : undefined;\n const selection = selectMediaBuyAccount(sandboxData?.accounts ?? [], options);\n if (selection.accountRef) {\n sandboxStep.details = selection.details;\n steps.push(sandboxStep);\n return { accountRef: selection.accountRef, steps };\n }\n\n sandboxStep.details = sandboxResult?.success\n ? selection.details\n : 'list_accounts failed; falling back to natural key';\n if (hints.requireOperatorAuth === true || selection.ambiguous) {\n sandboxStep.passed = false;\n } else {\n sandboxStep.passed = true;\n sandboxStep.error = undefined;\n }\n steps.push(sandboxStep);\n if (hints.requireOperatorAuth === true || selection.ambiguous) {\n return { accountRef: undefined, steps };\n }\n\n const brand = resolveBrand(options);\n return { accountRef: { brand, operator: brand.domain, sandbox: true }, steps };\n }\n\n if (options.sandbox) {\n const brand = resolveBrand(options);\n return { accountRef: { brand, operator: brand.domain, sandbox: true }, steps };\n }\n\n if (shouldDiscoverExplicitAccount) {\n const { result: accountsResult, step: accountsStep } = await runStep<TaskResult>(\n 'Discover accounts for media buy',\n 'list_accounts',\n async () => listAccounts({ status: 'active' })\n );\n\n if (accountsResult?.success && accountsResult?.data) {\n const accountsData = accountsResult.data as unknown as ListAccountsResponse;\n const selection = selectMediaBuyAccount(accountsData.accounts ?? [], options);\n if (selection.accountRef) {\n accountsStep.details = selection.details;\n steps.push(accountsStep);\n return { accountRef: selection.accountRef, steps };\n }\n accountsStep.details = selection.details;\n } else {\n accountsStep.details = 'list_accounts call failed';\n }\n steps.push(accountsStep);\n return { accountRef: undefined, steps };\n }\n\n return { accountRef: resolveAccount(options), steps };\n}\n\nfunction getMediaBuyAccountResolutionHints(profile: AgentProfile): MediaBuyAccountResolutionHints {\n const capabilities = profile.raw_capabilities;\n if (!isRecord(capabilities) || !isRecord(capabilities.account)) {\n return {};\n }\n\n const requireOperatorAuth = capabilities.account.require_operator_auth;\n return typeof requireOperatorAuth === 'boolean' ? { requireOperatorAuth } : {};\n}\n\nfunction selectMediaBuyAccount(\n accounts: ListAccountsResponse['accounts'],\n options: TestOptions\n): { accountRef?: AccountReference; details: string; ambiguous?: boolean } {\n const candidates = accounts.filter(\n account =>\n typeof account.account_id === 'string' &&\n account.account_id.length > 0 &&\n (account.status === undefined || account.status === 'active')\n );\n if (candidates.length === 0) {\n return { details: 'list_accounts returned no active accounts with account_id' };\n }\n\n const brand = resolveBrand(options);\n const brandMatches = candidates.filter(account => accountMatchesBrand(account, brand));\n const selectable = brandMatches.length > 0 ? brandMatches : candidates;\n\n if (selectable.length === 1) {\n const accountId = selectable[0]!.account_id as string;\n const matchSource = brandMatches.length === 1 ? 'brand-matched ' : '';\n return {\n accountRef: { account_id: accountId },\n details: `Using ${matchSource}account: ${accountId}`,\n };\n }\n\n const accountIds = selectable.map(account => account.account_id).join(', ');\n return {\n details: `list_accounts returned multiple matching accounts (${accountIds}); provide media_buy_account_id/account_id to disambiguate`,\n ambiguous: true,\n };\n}\n\nfunction accountMatchesBrand(\n account: ListAccountsResponse['accounts'][number],\n brand: ReturnType<typeof resolveBrand>\n) {\n const accountBrand = account.brand;\n if (!isRecord(accountBrand) || accountBrand.domain !== brand.domain) {\n return false;\n }\n\n if (brand.brand_id && accountBrand.brand_id !== brand.brand_id) {\n return false;\n }\n\n return typeof account.operator !== 'string' || account.operator === brand.domain;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Resolve which account reference to use for audience sync.\n *\n * Priority: audience_account_id > account_id > sandbox discovery > sandbox natural key > list_accounts discovery.\n *\n * Extracted for testability — the listAccounts callback abstracts the client call.\n */\nexport async function resolveAccountForAudiences(\n options: TestOptions,\n tools: string[],\n listAccounts: (params: Record<string, unknown>) => Promise<TaskResult>\n): Promise<{ accountRef: AccountReference | undefined; steps: TestStepResult[] }> {\n const steps: TestStepResult[] = [];\n\n const explicitAccountId = options.audience_account_id ?? options.account_id;\n if (explicitAccountId) {\n return { accountRef: { account_id: explicitAccountId }, steps };\n }\n\n if (options.sandbox && tools.includes('list_accounts')) {\n // Sandbox with list_accounts: try explicit sandbox path first (discover pre-existing test accounts)\n const { result: sandboxResult, step: sandboxStep } = await runStep<TaskResult>(\n 'Discover sandbox accounts',\n 'list_accounts',\n async () => listAccounts({ sandbox: true })\n );\n\n const sandboxData = sandboxResult?.success\n ? (sandboxResult.data as unknown as ListAccountsResponse | undefined)\n : undefined;\n const sandboxAccounts = sandboxData?.accounts ?? [];\n if (sandboxAccounts[0]?.account_id) {\n sandboxStep.details = `Using sandbox account: ${sandboxAccounts[0].account_id}`;\n steps.push(sandboxStep);\n return { accountRef: { account_id: sandboxAccounts[0].account_id }, steps };\n }\n\n // Fall back to natural key — mark step as informational, not a failure\n const brand = resolveBrand(options);\n if (!sandboxResult?.success) {\n sandboxStep.details = 'list_accounts failed; falling back to natural key';\n } else {\n sandboxStep.details = 'No explicit sandbox accounts found; falling back to natural key';\n }\n sandboxStep.passed = true;\n sandboxStep.error = undefined;\n steps.push(sandboxStep);\n return { accountRef: { brand, operator: brand.domain, sandbox: true }, steps };\n }\n\n if (options.sandbox) {\n // Sandbox without list_accounts: implicit account model, use natural key\n const brand = resolveBrand(options);\n return { accountRef: { brand, operator: brand.domain, sandbox: true }, steps };\n }\n\n if (tools.includes('list_accounts')) {\n const { result: accountsResult, step: accountsStep } = await runStep<TaskResult>(\n 'Discover accounts for audience sync',\n 'list_accounts',\n async () => listAccounts({})\n );\n\n if (accountsResult?.success && accountsResult?.data) {\n const accountsData = accountsResult.data as unknown as ListAccountsResponse;\n const accounts = accountsData.accounts ?? [];\n if (accounts[0]?.account_id) {\n accountsStep.details = `Using account: ${accounts[0].account_id}`;\n steps.push(accountsStep);\n return { accountRef: { account_id: accounts[0].account_id }, steps };\n }\n accountsStep.details = 'list_accounts returned no accounts';\n } else {\n accountsStep.details = 'list_accounts call failed';\n }\n steps.push(accountsStep);\n }\n\n return { accountRef: undefined, steps };\n}\n\n/**\n * Test: Audience Sync\n * Tests sync_audiences: discovery -> create audience -> delete audience\n */\nexport async function testSyncAudiences(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n if (!profile.tools.includes('sync_audiences')) {\n steps.push({\n step: 'Sync audiences',\n task: 'sync_audiences',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support sync_audiences',\n });\n return { steps, profile };\n }\n\n const { accountRef, steps: accountSteps } = await resolveAccountForAudiences(\n options,\n profile.tools,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n async params => client.listAccounts(params as any) as Promise<TaskResult>\n );\n steps.push(...accountSteps);\n\n if (!accountRef) {\n steps.push({\n step: 'Sync audiences',\n task: 'sync_audiences',\n passed: false,\n duration_ms: 0,\n error:\n 'No account available. Provide audience_account_id, use sandbox: true, or ensure list_accounts is supported.',\n });\n return { steps, profile };\n }\n\n // Step 1: Discovery call — list existing audiences without modification\n const { result: discoveryResult, step: discoveryStep } = await runStep<TaskResult>(\n 'Discover existing audiences (discovery-only)',\n 'sync_audiences',\n async () =>\n client.syncAudiences({\n account: accountRef,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (discoveryResult?.success && discoveryResult?.data) {\n const discoveryData = discoveryResult.data as unknown as SyncAudiencesSuccess;\n const audiences = discoveryData.audiences ?? [];\n discoveryStep.details = `Found ${audiences.length} existing audience(s)`;\n discoveryStep.response_preview = JSON.stringify(\n {\n existing_audiences: audiences.length,\n audience_ids: audiences.map(a => a.audience_id).slice(0, 5),\n },\n null,\n 2\n );\n } else if (discoveryResult && !discoveryResult.success) {\n discoveryStep.passed = false;\n discoveryStep.error = discoveryResult.error || 'sync_audiences discovery call failed';\n }\n steps.push(discoveryStep);\n\n if (!discoveryResult?.success) {\n return { steps, profile };\n }\n\n // Step 2: Create a test audience\n const testAudienceId = `adcp-test-audience-${Date.now()}`;\n\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Create test audience',\n 'sync_audiences',\n async () =>\n client.syncAudiences({\n account: accountRef,\n audiences: [\n {\n audience_id: testAudienceId,\n name: 'AdCP E2E Test Audience',\n add: [{ hashed_email: TEST_HASHED_EMAIL }, { hashed_phone: TEST_HASHED_PHONE }],\n },\n ],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (createResult?.success && createResult?.data) {\n const createData = createResult.data as unknown as SyncAudiencesSuccess;\n const audiences = createData.audiences ?? [];\n const testAudience = audiences.find(a => a.audience_id === testAudienceId);\n createStep.details = `Created audience \"${testAudienceId}\", action: ${testAudience?.action}, status: ${testAudience?.status ?? 'n/a'}`;\n createStep.created_id = testAudienceId;\n createStep.response_preview = JSON.stringify(\n {\n audience_id: testAudience?.audience_id,\n action: testAudience?.action,\n status: testAudience?.status,\n uploaded_count: testAudience?.uploaded_count,\n matched_count: testAudience?.matched_count,\n effective_match_rate: testAudience?.effective_match_rate,\n match_breakdown: testAudience?.match_breakdown,\n },\n null,\n 2\n );\n\n // Advisory: report match breakdown availability\n if (testAudience?.status === 'ready') {\n if (testAudience.match_breakdown) {\n createStep.details += `, match_breakdown: ${testAudience.match_breakdown.length} ID type(s)`;\n }\n if (testAudience.effective_match_rate != null) {\n createStep.details += `, effective_match_rate: ${(testAudience.effective_match_rate * 100).toFixed(1)}%`;\n }\n }\n } else if (createResult && !createResult.success) {\n createStep.passed = false;\n createStep.error = createResult.error || 'sync_audiences create call failed';\n }\n steps.push(createStep);\n\n if (!createResult?.success) {\n return { steps, profile };\n }\n\n // Step 3: Delete the test audience\n const { result: deleteResult, step: deleteStep } = await runStep<TaskResult>(\n 'Delete test audience',\n 'sync_audiences',\n async () =>\n client.syncAudiences({\n account: accountRef,\n audiences: [\n {\n audience_id: testAudienceId,\n delete: true,\n },\n ],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (deleteResult?.success && deleteResult?.data) {\n const deleteData = deleteResult.data as unknown as SyncAudiencesSuccess;\n const audiences = deleteData.audiences ?? [];\n const deleted = audiences.find(a => a.audience_id === testAudienceId);\n deleteStep.details = `Deleted audience \"${testAudienceId}\", action: ${deleted?.action}`;\n deleteStep.response_preview = JSON.stringify(\n {\n audience_id: deleted?.audience_id,\n action: deleted?.action,\n },\n null,\n 2\n );\n } else if (deleteResult && !deleteResult.success) {\n deleteStep.passed = false;\n deleteStep.error = deleteResult.error || 'sync_audiences delete call failed';\n }\n steps.push(deleteStep);\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// State Machine Compliance Scenarios\n// ---------------------------------------------------------------------------\n\n/**\n * Extract media buy status from a response, handling nested shapes.\n */\nfunction extractStatus(data: Record<string, unknown>): string | undefined {\n const nested = data.media_buy as Record<string, unknown> | undefined;\n return getAuthoritativeMediaBuyStatus(data) ?? getAuthoritativeMediaBuyStatus(nested);\n}\n\n/**\n * Test: Media Buy Lifecycle\n * Exercises the full state machine: create -> pause -> resume -> get status -> cancel\n */\nexport async function testMediaBuyLifecycle(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Create a media buy to work with\n const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId || !profile?.tools.includes('update_media_buy')) {\n return { steps, profile };\n }\n\n // Track revisions across steps for monotonicity check\n const revisions: { step: string; revision: number }[] = [];\n\n // Step 1: Pause the media buy\n const { result: pauseResult, step: pauseStep } = await runStep<TaskResult>(\n 'Pause media buy',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n paused: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (pauseResult?.success && pauseResult?.data) {\n const data = pauseResult.data as unknown as Record<string, unknown>;\n const status = extractStatus(data);\n const pauseRevision = data.revision as number | undefined;\n if (pauseRevision !== undefined) revisions.push({ step: 'pause', revision: pauseRevision });\n pauseStep.details = `Paused media buy, status: ${status}`;\n pauseStep.response_preview = JSON.stringify({ media_buy_id: mediaBuyId, status, revision: pauseRevision }, null, 2);\n if (status && status !== 'paused') {\n pauseStep.warnings = [`Expected status 'paused', got '${status}'`];\n }\n } else if (pauseResult && !pauseResult.success) {\n pauseStep.passed = false;\n pauseStep.error = pauseResult.error || 'Pause operation failed';\n }\n steps.push(pauseStep);\n\n // Step 2: Resume the media buy\n const { result: resumeResult, step: resumeStep } = await runStep<TaskResult>(\n 'Resume media buy',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n paused: false,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (resumeResult?.success && resumeResult?.data) {\n const data = resumeResult.data as unknown as Record<string, unknown>;\n const status = extractStatus(data);\n const resumeRevision = data.revision as number | undefined;\n if (resumeRevision !== undefined) revisions.push({ step: 'resume', revision: resumeRevision });\n resumeStep.details = `Resumed media buy, status: ${status}`;\n resumeStep.response_preview = JSON.stringify(\n { media_buy_id: mediaBuyId, status, revision: resumeRevision },\n null,\n 2\n );\n if (status && status !== 'active' && status !== 'pending_start') {\n resumeStep.warnings = [`Expected status 'active' or 'pending_start', got '${status}'`];\n }\n } else if (resumeResult && !resumeResult.success) {\n resumeStep.passed = false;\n resumeStep.error = resumeResult.error || 'Resume operation failed';\n }\n steps.push(resumeStep);\n\n // Step 2b: Budget update — verify substantive field mutation\n // Find a package to update budget on\n let budgetPackageId: string | undefined;\n let originalBudget: number | undefined;\n if (profile.tools.includes('get_media_buys')) {\n const { result: fetchResult } = await runStep<TaskResult>(\n 'Fetch packages for budget test',\n 'get_media_buys',\n async () => client.executeTask('get_media_buys', { media_buy_ids: [mediaBuyId] }) as Promise<TaskResult>\n );\n if (fetchResult?.success && fetchResult?.data) {\n const mbs = (fetchResult.data.media_buys || []) as Array<Record<string, unknown>>;\n const mb = mbs.find((item: Record<string, unknown>) => item.media_buy_id === mediaBuyId) || mbs[0];\n const pkgs = (mb?.packages || []) as Array<Record<string, unknown>>;\n if (pkgs[0]) {\n budgetPackageId = pkgs[0].package_id as string;\n originalBudget = pkgs[0].budget as number;\n }\n }\n }\n\n if (budgetPackageId && originalBudget !== undefined) {\n const newBudget = Math.round(originalBudget * 1.2 * 100) / 100; // 20% increase\n const { result: budgetResult, step: budgetStep } = await runStep<TaskResult>(\n 'Update package budget',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n packages: [{ package_id: budgetPackageId, budget: newBudget }],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (budgetResult?.success && budgetResult?.data) {\n const data = budgetResult.data as unknown as Record<string, unknown>;\n const budgetRevision = data.revision as number | undefined;\n if (budgetRevision !== undefined) revisions.push({ step: 'budget_update', revision: budgetRevision });\n budgetStep.details = `Updated budget from $${originalBudget} to $${newBudget}`;\n budgetStep.response_preview = JSON.stringify(\n { media_buy_id: mediaBuyId, package_id: budgetPackageId, new_budget: newBudget, revision: budgetRevision },\n null,\n 2\n );\n } else if (budgetResult && !budgetResult.success) {\n const error = budgetResult.error || '';\n if (error.includes('BUDGET_EXCEEDED') || error.includes('budget_exceeded')) {\n budgetStep.passed = true;\n budgetStep.details = `Agent rejected budget increase with BUDGET_EXCEEDED — acceptable`;\n } else {\n budgetStep.passed = false;\n budgetStep.error = budgetResult.error || 'Budget update failed';\n }\n }\n steps.push(budgetStep);\n }\n\n // Step 3: Get status and check valid_actions, confirmed_at, revision, history (if get_media_buys available)\n if (profile.tools.includes('get_media_buys')) {\n const { result: statusResult, step: statusStep } = await runStep<TaskResult>(\n 'Get media buy status and valid_actions',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n media_buy_ids: [mediaBuyId],\n include_history: 10,\n }) as Promise<TaskResult>\n );\n\n if (statusResult?.success && statusResult?.data) {\n const mediaBuys = (statusResult.data.media_buys || []) as Array<Record<string, unknown>>;\n const mediaBuy =\n mediaBuys.find((item: Record<string, unknown>) => item.media_buy_id === mediaBuyId) || mediaBuys[0];\n\n if (!mediaBuy) {\n statusStep.passed = false;\n statusStep.error = 'get_media_buys did not return the created media buy';\n } else {\n const validActions = mediaBuy.valid_actions as string[] | undefined;\n const mbRevision = mediaBuy.revision as number | undefined;\n const mbConfirmedAt = mediaBuy.confirmed_at as string | undefined;\n const history = mediaBuy.history as Array<Record<string, unknown>> | undefined;\n const packages = (mediaBuy.packages || []) as Array<Record<string, unknown>>;\n const hasCreativeDeadline = packages.some(p => p.creative_deadline) || !!mediaBuy.creative_deadline;\n const status = extractStatus(mediaBuy);\n\n // Validate history entry shape if present\n let historyValid = true;\n if (history?.length) {\n const missingTimestamp = history.some(h => !h.timestamp);\n const missingAction = history.some(h => !h.action);\n if (missingTimestamp || missingAction) historyValid = false;\n }\n\n statusStep.details = `Status: ${status}, valid_actions: ${validActions ? validActions.join(', ') : 'not provided'}, revision: ${mbRevision ?? 'not provided'}`;\n statusStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuy.media_buy_id,\n status,\n confirmed_at: mbConfirmedAt,\n revision: mbRevision,\n valid_actions: validActions,\n history_entries: history?.length ?? 0,\n history_valid: historyValid,\n has_creative_deadline: hasCreativeDeadline,\n sandbox: mediaBuy.sandbox,\n },\n null,\n 2\n );\n statusStep.observation_data = {\n valid_actions: validActions,\n sandbox: mediaBuy.sandbox,\n status,\n has_creative_deadline: hasCreativeDeadline,\n history_entries: history?.length ?? 0,\n history_valid: historyValid,\n };\n }\n } else if (statusResult && !statusResult.success) {\n statusStep.passed = false;\n statusStep.error = statusResult.error || 'get_media_buys failed';\n }\n steps.push(statusStep);\n }\n\n // Step 3b: Revision concurrency check — use actual stale revision from an earlier step\n const lastRevision = revisions.length > 0 ? revisions[revisions.length - 1]!.revision : undefined;\n const staleRevision = revisions.length >= 2 ? revisions[0]!.revision : -1;\n\n const { result: conflictResult, step: conflictStep } = await runStep<TaskResult>(\n 'Update with stale revision (expect CONFLICT)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n revision: staleRevision,\n end_time: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (conflictResult && !conflictResult.success) {\n const error = conflictResult.error || '';\n if (error.includes('CONFLICT') || error.includes('conflict') || error.includes('revision')) {\n conflictStep.passed = true;\n conflictStep.details = `Correctly rejected stale revision ${staleRevision} with CONFLICT (current: ${lastRevision ?? 'unknown'})`;\n } else {\n // Agent rejected for another reason — still acceptable, revision may not be supported\n conflictStep.passed = true;\n conflictStep.details = `Agent rejected update: ${error}`;\n conflictStep.warnings = [\n 'Agent did not return CONFLICT for stale revision — revision concurrency may not be supported',\n ];\n }\n } else if (conflictResult?.success) {\n // Agent accepted stale revision — revision concurrency not enforced\n conflictStep.passed = true;\n conflictStep.details = `Agent accepted stale revision ${staleRevision} — optimistic concurrency not enforced`;\n conflictStep.warnings = ['Agent does not enforce optimistic concurrency via revision numbers'];\n } else if (!conflictResult) {\n conflictStep.passed = false;\n conflictStep.error = 'No response from update_media_buy';\n }\n steps.push(conflictStep);\n\n // Step 3c: Check revision monotonicity\n if (revisions.length >= 2) {\n const monotonicStep: TestStepResult = {\n step: 'Revision monotonicity check',\n task: 'update_media_buy',\n passed: true,\n duration_ms: 0,\n };\n const isMonotonic = revisions.every((r, i) => i === 0 || r.revision > revisions[i - 1]!.revision);\n if (isMonotonic) {\n monotonicStep.details = `Revisions are monotonically increasing: ${revisions.map(r => `${r.step}=${r.revision}`).join(' → ')}`;\n } else {\n monotonicStep.passed = true; // advisory, not a hard fail\n monotonicStep.details = `Revisions: ${revisions.map(r => `${r.step}=${r.revision}`).join(' → ')}`;\n monotonicStep.warnings = [\n `Revision numbers are not monotonically increasing — buyers depend on this for concurrency safety`,\n ];\n }\n steps.push(monotonicStep);\n }\n\n // Step 4: Cancel the media buy\n const { result: cancelResult, step: cancelStep } = await runStep<TaskResult>(\n 'Cancel media buy',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n canceled: true,\n cancellation_reason: 'AdCP compliance test — lifecycle scenario',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (cancelResult?.success && cancelResult?.data) {\n const data = cancelResult.data as unknown as Record<string, unknown>;\n const nested = data.media_buy as Record<string, unknown> | undefined;\n const status = extractStatus(data);\n const cancelRevision = (data.revision ?? nested?.revision) as number | undefined;\n cancelStep.details = `Canceled media buy, status: ${status}`;\n const canceledBy = (data.canceled_by ?? nested?.canceled_by) as string | undefined;\n const canceledAt = (data.canceled_at ?? nested?.canceled_at) as string | undefined;\n if (cancelRevision !== undefined) revisions.push({ step: 'cancel', revision: cancelRevision });\n cancelStep.response_preview = JSON.stringify(\n { media_buy_id: mediaBuyId, status, revision: cancelRevision, canceled_by: canceledBy, canceled_at: canceledAt },\n null,\n 2\n );\n cancelStep.observation_data = { status, canceled_by: canceledBy, canceled_at: canceledAt };\n if (status && status !== 'canceled') {\n cancelStep.warnings = [`Expected status 'canceled', got '${status}'`];\n }\n } else if (cancelResult && !cancelResult.success) {\n // NOT_CANCELLABLE is a valid response — agent may not support cancellation\n const error = cancelResult.error || '';\n if (error.includes('NOT_CANCELLABLE') || error.includes('not_cancellable')) {\n cancelStep.passed = true;\n cancelStep.details = 'Agent does not support cancellation (NOT_CANCELLABLE)';\n } else {\n cancelStep.passed = false;\n cancelStep.error = cancelResult.error || 'Cancel operation failed';\n }\n }\n steps.push(cancelStep);\n\n return { steps, profile };\n}\n\n/**\n * Test: Terminal State Enforcement\n * Verifies agents reject updates to media buys in terminal states.\n */\nexport async function testTerminalStateEnforcement(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Create and cancel a media buy\n const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId || !profile?.tools.includes('update_media_buy')) {\n return { steps, profile };\n }\n\n // Cancel the media buy to put it in a terminal state\n const { result: cancelResult, step: cancelStep } = await runStep<TaskResult>(\n 'Cancel media buy (setup)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n canceled: true,\n cancellation_reason: 'AdCP compliance test — terminal state enforcement',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (cancelResult?.success && cancelResult?.data) {\n const data = cancelResult.data as unknown as Record<string, unknown>;\n cancelStep.details = `Canceled media buy, status: ${extractStatus(data)}`;\n } else if (cancelResult && !cancelResult.success) {\n const error = cancelResult.error || '';\n if (error.includes('NOT_CANCELLABLE') || error.includes('not_cancellable')) {\n // Agent doesn't support cancellation — try to find a completed buy instead\n cancelStep.passed = true;\n cancelStep.details = 'Agent does not support cancellation — will check for completed media buys instead';\n steps.push(cancelStep);\n\n // Look for a completed media buy to test terminal state enforcement against\n if (profile.tools.includes('get_media_buys')) {\n const { result: completedResult, step: completedStep } = await runStep<TaskResult>(\n 'Find completed media buy for terminal state test',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n status_filter: ['completed'],\n pagination: { max_results: 1 },\n }) as Promise<TaskResult>\n );\n\n if (completedResult?.success && completedResult?.data) {\n const completedBuys = (completedResult.data.media_buys || []) as Array<Record<string, unknown>>;\n if (completedBuys.length > 0) {\n const completedId = completedBuys[0]!.media_buy_id as string;\n completedStep.details = `Found completed media buy: ${completedId}`;\n steps.push(completedStep);\n\n // Try to update the completed media buy\n const { result: updateCompletedResult, step: updateCompletedStep } = await runStep<TaskResult>(\n 'Update completed media buy (expect rejection)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: completedId,\n paused: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (updateCompletedResult?.success) {\n updateCompletedStep.passed = false;\n updateCompletedStep.error =\n 'Agent accepted update to completed media buy — should reject with INVALID_STATE';\n } else if (updateCompletedResult) {\n updateCompletedStep.passed = true;\n const err = updateCompletedResult.error || '';\n const hasCode = err.includes('INVALID_STATE') || err.includes('invalid_state');\n updateCompletedStep.details = hasCode\n ? 'Correctly rejected update to completed media buy with INVALID_STATE'\n : `Correctly rejected update to completed media buy: ${err}`;\n if (!hasCode && err) {\n updateCompletedStep.warnings = ['Agent rejected the update but did not use INVALID_STATE error code'];\n }\n }\n steps.push(updateCompletedStep);\n } else {\n completedStep.details = 'No completed media buys found — cannot test terminal state enforcement';\n steps.push(completedStep);\n }\n } else {\n completedStep.passed = false;\n completedStep.error = completedResult?.error || 'Failed to query for completed media buys';\n steps.push(completedStep);\n }\n }\n\n return { steps, profile };\n }\n cancelStep.passed = false;\n cancelStep.error = cancelResult.error || 'Cancel setup failed';\n }\n steps.push(cancelStep);\n\n // Try to pause the canceled media buy — should be rejected\n const { result: pauseTerminalResult, step: pauseTerminalStep } = await runStep<TaskResult>(\n 'Update canceled media buy (expect rejection)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n paused: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (pauseTerminalResult?.success) {\n pauseTerminalStep.passed = false;\n pauseTerminalStep.error = 'Agent accepted update to canceled media buy — should reject with INVALID_STATE';\n } else if (pauseTerminalResult) {\n // Agent returned { success: false } — correct behavior\n pauseTerminalStep.passed = true;\n const error = pauseTerminalResult.error || '';\n const hasExpectedCode = error.includes('INVALID_STATE') || error.includes('invalid_state');\n pauseTerminalStep.details = hasExpectedCode\n ? 'Correctly rejected with INVALID_STATE'\n : `Correctly rejected update to canceled media buy: ${error}`;\n if (!hasExpectedCode && error) {\n pauseTerminalStep.warnings = ['Agent rejected the update but did not use INVALID_STATE error code'];\n }\n }\n // else: result is undefined (exception thrown) — runStep already set passed=false and error\n steps.push(pauseTerminalStep);\n\n // Try to cancel again — should also be rejected (or idempotent)\n const { result: reCancelResult, step: reCancelStep } = await runStep<TaskResult>(\n 'Cancel already-canceled media buy (expect rejection)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n canceled: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (reCancelResult?.success) {\n // Idempotent cancellation is acceptable\n reCancelStep.passed = true;\n reCancelStep.details = 'Agent accepted re-cancellation (idempotent) — acceptable behavior';\n } else if (reCancelResult) {\n reCancelStep.passed = true;\n const error = reCancelResult.error || '';\n reCancelStep.details = `Correctly rejected re-cancellation: ${error}`;\n }\n steps.push(reCancelStep);\n\n // Also check completed terminal state if get_media_buys is available\n if (profile.tools.includes('get_media_buys')) {\n const { result: completedResult } = await runStep<TaskResult>(\n 'Find completed media buy',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n status_filter: ['completed'],\n pagination: { max_results: 1 },\n }) as Promise<TaskResult>\n );\n\n if (completedResult?.success && completedResult?.data) {\n const completedBuys = (completedResult.data.media_buys || []) as Array<Record<string, unknown>>;\n if (completedBuys.length > 0) {\n const completedId = completedBuys[0]!.media_buy_id as string;\n const { result: updateCompletedResult, step: updateCompletedStep } = await runStep<TaskResult>(\n 'Update completed media buy (expect rejection)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: completedId,\n paused: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (updateCompletedResult?.success) {\n updateCompletedStep.passed = false;\n updateCompletedStep.error = 'Agent accepted update to completed media buy — should reject with INVALID_STATE';\n } else if (updateCompletedResult) {\n updateCompletedStep.passed = true;\n const err = updateCompletedResult.error || '';\n const hasCode = err.includes('INVALID_STATE') || err.includes('invalid_state');\n updateCompletedStep.details = hasCode\n ? 'Correctly rejected update to completed media buy with INVALID_STATE'\n : `Correctly rejected update to completed media buy: ${err}`;\n }\n steps.push(updateCompletedStep);\n }\n }\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Package Lifecycle\n * Tests package-level pause/resume independent of media buy status.\n */\nexport async function testPackageLifecycle(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Create a media buy\n const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId || !profile?.tools.includes('update_media_buy')) {\n return { steps, profile };\n }\n\n // Find a package ID — try get_media_buys first, fall back to convention\n let packageId = 'pkg-0';\n\n if (profile.tools.includes('get_media_buys')) {\n const { result: fetchResult, step: fetchStep } = await runStep<TaskResult>(\n 'Fetch package IDs',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n media_buy_ids: [mediaBuyId],\n }) as Promise<TaskResult>\n );\n\n if (fetchResult?.success && fetchResult?.data) {\n const mediaBuys = (fetchResult.data.media_buys || []) as Array<Record<string, unknown>>;\n const mediaBuy =\n mediaBuys.find((item: Record<string, unknown>) => item.media_buy_id === mediaBuyId) || mediaBuys[0];\n const packages = (mediaBuy?.packages || []) as Array<Record<string, unknown>>;\n if (packages[0]?.package_id) {\n packageId = packages[0].package_id as string;\n fetchStep.details = `Found package ${packageId}`;\n } else {\n fetchStep.details = `No packages found, falling back to '${packageId}'`;\n }\n } else if (fetchResult && !fetchResult.success) {\n fetchStep.passed = false;\n fetchStep.error = fetchResult.error || 'get_media_buys failed during package ID discovery';\n }\n steps.push(fetchStep);\n }\n\n // Step 1: Pause a package\n const { result: pauseResult, step: pauseStep } = await runStep<TaskResult>(\n 'Pause package',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n packages: [{ package_id: packageId, paused: true }],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (pauseResult?.success && pauseResult?.data) {\n const data = pauseResult.data as unknown as Record<string, unknown>;\n const affectedPackages = (data.affected_packages || []) as Array<Record<string, unknown>>;\n const pkg = affectedPackages.find(p => p.package_id === packageId) || affectedPackages[0];\n pauseStep.details = `Paused package ${packageId}, paused: ${pkg?.paused}`;\n pauseStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuyId,\n media_buy_status: extractStatus(data),\n package_id: pkg?.package_id,\n package_paused: pkg?.paused,\n },\n null,\n 2\n );\n } else if (pauseResult && !pauseResult.success) {\n pauseStep.passed = false;\n pauseStep.error = pauseResult.error || 'Package pause failed';\n }\n steps.push(pauseStep);\n\n // Step 2: Resume the package\n const { result: resumeResult, step: resumeStep } = await runStep<TaskResult>(\n 'Resume package',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n packages: [{ package_id: packageId, paused: false }],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (resumeResult?.success && resumeResult?.data) {\n const data = resumeResult.data as unknown as Record<string, unknown>;\n const affectedPackages = (data.affected_packages || []) as Array<Record<string, unknown>>;\n const pkg = affectedPackages.find(p => p.package_id === packageId) || affectedPackages[0];\n resumeStep.details = `Resumed package ${packageId}, paused: ${pkg?.paused}`;\n resumeStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuyId,\n media_buy_status: extractStatus(data),\n package_id: pkg?.package_id,\n package_paused: pkg?.paused,\n },\n null,\n 2\n );\n } else if (resumeResult && !resumeResult.success) {\n resumeStep.passed = false;\n resumeStep.error = resumeResult.error || 'Package resume failed';\n }\n steps.push(resumeStep);\n\n // Step 3: Verify media buy is still active\n if (profile.tools.includes('get_media_buys')) {\n const { result: verifyResult, step: verifyStep } = await runStep<TaskResult>(\n 'Verify media buy still active after package operations',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n media_buy_ids: [mediaBuyId],\n }) as Promise<TaskResult>\n );\n\n if (verifyResult?.success && verifyResult?.data) {\n const mediaBuys = (verifyResult.data.media_buys || []) as Array<Record<string, unknown>>;\n const mediaBuy =\n mediaBuys.find((item: Record<string, unknown>) => item.media_buy_id === mediaBuyId) || mediaBuys[0];\n const status = mediaBuy ? extractStatus(mediaBuy) : undefined;\n\n if (status === 'active' || status === 'pending_start') {\n verifyStep.details = `Media buy still ${status} after package-level operations`;\n } else {\n verifyStep.details = `Media buy status is '${status}' — expected 'active' or 'pending_start'`;\n verifyStep.warnings = [`Package-level pause/resume changed media buy status to '${status}'`];\n }\n verifyStep.response_preview = JSON.stringify({ media_buy_id: mediaBuy?.media_buy_id, status }, null, 2);\n } else if (verifyResult && !verifyResult.success) {\n verifyStep.passed = false;\n verifyStep.error = verifyResult.error || 'get_media_buys verification failed';\n }\n steps.push(verifyStep);\n }\n\n return { steps, profile };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/testing/scenarios/media-buy.ts"],"sourcesContent":["/**\n * Media Buy Testing Scenarios\n *\n * Tests sales agent media buy capabilities including:\n * - create_media_buy\n * - update_media_buy\n * - get_media_buy_delivery\n * - sync_creatives\n */\n\nimport type {\n AccountReference,\n SyncCreativesSuccess,\n ListCreativesResponse,\n SyncAudiencesSuccess,\n ListAccountsResponse,\n} from '../../types/tools.generated';\nimport type { Product, PricingOption, FormatReferenceStructuredObject as FormatID } from '../../types/core.generated';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport {\n getOrCreateClient,\n runStep,\n getOrDiscoverProfile,\n resolveBrand,\n resolveAccount,\n validateResponseSchema,\n} from '../client';\nimport { testDiscovery } from './discovery';\nimport { getAuthoritativeMediaBuyStatus } from '../../utils/media-buy-status';\n\n/**\n * Find a suitable product for testing based on options\n */\nexport function selectProduct(products: Product[], options: TestOptions): Product | null {\n // If channels specified, filter to matching products\n let candidates = products;\n\n if (options.channels?.length) {\n candidates = products.filter(p => p.channels?.some(ch => options.channels!.includes(ch)));\n }\n\n // If pricing models specified, filter further\n if (options.pricing_models?.length) {\n candidates = candidates.filter(p =>\n p.pricing_options?.some((po: PricingOption) => options.pricing_models!.includes(po.pricing_model))\n );\n }\n\n // Return first matching or first product\n return candidates[0] || products[0] || null;\n}\n\n/**\n * Select a pricing option from a product\n */\nexport function selectPricingOption(product: Product, preferredModels?: string[]): PricingOption | null {\n const options = product.pricing_options || [];\n\n if (preferredModels?.length) {\n const preferred = options.find((po: PricingOption) => preferredModels.includes(po.pricing_model));\n if (preferred) return preferred;\n }\n\n return options[0] || null;\n}\n\n/**\n * Build a create_media_buy request\n */\nexport function buildCreateMediaBuyRequest(\n product: Product,\n pricingOption: PricingOption,\n options: TestOptions,\n extras: {\n inline_creatives?: Record<string, unknown>[];\n creative_ids?: string[];\n accountRef?: AccountReference;\n } = {}\n): Record<string, unknown> {\n const minSpend = pricingOption.min_spend_per_package || 0;\n const budget = options.budget || Math.max(1000, minSpend);\n const now = new Date();\n const startTime = new Date(now.getTime() + 24 * 60 * 60 * 1000); // Tomorrow\n const endTime = new Date(startTime.getTime() + 7 * 24 * 60 * 60 * 1000); // 7 days later\n\n const isAuction =\n !('fixed_price' in pricingOption) &&\n (pricingOption.floor_price !== undefined || pricingOption.price_guidance !== undefined);\n\n const packageRequest: Record<string, unknown> = {\n product_id: product.product_id,\n budget,\n pricing_option_id: pricingOption.pricing_option_id,\n };\n\n // Add bid_price if auction-based\n if (isAuction && pricingOption.floor_price) {\n packageRequest.bid_price = pricingOption.floor_price * 1.5;\n }\n\n // Add inline creatives if provided\n if (extras.inline_creatives?.length) {\n packageRequest.creatives = extras.inline_creatives;\n }\n\n // Add creative references if provided\n if (extras.creative_ids?.length) {\n packageRequest.creative_ids = extras.creative_ids;\n }\n\n const hasAccountRef = Object.prototype.hasOwnProperty.call(extras, 'accountRef');\n const account = hasAccountRef ? extras.accountRef : resolveAccount(options);\n if (!account) {\n throw new Error(\n 'buildCreateMediaBuyRequest received accountRef: undefined. Resolve an account before building the request.'\n );\n }\n\n return {\n account,\n brand: resolveBrand(options),\n start_time: startTime.toISOString(),\n end_time: endTime.toISOString(),\n packages: [packageRequest],\n };\n}\n\nfunction getDefaultFormatId(): FormatID {\n return { agent_url: 'https://creative.adcontextprotocol.org', id: 'display_300x250' };\n}\n\nfunction formatIdToString(formatId: FormatID): string {\n return formatId.id;\n}\n\nfunction selectFormatId(product: Product, fallback: FormatID = getDefaultFormatId()): FormatID {\n if (!product?.format_ids?.length) {\n return fallback;\n }\n\n const format = product.format_ids[0] as unknown as string | FormatID | { format_id?: FormatID };\n if (typeof format === 'string') {\n return { ...fallback, id: format };\n }\n\n const nested = format as { format_id?: FormatID };\n if (nested.format_id) {\n return nested.format_id;\n }\n\n const direct = format as Partial<FormatID>;\n if (typeof direct.agent_url === 'string' && typeof direct.id === 'string') {\n return direct as FormatID;\n }\n\n return fallback;\n}\n\nfunction buildStaticInlineCreative(formatId: FormatID) {\n const ts = Date.now();\n return {\n creative_id: `test-inline-${ts}`,\n name: `Inline Test Creative ${ts}`,\n format_id: formatId,\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250?text=Inline+Creative',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n };\n}\n\nfunction extractCreativeManifest(data: any): any | undefined {\n return data?.creative_manifest || data?.creative_manifests?.[0];\n}\n\nfunction buildSyncCreativeFromManifest(manifest: any, fallbackFormatId: FormatID) {\n const creativeId = manifest?.creative_id || `test-creative-${Date.now()}`;\n return {\n creative_id: creativeId,\n name: manifest?.name || `Generated Creative ${creativeId}`,\n format_id: manifest?.format_id || fallbackFormatId,\n assets: manifest?.assets || buildStaticInlineCreative(fallbackFormatId).assets,\n };\n}\n\n/**\n * Test: Create Media Buy\n * Discovers products, then creates a test media buy\n */\nexport async function testCreateMediaBuy(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile; mediaBuyId?: string }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // First run discovery\n const { steps: discoverySteps, profile } = await testDiscovery(agentUrl, options);\n steps.push(...discoverySteps);\n\n if (!profile?.tools.includes('create_media_buy')) {\n steps.push({\n step: 'Create media buy',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support create_media_buy',\n });\n return { steps, profile };\n }\n\n const { accountRef, steps: accountSteps } = await resolveAccountForMediaBuy(\n options,\n profile.tools,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n async params => client.listAccounts(params as any) as Promise<TaskResult>,\n getMediaBuyAccountResolutionHints(profile)\n );\n steps.push(...accountSteps);\n\n if (!accountRef) {\n steps.push({\n step: 'Resolve account for media buy',\n task: 'list_accounts',\n passed: false,\n duration_ms: 0,\n error:\n 'No account available. Provide media_buy_account_id/account_id, use sandbox: true, or ensure list_accounts returns an account.',\n });\n return { steps, profile };\n }\n\n // Get products\n const { result: productsResult } = await runStep<TaskResult>(\n 'Fetch products for media buy',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: options.brief || 'Looking for display advertising products',\n brand: resolveBrand(options),\n account: accountRef,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n const productsData = productsResult?.data as Record<string, unknown> | undefined;\n const products = productsData?.products as Product[] | undefined;\n if (!productsResult?.success || !products?.length) {\n steps.push({\n step: 'Create media buy',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'No products available to create media buy',\n });\n return { steps, profile };\n }\n\n const product = selectProduct(products, options);\n if (!product) {\n steps.push({\n step: 'Create media buy',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'No suitable product found',\n });\n return { steps, profile };\n }\n const pricingOption = selectPricingOption(product, options.pricing_models);\n\n if (!pricingOption) {\n steps.push({\n step: 'Create media buy',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: `Product \"${product.name}\" has no pricing options`,\n });\n return { steps, profile };\n }\n\n const createRequest = buildCreateMediaBuyRequest(product, pricingOption, options, { accountRef });\n\n // Create the media buy\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Create media buy',\n 'create_media_buy',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n async () => client.createMediaBuy(createRequest as any) as Promise<TaskResult>\n );\n\n let mediaBuyId: string | undefined;\n\n if (createResult?.success && createResult?.data) {\n steps.push(validateResponseSchema('create_media_buy', createResult.data));\n const mediaBuy = createResult.data as unknown as Record<string, unknown>;\n const nested = mediaBuy.media_buy as Record<string, unknown> | undefined;\n mediaBuyId = (mediaBuy.media_buy_id || nested?.media_buy_id) as string | undefined;\n const status = extractStatus(mediaBuy);\n const packages = (mediaBuy.packages || nested?.packages) as unknown[] | undefined;\n createStep.details = `Created media buy: ${mediaBuyId}, status: ${status}`;\n createStep.created_id = mediaBuyId;\n const confirmedAt = (mediaBuy.confirmed_at ?? nested?.confirmed_at) as string | undefined;\n const revision = (mediaBuy.revision ?? nested?.revision) as number | undefined;\n const validActions = (mediaBuy.valid_actions ?? nested?.valid_actions) as string[] | undefined;\n createStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuyId,\n status,\n confirmed_at: confirmedAt,\n revision,\n valid_actions: validActions,\n packages_count: packages?.length,\n pricing_model: pricingOption.pricing_model,\n product_name: product.name,\n },\n null,\n 2\n );\n createStep.observation_data = { confirmed_at: confirmedAt, revision };\n } else if (createResult && !createResult.success) {\n createStep.passed = false;\n createStep.error = createResult.error || 'create_media_buy returned unsuccessful result';\n }\n steps.push(createStep);\n\n return { steps, profile, mediaBuyId };\n}\n\n/**\n * Test: Full Sales Flow\n * Complete lifecycle: discovery -> create -> update -> delivery\n */\nexport async function testFullSalesFlow(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Run create media buy flow first\n const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId) {\n return { steps, profile };\n }\n\n // Test update_media_buy if available\n if (profile?.tools.includes('update_media_buy')) {\n const { result: updateResult, step: updateStep } = await runStep<TaskResult>(\n 'Update media buy (increase budget)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n packages: [\n {\n package_id: 'pkg-0',\n budget: (options.budget || 1000) * 1.5,\n },\n ],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (updateResult?.success && updateResult?.data) {\n const data = updateResult.data as unknown as Record<string, unknown>;\n const nested = data.media_buy as Record<string, unknown> | undefined;\n const status = extractStatus(data);\n updateStep.details = `Updated media buy, status: ${status}`;\n updateStep.response_preview = JSON.stringify(\n {\n media_buy_id: (data.media_buy_id || nested?.media_buy_id) as string | undefined,\n status,\n },\n null,\n 2\n );\n } else if (updateResult && !updateResult.success) {\n updateStep.passed = false;\n updateStep.error = updateResult.error || 'update_media_buy returned unsuccessful result';\n }\n steps.push(updateStep);\n }\n\n if (profile?.tools.includes('get_media_buys')) {\n const { result: snapshotResult, step: snapshotStep } = await runStep<TaskResult>(\n 'Get media buy status with delivery snapshots',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n media_buy_ids: [mediaBuyId],\n include_snapshot: true,\n }) as Promise<TaskResult>\n );\n\n if (snapshotResult?.success && snapshotResult?.data) {\n steps.push(validateResponseSchema('get_media_buys', snapshotResult.data));\n const mediaBuys = snapshotResult.data.media_buys || [];\n const mediaBuy = mediaBuys.find((item: any) => item.media_buy_id === mediaBuyId) || mediaBuys[0];\n const packages = mediaBuy?.packages || [];\n const invalidPackages = packages.filter((pkg: any) => {\n if (pkg.snapshot) {\n return !pkg.snapshot.as_of || pkg.snapshot.staleness_seconds === undefined;\n }\n return !pkg.snapshot_unavailable_reason;\n });\n\n if (!mediaBuy) {\n snapshotStep.passed = false;\n snapshotStep.error = 'get_media_buys did not return the created media buy';\n } else if (invalidPackages.length > 0) {\n snapshotStep.passed = false;\n snapshotStep.error =\n 'include_snapshot=true must return either snapshot data or snapshot_unavailable_reason for each package';\n } else {\n snapshotStep.details = `Retrieved ${packages.length} package snapshot(s)`;\n snapshotStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuy.media_buy_id,\n package_count: packages.length,\n snapshots_returned: packages.filter((pkg: any) => !!pkg.snapshot).length,\n snapshot_unavailable: packages\n .filter((pkg: any) => !!pkg.snapshot_unavailable_reason)\n .map((pkg: any) => ({ package_id: pkg.package_id, reason: pkg.snapshot_unavailable_reason })),\n },\n null,\n 2\n );\n // Provide observation data so collectObservations can check valid_actions/sandbox\n // even when media_buy_lifecycle doesn't run (e.g., agent lacks update_media_buy).\n const status = extractStatus(mediaBuy);\n snapshotStep.observation_data = {\n valid_actions: mediaBuy.valid_actions,\n sandbox: mediaBuy.sandbox,\n status,\n has_creative_deadline: packages.some((p: any) => p.creative_deadline) || !!mediaBuy.creative_deadline,\n };\n }\n } else if (snapshotResult && !snapshotResult.success) {\n snapshotStep.passed = false;\n snapshotStep.error = snapshotResult.error || 'get_media_buys returned unsuccessful result';\n }\n steps.push(snapshotStep);\n }\n\n // Test get_media_buy_delivery if available\n if (profile?.tools.includes('get_media_buy_delivery')) {\n const { result: deliveryResult, step: deliveryStep } = await runStep<TaskResult>(\n 'Get delivery metrics',\n 'get_media_buy_delivery',\n async () =>\n client.getMediaBuyDelivery({\n media_buy_ids: [mediaBuyId],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (deliveryResult?.success && deliveryResult?.data) {\n const delivery = deliveryResult.data as unknown as Record<string, unknown>;\n const deliveries = delivery.deliveries as unknown[] | undefined;\n const mediaBuys = delivery.media_buys as unknown[] | undefined;\n deliveryStep.details = `Retrieved delivery metrics`;\n deliveryStep.response_preview = JSON.stringify(\n {\n has_deliveries: !!(deliveries?.length || mediaBuys?.length),\n },\n null,\n 2\n );\n } else if (deliveryResult && !deliveryResult.success) {\n deliveryStep.passed = false;\n deliveryStep.error = deliveryResult.error || 'get_media_buy_delivery returned unsuccessful result';\n }\n steps.push(deliveryStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Reporting Flow\n * Validates reporting capabilities:\n * - Agent has get_media_buy_delivery tool\n * - Products declare reporting_capabilities (frequencies, webhook support)\n * - get_media_buy_delivery returns valid structure or reporting_delayed with expected_availability\n * - Currency field is present in delivery data\n *\n * The protocol favors async webhook-based report delivery over buyer polling.\n * This scenario checks that the agent advertises webhook support and properly\n * handles the reporting_delayed status for data not yet available.\n */\nexport async function testReportingFlow(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profile.tools.includes('get_media_buy_delivery')) {\n steps.push({\n step: 'Check get_media_buy_delivery tool',\n task: 'get_media_buy_delivery',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support get_media_buy_delivery',\n });\n return { steps, profile };\n }\n\n // Check supported_protocols includes 'reporting'\n const hasReporting = profile.supported_protocols?.includes('reporting') ?? false;\n steps.push({\n step: 'Check reporting protocol declaration',\n passed: true,\n duration_ms: 0,\n details: hasReporting\n ? 'Agent declares reporting in supported_protocols'\n : 'Agent does not declare reporting in supported_protocols (tool is present but protocol not declared)',\n warnings: hasReporting\n ? undefined\n : ['Agent has get_media_buy_delivery but does not declare reporting in supported_protocols'],\n });\n\n // Discover products to check reporting_capabilities\n const { result: productsResult, step: productsStep } = await runStep<TaskResult>(\n 'Check product reporting capabilities',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: options.brief || 'Looking for advertising products with reporting',\n brand: resolveBrand(options),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n const productsData = productsResult?.data as Record<string, unknown> | undefined;\n const products = (productsData?.products ?? []) as Array<Record<string, unknown>>;\n\n // Evaluate reporting_capabilities on discovered products\n const withReporting = products.filter(p => p.reporting_capabilities);\n const withWebhooks = withReporting.filter(p => {\n const rc = p.reporting_capabilities as Record<string, unknown> | undefined;\n return rc?.supports_webhooks === true;\n });\n\n if (products.length > 0) {\n const webhookWarnings: string[] = [];\n if (withReporting.length === 0) {\n webhookWarnings.push(\n 'No products declare reporting_capabilities — buyers cannot discover reporting frequency or webhook support'\n );\n } else if (withWebhooks.length === 0) {\n webhookWarnings.push(\n 'No products declare supports_webhooks: true — buyers must poll get_media_buy_delivery instead of receiving async reports'\n );\n }\n\n // Check for available_reporting_frequencies\n const withFrequencies = withReporting.filter(p => {\n const rc = p.reporting_capabilities as Record<string, unknown> | undefined;\n const freqs = rc?.available_reporting_frequencies as unknown[] | undefined;\n return freqs && freqs.length > 0;\n });\n\n productsStep.details = [\n `${products.length} product(s) discovered`,\n `${withReporting.length} with reporting_capabilities`,\n `${withWebhooks.length} with webhook support`,\n `${withFrequencies.length} with reporting frequencies`,\n ].join(', ');\n productsStep.response_preview = JSON.stringify(\n {\n product_count: products.length,\n with_reporting_capabilities: withReporting.length,\n with_webhook_support: withWebhooks.length,\n with_frequencies: withFrequencies.length,\n sample_capabilities: withReporting.slice(0, 2).map(p => ({\n product_id: p.product_id,\n reporting_capabilities: p.reporting_capabilities,\n })),\n },\n null,\n 2\n );\n productsStep.warnings = webhookWarnings.length > 0 ? webhookWarnings : undefined;\n }\n steps.push(productsStep);\n\n // Create a media buy to report on\n const { steps: createSteps, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId) {\n steps.push({\n step: 'Find media buy for delivery report',\n passed: false,\n duration_ms: 0,\n error: 'No media_buy_id — cannot test delivery reporting',\n });\n return { steps, profile };\n }\n\n // Call get_media_buy_delivery\n const { result: deliveryResult, step: deliveryStep } = await runStep<TaskResult>(\n 'Get delivery metrics',\n 'get_media_buy_delivery',\n async () =>\n client.getMediaBuyDelivery({\n media_buy_ids: [mediaBuyId],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (deliveryResult?.success && deliveryResult?.data) {\n const delivery = deliveryResult.data as unknown as Record<string, unknown>;\n const deliveries = delivery.deliveries as unknown[] | undefined;\n const mediaBuys = delivery.media_buys as unknown[] | undefined;\n const mediaBuyDeliveries = delivery.media_buy_deliveries as Record<string, unknown>[] | undefined;\n\n const allEntries = (mediaBuyDeliveries ?? mediaBuys ?? deliveries ?? []) as Record<string, unknown>[];\n const hasData = allEntries.length > 0;\n\n // Split entries: some may be delayed while others have actual data\n const delayedEntries = allEntries.filter(e => e.status === 'reporting_delayed');\n const readyEntries = allEntries.filter(e => e.status !== 'reporting_delayed');\n\n // Check for currency on entry objects (not via string search)\n const hasCurrency = readyEntries.some(\n e => 'currency' in e || (e.totals as Record<string, unknown> | undefined)?.currency !== undefined\n );\n\n // Extract metrics info for diagnostics\n const firstReady = readyEntries[0];\n const totals = (firstReady?.totals ?? undefined) as Record<string, unknown> | undefined;\n const summary = delivery.summary as Record<string, unknown> | undefined;\n const impressions = (totals?.impressions ?? delivery.impressions ?? summary?.impressions) as number | undefined;\n const clicks = (totals?.clicks ?? delivery.clicks ?? summary?.clicks) as number | undefined;\n\n const details: string[] = [];\n const warnings: string[] = [];\n\n // Validate delayed entries\n if (delayedEntries.length > 0) {\n const withAvailability = delayedEntries.filter(e => e.expected_availability);\n details.push(`${delayedEntries.length} media buy(s) reporting_delayed`);\n if (withAvailability.length < delayedEntries.length) {\n warnings.push(\n 'reporting_delayed entries should include expected_availability so buyers know when to expect data'\n );\n }\n }\n\n // Validate ready entries\n if (readyEntries.length > 0) {\n details.push(`${readyEntries.length} media buy(s) with delivery data`);\n if (!hasCurrency) {\n warnings.push('No currency field found in delivery entries');\n }\n }\n\n if (!hasData) {\n deliveryStep.passed = false;\n deliveryStep.error = 'Expected delivery data or reporting_delayed status in response but found neither';\n } else {\n deliveryStep.details = details.join(', ');\n }\n\n if (warnings.length > 0) {\n deliveryStep.warnings = [...(deliveryStep.warnings || []), ...warnings];\n }\n\n const KNOWN_DELIVERY_KEYS = [\n 'media_buy_deliveries',\n 'media_buys',\n 'deliveries',\n 'currency',\n 'summary',\n 'reporting_period',\n 'notification_type',\n 'partial_data',\n ];\n deliveryStep.response_preview = JSON.stringify(\n {\n has_data: hasData,\n delayed_count: delayedEntries.length,\n ready_count: readyEntries.length,\n has_currency: hasCurrency,\n impressions,\n clicks,\n known_keys: Object.keys(delivery).filter(k => KNOWN_DELIVERY_KEYS.includes(k)),\n },\n null,\n 2\n );\n } else if (deliveryResult && !deliveryResult.success) {\n deliveryStep.passed = false;\n deliveryStep.error = deliveryResult.error || 'get_media_buy_delivery returned unsuccessful result';\n } else if (!deliveryResult) {\n deliveryStep.passed = false;\n deliveryStep.error = 'get_media_buy_delivery returned no result';\n }\n steps.push(deliveryStep);\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Sync Flow\n * Tests sync_creatives separately from create_media_buy\n */\nexport async function testCreativeSync(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profile.tools.includes('sync_creatives')) {\n steps.push({\n step: 'Sync creatives',\n task: 'sync_creatives',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support sync_creatives',\n });\n return { steps, profile };\n }\n\n const { accountRef, steps: accountSteps } = await resolveAccountForMediaBuy(\n options,\n profile.tools,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n async params => client.listAccounts(params as any) as Promise<TaskResult>,\n getMediaBuyAccountResolutionHints(profile)\n );\n steps.push(...accountSteps);\n\n if (!accountRef) {\n steps.push({\n step: 'Resolve account for creative sync',\n task: 'list_accounts',\n passed: false,\n duration_ms: 0,\n error:\n 'No account available. Provide media_buy_account_id/account_id, use sandbox: true, or ensure list_accounts returns an account.',\n });\n return { steps, profile };\n }\n\n // Get format info first\n let formatId: Record<string, unknown> = {\n agent_url: 'https://creative.adcontextprotocol.org',\n id: 'display_300x250',\n };\n if (profile.tools.includes('list_creative_formats')) {\n const { result: formatsResult } = await runStep<TaskResult>(\n 'Get formats for creative',\n 'list_creative_formats',\n async () => client.listCreativeFormatsLegacy({}) as Promise<TaskResult>\n );\n\n if (formatsResult?.success && formatsResult?.data) {\n const data = formatsResult.data as unknown as Record<string, unknown>;\n const formatIds = data.format_ids as unknown[] | undefined;\n const formats = data.formats as Record<string, unknown>[] | undefined;\n const firstFormat = formatIds?.[0] || formats?.[0];\n if (firstFormat) {\n if (typeof firstFormat === 'string') {\n formatId = { id: firstFormat };\n } else {\n const formatObj = firstFormat as Record<string, unknown>;\n formatId = (formatObj.format_id as Record<string, unknown>) || formatObj;\n }\n }\n }\n }\n\n // Test sync_creatives with a simple creative\n // Assets must be an object keyed by asset_role, not an array\n const testCreative = {\n creative_id: `test-creative-${Date.now()}`,\n name: 'E2E Test Creative',\n format_id: formatId,\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n };\n\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n 'Sync creative to library',\n 'sync_creatives',\n async () =>\n client.syncCreatives({\n account: accountRef,\n creatives: [testCreative],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (syncResult?.success && syncResult?.data) {\n const data = syncResult.data as unknown as SyncCreativesSuccess;\n const creatives = data.creatives || [];\n const actions = creatives.map(c => c.action);\n syncStep.details = `Synced ${creatives.length} creative(s), actions: ${actions.join(', ')}`;\n syncStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n actions: actions,\n creative_ids: creatives.map(c => c.creative_id),\n },\n null,\n 2\n );\n } else if (syncResult && !syncResult.success) {\n syncStep.passed = false;\n syncStep.error = syncResult.error || 'sync_creatives returned unsuccessful result';\n }\n steps.push(syncStep);\n\n // Test list_creatives if available\n if (profile.tools.includes('list_creatives')) {\n const { result: listResult, step: listStep } = await runStep<TaskResult>(\n 'List creatives in library',\n 'list_creatives',\n async () => client.listCreatives({}) as Promise<TaskResult>\n );\n\n if (listResult?.success && listResult?.data) {\n const data = listResult.data as unknown as ListCreativesResponse;\n const creatives = data.creatives || [];\n const querySummary = data.query_summary;\n const totalMatching = querySummary?.total_matching;\n const returned = querySummary?.returned ?? creatives.length;\n\n // Check for pagination bug: total_matching > 0 but returned = 0\n if (totalMatching !== undefined && totalMatching > 0 && returned === 0) {\n listStep.passed = false;\n listStep.error = `Pagination bug: query_summary shows ${totalMatching} total_matching but returned ${returned} creatives`;\n listStep.response_preview = JSON.stringify(\n {\n total_matching: totalMatching,\n returned,\n creatives_count: creatives.length,\n pagination: data.pagination,\n },\n null,\n 2\n );\n } else {\n listStep.details = `Found ${creatives.length} creative(s) in library`;\n listStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n total_matching: totalMatching,\n statuses: Array.from(new Set(creatives.map(c => c.status))),\n },\n null,\n 2\n );\n }\n } else if (listResult && !listResult.success) {\n listStep.passed = false;\n listStep.error = listResult.error || 'list_creatives returned unsuccessful result';\n }\n steps.push(listStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Inline Flow\n * Tests providing creatives inline in create_media_buy\n */\nexport async function testCreativeInline(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discovery first\n const { steps: discoverySteps, profile } = await testDiscovery(agentUrl, options);\n steps.push(...discoverySteps);\n\n if (!profile?.tools.includes('create_media_buy')) {\n steps.push({\n step: 'Create media buy with inline creatives',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support create_media_buy',\n });\n return { steps, profile };\n }\n\n // Check if agent declares inline creative support via capabilities\n if (profile.tools.includes('get_adcp_capabilities')) {\n try {\n const capResult = (await client.getAdcpCapabilities({})) as TaskResult | undefined;\n const capData = capResult?.data as Record<string, any> | undefined;\n if (capData?.media_buy?.features?.inline_creative_management === false) {\n steps.push({\n step: 'Create media buy with inline creative',\n task: 'create_media_buy',\n passed: true,\n duration_ms: 0,\n details: 'Skipped: agent declares inline_creative_management: false',\n });\n return { steps, profile };\n }\n } catch {\n // If capabilities check fails, proceed with the test\n }\n }\n\n // Get products\n const { result: productsResult } = await runStep<TaskResult>(\n 'Fetch products for inline creative test',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: options.brief || 'Looking for display advertising products',\n brand: resolveBrand(options),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n const inlineProductsData = productsResult?.data as Record<string, unknown> | undefined;\n const products = inlineProductsData?.products as Product[] | undefined;\n if (!productsResult?.success || !products?.length) {\n steps.push({\n step: 'Create media buy with inline creatives',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'No products available to test inline creatives',\n });\n return { steps, profile };\n }\n\n const product = selectProduct(products, options);\n if (!product) {\n steps.push({\n step: 'Create media buy with inline creatives',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'No suitable product found',\n });\n return { steps, profile };\n }\n const pricingOption = selectPricingOption(product, options.pricing_models);\n\n if (!pricingOption) {\n steps.push({\n step: 'Create media buy with inline creatives',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: `Product \"${product.name}\" has no pricing options`,\n });\n return { steps, profile };\n }\n\n const formatId = selectFormatId(product);\n let inlineCreative = buildStaticInlineCreative(formatId);\n\n if (profile.tools.includes('build_creative')) {\n const { result: buildResult, step: buildStep } = await runStep<TaskResult>(\n `Build creative for inline flow (${formatIdToString(formatId)})`,\n 'build_creative',\n async () =>\n client.executeTaskLegacy('build_creative', {\n target_format_id: formatId,\n brand: resolveBrand(options),\n message: `Create an ad creative for the ${formatIdToString(formatId)} format that can be attached to a media buy`,\n quality: 'draft',\n }) as Promise<TaskResult>\n );\n\n if (buildResult?.success && buildResult?.data) {\n const manifest = extractCreativeManifest(buildResult.data);\n if (manifest?.assets) {\n inlineCreative = buildSyncCreativeFromManifest(manifest, formatId);\n buildStep.details = `Built creative manifest for ${inlineCreative.format_id}`;\n buildStep.response_preview = JSON.stringify(\n {\n format_id: inlineCreative.format_id,\n asset_keys: Object.keys(inlineCreative.assets || {}),\n },\n null,\n 2\n );\n } else {\n buildStep.passed = false;\n buildStep.error = 'build_creative succeeded but returned no creative_manifest';\n }\n } else if (buildResult && !buildResult.success) {\n buildStep.passed = false;\n buildStep.error = buildResult.error || 'build_creative failed';\n }\n steps.push(buildStep);\n }\n\n const createRequest = buildCreateMediaBuyRequest(product, pricingOption, options, {\n inline_creatives: [inlineCreative],\n });\n\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Create media buy with inline creative',\n 'create_media_buy',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n async () => client.createMediaBuy(createRequest as any) as Promise<TaskResult>\n );\n\n if (createResult?.success && createResult?.data) {\n steps.push(validateResponseSchema('create_media_buy', createResult.data));\n const mediaBuy = createResult.data as unknown as Record<string, unknown>;\n const nested = mediaBuy.media_buy as Record<string, unknown> | undefined;\n const mediaBuyId = (mediaBuy.media_buy_id || nested?.media_buy_id) as string | undefined;\n const status = extractStatus(mediaBuy);\n const packages = (mediaBuy.packages || nested?.packages) as Record<string, unknown>[] | undefined;\n const hasCreatives = packages?.some(p => {\n const creatives = p.creatives as unknown[] | undefined;\n const creativeIds = p.creative_ids as unknown[] | undefined;\n return creatives?.length || creativeIds?.length;\n });\n\n createStep.details = `Created media buy with inline creative: ${mediaBuyId}`;\n createStep.created_id = mediaBuyId;\n createStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuyId,\n status,\n has_creatives: hasCreatives,\n packages_count: packages?.length,\n },\n null,\n 2\n );\n } else if (createResult && !createResult.success) {\n createStep.passed = false;\n createStep.error = createResult.error || 'create_media_buy with inline creatives failed';\n }\n steps.push(createStep);\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Reference Flow\n * Builds a creative manifest, syncs it into the seller's library, then references it in create_media_buy.\n */\nexport async function testCreativeReference(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { steps: discoverySteps, profile } = await testDiscovery(agentUrl, options);\n steps.push(...discoverySteps);\n\n if (!profile?.tools.includes('build_creative') || !profile.tools.includes('sync_creatives')) {\n steps.push({\n step: 'Build and reference creative',\n task: 'build_creative',\n passed: false,\n duration_ms: 0,\n error: 'Agent must support both build_creative and sync_creatives',\n });\n return { steps, profile };\n }\n\n const { result: productsResult } = await runStep<TaskResult>(\n 'Fetch products for creative reference test',\n 'get_products',\n async () =>\n client.executeTask('get_products', {\n buying_mode: 'brief',\n brief: options.brief || 'Looking for products that support generated creative attachments',\n brand: resolveBrand(options),\n }) as Promise<TaskResult>\n );\n\n const products = productsResult?.data?.products as any[] | undefined;\n if (!productsResult?.success || !products?.length) {\n steps.push({\n step: 'Build and reference creative',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'No products available to test creative references',\n });\n return { steps, profile };\n }\n\n const product = selectProduct(products, options);\n if (!product) {\n steps.push({\n step: 'Build and reference creative',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: 'No suitable product found for creative reference test',\n });\n return { steps, profile };\n }\n\n const pricingOption = selectPricingOption(product, options.pricing_models);\n const formatId = selectFormatId(product);\n\n if (!pricingOption) {\n steps.push({\n step: 'Build and reference creative',\n task: 'create_media_buy',\n passed: false,\n duration_ms: 0,\n error: `Product \"${product.name}\" has no pricing options`,\n });\n return { steps, profile };\n }\n\n const { result: buildResult, step: buildStep } = await runStep<TaskResult>(\n `Build creative for reference flow (${formatIdToString(formatId)})`,\n 'build_creative',\n async () =>\n client.executeTaskLegacy('build_creative', {\n target_format_id: formatId,\n brand: resolveBrand(options),\n message: `Create a reusable ad creative for the ${formatIdToString(formatId)} format`,\n quality: 'draft',\n }) as Promise<TaskResult>\n );\n\n if (!buildResult?.success || !buildResult?.data) {\n buildStep.passed = false;\n buildStep.error = buildResult?.error || 'build_creative failed';\n steps.push(buildStep);\n return { steps, profile };\n }\n\n const manifest = extractCreativeManifest(buildResult.data);\n if (!manifest?.assets) {\n buildStep.passed = false;\n buildStep.error = 'build_creative returned no creative_manifest';\n steps.push(buildStep);\n return { steps, profile };\n }\n\n const syncedCreative = buildSyncCreativeFromManifest(manifest, formatId);\n buildStep.details = `Built creative manifest for ${syncedCreative.format_id}`;\n buildStep.response_preview = JSON.stringify(\n {\n creative_id: syncedCreative.creative_id,\n format_id: syncedCreative.format_id,\n asset_keys: Object.keys(syncedCreative.assets || {}),\n },\n null,\n 2\n );\n steps.push(buildStep);\n\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n 'Sync generated creative to library',\n 'sync_creatives',\n async () =>\n client.executeTaskLegacy('sync_creatives', {\n creatives: [syncedCreative],\n }) as Promise<TaskResult>\n );\n\n if (!syncResult?.success || !syncResult?.data) {\n syncStep.passed = false;\n syncStep.error = syncResult?.error || 'sync_creatives failed';\n steps.push(syncStep);\n return { steps, profile };\n }\n\n syncStep.details = `Synced creative ${syncedCreative.creative_id} to seller library`;\n syncStep.created_id = syncedCreative.creative_id;\n syncStep.response_preview = JSON.stringify(\n {\n creative_id: syncedCreative.creative_id,\n synced_count: (syncResult.data.creatives || []).length,\n },\n null,\n 2\n );\n steps.push(syncStep);\n\n const createRequest = buildCreateMediaBuyRequest(product, pricingOption, options, {\n creative_ids: [syncedCreative.creative_id],\n });\n\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Create media buy with referenced creative',\n 'create_media_buy',\n async () => client.executeTaskLegacy('create_media_buy', createRequest) as Promise<TaskResult>\n );\n\n if (createResult?.success && createResult?.data) {\n steps.push(validateResponseSchema('create_media_buy', createResult.data));\n const mediaBuy = createResult.data;\n const mediaBuyId = mediaBuy.media_buy_id || mediaBuy.media_buy?.media_buy_id;\n const packages = mediaBuy.packages || mediaBuy.media_buy?.packages;\n const referenced = packages?.some((pkg: any) => pkg.creative_ids?.includes(syncedCreative.creative_id));\n createStep.details = `Created media buy with referenced creative ${syncedCreative.creative_id}`;\n createStep.created_id = mediaBuyId;\n createStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuyId,\n creative_id: syncedCreative.creative_id,\n referenced,\n },\n null,\n 2\n );\n } else if (createResult && !createResult.success) {\n createStep.passed = false;\n createStep.error = createResult.error || 'create_media_buy with creative_ids failed';\n }\n steps.push(createStep);\n\n return { steps, profile };\n}\n\n// SHA-256 lookalike placeholder for test email/phone hashes (not a real hash)\nconst TEST_HASHED_EMAIL = 'a' + '0'.repeat(63);\nconst TEST_HASHED_PHONE = 'b' + '0'.repeat(63);\n\ninterface MediaBuyAccountResolutionHints {\n requireOperatorAuth?: boolean;\n}\n\n/**\n * Resolve which account reference to use for media-buy and creative-library\n * test calls.\n *\n * Priority: media_buy_account_id > account_id > explicit-account discovery >\n * implicit/sandbox natural key. When account capabilities are unavailable,\n * list_accounts support is treated as an explicit-account hint for backwards\n * compatibility with older agents.\n *\n * Extracted for testability — the listAccounts callback abstracts the client call.\n */\nexport async function resolveAccountForMediaBuy(\n options: TestOptions,\n tools: string[],\n listAccounts: (params: Record<string, unknown>) => Promise<TaskResult>,\n hints: MediaBuyAccountResolutionHints = {}\n): Promise<{ accountRef: AccountReference | undefined; steps: TestStepResult[] }> {\n const steps: TestStepResult[] = [];\n\n const explicitAccountId = options.media_buy_account_id ?? options.account_id;\n if (explicitAccountId) {\n return { accountRef: { account_id: explicitAccountId }, steps };\n }\n\n const hasListAccounts = tools.includes('list_accounts');\n const shouldDiscoverExplicitAccount = hasListAccounts && hints.requireOperatorAuth !== false;\n\n if (options.sandbox && shouldDiscoverExplicitAccount) {\n const { result: sandboxResult, step: sandboxStep } = await runStep<TaskResult>(\n 'Discover sandbox accounts for media buy',\n 'list_accounts',\n async () => listAccounts({ sandbox: true, status: 'active' })\n );\n\n const sandboxData = sandboxResult?.success\n ? (sandboxResult.data as unknown as ListAccountsResponse | undefined)\n : undefined;\n const selection = selectMediaBuyAccount(sandboxData?.accounts ?? [], options);\n if (selection.accountRef) {\n sandboxStep.details = selection.details;\n steps.push(sandboxStep);\n return { accountRef: selection.accountRef, steps };\n }\n\n sandboxStep.details = sandboxResult?.success\n ? selection.details\n : 'list_accounts failed; falling back to natural key';\n if (hints.requireOperatorAuth === true || selection.ambiguous) {\n sandboxStep.passed = false;\n } else {\n sandboxStep.passed = true;\n sandboxStep.error = undefined;\n }\n steps.push(sandboxStep);\n if (hints.requireOperatorAuth === true || selection.ambiguous) {\n return { accountRef: undefined, steps };\n }\n\n const brand = resolveBrand(options);\n return { accountRef: { brand, operator: brand.domain, sandbox: true }, steps };\n }\n\n if (options.sandbox) {\n const brand = resolveBrand(options);\n return { accountRef: { brand, operator: brand.domain, sandbox: true }, steps };\n }\n\n if (shouldDiscoverExplicitAccount) {\n const { result: accountsResult, step: accountsStep } = await runStep<TaskResult>(\n 'Discover accounts for media buy',\n 'list_accounts',\n async () => listAccounts({ status: 'active' })\n );\n\n if (accountsResult?.success && accountsResult?.data) {\n const accountsData = accountsResult.data as unknown as ListAccountsResponse;\n const selection = selectMediaBuyAccount(accountsData.accounts ?? [], options);\n if (selection.accountRef) {\n accountsStep.details = selection.details;\n steps.push(accountsStep);\n return { accountRef: selection.accountRef, steps };\n }\n accountsStep.details = selection.details;\n } else {\n accountsStep.details = 'list_accounts call failed';\n }\n steps.push(accountsStep);\n return { accountRef: undefined, steps };\n }\n\n return { accountRef: resolveAccount(options), steps };\n}\n\nfunction getMediaBuyAccountResolutionHints(profile: AgentProfile): MediaBuyAccountResolutionHints {\n const capabilities = profile.raw_capabilities;\n if (!isRecord(capabilities) || !isRecord(capabilities.account)) {\n return {};\n }\n\n const requireOperatorAuth = capabilities.account.require_operator_auth;\n return typeof requireOperatorAuth === 'boolean' ? { requireOperatorAuth } : {};\n}\n\nfunction selectMediaBuyAccount(\n accounts: ListAccountsResponse['accounts'],\n options: TestOptions\n): { accountRef?: AccountReference; details: string; ambiguous?: boolean } {\n const candidates = accounts.filter(\n account =>\n typeof account.account_id === 'string' &&\n account.account_id.length > 0 &&\n (account.status === undefined || account.status === 'active')\n );\n if (candidates.length === 0) {\n return { details: 'list_accounts returned no active accounts with account_id' };\n }\n\n const brand = resolveBrand(options);\n const brandMatches = candidates.filter(account => accountMatchesBrand(account, brand));\n const selectable = brandMatches.length > 0 ? brandMatches : candidates;\n\n if (selectable.length === 1) {\n const accountId = selectable[0]!.account_id as string;\n const matchSource = brandMatches.length === 1 ? 'brand-matched ' : '';\n return {\n accountRef: { account_id: accountId },\n details: `Using ${matchSource}account: ${accountId}`,\n };\n }\n\n const accountIds = selectable.map(account => account.account_id).join(', ');\n return {\n details: `list_accounts returned multiple matching accounts (${accountIds}); provide media_buy_account_id/account_id to disambiguate`,\n ambiguous: true,\n };\n}\n\nfunction accountMatchesBrand(\n account: ListAccountsResponse['accounts'][number],\n brand: ReturnType<typeof resolveBrand>\n) {\n const accountBrand = account.brand;\n if (!isRecord(accountBrand) || accountBrand.domain !== brand.domain) {\n return false;\n }\n\n if (brand.brand_id && accountBrand.brand_id !== brand.brand_id) {\n return false;\n }\n\n return typeof account.operator !== 'string' || account.operator === brand.domain;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Resolve which account reference to use for audience sync.\n *\n * Priority: audience_account_id > account_id > sandbox discovery > sandbox natural key > list_accounts discovery.\n *\n * Extracted for testability — the listAccounts callback abstracts the client call.\n */\nexport async function resolveAccountForAudiences(\n options: TestOptions,\n tools: string[],\n listAccounts: (params: Record<string, unknown>) => Promise<TaskResult>\n): Promise<{ accountRef: AccountReference | undefined; steps: TestStepResult[] }> {\n const steps: TestStepResult[] = [];\n\n const explicitAccountId = options.audience_account_id ?? options.account_id;\n if (explicitAccountId) {\n return { accountRef: { account_id: explicitAccountId }, steps };\n }\n\n if (options.sandbox && tools.includes('list_accounts')) {\n // Sandbox with list_accounts: try explicit sandbox path first (discover pre-existing test accounts)\n const { result: sandboxResult, step: sandboxStep } = await runStep<TaskResult>(\n 'Discover sandbox accounts',\n 'list_accounts',\n async () => listAccounts({ sandbox: true })\n );\n\n const sandboxData = sandboxResult?.success\n ? (sandboxResult.data as unknown as ListAccountsResponse | undefined)\n : undefined;\n const sandboxAccounts = sandboxData?.accounts ?? [];\n if (sandboxAccounts[0]?.account_id) {\n sandboxStep.details = `Using sandbox account: ${sandboxAccounts[0].account_id}`;\n steps.push(sandboxStep);\n return { accountRef: { account_id: sandboxAccounts[0].account_id }, steps };\n }\n\n // Fall back to natural key — mark step as informational, not a failure\n const brand = resolveBrand(options);\n if (!sandboxResult?.success) {\n sandboxStep.details = 'list_accounts failed; falling back to natural key';\n } else {\n sandboxStep.details = 'No explicit sandbox accounts found; falling back to natural key';\n }\n sandboxStep.passed = true;\n sandboxStep.error = undefined;\n steps.push(sandboxStep);\n return { accountRef: { brand, operator: brand.domain, sandbox: true }, steps };\n }\n\n if (options.sandbox) {\n // Sandbox without list_accounts: implicit account model, use natural key\n const brand = resolveBrand(options);\n return { accountRef: { brand, operator: brand.domain, sandbox: true }, steps };\n }\n\n if (tools.includes('list_accounts')) {\n const { result: accountsResult, step: accountsStep } = await runStep<TaskResult>(\n 'Discover accounts for audience sync',\n 'list_accounts',\n async () => listAccounts({})\n );\n\n if (accountsResult?.success && accountsResult?.data) {\n const accountsData = accountsResult.data as unknown as ListAccountsResponse;\n const accounts = accountsData.accounts ?? [];\n if (accounts[0]?.account_id) {\n accountsStep.details = `Using account: ${accounts[0].account_id}`;\n steps.push(accountsStep);\n return { accountRef: { account_id: accounts[0].account_id }, steps };\n }\n accountsStep.details = 'list_accounts returned no accounts';\n } else {\n accountsStep.details = 'list_accounts call failed';\n }\n steps.push(accountsStep);\n }\n\n return { accountRef: undefined, steps };\n}\n\n/**\n * Test: Audience Sync\n * Tests sync_audiences: discovery -> create audience -> delete audience\n */\nexport async function testSyncAudiences(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n if (!profile.tools.includes('sync_audiences')) {\n steps.push({\n step: 'Sync audiences',\n task: 'sync_audiences',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support sync_audiences',\n });\n return { steps, profile };\n }\n\n const { accountRef, steps: accountSteps } = await resolveAccountForAudiences(\n options,\n profile.tools,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n async params => client.listAccounts(params as any) as Promise<TaskResult>\n );\n steps.push(...accountSteps);\n\n if (!accountRef) {\n steps.push({\n step: 'Sync audiences',\n task: 'sync_audiences',\n passed: false,\n duration_ms: 0,\n error:\n 'No account available. Provide audience_account_id, use sandbox: true, or ensure list_accounts is supported.',\n });\n return { steps, profile };\n }\n\n // Step 1: Discovery call — list existing audiences without modification\n const { result: discoveryResult, step: discoveryStep } = await runStep<TaskResult>(\n 'Discover existing audiences (discovery-only)',\n 'sync_audiences',\n async () =>\n client.syncAudiences({\n account: accountRef,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (discoveryResult?.success && discoveryResult?.data) {\n const discoveryData = discoveryResult.data as unknown as SyncAudiencesSuccess;\n const audiences = discoveryData.audiences ?? [];\n discoveryStep.details = `Found ${audiences.length} existing audience(s)`;\n discoveryStep.response_preview = JSON.stringify(\n {\n existing_audiences: audiences.length,\n audience_ids: audiences.map(a => a.audience_id).slice(0, 5),\n },\n null,\n 2\n );\n } else if (discoveryResult && !discoveryResult.success) {\n discoveryStep.passed = false;\n discoveryStep.error = discoveryResult.error || 'sync_audiences discovery call failed';\n }\n steps.push(discoveryStep);\n\n if (!discoveryResult?.success) {\n return { steps, profile };\n }\n\n // Step 2: Create a test audience\n const testAudienceId = `adcp-test-audience-${Date.now()}`;\n\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Create test audience',\n 'sync_audiences',\n async () =>\n client.syncAudiences({\n account: accountRef,\n audiences: [\n {\n audience_id: testAudienceId,\n name: 'AdCP E2E Test Audience',\n add: [{ hashed_email: TEST_HASHED_EMAIL }, { hashed_phone: TEST_HASHED_PHONE }],\n },\n ],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (createResult?.success && createResult?.data) {\n const createData = createResult.data as unknown as SyncAudiencesSuccess;\n const audiences = createData.audiences ?? [];\n const testAudience = audiences.find(a => a.audience_id === testAudienceId);\n createStep.details = `Created audience \"${testAudienceId}\", action: ${testAudience?.action}, status: ${testAudience?.status ?? 'n/a'}`;\n createStep.created_id = testAudienceId;\n createStep.response_preview = JSON.stringify(\n {\n audience_id: testAudience?.audience_id,\n action: testAudience?.action,\n status: testAudience?.status,\n uploaded_count: testAudience?.uploaded_count,\n matched_count: testAudience?.matched_count,\n effective_match_rate: testAudience?.effective_match_rate,\n match_breakdown: testAudience?.match_breakdown,\n },\n null,\n 2\n );\n\n // Advisory: report match breakdown availability\n if (testAudience?.status === 'ready') {\n if (testAudience.match_breakdown) {\n createStep.details += `, match_breakdown: ${testAudience.match_breakdown.length} ID type(s)`;\n }\n if (testAudience.effective_match_rate != null) {\n createStep.details += `, effective_match_rate: ${(testAudience.effective_match_rate * 100).toFixed(1)}%`;\n }\n }\n } else if (createResult && !createResult.success) {\n createStep.passed = false;\n createStep.error = createResult.error || 'sync_audiences create call failed';\n }\n steps.push(createStep);\n\n if (!createResult?.success) {\n return { steps, profile };\n }\n\n // Step 3: Delete the test audience\n const { result: deleteResult, step: deleteStep } = await runStep<TaskResult>(\n 'Delete test audience',\n 'sync_audiences',\n async () =>\n client.syncAudiences({\n account: accountRef,\n audiences: [\n {\n audience_id: testAudienceId,\n delete: true,\n },\n ],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (deleteResult?.success && deleteResult?.data) {\n const deleteData = deleteResult.data as unknown as SyncAudiencesSuccess;\n const audiences = deleteData.audiences ?? [];\n const deleted = audiences.find(a => a.audience_id === testAudienceId);\n deleteStep.details = `Deleted audience \"${testAudienceId}\", action: ${deleted?.action}`;\n deleteStep.response_preview = JSON.stringify(\n {\n audience_id: deleted?.audience_id,\n action: deleted?.action,\n },\n null,\n 2\n );\n } else if (deleteResult && !deleteResult.success) {\n deleteStep.passed = false;\n deleteStep.error = deleteResult.error || 'sync_audiences delete call failed';\n }\n steps.push(deleteStep);\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// State Machine Compliance Scenarios\n// ---------------------------------------------------------------------------\n\n/**\n * Extract media buy status from a response, handling nested shapes.\n */\nfunction extractStatus(data: Record<string, unknown>): string | undefined {\n const nested = data.media_buy as Record<string, unknown> | undefined;\n return getAuthoritativeMediaBuyStatus(data) ?? getAuthoritativeMediaBuyStatus(nested);\n}\n\n/**\n * Test: Media Buy Lifecycle\n * Exercises the full state machine: create -> pause -> resume -> get status -> cancel\n */\nexport async function testMediaBuyLifecycle(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Create a media buy to work with\n const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId || !profile?.tools.includes('update_media_buy')) {\n return { steps, profile };\n }\n\n // Track revisions across steps for monotonicity check\n const revisions: { step: string; revision: number }[] = [];\n\n // Step 1: Pause the media buy\n const { result: pauseResult, step: pauseStep } = await runStep<TaskResult>(\n 'Pause media buy',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n paused: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (pauseResult?.success && pauseResult?.data) {\n const data = pauseResult.data as unknown as Record<string, unknown>;\n const status = extractStatus(data);\n const pauseRevision = data.revision as number | undefined;\n if (pauseRevision !== undefined) revisions.push({ step: 'pause', revision: pauseRevision });\n pauseStep.details = `Paused media buy, status: ${status}`;\n pauseStep.response_preview = JSON.stringify({ media_buy_id: mediaBuyId, status, revision: pauseRevision }, null, 2);\n if (status && status !== 'paused') {\n pauseStep.warnings = [`Expected status 'paused', got '${status}'`];\n }\n } else if (pauseResult && !pauseResult.success) {\n pauseStep.passed = false;\n pauseStep.error = pauseResult.error || 'Pause operation failed';\n }\n steps.push(pauseStep);\n\n // Step 2: Resume the media buy\n const { result: resumeResult, step: resumeStep } = await runStep<TaskResult>(\n 'Resume media buy',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n paused: false,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (resumeResult?.success && resumeResult?.data) {\n const data = resumeResult.data as unknown as Record<string, unknown>;\n const status = extractStatus(data);\n const resumeRevision = data.revision as number | undefined;\n if (resumeRevision !== undefined) revisions.push({ step: 'resume', revision: resumeRevision });\n resumeStep.details = `Resumed media buy, status: ${status}`;\n resumeStep.response_preview = JSON.stringify(\n { media_buy_id: mediaBuyId, status, revision: resumeRevision },\n null,\n 2\n );\n if (status && status !== 'active' && status !== 'pending_start') {\n resumeStep.warnings = [`Expected status 'active' or 'pending_start', got '${status}'`];\n }\n } else if (resumeResult && !resumeResult.success) {\n resumeStep.passed = false;\n resumeStep.error = resumeResult.error || 'Resume operation failed';\n }\n steps.push(resumeStep);\n\n // Step 2b: Budget update — verify substantive field mutation\n // Find a package to update budget on\n let budgetPackageId: string | undefined;\n let originalBudget: number | undefined;\n if (profile.tools.includes('get_media_buys')) {\n const { result: fetchResult } = await runStep<TaskResult>(\n 'Fetch packages for budget test',\n 'get_media_buys',\n async () => client.executeTask('get_media_buys', { media_buy_ids: [mediaBuyId] }) as Promise<TaskResult>\n );\n if (fetchResult?.success && fetchResult?.data) {\n const mbs = (fetchResult.data.media_buys || []) as Array<Record<string, unknown>>;\n const mb = mbs.find((item: Record<string, unknown>) => item.media_buy_id === mediaBuyId) || mbs[0];\n const pkgs = (mb?.packages || []) as Array<Record<string, unknown>>;\n if (pkgs[0]) {\n budgetPackageId = pkgs[0].package_id as string;\n originalBudget = pkgs[0].budget as number;\n }\n }\n }\n\n if (budgetPackageId && originalBudget !== undefined) {\n const newBudget = Math.round(originalBudget * 1.2 * 100) / 100; // 20% increase\n const { result: budgetResult, step: budgetStep } = await runStep<TaskResult>(\n 'Update package budget',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n packages: [{ package_id: budgetPackageId, budget: newBudget }],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (budgetResult?.success && budgetResult?.data) {\n const data = budgetResult.data as unknown as Record<string, unknown>;\n const budgetRevision = data.revision as number | undefined;\n if (budgetRevision !== undefined) revisions.push({ step: 'budget_update', revision: budgetRevision });\n budgetStep.details = `Updated budget from $${originalBudget} to $${newBudget}`;\n budgetStep.response_preview = JSON.stringify(\n { media_buy_id: mediaBuyId, package_id: budgetPackageId, new_budget: newBudget, revision: budgetRevision },\n null,\n 2\n );\n } else if (budgetResult && !budgetResult.success) {\n const error = budgetResult.error || '';\n if (error.includes('BUDGET_EXCEEDED') || error.includes('budget_exceeded')) {\n budgetStep.passed = true;\n budgetStep.details = `Agent rejected budget increase with BUDGET_EXCEEDED — acceptable`;\n } else {\n budgetStep.passed = false;\n budgetStep.error = budgetResult.error || 'Budget update failed';\n }\n }\n steps.push(budgetStep);\n }\n\n // Step 3: Get status and check valid_actions, confirmed_at, revision, history (if get_media_buys available)\n if (profile.tools.includes('get_media_buys')) {\n const { result: statusResult, step: statusStep } = await runStep<TaskResult>(\n 'Get media buy status and valid_actions',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n media_buy_ids: [mediaBuyId],\n include_history: 10,\n }) as Promise<TaskResult>\n );\n\n if (statusResult?.success && statusResult?.data) {\n const mediaBuys = (statusResult.data.media_buys || []) as Array<Record<string, unknown>>;\n const mediaBuy =\n mediaBuys.find((item: Record<string, unknown>) => item.media_buy_id === mediaBuyId) || mediaBuys[0];\n\n if (!mediaBuy) {\n statusStep.passed = false;\n statusStep.error = 'get_media_buys did not return the created media buy';\n } else {\n const validActions = mediaBuy.valid_actions as string[] | undefined;\n const mbRevision = mediaBuy.revision as number | undefined;\n const mbConfirmedAt = mediaBuy.confirmed_at as string | undefined;\n const history = mediaBuy.history as Array<Record<string, unknown>> | undefined;\n const packages = (mediaBuy.packages || []) as Array<Record<string, unknown>>;\n const hasCreativeDeadline = packages.some(p => p.creative_deadline) || !!mediaBuy.creative_deadline;\n const status = extractStatus(mediaBuy);\n\n // Validate history entry shape if present\n let historyValid = true;\n if (history?.length) {\n const missingTimestamp = history.some(h => !h.timestamp);\n const missingAction = history.some(h => !h.action);\n if (missingTimestamp || missingAction) historyValid = false;\n }\n\n statusStep.details = `Status: ${status}, valid_actions: ${validActions ? validActions.join(', ') : 'not provided'}, revision: ${mbRevision ?? 'not provided'}`;\n statusStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuy.media_buy_id,\n status,\n confirmed_at: mbConfirmedAt,\n revision: mbRevision,\n valid_actions: validActions,\n history_entries: history?.length ?? 0,\n history_valid: historyValid,\n has_creative_deadline: hasCreativeDeadline,\n sandbox: mediaBuy.sandbox,\n },\n null,\n 2\n );\n statusStep.observation_data = {\n valid_actions: validActions,\n sandbox: mediaBuy.sandbox,\n status,\n has_creative_deadline: hasCreativeDeadline,\n history_entries: history?.length ?? 0,\n history_valid: historyValid,\n };\n }\n } else if (statusResult && !statusResult.success) {\n statusStep.passed = false;\n statusStep.error = statusResult.error || 'get_media_buys failed';\n }\n steps.push(statusStep);\n }\n\n // Step 3b: Revision concurrency check — use actual stale revision from an earlier step\n const lastRevision = revisions.length > 0 ? revisions[revisions.length - 1]!.revision : undefined;\n const staleRevision = revisions.length >= 2 ? revisions[0]!.revision : -1;\n\n const { result: conflictResult, step: conflictStep } = await runStep<TaskResult>(\n 'Update with stale revision (expect CONFLICT)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n revision: staleRevision,\n end_time: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (conflictResult && !conflictResult.success) {\n const error = conflictResult.error || '';\n if (error.includes('CONFLICT') || error.includes('conflict') || error.includes('revision')) {\n conflictStep.passed = true;\n conflictStep.details = `Correctly rejected stale revision ${staleRevision} with CONFLICT (current: ${lastRevision ?? 'unknown'})`;\n } else {\n // Agent rejected for another reason — still acceptable, revision may not be supported\n conflictStep.passed = true;\n conflictStep.details = `Agent rejected update: ${error}`;\n conflictStep.warnings = [\n 'Agent did not return CONFLICT for stale revision — revision concurrency may not be supported',\n ];\n }\n } else if (conflictResult?.success) {\n // Agent accepted stale revision — revision concurrency not enforced\n conflictStep.passed = true;\n conflictStep.details = `Agent accepted stale revision ${staleRevision} — optimistic concurrency not enforced`;\n conflictStep.warnings = ['Agent does not enforce optimistic concurrency via revision numbers'];\n } else if (!conflictResult) {\n conflictStep.passed = false;\n conflictStep.error = 'No response from update_media_buy';\n }\n steps.push(conflictStep);\n\n // Step 3c: Check revision monotonicity\n if (revisions.length >= 2) {\n const monotonicStep: TestStepResult = {\n step: 'Revision monotonicity check',\n task: 'update_media_buy',\n passed: true,\n duration_ms: 0,\n };\n const isMonotonic = revisions.every((r, i) => i === 0 || r.revision > revisions[i - 1]!.revision);\n if (isMonotonic) {\n monotonicStep.details = `Revisions are monotonically increasing: ${revisions.map(r => `${r.step}=${r.revision}`).join(' → ')}`;\n } else {\n monotonicStep.passed = true; // advisory, not a hard fail\n monotonicStep.details = `Revisions: ${revisions.map(r => `${r.step}=${r.revision}`).join(' → ')}`;\n monotonicStep.warnings = [\n `Revision numbers are not monotonically increasing — buyers depend on this for concurrency safety`,\n ];\n }\n steps.push(monotonicStep);\n }\n\n // Step 4: Cancel the media buy\n const { result: cancelResult, step: cancelStep } = await runStep<TaskResult>(\n 'Cancel media buy',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n canceled: true,\n cancellation_reason: 'AdCP compliance test — lifecycle scenario',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (cancelResult?.success && cancelResult?.data) {\n const data = cancelResult.data as unknown as Record<string, unknown>;\n const nested = data.media_buy as Record<string, unknown> | undefined;\n const status = extractStatus(data);\n const cancelRevision = (data.revision ?? nested?.revision) as number | undefined;\n cancelStep.details = `Canceled media buy, status: ${status}`;\n const canceledBy = (data.canceled_by ?? nested?.canceled_by) as string | undefined;\n const canceledAt = (data.canceled_at ?? nested?.canceled_at) as string | undefined;\n if (cancelRevision !== undefined) revisions.push({ step: 'cancel', revision: cancelRevision });\n cancelStep.response_preview = JSON.stringify(\n { media_buy_id: mediaBuyId, status, revision: cancelRevision, canceled_by: canceledBy, canceled_at: canceledAt },\n null,\n 2\n );\n cancelStep.observation_data = { status, canceled_by: canceledBy, canceled_at: canceledAt };\n if (status && status !== 'canceled') {\n cancelStep.warnings = [`Expected status 'canceled', got '${status}'`];\n }\n } else if (cancelResult && !cancelResult.success) {\n // NOT_CANCELLABLE is a valid response — agent may not support cancellation\n const error = cancelResult.error || '';\n if (error.includes('NOT_CANCELLABLE') || error.includes('not_cancellable')) {\n cancelStep.passed = true;\n cancelStep.details = 'Agent does not support cancellation (NOT_CANCELLABLE)';\n } else {\n cancelStep.passed = false;\n cancelStep.error = cancelResult.error || 'Cancel operation failed';\n }\n }\n steps.push(cancelStep);\n\n return { steps, profile };\n}\n\n/**\n * Test: Terminal State Enforcement\n * Verifies agents reject updates to media buys in terminal states.\n */\nexport async function testTerminalStateEnforcement(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Create and cancel a media buy\n const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId || !profile?.tools.includes('update_media_buy')) {\n return { steps, profile };\n }\n\n // Cancel the media buy to put it in a terminal state\n const { result: cancelResult, step: cancelStep } = await runStep<TaskResult>(\n 'Cancel media buy (setup)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n canceled: true,\n cancellation_reason: 'AdCP compliance test — terminal state enforcement',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (cancelResult?.success && cancelResult?.data) {\n const data = cancelResult.data as unknown as Record<string, unknown>;\n cancelStep.details = `Canceled media buy, status: ${extractStatus(data)}`;\n } else if (cancelResult && !cancelResult.success) {\n const error = cancelResult.error || '';\n if (error.includes('NOT_CANCELLABLE') || error.includes('not_cancellable')) {\n // Agent doesn't support cancellation — try to find a completed buy instead\n cancelStep.passed = true;\n cancelStep.details = 'Agent does not support cancellation — will check for completed media buys instead';\n steps.push(cancelStep);\n\n // Look for a completed media buy to test terminal state enforcement against\n if (profile.tools.includes('get_media_buys')) {\n const { result: completedResult, step: completedStep } = await runStep<TaskResult>(\n 'Find completed media buy for terminal state test',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n status_filter: ['completed'],\n pagination: { max_results: 1 },\n }) as Promise<TaskResult>\n );\n\n if (completedResult?.success && completedResult?.data) {\n const completedBuys = (completedResult.data.media_buys || []) as Array<Record<string, unknown>>;\n if (completedBuys.length > 0) {\n const completedId = completedBuys[0]!.media_buy_id as string;\n completedStep.details = `Found completed media buy: ${completedId}`;\n steps.push(completedStep);\n\n // Try to update the completed media buy\n const { result: updateCompletedResult, step: updateCompletedStep } = await runStep<TaskResult>(\n 'Update completed media buy (expect rejection)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: completedId,\n paused: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (updateCompletedResult?.success) {\n updateCompletedStep.passed = false;\n updateCompletedStep.error =\n 'Agent accepted update to completed media buy — should reject with INVALID_STATE';\n } else if (updateCompletedResult) {\n updateCompletedStep.passed = true;\n const err = updateCompletedResult.error || '';\n const hasCode = err.includes('INVALID_STATE') || err.includes('invalid_state');\n updateCompletedStep.details = hasCode\n ? 'Correctly rejected update to completed media buy with INVALID_STATE'\n : `Correctly rejected update to completed media buy: ${err}`;\n if (!hasCode && err) {\n updateCompletedStep.warnings = ['Agent rejected the update but did not use INVALID_STATE error code'];\n }\n }\n steps.push(updateCompletedStep);\n } else {\n completedStep.details = 'No completed media buys found — cannot test terminal state enforcement';\n steps.push(completedStep);\n }\n } else {\n completedStep.passed = false;\n completedStep.error = completedResult?.error || 'Failed to query for completed media buys';\n steps.push(completedStep);\n }\n }\n\n return { steps, profile };\n }\n cancelStep.passed = false;\n cancelStep.error = cancelResult.error || 'Cancel setup failed';\n }\n steps.push(cancelStep);\n\n // Try to pause the canceled media buy — should be rejected\n const { result: pauseTerminalResult, step: pauseTerminalStep } = await runStep<TaskResult>(\n 'Update canceled media buy (expect rejection)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n paused: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (pauseTerminalResult?.success) {\n pauseTerminalStep.passed = false;\n pauseTerminalStep.error = 'Agent accepted update to canceled media buy — should reject with INVALID_STATE';\n } else if (pauseTerminalResult) {\n // Agent returned { success: false } — correct behavior\n pauseTerminalStep.passed = true;\n const error = pauseTerminalResult.error || '';\n const hasExpectedCode = error.includes('INVALID_STATE') || error.includes('invalid_state');\n pauseTerminalStep.details = hasExpectedCode\n ? 'Correctly rejected with INVALID_STATE'\n : `Correctly rejected update to canceled media buy: ${error}`;\n if (!hasExpectedCode && error) {\n pauseTerminalStep.warnings = ['Agent rejected the update but did not use INVALID_STATE error code'];\n }\n }\n // else: result is undefined (exception thrown) — runStep already set passed=false and error\n steps.push(pauseTerminalStep);\n\n // Try to cancel again — should also be rejected (or idempotent)\n const { result: reCancelResult, step: reCancelStep } = await runStep<TaskResult>(\n 'Cancel already-canceled media buy (expect rejection)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n canceled: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (reCancelResult?.success) {\n // Idempotent cancellation is acceptable\n reCancelStep.passed = true;\n reCancelStep.details = 'Agent accepted re-cancellation (idempotent) — acceptable behavior';\n } else if (reCancelResult) {\n reCancelStep.passed = true;\n const error = reCancelResult.error || '';\n reCancelStep.details = `Correctly rejected re-cancellation: ${error}`;\n }\n steps.push(reCancelStep);\n\n // Also check completed terminal state if get_media_buys is available\n if (profile.tools.includes('get_media_buys')) {\n const { result: completedResult } = await runStep<TaskResult>(\n 'Find completed media buy',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n status_filter: ['completed'],\n pagination: { max_results: 1 },\n }) as Promise<TaskResult>\n );\n\n if (completedResult?.success && completedResult?.data) {\n const completedBuys = (completedResult.data.media_buys || []) as Array<Record<string, unknown>>;\n if (completedBuys.length > 0) {\n const completedId = completedBuys[0]!.media_buy_id as string;\n const { result: updateCompletedResult, step: updateCompletedStep } = await runStep<TaskResult>(\n 'Update completed media buy (expect rejection)',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: completedId,\n paused: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (updateCompletedResult?.success) {\n updateCompletedStep.passed = false;\n updateCompletedStep.error = 'Agent accepted update to completed media buy — should reject with INVALID_STATE';\n } else if (updateCompletedResult) {\n updateCompletedStep.passed = true;\n const err = updateCompletedResult.error || '';\n const hasCode = err.includes('INVALID_STATE') || err.includes('invalid_state');\n updateCompletedStep.details = hasCode\n ? 'Correctly rejected update to completed media buy with INVALID_STATE'\n : `Correctly rejected update to completed media buy: ${err}`;\n }\n steps.push(updateCompletedStep);\n }\n }\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Package Lifecycle\n * Tests package-level pause/resume independent of media buy status.\n */\nexport async function testPackageLifecycle(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Create a media buy\n const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId || !profile?.tools.includes('update_media_buy')) {\n return { steps, profile };\n }\n\n // Find a package ID — try get_media_buys first, fall back to convention\n let packageId = 'pkg-0';\n\n if (profile.tools.includes('get_media_buys')) {\n const { result: fetchResult, step: fetchStep } = await runStep<TaskResult>(\n 'Fetch package IDs',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n media_buy_ids: [mediaBuyId],\n }) as Promise<TaskResult>\n );\n\n if (fetchResult?.success && fetchResult?.data) {\n const mediaBuys = (fetchResult.data.media_buys || []) as Array<Record<string, unknown>>;\n const mediaBuy =\n mediaBuys.find((item: Record<string, unknown>) => item.media_buy_id === mediaBuyId) || mediaBuys[0];\n const packages = (mediaBuy?.packages || []) as Array<Record<string, unknown>>;\n if (packages[0]?.package_id) {\n packageId = packages[0].package_id as string;\n fetchStep.details = `Found package ${packageId}`;\n } else {\n fetchStep.details = `No packages found, falling back to '${packageId}'`;\n }\n } else if (fetchResult && !fetchResult.success) {\n fetchStep.passed = false;\n fetchStep.error = fetchResult.error || 'get_media_buys failed during package ID discovery';\n }\n steps.push(fetchStep);\n }\n\n // Step 1: Pause a package\n const { result: pauseResult, step: pauseStep } = await runStep<TaskResult>(\n 'Pause package',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n packages: [{ package_id: packageId, paused: true }],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (pauseResult?.success && pauseResult?.data) {\n const data = pauseResult.data as unknown as Record<string, unknown>;\n const affectedPackages = (data.affected_packages || []) as Array<Record<string, unknown>>;\n const pkg = affectedPackages.find(p => p.package_id === packageId) || affectedPackages[0];\n pauseStep.details = `Paused package ${packageId}, paused: ${pkg?.paused}`;\n pauseStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuyId,\n media_buy_status: extractStatus(data),\n package_id: pkg?.package_id,\n package_paused: pkg?.paused,\n },\n null,\n 2\n );\n } else if (pauseResult && !pauseResult.success) {\n pauseStep.passed = false;\n pauseStep.error = pauseResult.error || 'Package pause failed';\n }\n steps.push(pauseStep);\n\n // Step 2: Resume the package\n const { result: resumeResult, step: resumeStep } = await runStep<TaskResult>(\n 'Resume package',\n 'update_media_buy',\n async () =>\n client.updateMediaBuy({\n media_buy_id: mediaBuyId,\n packages: [{ package_id: packageId, paused: false }],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing\n } as any) as Promise<TaskResult>\n );\n\n if (resumeResult?.success && resumeResult?.data) {\n const data = resumeResult.data as unknown as Record<string, unknown>;\n const affectedPackages = (data.affected_packages || []) as Array<Record<string, unknown>>;\n const pkg = affectedPackages.find(p => p.package_id === packageId) || affectedPackages[0];\n resumeStep.details = `Resumed package ${packageId}, paused: ${pkg?.paused}`;\n resumeStep.response_preview = JSON.stringify(\n {\n media_buy_id: mediaBuyId,\n media_buy_status: extractStatus(data),\n package_id: pkg?.package_id,\n package_paused: pkg?.paused,\n },\n null,\n 2\n );\n } else if (resumeResult && !resumeResult.success) {\n resumeStep.passed = false;\n resumeStep.error = resumeResult.error || 'Package resume failed';\n }\n steps.push(resumeStep);\n\n // Step 3: Verify media buy is still active\n if (profile.tools.includes('get_media_buys')) {\n const { result: verifyResult, step: verifyStep } = await runStep<TaskResult>(\n 'Verify media buy still active after package operations',\n 'get_media_buys',\n async () =>\n client.executeTask('get_media_buys', {\n media_buy_ids: [mediaBuyId],\n }) as Promise<TaskResult>\n );\n\n if (verifyResult?.success && verifyResult?.data) {\n const mediaBuys = (verifyResult.data.media_buys || []) as Array<Record<string, unknown>>;\n const mediaBuy =\n mediaBuys.find((item: Record<string, unknown>) => item.media_buy_id === mediaBuyId) || mediaBuys[0];\n const status = mediaBuy ? extractStatus(mediaBuy) : undefined;\n\n if (status === 'active' || status === 'pending_start') {\n verifyStep.details = `Media buy still ${status} after package-level operations`;\n } else {\n verifyStep.details = `Media buy status is '${status}' — expected 'active' or 'pending_start'`;\n verifyStep.warnings = [`Package-level pause/resume changed media buy status to '${status}'`];\n }\n verifyStep.response_preview = JSON.stringify({ media_buy_id: mediaBuy?.media_buy_id, status }, null, 2);\n } else if (verifyResult && !verifyResult.success) {\n verifyStep.passed = false;\n verifyStep.error = verifyResult.error || 'get_media_buys verification failed';\n }\n steps.push(verifyStep);\n }\n\n return { steps, profile };\n}\n"],"mappings":"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","names":[]}