@adcp/sdk 12.1.1 → 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 (410) 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/provider-cache.d.mts +7 -0
  18. package/dist/lib/auth/oauth/provider-cache.d.ts +8 -0
  19. package/dist/lib/auth/oauth/provider-cache.d.ts.map +1 -0
  20. package/dist/lib/auth/oauth/provider-cache.js +44 -0
  21. package/dist/lib/auth/oauth/provider-cache.js.map +1 -0
  22. package/dist/lib/auth/oauth/provider-cache.mjs +19 -0
  23. package/dist/lib/auth/oauth/provider-cache.mjs.map +1 -0
  24. package/dist/lib/conformance/invariants/uniformError.js +1 -1
  25. package/dist/lib/conformance/invariants/uniformError.js.map +1 -1
  26. package/dist/lib/conformance/invariants/uniformError.mjs +1 -1
  27. package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
  28. package/dist/lib/conformance/runners.js +1 -1
  29. package/dist/lib/conformance/runners.js.map +1 -1
  30. package/dist/lib/conformance/runners.mjs +1 -1
  31. package/dist/lib/conformance/runners.mjs.map +1 -1
  32. package/dist/lib/conformance/seeder.js +5 -5
  33. package/dist/lib/conformance/seeder.js.map +1 -1
  34. package/dist/lib/conformance/seeder.mjs +5 -5
  35. package/dist/lib/conformance/seeder.mjs.map +1 -1
  36. package/dist/lib/core/ADCPMultiAgentClient.d.mts +26 -29
  37. package/dist/lib/core/ADCPMultiAgentClient.d.ts +26 -29
  38. package/dist/lib/core/ADCPMultiAgentClient.d.ts.map +1 -1
  39. package/dist/lib/core/ADCPMultiAgentClient.js +27 -19
  40. package/dist/lib/core/ADCPMultiAgentClient.js.map +1 -1
  41. package/dist/lib/core/ADCPMultiAgentClient.mjs +27 -19
  42. package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
  43. package/dist/lib/core/AgentClient.d.mts +148 -138
  44. package/dist/lib/core/AgentClient.d.ts +148 -138
  45. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  46. package/dist/lib/core/AgentClient.js +174 -85
  47. package/dist/lib/core/AgentClient.js.map +1 -1
  48. package/dist/lib/core/AgentClient.mjs +174 -85
  49. package/dist/lib/core/AgentClient.mjs.map +1 -1
  50. package/dist/lib/core/AsyncHandler.d.mts +18 -16
  51. package/dist/lib/core/AsyncHandler.d.ts +18 -16
  52. package/dist/lib/core/AsyncHandler.d.ts.map +1 -1
  53. package/dist/lib/core/AsyncHandler.js +22 -1
  54. package/dist/lib/core/AsyncHandler.js.map +1 -1
  55. package/dist/lib/core/AsyncHandler.mjs +22 -1
  56. package/dist/lib/core/AsyncHandler.mjs.map +1 -1
  57. package/dist/lib/core/ConversationTypes.d.mts +6 -2
  58. package/dist/lib/core/ConversationTypes.d.ts +6 -2
  59. package/dist/lib/core/ConversationTypes.d.ts.map +1 -1
  60. package/dist/lib/core/ConversationTypes.js.map +1 -1
  61. package/dist/lib/core/CreativeAgentClient.d.mts +41 -17
  62. package/dist/lib/core/CreativeAgentClient.d.ts +41 -17
  63. package/dist/lib/core/CreativeAgentClient.d.ts.map +1 -1
  64. package/dist/lib/core/CreativeAgentClient.js +39 -12
  65. package/dist/lib/core/CreativeAgentClient.js.map +1 -1
  66. package/dist/lib/core/CreativeAgentClient.mjs +39 -12
  67. package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
  68. package/dist/lib/core/SingleAgentClient.d.mts +127 -50
  69. package/dist/lib/core/SingleAgentClient.d.ts +127 -50
  70. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  71. package/dist/lib/core/SingleAgentClient.js +1617 -177
  72. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  73. package/dist/lib/core/SingleAgentClient.mjs +1627 -177
  74. package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
  75. package/dist/lib/core/TaskExecutor.d.mts +9 -0
  76. package/dist/lib/core/TaskExecutor.d.ts +9 -0
  77. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  78. package/dist/lib/core/TaskExecutor.js +136 -43
  79. package/dist/lib/core/TaskExecutor.js.map +1 -1
  80. package/dist/lib/core/TaskExecutor.mjs +136 -43
  81. package/dist/lib/core/TaskExecutor.mjs.map +1 -1
  82. package/dist/lib/index.d.mts +111 -17
  83. package/dist/lib/index.d.ts +111 -17
  84. package/dist/lib/index.d.ts.map +1 -1
  85. package/dist/lib/index.js +94 -94
  86. package/dist/lib/index.js.map +1 -1
  87. package/dist/lib/index.mjs +93 -94
  88. package/dist/lib/index.mjs.map +1 -1
  89. package/dist/lib/protocols/index.d.ts.map +1 -1
  90. package/dist/lib/protocols/index.js +6 -15
  91. package/dist/lib/protocols/index.js.map +1 -1
  92. package/dist/lib/protocols/index.mjs +6 -16
  93. package/dist/lib/protocols/index.mjs.map +1 -1
  94. package/dist/lib/protocols/mcp-modern.d.ts.map +1 -1
  95. package/dist/lib/protocols/mcp-modern.js +87 -12
  96. package/dist/lib/protocols/mcp-modern.js.map +1 -1
  97. package/dist/lib/protocols/mcp-modern.mjs +89 -12
  98. package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
  99. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  100. package/dist/lib/server/create-adcp-server.d.mts +6 -0
  101. package/dist/lib/server/create-adcp-server.d.ts +6 -0
  102. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  103. package/dist/lib/server/create-adcp-server.js +295 -48
  104. package/dist/lib/server/create-adcp-server.js.map +1 -1
  105. package/dist/lib/server/create-adcp-server.mjs +301 -50
  106. package/dist/lib/server/create-adcp-server.mjs.map +1 -1
  107. package/dist/lib/server/decisioning/assembly-helpers.d.mts +27 -13
  108. package/dist/lib/server/decisioning/assembly-helpers.d.ts +27 -13
  109. package/dist/lib/server/decisioning/assembly-helpers.d.ts.map +1 -1
  110. package/dist/lib/server/decisioning/assembly-helpers.js +136 -14
  111. package/dist/lib/server/decisioning/assembly-helpers.js.map +1 -1
  112. package/dist/lib/server/decisioning/assembly-helpers.mjs +134 -13
  113. package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
  114. package/dist/lib/server/decisioning/index.d.mts +13 -12
  115. package/dist/lib/server/decisioning/index.d.ts +13 -12
  116. package/dist/lib/server/decisioning/index.d.ts.map +1 -1
  117. package/dist/lib/server/decisioning/index.js +6 -0
  118. package/dist/lib/server/decisioning/index.js.map +1 -1
  119. package/dist/lib/server/decisioning/index.mjs +9 -3
  120. package/dist/lib/server/decisioning/index.mjs.map +1 -1
  121. package/dist/lib/server/decisioning/list-helpers.d.mts +13 -3
  122. package/dist/lib/server/decisioning/list-helpers.d.ts +13 -3
  123. package/dist/lib/server/decisioning/list-helpers.d.ts.map +1 -1
  124. package/dist/lib/server/decisioning/list-helpers.js +13 -3
  125. package/dist/lib/server/decisioning/list-helpers.js.map +1 -1
  126. package/dist/lib/server/decisioning/list-helpers.mjs +11 -2
  127. package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
  128. package/dist/lib/server/decisioning/manifest-helpers.d.mts +5 -3
  129. package/dist/lib/server/decisioning/manifest-helpers.d.ts +5 -3
  130. package/dist/lib/server/decisioning/manifest-helpers.d.ts.map +1 -1
  131. package/dist/lib/server/decisioning/manifest-helpers.js.map +1 -1
  132. package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
  133. package/dist/lib/server/decisioning/proposal/dispatch.d.mts +2 -2
  134. package/dist/lib/server/decisioning/proposal/dispatch.d.ts +2 -2
  135. package/dist/lib/server/decisioning/proposal/dispatch.d.ts.map +1 -1
  136. package/dist/lib/server/decisioning/proposal/dispatch.js.map +1 -1
  137. package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
  138. package/dist/lib/server/decisioning/proposal/index.d.mts +1 -1
  139. package/dist/lib/server/decisioning/proposal/index.d.ts +1 -1
  140. package/dist/lib/server/decisioning/proposal/index.d.ts.map +1 -1
  141. package/dist/lib/server/decisioning/proposal/index.js.map +1 -1
  142. package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
  143. package/dist/lib/server/decisioning/proposal/lifecycle.d.mts +3 -2
  144. package/dist/lib/server/decisioning/proposal/lifecycle.d.ts +3 -2
  145. package/dist/lib/server/decisioning/proposal/lifecycle.d.ts.map +1 -1
  146. package/dist/lib/server/decisioning/proposal/lifecycle.js.map +1 -1
  147. package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
  148. package/dist/lib/server/decisioning/proposal/mock-manager.d.mts +3 -3
  149. package/dist/lib/server/decisioning/proposal/mock-manager.d.ts +3 -3
  150. package/dist/lib/server/decisioning/proposal/mock-manager.d.ts.map +1 -1
  151. package/dist/lib/server/decisioning/proposal/mock-manager.js.map +1 -1
  152. package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
  153. package/dist/lib/server/decisioning/proposal/types.d.mts +10 -6
  154. package/dist/lib/server/decisioning/proposal/types.d.ts +10 -6
  155. package/dist/lib/server/decisioning/proposal/types.d.ts.map +1 -1
  156. package/dist/lib/server/decisioning/proposal/types.js.map +1 -1
  157. package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
  158. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +21 -2
  159. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +21 -2
  160. package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
  161. package/dist/lib/server/decisioning/runtime/from-platform.js +754 -81
  162. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
  163. package/dist/lib/server/decisioning/runtime/from-platform.mjs +763 -81
  164. package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
  165. package/dist/lib/server/decisioning/specialisms/brand-rights.d.mts +9 -9
  166. package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts +9 -9
  167. package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts.map +1 -1
  168. package/dist/lib/server/decisioning/specialisms/brand-rights.js.map +1 -1
  169. package/dist/lib/server/decisioning/specialisms/content-standards.d.mts +16 -16
  170. package/dist/lib/server/decisioning/specialisms/content-standards.d.ts +16 -16
  171. package/dist/lib/server/decisioning/specialisms/content-standards.d.ts.map +1 -1
  172. package/dist/lib/server/decisioning/specialisms/content-standards.js.map +1 -1
  173. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.mts +15 -13
  174. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts +15 -13
  175. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts.map +1 -1
  176. package/dist/lib/server/decisioning/specialisms/creative-ad-server.js.map +1 -1
  177. package/dist/lib/server/decisioning/specialisms/creative.d.mts +12 -11
  178. package/dist/lib/server/decisioning/specialisms/creative.d.ts +12 -11
  179. package/dist/lib/server/decisioning/specialisms/creative.d.ts.map +1 -1
  180. package/dist/lib/server/decisioning/specialisms/creative.js.map +1 -1
  181. package/dist/lib/server/decisioning/specialisms/sales.d.mts +25 -15
  182. package/dist/lib/server/decisioning/specialisms/sales.d.ts +25 -15
  183. package/dist/lib/server/decisioning/specialisms/sales.d.ts.map +1 -1
  184. package/dist/lib/server/decisioning/specialisms/sales.js.map +1 -1
  185. package/dist/lib/server/index.d.mts +3 -3
  186. package/dist/lib/server/index.d.ts +3 -3
  187. package/dist/lib/server/index.d.ts.map +1 -1
  188. package/dist/lib/server/index.js +72 -72
  189. package/dist/lib/server/index.js.map +1 -1
  190. package/dist/lib/server/index.mjs +36 -36
  191. package/dist/lib/server/index.mjs.map +1 -1
  192. package/dist/lib/server/legacy/v5/index.d.mts +1 -0
  193. package/dist/lib/server/legacy/v5/index.d.ts +1 -0
  194. package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
  195. package/dist/lib/server/legacy/v5/index.js +74 -1
  196. package/dist/lib/server/legacy/v5/index.js.map +1 -1
  197. package/dist/lib/server/legacy/v5/index.mjs +75 -1
  198. package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
  199. package/dist/lib/server/responses.d.mts +2 -2
  200. package/dist/lib/server/responses.d.ts +2 -2
  201. package/dist/lib/server/responses.js.map +1 -1
  202. package/dist/lib/server/responses.mjs.map +1 -1
  203. package/dist/lib/testing/client.js +1 -1
  204. package/dist/lib/testing/client.js.map +1 -1
  205. package/dist/lib/testing/client.mjs +1 -1
  206. package/dist/lib/testing/client.mjs.map +1 -1
  207. package/dist/lib/testing/scenarios/brand-rights.js +6 -6
  208. package/dist/lib/testing/scenarios/brand-rights.js.map +1 -1
  209. package/dist/lib/testing/scenarios/brand-rights.mjs +6 -6
  210. package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
  211. package/dist/lib/testing/scenarios/creative.js +7 -7
  212. package/dist/lib/testing/scenarios/creative.js.map +1 -1
  213. package/dist/lib/testing/scenarios/creative.mjs +7 -7
  214. package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
  215. package/dist/lib/testing/scenarios/discovery.js +2 -2
  216. package/dist/lib/testing/scenarios/discovery.js.map +1 -1
  217. package/dist/lib/testing/scenarios/discovery.mjs +2 -2
  218. package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
  219. package/dist/lib/testing/scenarios/edge-cases.js +11 -11
  220. package/dist/lib/testing/scenarios/edge-cases.js.map +1 -1
  221. package/dist/lib/testing/scenarios/edge-cases.mjs +11 -11
  222. package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
  223. package/dist/lib/testing/scenarios/governance.d.ts.map +1 -1
  224. package/dist/lib/testing/scenarios/governance.js +16 -22
  225. package/dist/lib/testing/scenarios/governance.js.map +1 -1
  226. package/dist/lib/testing/scenarios/governance.mjs +16 -22
  227. package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
  228. package/dist/lib/testing/scenarios/media-buy.js +5 -5
  229. package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
  230. package/dist/lib/testing/scenarios/media-buy.mjs +5 -5
  231. package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
  232. package/dist/lib/testing/scenarios/schema-compliance.js +1 -1
  233. package/dist/lib/testing/scenarios/schema-compliance.js.map +1 -1
  234. package/dist/lib/testing/scenarios/schema-compliance.mjs +1 -1
  235. package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
  236. package/dist/lib/testing/scenarios/trusted-match.d.ts.map +1 -1
  237. package/dist/lib/testing/scenarios/trusted-match.js +4 -3
  238. package/dist/lib/testing/scenarios/trusted-match.js.map +1 -1
  239. package/dist/lib/testing/scenarios/trusted-match.mjs +4 -3
  240. package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
  241. package/dist/lib/testing/storyboard/shape-drift-hints.d.mts +3 -4
  242. package/dist/lib/testing/storyboard/shape-drift-hints.d.ts +3 -4
  243. package/dist/lib/testing/storyboard/shape-drift-hints.d.ts.map +1 -1
  244. package/dist/lib/testing/storyboard/shape-drift-hints.js +27 -27
  245. package/dist/lib/testing/storyboard/shape-drift-hints.js.map +1 -1
  246. package/dist/lib/testing/storyboard/shape-drift-hints.mjs +27 -27
  247. package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
  248. package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
  249. package/dist/lib/testing/storyboard/task-map.js +43 -5
  250. package/dist/lib/testing/storyboard/task-map.js.map +1 -1
  251. package/dist/lib/testing/storyboard/task-map.mjs +43 -5
  252. package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
  253. package/dist/lib/testing/test-helpers.d.mts +2 -2
  254. package/dist/lib/testing/test-helpers.d.ts +2 -2
  255. package/dist/lib/testing/test-helpers.js.map +1 -1
  256. package/dist/lib/testing/test-helpers.mjs.map +1 -1
  257. package/dist/lib/types/adcp.d.mts +14 -14
  258. package/dist/lib/types/adcp.d.ts +14 -14
  259. package/dist/lib/types/adcp.d.ts.map +1 -1
  260. package/dist/lib/types/adcp.js.map +1 -1
  261. package/dist/lib/types/adcp.mjs.map +1 -1
  262. package/dist/lib/types/index.d.mts +2 -2
  263. package/dist/lib/types/index.d.ts +2 -2
  264. package/dist/lib/types/index.d.ts.map +1 -1
  265. package/dist/lib/types/index.js.map +1 -1
  266. package/dist/lib/types/index.mjs.map +1 -1
  267. package/dist/lib/utils/capabilities.d.mts +6 -0
  268. package/dist/lib/utils/capabilities.d.ts +6 -0
  269. package/dist/lib/utils/capabilities.d.ts.map +1 -1
  270. package/dist/lib/utils/capabilities.js +4 -0
  271. package/dist/lib/utils/capabilities.js.map +1 -1
  272. package/dist/lib/utils/capabilities.mjs +4 -0
  273. package/dist/lib/utils/capabilities.mjs.map +1 -1
  274. package/dist/lib/utils/creative-delivery.d.mts +52 -10
  275. package/dist/lib/utils/creative-delivery.d.ts +52 -10
  276. package/dist/lib/utils/creative-delivery.d.ts.map +1 -1
  277. package/dist/lib/utils/creative-delivery.js +104 -9
  278. package/dist/lib/utils/creative-delivery.js.map +1 -1
  279. package/dist/lib/utils/creative-delivery.mjs +104 -8
  280. package/dist/lib/utils/creative-delivery.mjs.map +1 -1
  281. package/dist/lib/utils/format-assets.d.mts +41 -38
  282. package/dist/lib/utils/format-assets.d.ts +41 -38
  283. package/dist/lib/utils/format-assets.d.ts.map +1 -1
  284. package/dist/lib/utils/format-assets.js +3 -1
  285. package/dist/lib/utils/format-assets.js.map +1 -1
  286. package/dist/lib/utils/format-assets.mjs +3 -1
  287. package/dist/lib/utils/format-assets.mjs.map +1 -1
  288. package/dist/lib/utils/index.d.mts +8 -8
  289. package/dist/lib/utils/index.d.ts +8 -8
  290. package/dist/lib/utils/index.d.ts.map +1 -1
  291. package/dist/lib/utils/index.js +11 -9
  292. package/dist/lib/utils/index.js.map +1 -1
  293. package/dist/lib/utils/index.mjs +9 -8
  294. package/dist/lib/utils/index.mjs.map +1 -1
  295. package/dist/lib/utils/preview-utils.d.mts +11 -8
  296. package/dist/lib/utils/preview-utils.d.ts +11 -8
  297. package/dist/lib/utils/preview-utils.d.ts.map +1 -1
  298. package/dist/lib/utils/preview-utils.js +4 -4
  299. package/dist/lib/utils/preview-utils.js.map +1 -1
  300. package/dist/lib/utils/preview-utils.mjs +3 -3
  301. package/dist/lib/utils/preview-utils.mjs.map +1 -1
  302. package/dist/lib/utils/tool-request-schemas.d.mts +2 -2
  303. package/dist/lib/utils/tool-request-schemas.d.ts +2 -2
  304. package/dist/lib/v2/projection/aao-reference-formats.json +492 -0
  305. package/dist/lib/v2/projection/augment-response.d.mts +31 -11
  306. package/dist/lib/v2/projection/augment-response.d.ts +31 -11
  307. package/dist/lib/v2/projection/augment-response.d.ts.map +1 -1
  308. package/dist/lib/v2/projection/augment-response.js +233 -27
  309. package/dist/lib/v2/projection/augment-response.js.map +1 -1
  310. package/dist/lib/v2/projection/augment-response.mjs +232 -27
  311. package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
  312. package/dist/lib/v2/projection/builders.d.mts +7 -6
  313. package/dist/lib/v2/projection/builders.d.ts +7 -6
  314. package/dist/lib/v2/projection/builders.d.ts.map +1 -1
  315. package/dist/lib/v2/projection/builders.js +11 -8
  316. package/dist/lib/v2/projection/builders.js.map +1 -1
  317. package/dist/lib/v2/projection/builders.mjs +9 -6
  318. package/dist/lib/v2/projection/builders.mjs.map +1 -1
  319. package/dist/lib/v2/projection/catalog-snapshot.d.mts +47 -0
  320. package/dist/lib/v2/projection/catalog-snapshot.d.ts +48 -0
  321. package/dist/lib/v2/projection/catalog-snapshot.d.ts.map +1 -0
  322. package/dist/lib/v2/projection/catalog-snapshot.js +291 -0
  323. package/dist/lib/v2/projection/catalog-snapshot.js.map +1 -0
  324. package/dist/lib/v2/projection/catalog-snapshot.mjs +265 -0
  325. package/dist/lib/v2/projection/catalog-snapshot.mjs.map +1 -0
  326. package/dist/lib/v2/projection/catalog.d.mts +23 -2
  327. package/dist/lib/v2/projection/catalog.d.ts +23 -2
  328. package/dist/lib/v2/projection/catalog.d.ts.map +1 -1
  329. package/dist/lib/v2/projection/catalog.js +34 -10
  330. package/dist/lib/v2/projection/catalog.js.map +1 -1
  331. package/dist/lib/v2/projection/catalog.mjs +33 -10
  332. package/dist/lib/v2/projection/catalog.mjs.map +1 -1
  333. package/dist/lib/v2/projection/creative-delivery.d.mts +157 -0
  334. package/dist/lib/v2/projection/creative-delivery.d.ts +158 -0
  335. package/dist/lib/v2/projection/creative-delivery.d.ts.map +1 -0
  336. package/dist/lib/v2/projection/creative-delivery.js +967 -0
  337. package/dist/lib/v2/projection/creative-delivery.js.map +1 -0
  338. package/dist/lib/v2/projection/creative-delivery.mjs +941 -0
  339. package/dist/lib/v2/projection/creative-delivery.mjs.map +1 -0
  340. package/dist/lib/v2/projection/index.d.mts +8 -6
  341. package/dist/lib/v2/projection/index.d.ts +8 -6
  342. package/dist/lib/v2/projection/index.d.ts.map +1 -1
  343. package/dist/lib/v2/projection/index.js +26 -4
  344. package/dist/lib/v2/projection/index.js.map +1 -1
  345. package/dist/lib/v2/projection/index.mjs +28 -4
  346. package/dist/lib/v2/projection/index.mjs.map +1 -1
  347. package/dist/lib/v2/projection/legacy-metadata.d.mts +21 -0
  348. package/dist/lib/v2/projection/legacy-metadata.d.ts +22 -0
  349. package/dist/lib/v2/projection/legacy-metadata.d.ts.map +1 -0
  350. package/dist/lib/v2/projection/legacy-metadata.js +73 -0
  351. package/dist/lib/v2/projection/legacy-metadata.js.map +1 -0
  352. package/dist/lib/v2/projection/legacy-metadata.mjs +45 -0
  353. package/dist/lib/v2/projection/legacy-metadata.mjs.map +1 -0
  354. package/dist/lib/v2/projection/types.d.mts +29 -23
  355. package/dist/lib/v2/projection/types.d.ts +29 -23
  356. package/dist/lib/v2/projection/types.d.ts.map +1 -1
  357. package/dist/lib/v2/projection/types.js.map +1 -1
  358. package/dist/lib/v2/projection/v1-to-v2.d.mts +29 -6
  359. package/dist/lib/v2/projection/v1-to-v2.d.ts +29 -6
  360. package/dist/lib/v2/projection/v1-to-v2.d.ts.map +1 -1
  361. package/dist/lib/v2/projection/v1-to-v2.js +218 -9
  362. package/dist/lib/v2/projection/v1-to-v2.js.map +1 -1
  363. package/dist/lib/v2/projection/v1-to-v2.mjs +219 -10
  364. package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
  365. package/dist/lib/v2/projection/v2-to-v1.d.mts +31 -2
  366. package/dist/lib/v2/projection/v2-to-v1.d.ts +31 -2
  367. package/dist/lib/v2/projection/v2-to-v1.d.ts.map +1 -1
  368. package/dist/lib/v2/projection/v2-to-v1.js +138 -7
  369. package/dist/lib/v2/projection/v2-to-v1.js.map +1 -1
  370. package/dist/lib/v2/projection/v2-to-v1.mjs +135 -6
  371. package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
  372. package/dist/lib/v2/projection/write-side.d.mts +12 -13
  373. package/dist/lib/v2/projection/write-side.d.ts +12 -13
  374. package/dist/lib/v2/projection/write-side.d.ts.map +1 -1
  375. package/dist/lib/v2/projection/write-side.js +16 -12
  376. package/dist/lib/v2/projection/write-side.js.map +1 -1
  377. package/dist/lib/v2/projection/write-side.mjs +16 -12
  378. package/dist/lib/v2/projection/write-side.mjs.map +1 -1
  379. package/dist/lib/version.d.mts +3 -3
  380. package/dist/lib/version.d.ts +3 -3
  381. package/dist/lib/version.d.ts.map +1 -1
  382. package/dist/lib/version.js +3 -3
  383. package/dist/lib/version.js.map +1 -1
  384. package/dist/lib/version.mjs +3 -3
  385. package/dist/lib/version.mjs.map +1 -1
  386. package/docs/guides/BUILD-AN-AGENT.md +7 -2
  387. package/docs/guides/PREVIEW-ASSET-DURABILITY.md +6 -2
  388. package/docs/llms.txt +1 -0
  389. package/examples/README.md +1 -1
  390. package/examples/batch-preview-test.ts +3 -3
  391. package/examples/conversation-client.ts +2 -2
  392. package/examples/debug-preview-response.ts +1 -1
  393. package/examples/decisioning-platform-broadcast-tv.ts +10 -4
  394. package/examples/decisioning-platform-mock-seller.ts +16 -9
  395. package/examples/decisioning-platform-programmatic.ts +18 -7
  396. package/examples/error-compliant-server.ts +26 -16
  397. package/examples/generative-creative-demo.ts +7 -19
  398. package/examples/hello_creative_adapter_ad_server.ts +37 -16
  399. package/examples/hello_creative_adapter_template.ts +12 -10
  400. package/examples/hello_seller_adapter_guaranteed.ts +52 -23
  401. package/examples/hello_seller_adapter_multi_tenant.ts +6 -3
  402. package/examples/hello_seller_adapter_non_guaranteed.ts +54 -26
  403. package/examples/hello_seller_adapter_proposal_mode.ts +40 -14
  404. package/examples/hello_seller_adapter_social.ts +2 -7
  405. package/examples/inspect-card-formats.ts +1 -1
  406. package/examples/simple-getting-started.ts +1 -1
  407. package/examples/test-helpers-demo.ts +1 -1
  408. package/package.json +2 -2
  409. package/skills/build-decisioning-creative-template/SKILL.md +11 -11
  410. package/skills/build-decisioning-platform/advanced/REFERENCE.md +8 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/testing/scenarios/brand-rights.ts"],"sourcesContent":["/**\n * Brand Rights Protocol Testing Scenarios (v3)\n *\n * Tests brand rights agent capabilities including:\n * - get_brand_identity -- retrieves brand identity information\n * - get_rights -- queries current rights associated with a brand\n * - acquire_rights -- initiates acquisition of brand rights\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile } from '../client';\nimport { BRAND_RIGHTS_TOOLS } from '../../utils/capabilities';\n\n/**\n * Test: Brand Rights Flow\n *\n * Flow: discover profile -> check brand rights tools -> get_rights -> acquire_rights\n */\nexport async function testBrandRightsFlow(\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 // Check if agent supports any brand rights tools\n const hasBrandRights = BRAND_RIGHTS_TOOLS.some(t => profile.tools.includes(t));\n if (!hasBrandRights) {\n steps.push({\n step: 'Brand rights support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support Brand Rights Protocol tools',\n details: `Required tools: ${BRAND_RIGHTS_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n // Test: get_brand_identity\n if (profile.tools.includes('get_brand_identity')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get brand identity: retrieve brand identity information',\n 'get_brand_identity',\n async () =>\n client.executeTask('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-id-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Brand identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_guidelines: !!data['guidelines'],\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'get_brand_identity not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_brand_identity failed';\n }\n }\n steps.push(step);\n }\n\n // Test: get_rights\n if (profile.tools.includes('get_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get rights: query current brand rights',\n 'get_rights',\n async () =>\n client.executeTask('get_rights', {\n type: 'get_rights_request',\n request_id: `e2e-rights-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n const rights = Array.isArray(data['rights']) ? data['rights'] : [];\n step.details = `Get rights returned ${rights.length} right(s)`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n rights_count: rights.length,\n has_expiration: rights.some((r: Record<string, unknown>) => !!r['expires_at']),\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'get_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_rights failed';\n }\n }\n steps.push(step);\n }\n\n // Test: acquire_rights\n if (profile.tools.includes('acquire_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Acquire rights: initiate brand rights acquisition',\n 'acquire_rights',\n async () =>\n client.executeTask('acquire_rights', {\n type: 'acquire_rights_request',\n request_id: `e2e-acquire-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n rights_type: 'usage',\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Acquire rights returned status: ${data['status'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n status: data['status'],\n rights_id: data['rights_id'],\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'acquire_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'acquire_rights failed';\n }\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Brand Identity\n *\n * Tests get_brand_identity at public and authorized access tiers.\n */\nexport async function testBrandIdentity(\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 { 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('get_brand_identity')) {\n steps.push({\n step: 'Brand identity support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support get_brand_identity',\n });\n return { steps, profile };\n }\n\n // Public access tier\n const { result: publicResult, step: publicStep } = await runStep<TaskResult>(\n 'Get brand identity (public access)',\n 'get_brand_identity',\n async () =>\n client.executeTask('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-pub-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n }) as Promise<TaskResult>\n );\n\n if (publicResult?.success && publicResult?.data) {\n const data = publicResult.data as Record<string, unknown>;\n publicStep.details = `Public identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n publicStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_logos: Array.isArray(data['logos']) && (data['logos'] as unknown[]).length > 0,\n has_colors: !!data['colors'],\n has_tone: !!data['tone'],\n },\n null,\n 2\n );\n } else if (publicResult && !publicResult.success) {\n publicStep.passed = false;\n publicStep.error = publicResult.error || 'get_brand_identity (public) failed';\n }\n steps.push(publicStep);\n\n // Authorized access tier (with brand_id if available)\n if (options.brand?.brand_id) {\n const { result: authResult, step: authStep } = await runStep<TaskResult>(\n 'Get brand identity (authorized access)',\n 'get_brand_identity',\n async () =>\n client.executeTask('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-auth-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (authResult?.success && authResult?.data) {\n const data = authResult.data as Record<string, unknown>;\n authStep.details = `Authorized identity returned for ${data['brand_name'] ?? 'unknown'}`;\n authStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n access_tier: data['access_tier'],\n has_guidelines: !!data['guidelines'],\n },\n null,\n 2\n );\n } else if (authResult && !authResult.success) {\n authStep.passed = false;\n authStep.error = authResult.error || 'get_brand_identity (authorized) failed';\n }\n steps.push(authStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Approval\n *\n * Tests the creative_approval workflow for brand compliance review.\n */\nexport async function testCreativeApproval(\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 { 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('creative_approval')) {\n steps.push({\n step: 'Creative approval support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support creative_approval',\n });\n return { steps, profile };\n }\n\n // Submit a creative for brand approval\n const { result, step } = await runStep<TaskResult>(\n 'Submit creative for brand approval',\n 'creative_approval',\n async () =>\n client.executeTask('creative_approval', {\n type: 'creative_approval_request',\n request_id: `e2e-approval-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n creative: {\n creative_id: `e2e-creative-${Date.now()}`,\n format: 'display_300x250',\n assets: [\n {\n asset_type: 'image',\n url: 'https://example.com/test-creative-300x250.png',\n },\n ],\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Creative approval decision: ${data['decision'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n decision: data['decision'],\n feedback: data['feedback'],\n has_issues: Array.isArray(data['issues']) && (data['issues'] as unknown[]).length > 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'creative_approval not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'creative_approval failed';\n }\n }\n steps.push(step);\n\n return { steps, profile };\n}\n\n/**\n * Check if agent has any brand rights tools\n */\nexport function hasBrandRightsTools(tools: string[]): boolean {\n return BRAND_RIGHTS_TOOLS.some(t => tools.includes(t));\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/testing/scenarios/brand-rights.ts"],"sourcesContent":["/**\n * Brand Rights Protocol Testing Scenarios (v3)\n *\n * Tests brand rights agent capabilities including:\n * - get_brand_identity -- retrieves brand identity information\n * - get_rights -- queries current rights associated with a brand\n * - acquire_rights -- initiates acquisition of brand rights\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile } from '../client';\nimport { BRAND_RIGHTS_TOOLS } from '../../utils/capabilities';\n\n/**\n * Test: Brand Rights Flow\n *\n * Flow: discover profile -> check brand rights tools -> get_rights -> acquire_rights\n */\nexport async function testBrandRightsFlow(\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 // Check if agent supports any brand rights tools\n const hasBrandRights = BRAND_RIGHTS_TOOLS.some(t => profile.tools.includes(t));\n if (!hasBrandRights) {\n steps.push({\n step: 'Brand rights support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support Brand Rights Protocol tools',\n details: `Required tools: ${BRAND_RIGHTS_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n // Test: get_brand_identity\n if (profile.tools.includes('get_brand_identity')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get brand identity: retrieve brand identity information',\n 'get_brand_identity',\n async () =>\n client.executeTaskLegacy('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-id-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Brand identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_guidelines: !!data['guidelines'],\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'get_brand_identity not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_brand_identity failed';\n }\n }\n steps.push(step);\n }\n\n // Test: get_rights\n if (profile.tools.includes('get_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get rights: query current brand rights',\n 'get_rights',\n async () =>\n client.executeTaskLegacy('get_rights', {\n type: 'get_rights_request',\n request_id: `e2e-rights-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n const rights = Array.isArray(data['rights']) ? data['rights'] : [];\n step.details = `Get rights returned ${rights.length} right(s)`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n rights_count: rights.length,\n has_expiration: rights.some((r: Record<string, unknown>) => !!r['expires_at']),\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'get_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_rights failed';\n }\n }\n steps.push(step);\n }\n\n // Test: acquire_rights\n if (profile.tools.includes('acquire_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Acquire rights: initiate brand rights acquisition',\n 'acquire_rights',\n async () =>\n client.executeTaskLegacy('acquire_rights', {\n type: 'acquire_rights_request',\n request_id: `e2e-acquire-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n rights_type: 'usage',\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Acquire rights returned status: ${data['status'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n status: data['status'],\n rights_id: data['rights_id'],\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'acquire_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'acquire_rights failed';\n }\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Brand Identity\n *\n * Tests get_brand_identity at public and authorized access tiers.\n */\nexport async function testBrandIdentity(\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 { 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('get_brand_identity')) {\n steps.push({\n step: 'Brand identity support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support get_brand_identity',\n });\n return { steps, profile };\n }\n\n // Public access tier\n const { result: publicResult, step: publicStep } = await runStep<TaskResult>(\n 'Get brand identity (public access)',\n 'get_brand_identity',\n async () =>\n client.executeTaskLegacy('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-pub-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n }) as Promise<TaskResult>\n );\n\n if (publicResult?.success && publicResult?.data) {\n const data = publicResult.data as Record<string, unknown>;\n publicStep.details = `Public identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n publicStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_logos: Array.isArray(data['logos']) && (data['logos'] as unknown[]).length > 0,\n has_colors: !!data['colors'],\n has_tone: !!data['tone'],\n },\n null,\n 2\n );\n } else if (publicResult && !publicResult.success) {\n publicStep.passed = false;\n publicStep.error = publicResult.error || 'get_brand_identity (public) failed';\n }\n steps.push(publicStep);\n\n // Authorized access tier (with brand_id if available)\n if (options.brand?.brand_id) {\n const { result: authResult, step: authStep } = await runStep<TaskResult>(\n 'Get brand identity (authorized access)',\n 'get_brand_identity',\n async () =>\n client.executeTaskLegacy('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-auth-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (authResult?.success && authResult?.data) {\n const data = authResult.data as Record<string, unknown>;\n authStep.details = `Authorized identity returned for ${data['brand_name'] ?? 'unknown'}`;\n authStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n access_tier: data['access_tier'],\n has_guidelines: !!data['guidelines'],\n },\n null,\n 2\n );\n } else if (authResult && !authResult.success) {\n authStep.passed = false;\n authStep.error = authResult.error || 'get_brand_identity (authorized) failed';\n }\n steps.push(authStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Approval\n *\n * Tests the creative_approval workflow for brand compliance review.\n */\nexport async function testCreativeApproval(\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 { 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('creative_approval')) {\n steps.push({\n step: 'Creative approval support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support creative_approval',\n });\n return { steps, profile };\n }\n\n // Submit a creative for brand approval\n const { result, step } = await runStep<TaskResult>(\n 'Submit creative for brand approval',\n 'creative_approval',\n async () =>\n client.executeCustomTask('creative_approval', {\n type: 'creative_approval_request',\n request_id: `e2e-approval-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n creative: {\n creative_id: `e2e-creative-${Date.now()}`,\n format: 'display_300x250',\n assets: [\n {\n asset_type: 'image',\n url: 'https://example.com/test-creative-300x250.png',\n },\n ],\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Creative approval decision: ${data['decision'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n decision: data['decision'],\n feedback: data['feedback'],\n has_issues: Array.isArray(data['issues']) && (data['issues'] as unknown[]).length > 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'creative_approval not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'creative_approval failed';\n }\n }\n steps.push(step);\n\n return { steps, profile };\n}\n\n/**\n * Check if agent has any brand rights tools\n */\nexport function hasBrandRightsTools(tools: string[]): boolean {\n return BRAND_RIGHTS_TOOLS.some(t => tools.includes(t));\n}\n"],"mappings":"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","names":[]}
@@ -23,7 +23,7 @@ async function testBrandRightsFlow(agentUrl, options) {
23
23
  const { result, step } = await runStep(
24
24
  "Get brand identity: retrieve brand identity information",
25
25
  "get_brand_identity",
26
- async () => client.executeTask("get_brand_identity", {
26
+ async () => client.executeTaskLegacy("get_brand_identity", {
27
27
  type: "get_brand_identity_request",
28
28
  request_id: `e2e-brand-id-${Date.now()}`,
29
29
  brand_domain: options.brand?.domain ?? "example.com",
@@ -59,7 +59,7 @@ async function testBrandRightsFlow(agentUrl, options) {
59
59
  const { result, step } = await runStep(
60
60
  "Get rights: query current brand rights",
61
61
  "get_rights",
62
- async () => client.executeTask("get_rights", {
62
+ async () => client.executeTaskLegacy("get_rights", {
63
63
  type: "get_rights_request",
64
64
  request_id: `e2e-rights-${Date.now()}`,
65
65
  brand_domain: options.brand?.domain ?? "example.com",
@@ -95,7 +95,7 @@ async function testBrandRightsFlow(agentUrl, options) {
95
95
  const { result, step } = await runStep(
96
96
  "Acquire rights: initiate brand rights acquisition",
97
97
  "acquire_rights",
98
- async () => client.executeTask("acquire_rights", {
98
+ async () => client.executeTaskLegacy("acquire_rights", {
99
99
  type: "acquire_rights_request",
100
100
  request_id: `e2e-acquire-${Date.now()}`,
101
101
  brand_domain: options.brand?.domain ?? "example.com",
@@ -149,7 +149,7 @@ async function testBrandIdentity(agentUrl, options) {
149
149
  const { result: publicResult, step: publicStep } = await runStep(
150
150
  "Get brand identity (public access)",
151
151
  "get_brand_identity",
152
- async () => client.executeTask("get_brand_identity", {
152
+ async () => client.executeTaskLegacy("get_brand_identity", {
153
153
  type: "get_brand_identity_request",
154
154
  request_id: `e2e-brand-pub-${Date.now()}`,
155
155
  brand_domain: options.brand?.domain ?? "example.com"
@@ -179,7 +179,7 @@ async function testBrandIdentity(agentUrl, options) {
179
179
  const { result: authResult, step: authStep } = await runStep(
180
180
  "Get brand identity (authorized access)",
181
181
  "get_brand_identity",
182
- async () => client.executeTask("get_brand_identity", {
182
+ async () => client.executeTaskLegacy("get_brand_identity", {
183
183
  type: "get_brand_identity_request",
184
184
  request_id: `e2e-brand-auth-${Date.now()}`,
185
185
  brand_domain: options.brand?.domain ?? "example.com",
@@ -227,7 +227,7 @@ async function testCreativeApproval(agentUrl, options) {
227
227
  const { result, step } = await runStep(
228
228
  "Submit creative for brand approval",
229
229
  "creative_approval",
230
- async () => client.executeTask("creative_approval", {
230
+ async () => client.executeCustomTask("creative_approval", {
231
231
  type: "creative_approval_request",
232
232
  request_id: `e2e-approval-${Date.now()}`,
233
233
  brand_domain: options.brand?.domain ?? "example.com",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/testing/scenarios/brand-rights.ts"],"sourcesContent":["/**\n * Brand Rights Protocol Testing Scenarios (v3)\n *\n * Tests brand rights agent capabilities including:\n * - get_brand_identity -- retrieves brand identity information\n * - get_rights -- queries current rights associated with a brand\n * - acquire_rights -- initiates acquisition of brand rights\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile } from '../client';\nimport { BRAND_RIGHTS_TOOLS } from '../../utils/capabilities';\n\n/**\n * Test: Brand Rights Flow\n *\n * Flow: discover profile -> check brand rights tools -> get_rights -> acquire_rights\n */\nexport async function testBrandRightsFlow(\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 // Check if agent supports any brand rights tools\n const hasBrandRights = BRAND_RIGHTS_TOOLS.some(t => profile.tools.includes(t));\n if (!hasBrandRights) {\n steps.push({\n step: 'Brand rights support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support Brand Rights Protocol tools',\n details: `Required tools: ${BRAND_RIGHTS_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n // Test: get_brand_identity\n if (profile.tools.includes('get_brand_identity')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get brand identity: retrieve brand identity information',\n 'get_brand_identity',\n async () =>\n client.executeTask('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-id-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Brand identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_guidelines: !!data['guidelines'],\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'get_brand_identity not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_brand_identity failed';\n }\n }\n steps.push(step);\n }\n\n // Test: get_rights\n if (profile.tools.includes('get_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get rights: query current brand rights',\n 'get_rights',\n async () =>\n client.executeTask('get_rights', {\n type: 'get_rights_request',\n request_id: `e2e-rights-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n const rights = Array.isArray(data['rights']) ? data['rights'] : [];\n step.details = `Get rights returned ${rights.length} right(s)`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n rights_count: rights.length,\n has_expiration: rights.some((r: Record<string, unknown>) => !!r['expires_at']),\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'get_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_rights failed';\n }\n }\n steps.push(step);\n }\n\n // Test: acquire_rights\n if (profile.tools.includes('acquire_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Acquire rights: initiate brand rights acquisition',\n 'acquire_rights',\n async () =>\n client.executeTask('acquire_rights', {\n type: 'acquire_rights_request',\n request_id: `e2e-acquire-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n rights_type: 'usage',\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Acquire rights returned status: ${data['status'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n status: data['status'],\n rights_id: data['rights_id'],\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'acquire_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'acquire_rights failed';\n }\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Brand Identity\n *\n * Tests get_brand_identity at public and authorized access tiers.\n */\nexport async function testBrandIdentity(\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 { 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('get_brand_identity')) {\n steps.push({\n step: 'Brand identity support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support get_brand_identity',\n });\n return { steps, profile };\n }\n\n // Public access tier\n const { result: publicResult, step: publicStep } = await runStep<TaskResult>(\n 'Get brand identity (public access)',\n 'get_brand_identity',\n async () =>\n client.executeTask('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-pub-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n }) as Promise<TaskResult>\n );\n\n if (publicResult?.success && publicResult?.data) {\n const data = publicResult.data as Record<string, unknown>;\n publicStep.details = `Public identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n publicStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_logos: Array.isArray(data['logos']) && (data['logos'] as unknown[]).length > 0,\n has_colors: !!data['colors'],\n has_tone: !!data['tone'],\n },\n null,\n 2\n );\n } else if (publicResult && !publicResult.success) {\n publicStep.passed = false;\n publicStep.error = publicResult.error || 'get_brand_identity (public) failed';\n }\n steps.push(publicStep);\n\n // Authorized access tier (with brand_id if available)\n if (options.brand?.brand_id) {\n const { result: authResult, step: authStep } = await runStep<TaskResult>(\n 'Get brand identity (authorized access)',\n 'get_brand_identity',\n async () =>\n client.executeTask('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-auth-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (authResult?.success && authResult?.data) {\n const data = authResult.data as Record<string, unknown>;\n authStep.details = `Authorized identity returned for ${data['brand_name'] ?? 'unknown'}`;\n authStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n access_tier: data['access_tier'],\n has_guidelines: !!data['guidelines'],\n },\n null,\n 2\n );\n } else if (authResult && !authResult.success) {\n authStep.passed = false;\n authStep.error = authResult.error || 'get_brand_identity (authorized) failed';\n }\n steps.push(authStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Approval\n *\n * Tests the creative_approval workflow for brand compliance review.\n */\nexport async function testCreativeApproval(\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 { 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('creative_approval')) {\n steps.push({\n step: 'Creative approval support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support creative_approval',\n });\n return { steps, profile };\n }\n\n // Submit a creative for brand approval\n const { result, step } = await runStep<TaskResult>(\n 'Submit creative for brand approval',\n 'creative_approval',\n async () =>\n client.executeTask('creative_approval', {\n type: 'creative_approval_request',\n request_id: `e2e-approval-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n creative: {\n creative_id: `e2e-creative-${Date.now()}`,\n format: 'display_300x250',\n assets: [\n {\n asset_type: 'image',\n url: 'https://example.com/test-creative-300x250.png',\n },\n ],\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Creative approval decision: ${data['decision'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n decision: data['decision'],\n feedback: data['feedback'],\n has_issues: Array.isArray(data['issues']) && (data['issues'] as unknown[]).length > 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'creative_approval not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'creative_approval failed';\n }\n }\n steps.push(step);\n\n return { steps, profile };\n}\n\n/**\n * Check if agent has any brand rights tools\n */\nexport function hasBrandRightsTools(tools: string[]): boolean {\n return BRAND_RIGHTS_TOOLS.some(t => tools.includes(t));\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/testing/scenarios/brand-rights.ts"],"sourcesContent":["/**\n * Brand Rights Protocol Testing Scenarios (v3)\n *\n * Tests brand rights agent capabilities including:\n * - get_brand_identity -- retrieves brand identity information\n * - get_rights -- queries current rights associated with a brand\n * - acquire_rights -- initiates acquisition of brand rights\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile } from '../client';\nimport { BRAND_RIGHTS_TOOLS } from '../../utils/capabilities';\n\n/**\n * Test: Brand Rights Flow\n *\n * Flow: discover profile -> check brand rights tools -> get_rights -> acquire_rights\n */\nexport async function testBrandRightsFlow(\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 // Check if agent supports any brand rights tools\n const hasBrandRights = BRAND_RIGHTS_TOOLS.some(t => profile.tools.includes(t));\n if (!hasBrandRights) {\n steps.push({\n step: 'Brand rights support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support Brand Rights Protocol tools',\n details: `Required tools: ${BRAND_RIGHTS_TOOLS.join(', ')}. Available: ${profile.tools.join(', ')}`,\n });\n return { steps, profile };\n }\n\n // Test: get_brand_identity\n if (profile.tools.includes('get_brand_identity')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get brand identity: retrieve brand identity information',\n 'get_brand_identity',\n async () =>\n client.executeTaskLegacy('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-id-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Brand identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_guidelines: !!data['guidelines'],\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'get_brand_identity not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_brand_identity failed';\n }\n }\n steps.push(step);\n }\n\n // Test: get_rights\n if (profile.tools.includes('get_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Get rights: query current brand rights',\n 'get_rights',\n async () =>\n client.executeTaskLegacy('get_rights', {\n type: 'get_rights_request',\n request_id: `e2e-rights-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n const rights = Array.isArray(data['rights']) ? data['rights'] : [];\n step.details = `Get rights returned ${rights.length} right(s)`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n rights_count: rights.length,\n has_expiration: rights.some((r: Record<string, unknown>) => !!r['expires_at']),\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'get_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'get_rights failed';\n }\n }\n steps.push(step);\n }\n\n // Test: acquire_rights\n if (profile.tools.includes('acquire_rights')) {\n const { result, step } = await runStep<TaskResult>(\n 'Acquire rights: initiate brand rights acquisition',\n 'acquire_rights',\n async () =>\n client.executeTaskLegacy('acquire_rights', {\n type: 'acquire_rights_request',\n request_id: `e2e-acquire-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n rights_type: 'usage',\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Acquire rights returned status: ${data['status'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n status: data['status'],\n rights_id: data['rights_id'],\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'acquire_rights not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'acquire_rights failed';\n }\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Brand Identity\n *\n * Tests get_brand_identity at public and authorized access tiers.\n */\nexport async function testBrandIdentity(\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 { 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('get_brand_identity')) {\n steps.push({\n step: 'Brand identity support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support get_brand_identity',\n });\n return { steps, profile };\n }\n\n // Public access tier\n const { result: publicResult, step: publicStep } = await runStep<TaskResult>(\n 'Get brand identity (public access)',\n 'get_brand_identity',\n async () =>\n client.executeTaskLegacy('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-pub-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n }) as Promise<TaskResult>\n );\n\n if (publicResult?.success && publicResult?.data) {\n const data = publicResult.data as Record<string, unknown>;\n publicStep.details = `Public identity returned for ${data['brand_name'] ?? data['brand_domain'] ?? 'unknown'}`;\n publicStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n brand_domain: data['brand_domain'],\n has_logos: Array.isArray(data['logos']) && (data['logos'] as unknown[]).length > 0,\n has_colors: !!data['colors'],\n has_tone: !!data['tone'],\n },\n null,\n 2\n );\n } else if (publicResult && !publicResult.success) {\n publicStep.passed = false;\n publicStep.error = publicResult.error || 'get_brand_identity (public) failed';\n }\n steps.push(publicStep);\n\n // Authorized access tier (with brand_id if available)\n if (options.brand?.brand_id) {\n const { result: authResult, step: authStep } = await runStep<TaskResult>(\n 'Get brand identity (authorized access)',\n 'get_brand_identity',\n async () =>\n client.executeTaskLegacy('get_brand_identity', {\n type: 'get_brand_identity_request',\n request_id: `e2e-brand-auth-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n }) as Promise<TaskResult>\n );\n\n if (authResult?.success && authResult?.data) {\n const data = authResult.data as Record<string, unknown>;\n authStep.details = `Authorized identity returned for ${data['brand_name'] ?? 'unknown'}`;\n authStep.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n brand_name: data['brand_name'],\n access_tier: data['access_tier'],\n has_guidelines: !!data['guidelines'],\n },\n null,\n 2\n );\n } else if (authResult && !authResult.success) {\n authStep.passed = false;\n authStep.error = authResult.error || 'get_brand_identity (authorized) failed';\n }\n steps.push(authStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Approval\n *\n * Tests the creative_approval workflow for brand compliance review.\n */\nexport async function testCreativeApproval(\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 { 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('creative_approval')) {\n steps.push({\n step: 'Creative approval support check',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support creative_approval',\n });\n return { steps, profile };\n }\n\n // Submit a creative for brand approval\n const { result, step } = await runStep<TaskResult>(\n 'Submit creative for brand approval',\n 'creative_approval',\n async () =>\n client.executeCustomTask('creative_approval', {\n type: 'creative_approval_request',\n request_id: `e2e-approval-${Date.now()}`,\n brand_domain: options.brand?.domain ?? 'example.com',\n brand_id: options.brand?.brand_id,\n creative: {\n creative_id: `e2e-creative-${Date.now()}`,\n format: 'display_300x250',\n assets: [\n {\n asset_type: 'image',\n url: 'https://example.com/test-creative-300x250.png',\n },\n ],\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as Record<string, unknown>;\n step.details = `Creative approval decision: ${data['decision'] ?? 'unknown'}`;\n step.response_preview = JSON.stringify(\n {\n request_id: data['request_id'],\n decision: data['decision'],\n feedback: data['feedback'],\n has_issues: Array.isArray(data['issues']) && (data['issues'] as unknown[]).length > 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n const error = result.error || '';\n if (error.includes('not supported') || error.includes('not implemented')) {\n step.passed = true;\n step.details = 'creative_approval not supported by this agent (expected for some agents)';\n } else {\n step.passed = false;\n step.error = result.error || 'creative_approval failed';\n }\n }\n steps.push(step);\n\n return { steps, profile };\n}\n\n/**\n * Check if agent has any brand rights tools\n */\nexport function hasBrandRightsTools(tools: string[]): boolean {\n return BRAND_RIGHTS_TOOLS.some(t => tools.includes(t));\n}\n"],"mappings":"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","names":[]}
@@ -44,7 +44,7 @@ async function testCreativeFlow(agentUrl, options) {
44
44
  const { result, step } = await (0, import_client.runStep)(
45
45
  `Build creative: ${formatDisplayName}`,
46
46
  "build_creative",
47
- async () => client.buildCreative({
47
+ async () => client.buildCreativeLegacy({
48
48
  target_format_id: format.format_id,
49
49
  brand: (0, import_client.resolveBrand)(options),
50
50
  message: `Create an ad for an e-commerce brand promoting summer sale`,
@@ -77,7 +77,7 @@ async function testCreativeFlow(agentUrl, options) {
77
77
  const { step: minimalStep } = await (0, import_client.runStep)(
78
78
  "Preview creative: minimal assets",
79
79
  "preview_creative",
80
- async () => client.previewCreative({
80
+ async () => client.previewCreativeLegacy({
81
81
  request_type: "single",
82
82
  creative_manifest: {
83
83
  format_id: formatsToTest[0]?.format_id || {
@@ -95,7 +95,7 @@ async function testCreativeFlow(agentUrl, options) {
95
95
  const { result, step } = await (0, import_client.runStep)(
96
96
  `Preview creative: with assets (${sampleFormat.format_id.id})`,
97
97
  "preview_creative",
98
- async () => client.previewCreative({
98
+ async () => client.previewCreativeLegacy({
99
99
  request_type: "single",
100
100
  creative_manifest: {
101
101
  format_id: sampleFormat.format_id,
@@ -128,7 +128,7 @@ async function testCreativeFlow(agentUrl, options) {
128
128
  const { result: errorResult, step: errorStep } = await (0, import_client.runStep)(
129
129
  "Preview creative: invalid format (error expected)",
130
130
  "preview_creative",
131
- async () => client.previewCreative({
131
+ async () => client.previewCreativeLegacy({
132
132
  request_type: "single",
133
133
  creative_manifest: {
134
134
  format_id: { agent_url: "https://creative.adcontextprotocol.org", id: "INVALID_FORMAT_ID_12345" },
@@ -209,7 +209,7 @@ async function testCreativeLifecycle(agentUrl, options) {
209
209
  const { result: syncResult, step: syncStep } = await (0, import_client.runStep)(
210
210
  `Sync ${creativesToSync.length} creative(s) to library`,
211
211
  "sync_creatives",
212
- async () => client.executeTask("sync_creatives", {
212
+ async () => client.executeTaskLegacy("sync_creatives", {
213
213
  creatives: creativesToSync
214
214
  })
215
215
  );
@@ -321,7 +321,7 @@ async function testCreativeLifecycle(agentUrl, options) {
321
321
  const { result, step } = await (0, import_client.runStep)(
322
322
  `Build creative for lifecycle (${targetFormat.format_id})`,
323
323
  "build_creative",
324
- async () => client.executeTask("build_creative", {
324
+ async () => client.executeTaskLegacy("build_creative", {
325
325
  target_format_id: targetFormat.format_id,
326
326
  brand: (0, import_client.resolveBrand)(options),
327
327
  message: `Create an ad for lifecycle testing`,
@@ -352,7 +352,7 @@ async function testCreativeLifecycle(agentUrl, options) {
352
352
  const { result, step } = await (0, import_client.runStep)(
353
353
  `Preview creative for lifecycle (${targetFormat.format_id})`,
354
354
  "preview_creative",
355
- async () => client.executeTask("preview_creative", {
355
+ async () => client.executeTaskLegacy("preview_creative", {
356
356
  request_type: "single",
357
357
  creative_manifest: {
358
358
  format_id: targetFormat.format_id,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/testing/scenarios/creative.ts"],"sourcesContent":["/**\n * Creative Agent Testing Scenarios\n *\n * Tests creative agent capabilities including:\n * - list_creative_formats / list_formats\n * - build_creative\n * - preview_creative\n *\n * Enhanced to:\n * - Test multiple formats from the agent's actual catalog\n * - Test with both required and optional assets\n * - Validate preview renders\n */\n\nimport type { BuildCreativeRequest, PreviewCreativeRequest } from '../../types/tools.generated';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile, discoverCreativeFormats, resolveBrand } from '../client';\n\n/**\n * Test: Creative Flow (for creative agents)\n *\n * Flow: list_formats -> build_creative (multiple formats) -> preview_creative (with assets)\n */\nexport async function testCreativeFlow(\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 // Discover creative formats with full details\n const { formats, step: formatStep } = await discoverCreativeFormats(client, profile);\n steps.push(formatStep);\n\n if (!formatStep.passed || !formats || formats.length === 0) {\n return { steps, profile: { ...profile, supported_formats: formats || [] } };\n }\n\n // Store discovered formats in profile\n profile.supported_formats = formats;\n\n // Determine which formats to test\n const formatsToTest = selectFormatsToTest(formats || [], options);\n\n // Build creative for each selected format\n if (profile.tools.includes('build_creative')) {\n for (const format of formatsToTest) {\n const formatDisplayName = format.name || format.format_id.id;\n const { result, step } = await runStep<TaskResult>(\n `Build creative: ${formatDisplayName}`,\n 'build_creative',\n async () =>\n client.buildCreative({\n target_format_id: format.format_id,\n brand: resolveBrand(options),\n message: `Create an ad for an e-commerce brand promoting summer sale`,\n quality: 'draft',\n include_preview: true,\n } as unknown as BuildCreativeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as {\n creative_manifest?: { format_id?: unknown; assets?: Record<string, unknown> };\n creative_manifests?: Array<{ format_id?: unknown; assets?: Record<string, unknown> }>;\n preview?: { previews?: unknown[] };\n };\n const manifest = data.creative_manifest || data.creative_manifests?.[0];\n step.details = `Built creative manifest for format ${formatDisplayName}`;\n step.response_preview = JSON.stringify(\n {\n format_id: manifest?.format_id || format.format_id,\n asset_keys: Object.keys(manifest?.assets || {}),\n has_preview: !!data.preview,\n preview_count: data.preview?.previews?.length || 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'build_creative failed';\n }\n steps.push(step);\n }\n }\n\n // Preview creative with various asset configurations\n if (profile.tools.includes('preview_creative')) {\n // Test 1: Preview with minimal assets (empty)\n const { step: minimalStep } = await runStep<TaskResult>(\n 'Preview creative: minimal assets',\n 'preview_creative',\n async () =>\n client.previewCreative({\n request_type: 'single',\n creative_manifest: {\n format_id: formatsToTest[0]?.format_id || {\n agent_url: 'https://creative.adcontextprotocol.org',\n id: 'display_300x250',\n },\n name: 'Minimal Test Creative',\n assets: {},\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n steps.push(minimalStep);\n\n // Test 2: Preview with sample assets\n const sampleFormat = formatsToTest[0];\n if (sampleFormat) {\n const { result, step } = await runStep<TaskResult>(\n `Preview creative: with assets (${sampleFormat.format_id.id})`,\n 'preview_creative',\n async () =>\n client.previewCreative({\n request_type: 'single',\n creative_manifest: {\n format_id: sampleFormat.format_id,\n name: 'Full Test Creative',\n assets: buildTestAssets(sampleFormat) as unknown as Record<string, unknown>,\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as {\n previews?: Array<{ renders?: unknown[] }>;\n interactive_url?: string;\n };\n const previews = data.previews || [];\n const renderCount = previews.reduce((count, preview) => count + (preview.renders?.length || 0), 0);\n step.details = `Generated preview with ${previews.length} variant(s)`;\n step.response_preview = JSON.stringify(\n {\n has_renders: renderCount > 0,\n preview_count: previews.length,\n render_count: renderCount,\n interactive_url: data.interactive_url,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'preview_creative failed';\n }\n steps.push(step);\n }\n\n // Test 3: Preview with invalid format_id (error case)\n const { result: errorResult, step: errorStep } = await runStep<TaskResult>(\n 'Preview creative: invalid format (error expected)',\n 'preview_creative',\n async () =>\n client.previewCreative({\n request_type: 'single',\n creative_manifest: {\n format_id: { agent_url: 'https://creative.adcontextprotocol.org', id: 'INVALID_FORMAT_ID_12345' },\n name: 'Error Test Creative',\n assets: {},\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n\n // This should fail - if it succeeds with invalid format, that's a bug\n if (errorResult?.success) {\n errorStep.passed = false;\n errorStep.error = 'Expected error for invalid format_id but got success';\n } else {\n errorStep.passed = true;\n errorStep.details = 'Correctly rejected invalid format_id';\n }\n steps.push(errorStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Lifecycle\n *\n * Chains creative protocol operations end-to-end:\n * 1. list_creative_formats → verify format schema\n * 2. sync_creatives with multiple creatives → verify per-creative status\n * 3. list_creatives (no snapshot) → verify basic fields\n * 4. list_creatives (include_snapshot: true) → verify snapshot or snapshot_unavailable_reason\n * 5. build_creative or preview_creative on synced creative → adapt to agent capabilities\n */\nexport async function testCreativeLifecycle(\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 // Step 1: Discover creative formats\n const { formats, step: formatStep } = await discoverCreativeFormats(client, profile);\n steps.push(formatStep);\n\n if (!formatStep.passed || !formats || formats.length === 0) {\n return { steps, profile };\n }\n\n profile.supported_formats = formats;\n\n // Validate format schema: each format should have format_id\n const formatSchemaIssues: string[] = [];\n for (const format of formats) {\n if (!format.format_id) formatSchemaIssues.push('Missing format_id');\n }\n\n steps.push({\n step: 'Validate format schema',\n passed: formatSchemaIssues.length === 0,\n duration_ms: 0,\n details:\n formatSchemaIssues.length === 0\n ? `All ${formats.length} format(s) have required fields`\n : formatSchemaIssues.join('; '),\n warnings: formatSchemaIssues.length > 0 ? formatSchemaIssues : undefined,\n });\n\n // Step 2: Sync multiple creatives (image + video if formats allow)\n if (profile.tools.includes('sync_creatives')) {\n const imageFormat = formats[0]!;\n const videoFormat = formats.length > 1 ? formats[1] : undefined;\n\n const creativesToSync = [\n {\n creative_id: `lifecycle-img-${Date.now()}`,\n name: 'Lifecycle Test Image Creative',\n format_id: imageFormat.format_id,\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250.png?text=Lifecycle+Image',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n },\n ];\n\n if (videoFormat) {\n creativesToSync.push({\n creative_id: `lifecycle-vid-${Date.now()}`,\n name: 'Lifecycle Test Video Creative',\n format_id: videoFormat.format_id,\n assets: {\n primary: {\n url: 'https://storage.googleapis.com/webfundamentals-assets/videos/chrome.mp4',\n width: 1920,\n height: 1080,\n format: 'mp4',\n },\n },\n });\n }\n\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n `Sync ${creativesToSync.length} creative(s) to library`,\n 'sync_creatives',\n async () =>\n client.executeTask('sync_creatives', {\n creatives: creativesToSync,\n }) as Promise<TaskResult>\n );\n\n if (syncResult?.success && syncResult?.data) {\n const data = syncResult.data;\n const creatives = data.creatives || [];\n const actions = creatives.map((c: any) => c.action);\n const failed = creatives.filter((c: any) => c.action === 'failed');\n\n syncStep.details = `Synced ${creatives.length} creative(s), actions: ${actions.join(', ')}`;\n syncStep.response_preview = JSON.stringify(\n {\n synced_count: creatives.length,\n actions,\n creative_ids: creatives.map((c: any) => c.creative_id),\n failed_count: failed.length,\n failed_errors: failed.map((c: any) => ({ creative_id: c.creative_id, errors: c.errors })),\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 // Step 3: list_creatives without snapshot\n if (profile.tools.includes('list_creatives')) {\n const { result: listResult, step: listStep } = await runStep<TaskResult>(\n 'List creatives (no snapshot)',\n 'list_creatives',\n async () => client.executeTask('list_creatives', {}) as Promise<TaskResult>\n );\n\n if (listResult?.success && listResult?.data) {\n const data = listResult.data;\n const creatives = data.creatives || [];\n\n // Validate basic fields on each creative\n const fieldIssues: string[] = [];\n for (const creative of creatives.slice(0, 5)) {\n if (!creative.creative_id) fieldIssues.push('Creative missing creative_id');\n if (!creative.name) fieldIssues.push(`Creative ${creative.creative_id}: missing name`);\n if (!creative.format_id) fieldIssues.push(`Creative ${creative.creative_id}: missing format_id`);\n }\n\n // Verify snapshot is absent when not requested\n const hasUnexpectedSnapshot = creatives.some((c: any) => c.snapshot !== undefined);\n\n if (fieldIssues.length > 0) {\n listStep.passed = false;\n listStep.error = `Creative field validation: ${fieldIssues.join('; ')}`;\n } else {\n listStep.details = `Found ${creatives.length} creative(s) with valid fields`;\n }\n\n listStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n statuses: Array.from(new Set(creatives.map((c: any) => c.status))),\n has_unexpected_snapshot: hasUnexpectedSnapshot,\n query_summary: data.query_summary,\n },\n null,\n 2\n );\n\n if (hasUnexpectedSnapshot) {\n listStep.warnings = ['snapshot field present on creatives without include_snapshot=true'];\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 // Step 4: list_creatives with include_snapshot: true\n const { result: snapshotResult, step: snapshotStep } = await runStep<TaskResult>(\n 'List creatives (include_snapshot: true)',\n 'list_creatives',\n async () => client.executeTask('list_creatives', { include_snapshot: true }) as Promise<TaskResult>\n );\n\n if (snapshotResult?.success && snapshotResult?.data) {\n const data = snapshotResult.data;\n const creatives = data.creatives || [];\n\n // Each creative should have either snapshot data or snapshot_unavailable_reason\n const invalidCreatives = creatives.filter((c: any) => {\n if (c.snapshot) {\n return !c.snapshot.as_of || c.snapshot.staleness_seconds === undefined;\n }\n return !c.snapshot_unavailable_reason;\n });\n\n if (invalidCreatives.length > 0) {\n snapshotStep.passed = false;\n snapshotStep.error = `${invalidCreatives.length} creative(s) missing both snapshot and snapshot_unavailable_reason`;\n } else {\n const withSnapshot = creatives.filter((c: any) => !!c.snapshot).length;\n const withReason = creatives.filter((c: any) => !!c.snapshot_unavailable_reason).length;\n snapshotStep.details = `${creatives.length} creative(s): ${withSnapshot} with snapshot, ${withReason} with unavailable_reason`;\n }\n\n snapshotStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n with_snapshot: creatives.filter((c: any) => !!c.snapshot).length,\n with_unavailable_reason: creatives.filter((c: any) => !!c.snapshot_unavailable_reason).length,\n snapshot_reasons: Array.from(\n new Set(creatives.map((c: any) => c.snapshot_unavailable_reason).filter(Boolean))\n ),\n },\n null,\n 2\n );\n } else if (snapshotResult && !snapshotResult.success) {\n snapshotStep.passed = false;\n snapshotStep.error = snapshotResult.error || 'list_creatives with snapshot returned unsuccessful result';\n }\n steps.push(snapshotStep);\n }\n }\n\n // Step 5: build_creative or preview_creative (adapt to agent capabilities)\n if (profile.tools.includes('build_creative')) {\n const targetFormat = formats[0]!;\n const { result, step } = await runStep<TaskResult>(\n `Build creative for lifecycle (${targetFormat.format_id})`,\n 'build_creative',\n async () =>\n client.executeTask('build_creative', {\n target_format_id: targetFormat.format_id,\n brand: resolveBrand(options),\n message: `Create an ad for lifecycle testing`,\n quality: 'draft',\n include_preview: true,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n const manifest = data.creative_manifest || data.creative_manifests?.[0];\n step.details = `Built creative manifest for format ${manifest?.format_id || targetFormat.format_id}`;\n step.response_preview = JSON.stringify(\n {\n format_id: manifest?.format_id || targetFormat.format_id,\n asset_keys: Object.keys(manifest?.assets || {}),\n has_preview: !!data.preview,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'build_creative failed';\n }\n steps.push(step);\n } else if (profile.tools.includes('preview_creative')) {\n // Tag-serving agents may only support preview, not build\n const targetFormat = formats[0]!;\n const { result, step } = await runStep<TaskResult>(\n `Preview creative for lifecycle (${targetFormat.format_id})`,\n 'preview_creative',\n async () =>\n client.executeTask('preview_creative', {\n request_type: 'single',\n creative_manifest: {\n format_id: targetFormat.format_id,\n name: 'Lifecycle Test Preview',\n assets: buildTestAssets(targetFormat),\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n step.details = `Generated preview with ${data.renders?.length || 0} render(s)`;\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'preview_creative failed';\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Select which formats to test based on options\n */\nfunction selectFormatsToTest(\n formats: NonNullable<AgentProfile['supported_formats']>,\n options: TestOptions\n): NonNullable<AgentProfile['supported_formats']> {\n // If specific format_ids provided, use those\n if (options.format_ids?.length) {\n return formats.filter(f => options.format_ids!.includes(f.format_id.id));\n }\n\n // If test_all_formats, test up to max_formats_to_test\n if (options.test_all_formats) {\n const maxFormats = options.max_formats_to_test || 5;\n return formats.slice(0, maxFormats);\n }\n\n // Default: test up to 3 formats\n return formats.slice(0, 3);\n}\n\n/**\n * Build test assets for a format based on its requirements\n */\nfunction buildTestAssets(\n format: NonNullable<AgentProfile['supported_formats']>[0]\n): Array<{ asset_id: string; asset_type: string; url: string }> {\n const assets: Array<{ asset_id: string; asset_type: string; url: string }> = [];\n\n // Add required assets\n if (format.required_assets?.length) {\n for (const assetName of format.required_assets) {\n assets.push({\n asset_id: assetName,\n asset_type: guessAssetType(assetName),\n url: getTestAssetUrl(assetName),\n });\n }\n }\n\n // If no required assets, add a default image\n if (assets.length === 0) {\n assets.push({\n asset_id: 'primary_image',\n asset_type: 'image',\n url: 'https://via.placeholder.com/300x250.png?text=Test+Creative',\n });\n }\n\n return assets;\n}\n\n/**\n * Guess asset type from asset name\n */\nfunction guessAssetType(assetName: string): string {\n const lower = assetName.toLowerCase();\n if (lower.includes('video') || lower.includes('clip')) return 'video';\n if (lower.includes('audio') || lower.includes('sound')) return 'audio';\n if (lower.includes('logo')) return 'image';\n if (lower.includes('text') || lower.includes('headline') || lower.includes('copy')) return 'text';\n return 'image';\n}\n\n/**\n * Get a test asset URL for testing\n */\nfunction getTestAssetUrl(assetName: string): string {\n const type = guessAssetType(assetName);\n switch (type) {\n case 'video':\n return 'https://storage.googleapis.com/webfundamentals-assets/videos/chrome.mp4';\n case 'audio':\n return 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3';\n default:\n return 'https://via.placeholder.com/300x250.png?text=Test+Asset';\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/testing/scenarios/creative.ts"],"sourcesContent":["/**\n * Creative Agent Testing Scenarios\n *\n * Tests creative agent capabilities including:\n * - list_creative_formats / list_formats\n * - build_creative\n * - preview_creative\n *\n * Enhanced to:\n * - Test multiple formats from the agent's actual catalog\n * - Test with both required and optional assets\n * - Validate preview renders\n */\n\nimport type { BuildCreativeRequest, PreviewCreativeRequest } from '../../types/tools.generated';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile, discoverCreativeFormats, resolveBrand } from '../client';\n\n/**\n * Test: Creative Flow (for creative agents)\n *\n * Flow: list_formats -> build_creative (multiple formats) -> preview_creative (with assets)\n */\nexport async function testCreativeFlow(\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 // Discover creative formats with full details\n const { formats, step: formatStep } = await discoverCreativeFormats(client, profile);\n steps.push(formatStep);\n\n if (!formatStep.passed || !formats || formats.length === 0) {\n return { steps, profile: { ...profile, supported_formats: formats || [] } };\n }\n\n // Store discovered formats in profile\n profile.supported_formats = formats;\n\n // Determine which formats to test\n const formatsToTest = selectFormatsToTest(formats || [], options);\n\n // Build creative for each selected format\n if (profile.tools.includes('build_creative')) {\n for (const format of formatsToTest) {\n const formatDisplayName = format.name || format.format_id.id;\n const { result, step } = await runStep<TaskResult>(\n `Build creative: ${formatDisplayName}`,\n 'build_creative',\n async () =>\n client.buildCreativeLegacy({\n target_format_id: format.format_id,\n brand: resolveBrand(options),\n message: `Create an ad for an e-commerce brand promoting summer sale`,\n quality: 'draft',\n include_preview: true,\n } as unknown as BuildCreativeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as {\n creative_manifest?: { format_id?: unknown; assets?: Record<string, unknown> };\n creative_manifests?: Array<{ format_id?: unknown; assets?: Record<string, unknown> }>;\n preview?: { previews?: unknown[] };\n };\n const manifest = data.creative_manifest || data.creative_manifests?.[0];\n step.details = `Built creative manifest for format ${formatDisplayName}`;\n step.response_preview = JSON.stringify(\n {\n format_id: manifest?.format_id || format.format_id,\n asset_keys: Object.keys(manifest?.assets || {}),\n has_preview: !!data.preview,\n preview_count: data.preview?.previews?.length || 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'build_creative failed';\n }\n steps.push(step);\n }\n }\n\n // Preview creative with various asset configurations\n if (profile.tools.includes('preview_creative')) {\n // Test 1: Preview with minimal assets (empty)\n const { step: minimalStep } = await runStep<TaskResult>(\n 'Preview creative: minimal assets',\n 'preview_creative',\n async () =>\n client.previewCreativeLegacy({\n request_type: 'single',\n creative_manifest: {\n format_id: formatsToTest[0]?.format_id || {\n agent_url: 'https://creative.adcontextprotocol.org',\n id: 'display_300x250',\n },\n name: 'Minimal Test Creative',\n assets: {},\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n steps.push(minimalStep);\n\n // Test 2: Preview with sample assets\n const sampleFormat = formatsToTest[0];\n if (sampleFormat) {\n const { result, step } = await runStep<TaskResult>(\n `Preview creative: with assets (${sampleFormat.format_id.id})`,\n 'preview_creative',\n async () =>\n client.previewCreativeLegacy({\n request_type: 'single',\n creative_manifest: {\n format_id: sampleFormat.format_id,\n name: 'Full Test Creative',\n assets: buildTestAssets(sampleFormat) as unknown as Record<string, unknown>,\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as {\n previews?: Array<{ renders?: unknown[] }>;\n interactive_url?: string;\n };\n const previews = data.previews || [];\n const renderCount = previews.reduce((count, preview) => count + (preview.renders?.length || 0), 0);\n step.details = `Generated preview with ${previews.length} variant(s)`;\n step.response_preview = JSON.stringify(\n {\n has_renders: renderCount > 0,\n preview_count: previews.length,\n render_count: renderCount,\n interactive_url: data.interactive_url,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'preview_creative failed';\n }\n steps.push(step);\n }\n\n // Test 3: Preview with invalid format_id (error case)\n const { result: errorResult, step: errorStep } = await runStep<TaskResult>(\n 'Preview creative: invalid format (error expected)',\n 'preview_creative',\n async () =>\n client.previewCreativeLegacy({\n request_type: 'single',\n creative_manifest: {\n format_id: { agent_url: 'https://creative.adcontextprotocol.org', id: 'INVALID_FORMAT_ID_12345' },\n name: 'Error Test Creative',\n assets: {},\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n\n // This should fail - if it succeeds with invalid format, that's a bug\n if (errorResult?.success) {\n errorStep.passed = false;\n errorStep.error = 'Expected error for invalid format_id but got success';\n } else {\n errorStep.passed = true;\n errorStep.details = 'Correctly rejected invalid format_id';\n }\n steps.push(errorStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Lifecycle\n *\n * Chains creative protocol operations end-to-end:\n * 1. list_creative_formats → verify format schema\n * 2. sync_creatives with multiple creatives → verify per-creative status\n * 3. list_creatives (no snapshot) → verify basic fields\n * 4. list_creatives (include_snapshot: true) → verify snapshot or snapshot_unavailable_reason\n * 5. build_creative or preview_creative on synced creative → adapt to agent capabilities\n */\nexport async function testCreativeLifecycle(\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 // Step 1: Discover creative formats\n const { formats, step: formatStep } = await discoverCreativeFormats(client, profile);\n steps.push(formatStep);\n\n if (!formatStep.passed || !formats || formats.length === 0) {\n return { steps, profile };\n }\n\n profile.supported_formats = formats;\n\n // Validate format schema: each format should have format_id\n const formatSchemaIssues: string[] = [];\n for (const format of formats) {\n if (!format.format_id) formatSchemaIssues.push('Missing format_id');\n }\n\n steps.push({\n step: 'Validate format schema',\n passed: formatSchemaIssues.length === 0,\n duration_ms: 0,\n details:\n formatSchemaIssues.length === 0\n ? `All ${formats.length} format(s) have required fields`\n : formatSchemaIssues.join('; '),\n warnings: formatSchemaIssues.length > 0 ? formatSchemaIssues : undefined,\n });\n\n // Step 2: Sync multiple creatives (image + video if formats allow)\n if (profile.tools.includes('sync_creatives')) {\n const imageFormat = formats[0]!;\n const videoFormat = formats.length > 1 ? formats[1] : undefined;\n\n const creativesToSync = [\n {\n creative_id: `lifecycle-img-${Date.now()}`,\n name: 'Lifecycle Test Image Creative',\n format_id: imageFormat.format_id,\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250.png?text=Lifecycle+Image',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n },\n ];\n\n if (videoFormat) {\n creativesToSync.push({\n creative_id: `lifecycle-vid-${Date.now()}`,\n name: 'Lifecycle Test Video Creative',\n format_id: videoFormat.format_id,\n assets: {\n primary: {\n url: 'https://storage.googleapis.com/webfundamentals-assets/videos/chrome.mp4',\n width: 1920,\n height: 1080,\n format: 'mp4',\n },\n },\n });\n }\n\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n `Sync ${creativesToSync.length} creative(s) to library`,\n 'sync_creatives',\n async () =>\n client.executeTaskLegacy('sync_creatives', {\n creatives: creativesToSync,\n }) as Promise<TaskResult>\n );\n\n if (syncResult?.success && syncResult?.data) {\n const data = syncResult.data;\n const creatives = data.creatives || [];\n const actions = creatives.map((c: any) => c.action);\n const failed = creatives.filter((c: any) => c.action === 'failed');\n\n syncStep.details = `Synced ${creatives.length} creative(s), actions: ${actions.join(', ')}`;\n syncStep.response_preview = JSON.stringify(\n {\n synced_count: creatives.length,\n actions,\n creative_ids: creatives.map((c: any) => c.creative_id),\n failed_count: failed.length,\n failed_errors: failed.map((c: any) => ({ creative_id: c.creative_id, errors: c.errors })),\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 // Step 3: list_creatives without snapshot\n if (profile.tools.includes('list_creatives')) {\n const { result: listResult, step: listStep } = await runStep<TaskResult>(\n 'List creatives (no snapshot)',\n 'list_creatives',\n async () => client.executeTask('list_creatives', {}) as Promise<TaskResult>\n );\n\n if (listResult?.success && listResult?.data) {\n const data = listResult.data;\n const creatives = data.creatives || [];\n\n // Validate basic fields on each creative\n const fieldIssues: string[] = [];\n for (const creative of creatives.slice(0, 5)) {\n if (!creative.creative_id) fieldIssues.push('Creative missing creative_id');\n if (!creative.name) fieldIssues.push(`Creative ${creative.creative_id}: missing name`);\n if (!creative.format_id) fieldIssues.push(`Creative ${creative.creative_id}: missing format_id`);\n }\n\n // Verify snapshot is absent when not requested\n const hasUnexpectedSnapshot = creatives.some((c: any) => c.snapshot !== undefined);\n\n if (fieldIssues.length > 0) {\n listStep.passed = false;\n listStep.error = `Creative field validation: ${fieldIssues.join('; ')}`;\n } else {\n listStep.details = `Found ${creatives.length} creative(s) with valid fields`;\n }\n\n listStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n statuses: Array.from(new Set(creatives.map((c: any) => c.status))),\n has_unexpected_snapshot: hasUnexpectedSnapshot,\n query_summary: data.query_summary,\n },\n null,\n 2\n );\n\n if (hasUnexpectedSnapshot) {\n listStep.warnings = ['snapshot field present on creatives without include_snapshot=true'];\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 // Step 4: list_creatives with include_snapshot: true\n const { result: snapshotResult, step: snapshotStep } = await runStep<TaskResult>(\n 'List creatives (include_snapshot: true)',\n 'list_creatives',\n async () => client.executeTask('list_creatives', { include_snapshot: true }) as Promise<TaskResult>\n );\n\n if (snapshotResult?.success && snapshotResult?.data) {\n const data = snapshotResult.data;\n const creatives = data.creatives || [];\n\n // Each creative should have either snapshot data or snapshot_unavailable_reason\n const invalidCreatives = creatives.filter((c: any) => {\n if (c.snapshot) {\n return !c.snapshot.as_of || c.snapshot.staleness_seconds === undefined;\n }\n return !c.snapshot_unavailable_reason;\n });\n\n if (invalidCreatives.length > 0) {\n snapshotStep.passed = false;\n snapshotStep.error = `${invalidCreatives.length} creative(s) missing both snapshot and snapshot_unavailable_reason`;\n } else {\n const withSnapshot = creatives.filter((c: any) => !!c.snapshot).length;\n const withReason = creatives.filter((c: any) => !!c.snapshot_unavailable_reason).length;\n snapshotStep.details = `${creatives.length} creative(s): ${withSnapshot} with snapshot, ${withReason} with unavailable_reason`;\n }\n\n snapshotStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n with_snapshot: creatives.filter((c: any) => !!c.snapshot).length,\n with_unavailable_reason: creatives.filter((c: any) => !!c.snapshot_unavailable_reason).length,\n snapshot_reasons: Array.from(\n new Set(creatives.map((c: any) => c.snapshot_unavailable_reason).filter(Boolean))\n ),\n },\n null,\n 2\n );\n } else if (snapshotResult && !snapshotResult.success) {\n snapshotStep.passed = false;\n snapshotStep.error = snapshotResult.error || 'list_creatives with snapshot returned unsuccessful result';\n }\n steps.push(snapshotStep);\n }\n }\n\n // Step 5: build_creative or preview_creative (adapt to agent capabilities)\n if (profile.tools.includes('build_creative')) {\n const targetFormat = formats[0]!;\n const { result, step } = await runStep<TaskResult>(\n `Build creative for lifecycle (${targetFormat.format_id})`,\n 'build_creative',\n async () =>\n client.executeTaskLegacy('build_creative', {\n target_format_id: targetFormat.format_id,\n brand: resolveBrand(options),\n message: `Create an ad for lifecycle testing`,\n quality: 'draft',\n include_preview: true,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n const manifest = data.creative_manifest || data.creative_manifests?.[0];\n step.details = `Built creative manifest for format ${manifest?.format_id || targetFormat.format_id}`;\n step.response_preview = JSON.stringify(\n {\n format_id: manifest?.format_id || targetFormat.format_id,\n asset_keys: Object.keys(manifest?.assets || {}),\n has_preview: !!data.preview,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'build_creative failed';\n }\n steps.push(step);\n } else if (profile.tools.includes('preview_creative')) {\n // Tag-serving agents may only support preview, not build\n const targetFormat = formats[0]!;\n const { result, step } = await runStep<TaskResult>(\n `Preview creative for lifecycle (${targetFormat.format_id})`,\n 'preview_creative',\n async () =>\n client.executeTaskLegacy('preview_creative', {\n request_type: 'single',\n creative_manifest: {\n format_id: targetFormat.format_id,\n name: 'Lifecycle Test Preview',\n assets: buildTestAssets(targetFormat),\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n step.details = `Generated preview with ${data.renders?.length || 0} render(s)`;\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'preview_creative failed';\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Select which formats to test based on options\n */\nfunction selectFormatsToTest(\n formats: NonNullable<AgentProfile['supported_formats']>,\n options: TestOptions\n): NonNullable<AgentProfile['supported_formats']> {\n // If specific format_ids provided, use those\n if (options.format_ids?.length) {\n return formats.filter(f => options.format_ids!.includes(f.format_id.id));\n }\n\n // If test_all_formats, test up to max_formats_to_test\n if (options.test_all_formats) {\n const maxFormats = options.max_formats_to_test || 5;\n return formats.slice(0, maxFormats);\n }\n\n // Default: test up to 3 formats\n return formats.slice(0, 3);\n}\n\n/**\n * Build test assets for a format based on its requirements\n */\nfunction buildTestAssets(\n format: NonNullable<AgentProfile['supported_formats']>[0]\n): Array<{ asset_id: string; asset_type: string; url: string }> {\n const assets: Array<{ asset_id: string; asset_type: string; url: string }> = [];\n\n // Add required assets\n if (format.required_assets?.length) {\n for (const assetName of format.required_assets) {\n assets.push({\n asset_id: assetName,\n asset_type: guessAssetType(assetName),\n url: getTestAssetUrl(assetName),\n });\n }\n }\n\n // If no required assets, add a default image\n if (assets.length === 0) {\n assets.push({\n asset_id: 'primary_image',\n asset_type: 'image',\n url: 'https://via.placeholder.com/300x250.png?text=Test+Creative',\n });\n }\n\n return assets;\n}\n\n/**\n * Guess asset type from asset name\n */\nfunction guessAssetType(assetName: string): string {\n const lower = assetName.toLowerCase();\n if (lower.includes('video') || lower.includes('clip')) return 'video';\n if (lower.includes('audio') || lower.includes('sound')) return 'audio';\n if (lower.includes('logo')) return 'image';\n if (lower.includes('text') || lower.includes('headline') || lower.includes('copy')) return 'text';\n return 'image';\n}\n\n/**\n * Get a test asset URL for testing\n */\nfunction getTestAssetUrl(assetName: string): string {\n const type = guessAssetType(assetName);\n switch (type) {\n case 'video':\n return 'https://storage.googleapis.com/webfundamentals-assets/videos/chrome.mp4';\n case 'audio':\n return 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3';\n default:\n return 'https://via.placeholder.com/300x250.png?text=Test+Asset';\n }\n}\n"],"mappings":"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","names":[]}
@@ -20,7 +20,7 @@ async function testCreativeFlow(agentUrl, options) {
20
20
  const { result, step } = await runStep(
21
21
  `Build creative: ${formatDisplayName}`,
22
22
  "build_creative",
23
- async () => client.buildCreative({
23
+ async () => client.buildCreativeLegacy({
24
24
  target_format_id: format.format_id,
25
25
  brand: resolveBrand(options),
26
26
  message: `Create an ad for an e-commerce brand promoting summer sale`,
@@ -53,7 +53,7 @@ async function testCreativeFlow(agentUrl, options) {
53
53
  const { step: minimalStep } = await runStep(
54
54
  "Preview creative: minimal assets",
55
55
  "preview_creative",
56
- async () => client.previewCreative({
56
+ async () => client.previewCreativeLegacy({
57
57
  request_type: "single",
58
58
  creative_manifest: {
59
59
  format_id: formatsToTest[0]?.format_id || {
@@ -71,7 +71,7 @@ async function testCreativeFlow(agentUrl, options) {
71
71
  const { result, step } = await runStep(
72
72
  `Preview creative: with assets (${sampleFormat.format_id.id})`,
73
73
  "preview_creative",
74
- async () => client.previewCreative({
74
+ async () => client.previewCreativeLegacy({
75
75
  request_type: "single",
76
76
  creative_manifest: {
77
77
  format_id: sampleFormat.format_id,
@@ -104,7 +104,7 @@ async function testCreativeFlow(agentUrl, options) {
104
104
  const { result: errorResult, step: errorStep } = await runStep(
105
105
  "Preview creative: invalid format (error expected)",
106
106
  "preview_creative",
107
- async () => client.previewCreative({
107
+ async () => client.previewCreativeLegacy({
108
108
  request_type: "single",
109
109
  creative_manifest: {
110
110
  format_id: { agent_url: "https://creative.adcontextprotocol.org", id: "INVALID_FORMAT_ID_12345" },
@@ -185,7 +185,7 @@ async function testCreativeLifecycle(agentUrl, options) {
185
185
  const { result: syncResult, step: syncStep } = await runStep(
186
186
  `Sync ${creativesToSync.length} creative(s) to library`,
187
187
  "sync_creatives",
188
- async () => client.executeTask("sync_creatives", {
188
+ async () => client.executeTaskLegacy("sync_creatives", {
189
189
  creatives: creativesToSync
190
190
  })
191
191
  );
@@ -297,7 +297,7 @@ async function testCreativeLifecycle(agentUrl, options) {
297
297
  const { result, step } = await runStep(
298
298
  `Build creative for lifecycle (${targetFormat.format_id})`,
299
299
  "build_creative",
300
- async () => client.executeTask("build_creative", {
300
+ async () => client.executeTaskLegacy("build_creative", {
301
301
  target_format_id: targetFormat.format_id,
302
302
  brand: resolveBrand(options),
303
303
  message: `Create an ad for lifecycle testing`,
@@ -328,7 +328,7 @@ async function testCreativeLifecycle(agentUrl, options) {
328
328
  const { result, step } = await runStep(
329
329
  `Preview creative for lifecycle (${targetFormat.format_id})`,
330
330
  "preview_creative",
331
- async () => client.executeTask("preview_creative", {
331
+ async () => client.executeTaskLegacy("preview_creative", {
332
332
  request_type: "single",
333
333
  creative_manifest: {
334
334
  format_id: targetFormat.format_id,