@adcp/sdk 12.0.0 → 12.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (959) hide show
  1. package/dist/lib/adapters/content-standards-adapter.mjs +0 -6
  2. package/dist/lib/adapters/content-standards-adapter.mjs.map +1 -1
  3. package/dist/lib/adapters/derived-account-store.mjs +0 -6
  4. package/dist/lib/adapters/derived-account-store.mjs.map +1 -1
  5. package/dist/lib/adapters/governance-adapter.mjs +0 -6
  6. package/dist/lib/adapters/governance-adapter.mjs.map +1 -1
  7. package/dist/lib/adapters/implicit-account-store.mjs +0 -6
  8. package/dist/lib/adapters/implicit-account-store.mjs.map +1 -1
  9. package/dist/lib/adapters/index.mjs +0 -6
  10. package/dist/lib/adapters/index.mjs.map +1 -1
  11. package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs +0 -6
  12. package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs.map +1 -1
  13. package/dist/lib/adapters/legacy/v2-5/get_products.mjs +0 -6
  14. package/dist/lib/adapters/legacy/v2-5/get_products.mjs.map +1 -1
  15. package/dist/lib/adapters/legacy/v2-5/index.mjs +0 -6
  16. package/dist/lib/adapters/legacy/v2-5/index.mjs.map +1 -1
  17. package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs +0 -6
  18. package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs.map +1 -1
  19. package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs +0 -6
  20. package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs.map +1 -1
  21. package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs +0 -6
  22. package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs.map +1 -1
  23. package/dist/lib/adapters/legacy/v2-5/types.mjs +0 -6
  24. package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs +0 -6
  25. package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs.map +1 -1
  26. package/dist/lib/adapters/oauth-passthrough-resolver.mjs +0 -6
  27. package/dist/lib/adapters/oauth-passthrough-resolver.mjs.map +1 -1
  28. package/dist/lib/adapters/property-list-adapter.mjs +0 -6
  29. package/dist/lib/adapters/property-list-adapter.mjs.map +1 -1
  30. package/dist/lib/adapters/roster-account-store.mjs +0 -6
  31. package/dist/lib/adapters/roster-account-store.mjs.map +1 -1
  32. package/dist/lib/adapters/si-session-manager.mjs +0 -6
  33. package/dist/lib/adapters/si-session-manager.mjs.map +1 -1
  34. package/dist/lib/adapters/version/3.0/brand-fields.mjs +0 -6
  35. package/dist/lib/adapters/version/3.0/brand-fields.mjs.map +1 -1
  36. package/dist/lib/adapters/version/3.0/get-products.mjs +0 -6
  37. package/dist/lib/adapters/version/3.0/get-products.mjs.map +1 -1
  38. package/dist/lib/adapters/version/3.0/index.mjs +0 -6
  39. package/dist/lib/adapters/version/3.0/index.mjs.map +1 -1
  40. package/dist/lib/adapters/version/3.0/sync-accounts.mjs +0 -6
  41. package/dist/lib/adapters/version/3.0/sync-accounts.mjs.map +1 -1
  42. package/dist/lib/adapters/version/index.mjs +0 -6
  43. package/dist/lib/adapters/version/index.mjs.map +1 -1
  44. package/dist/lib/adapters/version/types.mjs +0 -6
  45. package/dist/lib/advanced.mjs +0 -6
  46. package/dist/lib/advanced.mjs.map +1 -1
  47. package/dist/lib/agents/index.generated.mjs +0 -6
  48. package/dist/lib/agents/index.generated.mjs.map +1 -1
  49. package/dist/lib/auth/index.mjs +0 -6
  50. package/dist/lib/auth/index.mjs.map +1 -1
  51. package/dist/lib/auth/oauth/CLIFlowHandler.mjs +0 -6
  52. package/dist/lib/auth/oauth/CLIFlowHandler.mjs.map +1 -1
  53. package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs +0 -6
  54. package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs.map +1 -1
  55. package/dist/lib/auth/oauth/MCPOAuthProvider.mjs +0 -6
  56. package/dist/lib/auth/oauth/MCPOAuthProvider.mjs.map +1 -1
  57. package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs +0 -6
  58. package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs.map +1 -1
  59. package/dist/lib/auth/oauth/authorization-required.mjs +0 -6
  60. package/dist/lib/auth/oauth/authorization-required.mjs.map +1 -1
  61. package/dist/lib/auth/oauth/diagnose.mjs +0 -6
  62. package/dist/lib/auth/oauth/diagnose.mjs.map +1 -1
  63. package/dist/lib/auth/oauth/diagnostics.mjs +0 -6
  64. package/dist/lib/auth/oauth/diagnostics.mjs.map +1 -1
  65. package/dist/lib/auth/oauth/discovery.mjs +0 -6
  66. package/dist/lib/auth/oauth/discovery.mjs.map +1 -1
  67. package/dist/lib/auth/oauth/file-storage.mjs +0 -6
  68. package/dist/lib/auth/oauth/file-storage.mjs.map +1 -1
  69. package/dist/lib/auth/oauth/index.mjs +0 -6
  70. package/dist/lib/auth/oauth/index.mjs.map +1 -1
  71. package/dist/lib/auth/oauth/secret-resolver.mjs +0 -6
  72. package/dist/lib/auth/oauth/secret-resolver.mjs.map +1 -1
  73. package/dist/lib/auth/oauth/storage-registry.mjs +0 -6
  74. package/dist/lib/auth/oauth/storage-registry.mjs.map +1 -1
  75. package/dist/lib/auth/oauth/types.mjs +0 -6
  76. package/dist/lib/auth/oauth/types.mjs.map +1 -1
  77. package/dist/lib/auth/oauth/web-flow.mjs +0 -6
  78. package/dist/lib/auth/oauth/web-flow.mjs.map +1 -1
  79. package/dist/lib/brand/index.mjs +0 -6
  80. package/dist/lib/brand/index.mjs.map +1 -1
  81. package/dist/lib/canonical-references/index.mjs +6 -7
  82. package/dist/lib/canonical-references/index.mjs.map +1 -1
  83. package/dist/lib/client/index.mjs +0 -6
  84. package/dist/lib/client/index.mjs.map +1 -1
  85. package/dist/lib/compliance/index.mjs +0 -6
  86. package/dist/lib/compliance/index.mjs.map +1 -1
  87. package/dist/lib/compliance-fixtures/index.mjs +0 -6
  88. package/dist/lib/compliance-fixtures/index.mjs.map +1 -1
  89. package/dist/lib/compliance-fixtures/test-authorization-server.mjs +0 -6
  90. package/dist/lib/compliance-fixtures/test-authorization-server.mjs.map +1 -1
  91. package/dist/lib/conformance/index.mjs +0 -6
  92. package/dist/lib/conformance/index.mjs.map +1 -1
  93. package/dist/lib/conformance/invariants/uniformError.mjs +0 -6
  94. package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
  95. package/dist/lib/conformance/invariants/uniformErrorComparator.mjs +0 -6
  96. package/dist/lib/conformance/invariants/uniformErrorComparator.mjs.map +1 -1
  97. package/dist/lib/conformance/oracle.mjs +0 -6
  98. package/dist/lib/conformance/oracle.mjs.map +1 -1
  99. package/dist/lib/conformance/runConformance.mjs +0 -6
  100. package/dist/lib/conformance/runConformance.mjs.map +1 -1
  101. package/dist/lib/conformance/runners.mjs +0 -6
  102. package/dist/lib/conformance/runners.mjs.map +1 -1
  103. package/dist/lib/conformance/schemaArbitrary.mjs +0 -6
  104. package/dist/lib/conformance/schemaArbitrary.mjs.map +1 -1
  105. package/dist/lib/conformance/schemaLoader.mjs +5 -6
  106. package/dist/lib/conformance/schemaLoader.mjs.map +1 -1
  107. package/dist/lib/conformance/seeder.mjs +0 -6
  108. package/dist/lib/conformance/seeder.mjs.map +1 -1
  109. package/dist/lib/conformance/types.mjs +0 -6
  110. package/dist/lib/conformance/types.mjs.map +1 -1
  111. package/dist/lib/conformance/webhook.mjs +0 -6
  112. package/dist/lib/conformance/webhook.mjs.map +1 -1
  113. package/dist/lib/core/ADCPMultiAgentClient.mjs +0 -6
  114. package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
  115. package/dist/lib/core/AgentClient.mjs +0 -6
  116. package/dist/lib/core/AgentClient.mjs.map +1 -1
  117. package/dist/lib/core/AsyncHandler.mjs +0 -6
  118. package/dist/lib/core/AsyncHandler.mjs.map +1 -1
  119. package/dist/lib/core/ConfigurationManager.mjs +0 -6
  120. package/dist/lib/core/ConfigurationManager.mjs.map +1 -1
  121. package/dist/lib/core/ConversationTypes.mjs +0 -6
  122. package/dist/lib/core/CreativeAgentClient.mjs +0 -6
  123. package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
  124. package/dist/lib/core/GovernanceMiddleware.mjs +0 -6
  125. package/dist/lib/core/GovernanceMiddleware.mjs.map +1 -1
  126. package/dist/lib/core/GovernanceTypes.mjs +0 -6
  127. package/dist/lib/core/GovernanceTypes.mjs.map +1 -1
  128. package/dist/lib/core/ProtocolResponseParser.mjs +0 -6
  129. package/dist/lib/core/ProtocolResponseParser.mjs.map +1 -1
  130. package/dist/lib/core/ResponseValidator.mjs +0 -6
  131. package/dist/lib/core/ResponseValidator.mjs.map +1 -1
  132. package/dist/lib/core/SingleAgentClient.mjs +0 -6
  133. package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
  134. package/dist/lib/core/TaskEventTypes.mjs +0 -6
  135. package/dist/lib/core/TaskEventTypes.mjs.map +1 -1
  136. package/dist/lib/core/TaskExecutor.mjs +0 -6
  137. package/dist/lib/core/TaskExecutor.mjs.map +1 -1
  138. package/dist/lib/core/match.mjs +0 -6
  139. package/dist/lib/core/match.mjs.map +1 -1
  140. package/dist/lib/core/task-status.mjs +0 -6
  141. package/dist/lib/core/task-status.mjs.map +1 -1
  142. package/dist/lib/core/webhook-url.mjs +0 -6
  143. package/dist/lib/core/webhook-url.mjs.map +1 -1
  144. package/dist/lib/discovery/adagents-redirects.mjs +0 -6
  145. package/dist/lib/discovery/adagents-redirects.mjs.map +1 -1
  146. package/dist/lib/discovery/agent-directory.mjs +0 -6
  147. package/dist/lib/discovery/agent-directory.mjs.map +1 -1
  148. package/dist/lib/discovery/inline-publisher-properties.mjs +0 -6
  149. package/dist/lib/discovery/inline-publisher-properties.mjs.map +1 -1
  150. package/dist/lib/discovery/network-consistency-checker.mjs +0 -6
  151. package/dist/lib/discovery/network-consistency-checker.mjs.map +1 -1
  152. package/dist/lib/discovery/property-crawler.mjs +0 -6
  153. package/dist/lib/discovery/property-crawler.mjs.map +1 -1
  154. package/dist/lib/discovery/property-index.mjs +0 -6
  155. package/dist/lib/discovery/property-index.mjs.map +1 -1
  156. package/dist/lib/discovery/publisher-property-selector.mjs +0 -6
  157. package/dist/lib/discovery/publisher-property-selector.mjs.map +1 -1
  158. package/dist/lib/discovery/resolve-agent-properties.mjs +0 -6
  159. package/dist/lib/discovery/resolve-agent-properties.mjs.map +1 -1
  160. package/dist/lib/discovery/types.mjs +0 -6
  161. package/dist/lib/discovery/validate-adagents.mjs +0 -6
  162. package/dist/lib/discovery/validate-adagents.mjs.map +1 -1
  163. package/dist/lib/enums.mjs +0 -6
  164. package/dist/lib/enums.mjs.map +1 -1
  165. package/dist/lib/errors/index.mjs +0 -6
  166. package/dist/lib/errors/index.mjs.map +1 -1
  167. package/dist/lib/express-mcp/index.mjs +0 -6
  168. package/dist/lib/express-mcp/index.mjs.map +1 -1
  169. package/dist/lib/governance/index.mjs +0 -6
  170. package/dist/lib/governance/index.mjs.map +1 -1
  171. package/dist/lib/handlers/types.mjs +0 -6
  172. package/dist/lib/handlers/types.mjs.map +1 -1
  173. package/dist/lib/index.d.mts +1 -1
  174. package/dist/lib/index.d.ts +1 -1
  175. package/dist/lib/index.d.ts.map +1 -1
  176. package/dist/lib/index.js.map +1 -1
  177. package/dist/lib/index.mjs +0 -6
  178. package/dist/lib/index.mjs.map +1 -1
  179. package/dist/lib/media-buy/available-actions.mjs +0 -6
  180. package/dist/lib/media-buy/available-actions.mjs.map +1 -1
  181. package/dist/lib/media-buy/index.mjs +0 -6
  182. package/dist/lib/media-buy/index.mjs.map +1 -1
  183. package/dist/lib/media-buy/preflight.mjs +0 -6
  184. package/dist/lib/media-buy/preflight.mjs.map +1 -1
  185. package/dist/lib/media-buy/property-policy.mjs +0 -6
  186. package/dist/lib/media-buy/property-policy.mjs.map +1 -1
  187. package/dist/lib/media-buy/types.mjs +0 -6
  188. package/dist/lib/media-buy/types.mjs.map +1 -1
  189. package/dist/lib/media-buy/update-fields.generated.mjs +0 -6
  190. package/dist/lib/media-buy/update-fields.generated.mjs.map +1 -1
  191. package/dist/lib/mock-server/creative-ad-server/seed-data.mjs +0 -6
  192. package/dist/lib/mock-server/creative-ad-server/seed-data.mjs.map +1 -1
  193. package/dist/lib/mock-server/creative-ad-server/server.mjs +0 -6
  194. package/dist/lib/mock-server/creative-ad-server/server.mjs.map +1 -1
  195. package/dist/lib/mock-server/creative-template/seed-data.mjs +0 -6
  196. package/dist/lib/mock-server/creative-template/seed-data.mjs.map +1 -1
  197. package/dist/lib/mock-server/creative-template/server.mjs +0 -6
  198. package/dist/lib/mock-server/creative-template/server.mjs.map +1 -1
  199. package/dist/lib/mock-server/index.mjs +0 -6
  200. package/dist/lib/mock-server/index.mjs.map +1 -1
  201. package/dist/lib/mock-server/sales-guaranteed/recipe.mjs +0 -6
  202. package/dist/lib/mock-server/sales-guaranteed/recipe.mjs.map +1 -1
  203. package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs +0 -6
  204. package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs.map +1 -1
  205. package/dist/lib/mock-server/sales-guaranteed/server.mjs +0 -6
  206. package/dist/lib/mock-server/sales-guaranteed/server.mjs.map +1 -1
  207. package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs +0 -6
  208. package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs.map +1 -1
  209. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs +0 -6
  210. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs.map +1 -1
  211. package/dist/lib/mock-server/sales-non-guaranteed/server.mjs +0 -6
  212. package/dist/lib/mock-server/sales-non-guaranteed/server.mjs.map +1 -1
  213. package/dist/lib/mock-server/sales-social/seed-data.mjs +0 -6
  214. package/dist/lib/mock-server/sales-social/seed-data.mjs.map +1 -1
  215. package/dist/lib/mock-server/sales-social/server.mjs +0 -6
  216. package/dist/lib/mock-server/sales-social/server.mjs.map +1 -1
  217. package/dist/lib/mock-server/scenario.mjs +0 -6
  218. package/dist/lib/mock-server/scenario.mjs.map +1 -1
  219. package/dist/lib/mock-server/signal-marketplace/seed-data.mjs +0 -6
  220. package/dist/lib/mock-server/signal-marketplace/seed-data.mjs.map +1 -1
  221. package/dist/lib/mock-server/signal-marketplace/server.mjs +0 -6
  222. package/dist/lib/mock-server/signal-marketplace/server.mjs.map +1 -1
  223. package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs +0 -6
  224. package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs.map +1 -1
  225. package/dist/lib/mock-server/sponsored-intelligence/server.mjs +0 -6
  226. package/dist/lib/mock-server/sponsored-intelligence/server.mjs.map +1 -1
  227. package/dist/lib/net/address-guards.mjs +0 -6
  228. package/dist/lib/net/address-guards.mjs.map +1 -1
  229. package/dist/lib/net/index.mjs +0 -6
  230. package/dist/lib/net/index.mjs.map +1 -1
  231. package/dist/lib/net/ssrf-fetch.mjs +0 -6
  232. package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
  233. package/dist/lib/observability/index.mjs +0 -6
  234. package/dist/lib/observability/index.mjs.map +1 -1
  235. package/dist/lib/observability/tracing.mjs +6 -7
  236. package/dist/lib/observability/tracing.mjs.map +1 -1
  237. package/dist/lib/protocols/a2a.mjs +0 -6
  238. package/dist/lib/protocols/a2a.mjs.map +1 -1
  239. package/dist/lib/protocols/abort.mjs +0 -6
  240. package/dist/lib/protocols/abort.mjs.map +1 -1
  241. package/dist/lib/protocols/index.mjs +0 -6
  242. package/dist/lib/protocols/index.mjs.map +1 -1
  243. package/dist/lib/protocols/mcp-modern.mjs +0 -6
  244. package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
  245. package/dist/lib/protocols/mcp-tasks.mjs +0 -6
  246. package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
  247. package/dist/lib/protocols/mcp.mjs +0 -6
  248. package/dist/lib/protocols/mcp.mjs.map +1 -1
  249. package/dist/lib/protocols/rawResponseCapture.mjs +0 -6
  250. package/dist/lib/protocols/rawResponseCapture.mjs.map +1 -1
  251. package/dist/lib/protocols/responseSizeLimit.mjs +0 -6
  252. package/dist/lib/protocols/responseSizeLimit.mjs.map +1 -1
  253. package/dist/lib/protocols/transportDiagnostics.mjs +0 -6
  254. package/dist/lib/protocols/transportDiagnostics.mjs.map +1 -1
  255. package/dist/lib/registry/cursor-store.mjs +0 -6
  256. package/dist/lib/registry/cursor-store.mjs.map +1 -1
  257. package/dist/lib/registry/feed-stream.mjs +0 -6
  258. package/dist/lib/registry/feed-stream.mjs.map +1 -1
  259. package/dist/lib/registry/index.mjs +0 -6
  260. package/dist/lib/registry/index.mjs.map +1 -1
  261. package/dist/lib/registry/property-registry.mjs +0 -6
  262. package/dist/lib/registry/property-registry.mjs.map +1 -1
  263. package/dist/lib/registry/sync.mjs +0 -6
  264. package/dist/lib/registry/sync.mjs.map +1 -1
  265. package/dist/lib/registry/types.generated.mjs +0 -6
  266. package/dist/lib/registry/types.mjs +0 -6
  267. package/dist/lib/schemas/index.mjs +0 -6
  268. package/dist/lib/schemas/index.mjs.map +1 -1
  269. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  270. package/dist/lib/server/a2a-adapter.mjs +0 -6
  271. package/dist/lib/server/a2a-adapter.mjs.map +1 -1
  272. package/dist/lib/server/account-mode.mjs +0 -6
  273. package/dist/lib/server/account-mode.mjs.map +1 -1
  274. package/dist/lib/server/adcp-server.mjs +0 -6
  275. package/dist/lib/server/adcp-server.mjs.map +1 -1
  276. package/dist/lib/server/auth-introspection.mjs +0 -6
  277. package/dist/lib/server/auth-introspection.mjs.map +1 -1
  278. package/dist/lib/server/auth-signature.mjs +0 -6
  279. package/dist/lib/server/auth-signature.mjs.map +1 -1
  280. package/dist/lib/server/auth.mjs +0 -6
  281. package/dist/lib/server/auth.mjs.map +1 -1
  282. package/dist/lib/server/create-adcp-server.d.mts +13 -0
  283. package/dist/lib/server/create-adcp-server.d.ts +13 -0
  284. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  285. package/dist/lib/server/create-adcp-server.js +3 -2
  286. package/dist/lib/server/create-adcp-server.js.map +1 -1
  287. package/dist/lib/server/create-adcp-server.mjs +3 -8
  288. package/dist/lib/server/create-adcp-server.mjs.map +1 -1
  289. package/dist/lib/server/credential-policy.mjs +0 -6
  290. package/dist/lib/server/credential-policy.mjs.map +1 -1
  291. package/dist/lib/server/ctx-metadata/backends/memory.mjs +0 -6
  292. package/dist/lib/server/ctx-metadata/backends/memory.mjs.map +1 -1
  293. package/dist/lib/server/ctx-metadata/backends/pg.mjs +0 -6
  294. package/dist/lib/server/ctx-metadata/backends/pg.mjs.map +1 -1
  295. package/dist/lib/server/ctx-metadata/backends/redis.mjs +0 -6
  296. package/dist/lib/server/ctx-metadata/backends/redis.mjs.map +1 -1
  297. package/dist/lib/server/ctx-metadata/index.mjs +0 -6
  298. package/dist/lib/server/ctx-metadata/index.mjs.map +1 -1
  299. package/dist/lib/server/ctx-metadata/store.mjs +0 -6
  300. package/dist/lib/server/ctx-metadata/store.mjs.map +1 -1
  301. package/dist/lib/server/ctx-metadata/wire-shape.mjs +0 -6
  302. package/dist/lib/server/ctx-metadata/wire-shape.mjs.map +1 -1
  303. package/dist/lib/server/decisioning/account.mjs +0 -6
  304. package/dist/lib/server/decisioning/account.mjs.map +1 -1
  305. package/dist/lib/server/decisioning/admin-router.mjs +0 -6
  306. package/dist/lib/server/decisioning/admin-router.mjs.map +1 -1
  307. package/dist/lib/server/decisioning/assembly-helpers.mjs +0 -6
  308. package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
  309. package/dist/lib/server/decisioning/async-outcome.mjs +0 -6
  310. package/dist/lib/server/decisioning/async-outcome.mjs.map +1 -1
  311. package/dist/lib/server/decisioning/buyer-agent.mjs +0 -6
  312. package/dist/lib/server/decisioning/buyer-agent.mjs.map +1 -1
  313. package/dist/lib/server/decisioning/capabilities.mjs +0 -6
  314. package/dist/lib/server/decisioning/capabilities.mjs.map +1 -1
  315. package/dist/lib/server/decisioning/compose.mjs +0 -6
  316. package/dist/lib/server/decisioning/compose.mjs.map +1 -1
  317. package/dist/lib/server/decisioning/context.mjs +0 -6
  318. package/dist/lib/server/decisioning/errors-typed.mjs +0 -6
  319. package/dist/lib/server/decisioning/errors-typed.mjs.map +1 -1
  320. package/dist/lib/server/decisioning/helpers.mjs +0 -6
  321. package/dist/lib/server/decisioning/helpers.mjs.map +1 -1
  322. package/dist/lib/server/decisioning/index.mjs +0 -6
  323. package/dist/lib/server/decisioning/index.mjs.map +1 -1
  324. package/dist/lib/server/decisioning/list-helpers.mjs +0 -6
  325. package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
  326. package/dist/lib/server/decisioning/manifest-helpers.mjs +0 -6
  327. package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
  328. package/dist/lib/server/decisioning/pagination.mjs +0 -6
  329. package/dist/lib/server/decisioning/platform-helpers.mjs +0 -6
  330. package/dist/lib/server/decisioning/platform-helpers.mjs.map +1 -1
  331. package/dist/lib/server/decisioning/platform.mjs +0 -6
  332. package/dist/lib/server/decisioning/proposal/dispatch.mjs +0 -6
  333. package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
  334. package/dist/lib/server/decisioning/proposal/index.mjs +0 -6
  335. package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
  336. package/dist/lib/server/decisioning/proposal/lifecycle.mjs +0 -6
  337. package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
  338. package/dist/lib/server/decisioning/proposal/mock-manager.mjs +0 -6
  339. package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
  340. package/dist/lib/server/decisioning/proposal/store.mjs +0 -6
  341. package/dist/lib/server/decisioning/proposal/store.mjs.map +1 -1
  342. package/dist/lib/server/decisioning/proposal/types.mjs +0 -6
  343. package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
  344. package/dist/lib/server/decisioning/resolve-presets.mjs +0 -6
  345. package/dist/lib/server/decisioning/resolve-presets.mjs.map +1 -1
  346. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs +0 -6
  347. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
  348. package/dist/lib/server/decisioning/runtime/from-platform.mjs +0 -6
  349. package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
  350. package/dist/lib/server/decisioning/runtime/observed-modes.mjs +0 -6
  351. package/dist/lib/server/decisioning/runtime/observed-modes.mjs.map +1 -1
  352. package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs +0 -6
  353. package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs.map +1 -1
  354. package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs +0 -6
  355. package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs.map +1 -1
  356. package/dist/lib/server/decisioning/runtime/task-registry.mjs +0 -6
  357. package/dist/lib/server/decisioning/runtime/task-registry.mjs.map +1 -1
  358. package/dist/lib/server/decisioning/runtime/to-context.mjs +0 -6
  359. package/dist/lib/server/decisioning/runtime/to-context.mjs.map +1 -1
  360. package/dist/lib/server/decisioning/runtime/validate-platform.mjs +0 -6
  361. package/dist/lib/server/decisioning/runtime/validate-platform.mjs.map +1 -1
  362. package/dist/lib/server/decisioning/specialisms/audiences.mjs +0 -6
  363. package/dist/lib/server/decisioning/specialisms/brand-rights.mjs +0 -6
  364. package/dist/lib/server/decisioning/specialisms/campaign-governance.mjs +0 -6
  365. package/dist/lib/server/decisioning/specialisms/content-standards.mjs +0 -6
  366. package/dist/lib/server/decisioning/specialisms/creative-ad-server.mjs +0 -6
  367. package/dist/lib/server/decisioning/specialisms/creative.mjs +0 -6
  368. package/dist/lib/server/decisioning/specialisms/lists.mjs +0 -6
  369. package/dist/lib/server/decisioning/specialisms/sales.mjs +0 -6
  370. package/dist/lib/server/decisioning/specialisms/signals.mjs +0 -6
  371. package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.mjs +0 -6
  372. package/dist/lib/server/decisioning/start-time.mjs +0 -6
  373. package/dist/lib/server/decisioning/start-time.mjs.map +1 -1
  374. package/dist/lib/server/decisioning/status-changes.mjs +0 -6
  375. package/dist/lib/server/decisioning/status-changes.mjs.map +1 -1
  376. package/dist/lib/server/decisioning/status-mappers.mjs +0 -6
  377. package/dist/lib/server/decisioning/status-mappers.mjs.map +1 -1
  378. package/dist/lib/server/decisioning/tenant-registry.mjs +0 -6
  379. package/dist/lib/server/decisioning/tenant-registry.mjs.map +1 -1
  380. package/dist/lib/server/decisioning/tenant-store.mjs +0 -6
  381. package/dist/lib/server/decisioning/tenant-store.mjs.map +1 -1
  382. package/dist/lib/server/decisioning/validate-specialisms.mjs +0 -6
  383. package/dist/lib/server/decisioning/validate-specialisms.mjs.map +1 -1
  384. package/dist/lib/server/dynamic-registry.mjs +0 -6
  385. package/dist/lib/server/dynamic-registry.mjs.map +1 -1
  386. package/dist/lib/server/envelope-allowlist.mjs +0 -6
  387. package/dist/lib/server/envelope-allowlist.mjs.map +1 -1
  388. package/dist/lib/server/error-arm-tools.mjs +5 -6
  389. package/dist/lib/server/error-arm-tools.mjs.map +1 -1
  390. package/dist/lib/server/errors.mjs +0 -6
  391. package/dist/lib/server/errors.mjs.map +1 -1
  392. package/dist/lib/server/example-tld-guard.mjs +0 -6
  393. package/dist/lib/server/example-tld-guard.mjs.map +1 -1
  394. package/dist/lib/server/express-adapter.mjs +0 -6
  395. package/dist/lib/server/express-adapter.mjs.map +1 -1
  396. package/dist/lib/server/governance.mjs +0 -6
  397. package/dist/lib/server/governance.mjs.map +1 -1
  398. package/dist/lib/server/idempotency/backends/lazy.mjs +0 -6
  399. package/dist/lib/server/idempotency/backends/lazy.mjs.map +1 -1
  400. package/dist/lib/server/idempotency/backends/memory.mjs +0 -6
  401. package/dist/lib/server/idempotency/backends/memory.mjs.map +1 -1
  402. package/dist/lib/server/idempotency/backends/pg.mjs +0 -6
  403. package/dist/lib/server/idempotency/backends/pg.mjs.map +1 -1
  404. package/dist/lib/server/idempotency/backends/redis.mjs +0 -6
  405. package/dist/lib/server/idempotency/backends/redis.mjs.map +1 -1
  406. package/dist/lib/server/idempotency/index.mjs +0 -6
  407. package/dist/lib/server/idempotency/index.mjs.map +1 -1
  408. package/dist/lib/server/idempotency/store.mjs +0 -6
  409. package/dist/lib/server/idempotency/store.mjs.map +1 -1
  410. package/dist/lib/server/index.d.mts +1 -1
  411. package/dist/lib/server/index.d.ts +1 -1
  412. package/dist/lib/server/index.d.ts.map +1 -1
  413. package/dist/lib/server/index.js.map +1 -1
  414. package/dist/lib/server/index.mjs +0 -6
  415. package/dist/lib/server/index.mjs.map +1 -1
  416. package/dist/lib/server/legacy/v5/index.d.mts +1 -1
  417. package/dist/lib/server/legacy/v5/index.d.ts +1 -1
  418. package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
  419. package/dist/lib/server/legacy/v5/index.js.map +1 -1
  420. package/dist/lib/server/legacy/v5/index.mjs +0 -6
  421. package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
  422. package/dist/lib/server/mcp-modern-server.mjs +0 -6
  423. package/dist/lib/server/mcp-modern-server.mjs.map +1 -1
  424. package/dist/lib/server/media-buy-actions.mjs +0 -6
  425. package/dist/lib/server/media-buy-actions.mjs.map +1 -1
  426. package/dist/lib/server/media-buy-helpers.mjs +0 -6
  427. package/dist/lib/server/media-buy-helpers.mjs.map +1 -1
  428. package/dist/lib/server/media-buy-store.mjs +0 -6
  429. package/dist/lib/server/media-buy-store.mjs.map +1 -1
  430. package/dist/lib/server/normalize-errors.mjs +0 -6
  431. package/dist/lib/server/normalize-errors.mjs.map +1 -1
  432. package/dist/lib/server/operational-platform.mjs +0 -6
  433. package/dist/lib/server/operational-platform.mjs.map +1 -1
  434. package/dist/lib/server/pick-safe-details.mjs +0 -6
  435. package/dist/lib/server/pick-safe-details.mjs.map +1 -1
  436. package/dist/lib/server/pin-and-bind-fetch.mjs +0 -6
  437. package/dist/lib/server/pin-and-bind-fetch.mjs.map +1 -1
  438. package/dist/lib/server/postgres-state-store.mjs +0 -6
  439. package/dist/lib/server/postgres-state-store.mjs.map +1 -1
  440. package/dist/lib/server/postgres-task-store.mjs +0 -6
  441. package/dist/lib/server/postgres-task-store.mjs.map +1 -1
  442. package/dist/lib/server/product-defaults.mjs +0 -6
  443. package/dist/lib/server/product-defaults.mjs.map +1 -1
  444. package/dist/lib/server/redact.mjs +0 -6
  445. package/dist/lib/server/redact.mjs.map +1 -1
  446. package/dist/lib/server/responses.mjs +0 -6
  447. package/dist/lib/server/responses.mjs.map +1 -1
  448. package/dist/lib/server/serve.mjs +0 -6
  449. package/dist/lib/server/serve.mjs.map +1 -1
  450. package/dist/lib/server/socket-mode/conformance-client.mjs +0 -6
  451. package/dist/lib/server/socket-mode/conformance-client.mjs.map +1 -1
  452. package/dist/lib/server/socket-mode/index.mjs +0 -6
  453. package/dist/lib/server/socket-mode/index.mjs.map +1 -1
  454. package/dist/lib/server/socket-mode/ws-transport.mjs +0 -6
  455. package/dist/lib/server/socket-mode/ws-transport.mjs.map +1 -1
  456. package/dist/lib/server/state-machine.mjs +0 -6
  457. package/dist/lib/server/state-machine.mjs.map +1 -1
  458. package/dist/lib/server/state-store.mjs +0 -6
  459. package/dist/lib/server/state-store.mjs.map +1 -1
  460. package/dist/lib/server/structured-serialize.mjs +0 -6
  461. package/dist/lib/server/structured-serialize.mjs.map +1 -1
  462. package/dist/lib/server/targeting-helpers.mjs +0 -6
  463. package/dist/lib/server/targeting-helpers.mjs.map +1 -1
  464. package/dist/lib/server/tasks.mjs +0 -6
  465. package/dist/lib/server/tasks.mjs.map +1 -1
  466. package/dist/lib/server/test-controller-bridge.mjs +0 -6
  467. package/dist/lib/server/test-controller-bridge.mjs.map +1 -1
  468. package/dist/lib/server/test-controller.mjs +0 -6
  469. package/dist/lib/server/test-controller.mjs.map +1 -1
  470. package/dist/lib/server/upstream-helpers.mjs +0 -6
  471. package/dist/lib/server/upstream-helpers.mjs.map +1 -1
  472. package/dist/lib/server/webhook-emitter.mjs +0 -6
  473. package/dist/lib/server/webhook-emitter.mjs.map +1 -1
  474. package/dist/lib/server/wire-safe.mjs +0 -6
  475. package/dist/lib/server/wire-safe.mjs.map +1 -1
  476. package/dist/lib/server/wire-spec-fields.generated.mjs +0 -6
  477. package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
  478. package/dist/lib/server/wrap-envelope.mjs +0 -6
  479. package/dist/lib/server/wrap-envelope.mjs.map +1 -1
  480. package/dist/lib/signing/agent-context.mjs +0 -6
  481. package/dist/lib/signing/agent-context.mjs.map +1 -1
  482. package/dist/lib/signing/agent-fetch.mjs +0 -6
  483. package/dist/lib/signing/agent-fetch.mjs.map +1 -1
  484. package/dist/lib/signing/agent-resolver/canonicalize.mjs +0 -6
  485. package/dist/lib/signing/agent-resolver/canonicalize.mjs.map +1 -1
  486. package/dist/lib/signing/agent-resolver/capabilities-types.mjs +0 -6
  487. package/dist/lib/signing/agent-resolver/capabilities-types.mjs.map +1 -1
  488. package/dist/lib/signing/agent-resolver/consistency.mjs +0 -6
  489. package/dist/lib/signing/agent-resolver/consistency.mjs.map +1 -1
  490. package/dist/lib/signing/agent-resolver/errors.mjs +0 -6
  491. package/dist/lib/signing/agent-resolver/errors.mjs.map +1 -1
  492. package/dist/lib/signing/agent-resolver/etld.mjs +0 -6
  493. package/dist/lib/signing/agent-resolver/etld.mjs.map +1 -1
  494. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs +0 -6
  495. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs.map +1 -1
  496. package/dist/lib/signing/agent-resolver/index.mjs +0 -6
  497. package/dist/lib/signing/agent-resolver/index.mjs.map +1 -1
  498. package/dist/lib/signing/agent-resolver/jwks-set.mjs +0 -6
  499. package/dist/lib/signing/agent-resolver/jwks-set.mjs.map +1 -1
  500. package/dist/lib/signing/agent-resolver/resolve-agent.mjs +0 -6
  501. package/dist/lib/signing/agent-resolver/resolve-agent.mjs.map +1 -1
  502. package/dist/lib/signing/agent-resolver/select-agent.mjs +0 -6
  503. package/dist/lib/signing/agent-resolver/select-agent.mjs.map +1 -1
  504. package/dist/lib/signing/agent-resolver/strict-json.mjs +0 -6
  505. package/dist/lib/signing/agent-resolver/strict-json.mjs.map +1 -1
  506. package/dist/lib/signing/brand-jwks.mjs +0 -6
  507. package/dist/lib/signing/brand-jwks.mjs.map +1 -1
  508. package/dist/lib/signing/canonicalize.mjs +0 -6
  509. package/dist/lib/signing/canonicalize.mjs.map +1 -1
  510. package/dist/lib/signing/capability-cache.mjs +0 -6
  511. package/dist/lib/signing/capability-cache.mjs.map +1 -1
  512. package/dist/lib/signing/capability-priming.mjs +0 -6
  513. package/dist/lib/signing/capability-priming.mjs.map +1 -1
  514. package/dist/lib/signing/client.mjs +0 -6
  515. package/dist/lib/signing/client.mjs.map +1 -1
  516. package/dist/lib/signing/content-digest.mjs +0 -6
  517. package/dist/lib/signing/content-digest.mjs.map +1 -1
  518. package/dist/lib/signing/crypto.mjs +0 -6
  519. package/dist/lib/signing/crypto.mjs.map +1 -1
  520. package/dist/lib/signing/ecdsa-encoding.mjs +0 -6
  521. package/dist/lib/signing/ecdsa-encoding.mjs.map +1 -1
  522. package/dist/lib/signing/errors.mjs +0 -6
  523. package/dist/lib/signing/errors.mjs.map +1 -1
  524. package/dist/lib/signing/fetch-async.mjs +0 -6
  525. package/dist/lib/signing/fetch-async.mjs.map +1 -1
  526. package/dist/lib/signing/fetch.mjs +0 -6
  527. package/dist/lib/signing/fetch.mjs.map +1 -1
  528. package/dist/lib/signing/index.mjs +0 -6
  529. package/dist/lib/signing/index.mjs.map +1 -1
  530. package/dist/lib/signing/jwks-helpers.mjs +0 -6
  531. package/dist/lib/signing/jwks-helpers.mjs.map +1 -1
  532. package/dist/lib/signing/jwks-https.mjs +0 -6
  533. package/dist/lib/signing/jwks-https.mjs.map +1 -1
  534. package/dist/lib/signing/jwks.mjs +0 -6
  535. package/dist/lib/signing/jwks.mjs.map +1 -1
  536. package/dist/lib/signing/middleware.mjs +0 -6
  537. package/dist/lib/signing/middleware.mjs.map +1 -1
  538. package/dist/lib/signing/parser.mjs +0 -6
  539. package/dist/lib/signing/parser.mjs.map +1 -1
  540. package/dist/lib/signing/postgres-replay-store.mjs +0 -6
  541. package/dist/lib/signing/postgres-replay-store.mjs.map +1 -1
  542. package/dist/lib/signing/protocol-response.mjs +0 -6
  543. package/dist/lib/signing/protocol-response.mjs.map +1 -1
  544. package/dist/lib/signing/provider.mjs +0 -6
  545. package/dist/lib/signing/redis-replay-store.mjs +0 -6
  546. package/dist/lib/signing/redis-replay-store.mjs.map +1 -1
  547. package/dist/lib/signing/replay.mjs +0 -6
  548. package/dist/lib/signing/replay.mjs.map +1 -1
  549. package/dist/lib/signing/request-context.mjs +0 -6
  550. package/dist/lib/signing/request-context.mjs.map +1 -1
  551. package/dist/lib/signing/revocation-https.mjs +0 -6
  552. package/dist/lib/signing/revocation-https.mjs.map +1 -1
  553. package/dist/lib/signing/revocation.mjs +0 -6
  554. package/dist/lib/signing/revocation.mjs.map +1 -1
  555. package/dist/lib/signing/server.mjs +0 -6
  556. package/dist/lib/signing/server.mjs.map +1 -1
  557. package/dist/lib/signing/signer-async.mjs +0 -6
  558. package/dist/lib/signing/signer-async.mjs.map +1 -1
  559. package/dist/lib/signing/signer.mjs +0 -6
  560. package/dist/lib/signing/signer.mjs.map +1 -1
  561. package/dist/lib/signing/testing.mjs +0 -6
  562. package/dist/lib/signing/testing.mjs.map +1 -1
  563. package/dist/lib/signing/types.mjs +0 -6
  564. package/dist/lib/signing/types.mjs.map +1 -1
  565. package/dist/lib/signing/verifier.mjs +0 -6
  566. package/dist/lib/signing/verifier.mjs.map +1 -1
  567. package/dist/lib/signing/webhook-auth-detection.mjs +0 -6
  568. package/dist/lib/signing/webhook-auth-detection.mjs.map +1 -1
  569. package/dist/lib/signing/webhook-verifier.mjs +0 -6
  570. package/dist/lib/signing/webhook-verifier.mjs.map +1 -1
  571. package/dist/lib/storage/MemoryStorage.mjs +0 -6
  572. package/dist/lib/storage/MemoryStorage.mjs.map +1 -1
  573. package/dist/lib/storage/interfaces.mjs +0 -6
  574. package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs +0 -6
  575. package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs.map +1 -1
  576. package/dist/lib/substitution/encoder/index.mjs +0 -6
  577. package/dist/lib/substitution/encoder/index.mjs.map +1 -1
  578. package/dist/lib/substitution/index.mjs +0 -6
  579. package/dist/lib/substitution/index.mjs.map +1 -1
  580. package/dist/lib/substitution/observer/SubstitutionObserver.mjs +0 -6
  581. package/dist/lib/substitution/observer/SubstitutionObserver.mjs.map +1 -1
  582. package/dist/lib/substitution/observer/alignment.mjs +0 -6
  583. package/dist/lib/substitution/observer/alignment.mjs.map +1 -1
  584. package/dist/lib/substitution/observer/assertions.mjs +0 -6
  585. package/dist/lib/substitution/observer/assertions.mjs.map +1 -1
  586. package/dist/lib/substitution/observer/html-parser.mjs +0 -6
  587. package/dist/lib/substitution/observer/html-parser.mjs.map +1 -1
  588. package/dist/lib/substitution/observer/index.mjs +0 -6
  589. package/dist/lib/substitution/observer/index.mjs.map +1 -1
  590. package/dist/lib/substitution/observer/ssrf.mjs +0 -6
  591. package/dist/lib/substitution/observer/ssrf.mjs.map +1 -1
  592. package/dist/lib/substitution/rfc3986.mjs +0 -6
  593. package/dist/lib/substitution/rfc3986.mjs.map +1 -1
  594. package/dist/lib/substitution/translate.mjs +0 -6
  595. package/dist/lib/substitution/translate.mjs.map +1 -1
  596. package/dist/lib/substitution/types.mjs +0 -6
  597. package/dist/lib/substitution/vectors.mjs +0 -6
  598. package/dist/lib/substitution/vectors.mjs.map +1 -1
  599. package/dist/lib/testing/agent-tester.mjs +0 -6
  600. package/dist/lib/testing/agent-tester.mjs.map +1 -1
  601. package/dist/lib/testing/client.mjs +0 -6
  602. package/dist/lib/testing/client.mjs.map +1 -1
  603. package/dist/lib/testing/compliance/briefs.mjs +0 -6
  604. package/dist/lib/testing/compliance/briefs.mjs.map +1 -1
  605. package/dist/lib/testing/compliance/comply.mjs +0 -6
  606. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  607. package/dist/lib/testing/compliance/index.mjs +0 -6
  608. package/dist/lib/testing/compliance/index.mjs.map +1 -1
  609. package/dist/lib/testing/compliance/spec-conformance.mjs +0 -6
  610. package/dist/lib/testing/compliance/spec-conformance.mjs.map +1 -1
  611. package/dist/lib/testing/compliance/storyboard-tracks.mjs +0 -6
  612. package/dist/lib/testing/compliance/storyboard-tracks.mjs.map +1 -1
  613. package/dist/lib/testing/compliance/summary.mjs +0 -6
  614. package/dist/lib/testing/compliance/summary.mjs.map +1 -1
  615. package/dist/lib/testing/compliance/types.mjs +0 -6
  616. package/dist/lib/testing/comply-controller.mjs +0 -6
  617. package/dist/lib/testing/comply-controller.mjs.map +1 -1
  618. package/dist/lib/testing/controller-assertions.mjs +0 -6
  619. package/dist/lib/testing/controller-assertions.mjs.map +1 -1
  620. package/dist/lib/testing/formatter.mjs +0 -6
  621. package/dist/lib/testing/formatter.mjs.map +1 -1
  622. package/dist/lib/testing/index.mjs +0 -6
  623. package/dist/lib/testing/index.mjs.map +1 -1
  624. package/dist/lib/testing/local-agent-runner.mjs +0 -6
  625. package/dist/lib/testing/local-agent-runner.mjs.map +1 -1
  626. package/dist/lib/testing/orchestrator.mjs +0 -6
  627. package/dist/lib/testing/orchestrator.mjs.map +1 -1
  628. package/dist/lib/testing/personas/index.mjs +0 -6
  629. package/dist/lib/testing/personas/index.mjs.map +1 -1
  630. package/dist/lib/testing/scenarios/brand-rights.mjs +0 -6
  631. package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
  632. package/dist/lib/testing/scenarios/capabilities.mjs +0 -6
  633. package/dist/lib/testing/scenarios/capabilities.mjs.map +1 -1
  634. package/dist/lib/testing/scenarios/creative.mjs +0 -6
  635. package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
  636. package/dist/lib/testing/scenarios/deterministic.mjs +0 -6
  637. package/dist/lib/testing/scenarios/deterministic.mjs.map +1 -1
  638. package/dist/lib/testing/scenarios/discovery.mjs +0 -6
  639. package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
  640. package/dist/lib/testing/scenarios/edge-cases.mjs +0 -6
  641. package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
  642. package/dist/lib/testing/scenarios/error-compliance.mjs +0 -6
  643. package/dist/lib/testing/scenarios/error-compliance.mjs.map +1 -1
  644. package/dist/lib/testing/scenarios/governance.mjs +0 -6
  645. package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
  646. package/dist/lib/testing/scenarios/health.mjs +0 -6
  647. package/dist/lib/testing/scenarios/health.mjs.map +1 -1
  648. package/dist/lib/testing/scenarios/index.mjs +0 -6
  649. package/dist/lib/testing/scenarios/index.mjs.map +1 -1
  650. package/dist/lib/testing/scenarios/media-buy.mjs +0 -6
  651. package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
  652. package/dist/lib/testing/scenarios/schema-compliance.mjs +0 -6
  653. package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
  654. package/dist/lib/testing/scenarios/signals.mjs +0 -6
  655. package/dist/lib/testing/scenarios/signals.mjs.map +1 -1
  656. package/dist/lib/testing/scenarios/sponsored-intelligence.mjs +0 -6
  657. package/dist/lib/testing/scenarios/sponsored-intelligence.mjs.map +1 -1
  658. package/dist/lib/testing/scenarios/trusted-match.mjs +0 -6
  659. package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
  660. package/dist/lib/testing/seed-merge.mjs +0 -6
  661. package/dist/lib/testing/seed-merge.mjs.map +1 -1
  662. package/dist/lib/testing/storyboard/agent-routing.mjs +0 -6
  663. package/dist/lib/testing/storyboard/agent-routing.mjs.map +1 -1
  664. package/dist/lib/testing/storyboard/assertions.mjs +0 -6
  665. package/dist/lib/testing/storyboard/assertions.mjs.map +1 -1
  666. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +0 -6
  667. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs.map +1 -1
  668. package/dist/lib/testing/storyboard/compliance.mjs +5 -6
  669. package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
  670. package/dist/lib/testing/storyboard/context.mjs +0 -6
  671. package/dist/lib/testing/storyboard/context.mjs.map +1 -1
  672. package/dist/lib/testing/storyboard/default-invariants.mjs +0 -6
  673. package/dist/lib/testing/storyboard/default-invariants.mjs.map +1 -1
  674. package/dist/lib/testing/storyboard/index.mjs +0 -6
  675. package/dist/lib/testing/storyboard/index.mjs.map +1 -1
  676. package/dist/lib/testing/storyboard/junit.mjs +0 -6
  677. package/dist/lib/testing/storyboard/junit.mjs.map +1 -1
  678. package/dist/lib/testing/storyboard/loader.mjs +0 -6
  679. package/dist/lib/testing/storyboard/loader.mjs.map +1 -1
  680. package/dist/lib/testing/storyboard/parallel-dispatch.mjs +0 -6
  681. package/dist/lib/testing/storyboard/parallel-dispatch.mjs.map +1 -1
  682. package/dist/lib/testing/storyboard/path.mjs +0 -6
  683. package/dist/lib/testing/storyboard/path.mjs.map +1 -1
  684. package/dist/lib/testing/storyboard/probes.mjs +0 -6
  685. package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
  686. package/dist/lib/testing/storyboard/rate-limit-trip.mjs +0 -6
  687. package/dist/lib/testing/storyboard/rate-limit-trip.mjs.map +1 -1
  688. package/dist/lib/testing/storyboard/rejection-hints.mjs +0 -6
  689. package/dist/lib/testing/storyboard/rejection-hints.mjs.map +1 -1
  690. package/dist/lib/testing/storyboard/request-builder.mjs +0 -6
  691. package/dist/lib/testing/storyboard/request-builder.mjs.map +1 -1
  692. package/dist/lib/testing/storyboard/request-signing/builder.mjs +0 -6
  693. package/dist/lib/testing/storyboard/request-signing/builder.mjs.map +1 -1
  694. package/dist/lib/testing/storyboard/request-signing/grader.mjs +0 -6
  695. package/dist/lib/testing/storyboard/request-signing/grader.mjs.map +1 -1
  696. package/dist/lib/testing/storyboard/request-signing/index.mjs +0 -6
  697. package/dist/lib/testing/storyboard/request-signing/index.mjs.map +1 -1
  698. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +0 -6
  699. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs.map +1 -1
  700. package/dist/lib/testing/storyboard/request-signing/probe.mjs +0 -6
  701. package/dist/lib/testing/storyboard/request-signing/probe.mjs.map +1 -1
  702. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs +0 -6
  703. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs.map +1 -1
  704. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs +0 -6
  705. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs.map +1 -1
  706. package/dist/lib/testing/storyboard/request-signing/types.mjs +0 -6
  707. package/dist/lib/testing/storyboard/request-signing/types.mjs.map +1 -1
  708. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +0 -6
  709. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
  710. package/dist/lib/testing/storyboard/runner.mjs +0 -6
  711. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  712. package/dist/lib/testing/storyboard/sandbox-entities.mjs +0 -6
  713. package/dist/lib/testing/storyboard/sandbox-entities.mjs.map +1 -1
  714. package/dist/lib/testing/storyboard/seeding.mjs +0 -6
  715. package/dist/lib/testing/storyboard/seeding.mjs.map +1 -1
  716. package/dist/lib/testing/storyboard/shape-drift-hints.mjs +0 -6
  717. package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
  718. package/dist/lib/testing/storyboard/signer-grader/grader.mjs +0 -6
  719. package/dist/lib/testing/storyboard/signer-grader/grader.mjs.map +1 -1
  720. package/dist/lib/testing/storyboard/signer-grader/index.mjs +0 -6
  721. package/dist/lib/testing/storyboard/signer-grader/index.mjs.map +1 -1
  722. package/dist/lib/testing/storyboard/signer-grader/types.mjs +0 -6
  723. package/dist/lib/testing/storyboard/strict-validation-hints.mjs +0 -6
  724. package/dist/lib/testing/storyboard/strict-validation-hints.mjs.map +1 -1
  725. package/dist/lib/testing/storyboard/task-map.mjs +0 -6
  726. package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
  727. package/dist/lib/testing/storyboard/test-kit.mjs +0 -6
  728. package/dist/lib/testing/storyboard/test-kit.mjs.map +1 -1
  729. package/dist/lib/testing/storyboard/types.mjs +0 -6
  730. package/dist/lib/testing/storyboard/types.mjs.map +1 -1
  731. package/dist/lib/testing/storyboard/validations.mjs +0 -6
  732. package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
  733. package/dist/lib/testing/storyboard/webhook-assertions.mjs +0 -6
  734. package/dist/lib/testing/storyboard/webhook-assertions.mjs.map +1 -1
  735. package/dist/lib/testing/storyboard/webhook-receiver.mjs +0 -6
  736. package/dist/lib/testing/storyboard/webhook-receiver.mjs.map +1 -1
  737. package/dist/lib/testing/stubs/governance-agent-stub.mjs +0 -6
  738. package/dist/lib/testing/stubs/governance-agent-stub.mjs.map +1 -1
  739. package/dist/lib/testing/stubs/index.mjs +0 -6
  740. package/dist/lib/testing/stubs/index.mjs.map +1 -1
  741. package/dist/lib/testing/test-controller.mjs +0 -6
  742. package/dist/lib/testing/test-controller.mjs.map +1 -1
  743. package/dist/lib/testing/test-helpers.mjs +0 -6
  744. package/dist/lib/testing/test-helpers.mjs.map +1 -1
  745. package/dist/lib/testing/types.mjs +0 -6
  746. package/dist/lib/types/adcp.mjs +0 -6
  747. package/dist/lib/types/adcp.mjs.map +1 -1
  748. package/dist/lib/types/asset-instances.mjs +0 -6
  749. package/dist/lib/types/compat.mjs +0 -6
  750. package/dist/lib/types/compat.mjs.map +1 -1
  751. package/dist/lib/types/core.generated.mjs +0 -6
  752. package/dist/lib/types/enums.generated.mjs +0 -6
  753. package/dist/lib/types/enums.generated.mjs.map +1 -1
  754. package/dist/lib/types/error-codes.mjs +0 -6
  755. package/dist/lib/types/error-codes.mjs.map +1 -1
  756. package/dist/lib/types/error-details.aliases.mjs +0 -6
  757. package/dist/lib/types/error-details.aliases.mjs.map +1 -1
  758. package/dist/lib/types/format-asset-slots.mjs +0 -6
  759. package/dist/lib/types/forward-compat-error-codes.mjs +0 -6
  760. package/dist/lib/types/forward-compat-error-codes.mjs.map +1 -1
  761. package/dist/lib/types/index.mjs +0 -6
  762. package/dist/lib/types/index.mjs.map +1 -1
  763. package/dist/lib/types/inline-enums.aliases.mjs +0 -6
  764. package/dist/lib/types/inline-enums.aliases.mjs.map +1 -1
  765. package/dist/lib/types/inline-enums.generated.mjs +0 -6
  766. package/dist/lib/types/inline-enums.generated.mjs.map +1 -1
  767. package/dist/lib/types/manifest.generated.mjs +0 -6
  768. package/dist/lib/types/manifest.generated.mjs.map +1 -1
  769. package/dist/lib/types/schemas.generated.mjs +0 -6
  770. package/dist/lib/types/schemas.generated.mjs.map +1 -1
  771. package/dist/lib/types/server-payload-aliases.mjs +0 -6
  772. package/dist/lib/types/server-payload.mjs +0 -6
  773. package/dist/lib/types/sync-rows.mjs +0 -6
  774. package/dist/lib/types/tools.generated.mjs +0 -6
  775. package/dist/lib/types/v2-5/index.mjs +0 -6
  776. package/dist/lib/types/v2-5/index.mjs.map +1 -1
  777. package/dist/lib/types/v2-5/tools.generated.mjs +0 -6
  778. package/dist/lib/types/v3-1-beta/index.mjs +0 -6
  779. package/dist/lib/types/v3-1-beta/index.mjs.map +1 -1
  780. package/dist/lib/types/v3-1-beta/tools.generated.mjs +0 -6
  781. package/dist/lib/types/wellknown-schemas.generated.mjs +0 -6
  782. package/dist/lib/types/wellknown-schemas.generated.mjs.map +1 -1
  783. package/dist/lib/upstream-recorder/constants.mjs +0 -6
  784. package/dist/lib/upstream-recorder/constants.mjs.map +1 -1
  785. package/dist/lib/upstream-recorder/index.mjs +0 -6
  786. package/dist/lib/upstream-recorder/index.mjs.map +1 -1
  787. package/dist/lib/upstream-recorder/recorder.mjs +0 -6
  788. package/dist/lib/upstream-recorder/recorder.mjs.map +1 -1
  789. package/dist/lib/upstream-recorder/types.mjs +0 -6
  790. package/dist/lib/upstream-recorder/types.mjs.map +1 -1
  791. package/dist/lib/utils/a2a-artifacts.mjs +0 -6
  792. package/dist/lib/utils/a2a-artifacts.mjs.map +1 -1
  793. package/dist/lib/utils/a2a-discovery.mjs +0 -6
  794. package/dist/lib/utils/a2a-discovery.mjs.map +1 -1
  795. package/dist/lib/utils/activation-key-builders.mjs +0 -6
  796. package/dist/lib/utils/activation-key-builders.mjs.map +1 -1
  797. package/dist/lib/utils/adcp-version-config.mjs +0 -6
  798. package/dist/lib/utils/adcp-version-config.mjs.map +1 -1
  799. package/dist/lib/utils/asset-builders.mjs +0 -6
  800. package/dist/lib/utils/asset-builders.mjs.map +1 -1
  801. package/dist/lib/utils/build-creative-return-builders.mjs +0 -6
  802. package/dist/lib/utils/build-creative-return-builders.mjs.map +1 -1
  803. package/dist/lib/utils/buyer-retry-policy.mjs +0 -6
  804. package/dist/lib/utils/buyer-retry-policy.mjs.map +1 -1
  805. package/dist/lib/utils/capabilities.mjs +0 -6
  806. package/dist/lib/utils/capabilities.mjs.map +1 -1
  807. package/dist/lib/utils/capability-rollups.mjs +0 -6
  808. package/dist/lib/utils/capability-rollups.mjs.map +1 -1
  809. package/dist/lib/utils/creative-adapter.mjs +0 -6
  810. package/dist/lib/utils/creative-adapter.mjs.map +1 -1
  811. package/dist/lib/utils/creative-delivery.mjs +0 -6
  812. package/dist/lib/utils/creative-delivery.mjs.map +1 -1
  813. package/dist/lib/utils/deprecation.mjs +0 -6
  814. package/dist/lib/utils/deprecation.mjs.map +1 -1
  815. package/dist/lib/utils/envelope-status-compat.mjs +0 -6
  816. package/dist/lib/utils/envelope-status-compat.mjs.map +1 -1
  817. package/dist/lib/utils/error-extraction.mjs +0 -6
  818. package/dist/lib/utils/error-extraction.mjs.map +1 -1
  819. package/dist/lib/utils/extract-result.mjs +0 -6
  820. package/dist/lib/utils/extract-result.mjs.map +1 -1
  821. package/dist/lib/utils/format-asset-slot-builders.mjs +0 -6
  822. package/dist/lib/utils/format-asset-slot-builders.mjs.map +1 -1
  823. package/dist/lib/utils/format-assets.mjs +0 -6
  824. package/dist/lib/utils/format-assets.mjs.map +1 -1
  825. package/dist/lib/utils/format-render-builders.mjs +0 -6
  826. package/dist/lib/utils/format-render-builders.mjs.map +1 -1
  827. package/dist/lib/utils/format-renders.mjs +0 -6
  828. package/dist/lib/utils/format-renders.mjs.map +1 -1
  829. package/dist/lib/utils/get-products-cache-scope.mjs +0 -6
  830. package/dist/lib/utils/get-products-cache-scope.mjs.map +1 -1
  831. package/dist/lib/utils/glob.mjs +0 -6
  832. package/dist/lib/utils/glob.mjs.map +1 -1
  833. package/dist/lib/utils/global-async-local-storage.mjs +0 -6
  834. package/dist/lib/utils/global-async-local-storage.mjs.map +1 -1
  835. package/dist/lib/utils/idempotency.mjs +0 -6
  836. package/dist/lib/utils/idempotency.mjs.map +1 -1
  837. package/dist/lib/utils/index.mjs +0 -6
  838. package/dist/lib/utils/index.mjs.map +1 -1
  839. package/dist/lib/utils/jcs.mjs +0 -6
  840. package/dist/lib/utils/jcs.mjs.map +1 -1
  841. package/dist/lib/utils/json-depth.mjs +0 -6
  842. package/dist/lib/utils/json-depth.mjs.map +1 -1
  843. package/dist/lib/utils/logger.mjs +0 -6
  844. package/dist/lib/utils/logger.mjs.map +1 -1
  845. package/dist/lib/utils/media-buy-delivery-notification-builders.mjs +0 -6
  846. package/dist/lib/utils/media-buy-delivery-notification-builders.mjs.map +1 -1
  847. package/dist/lib/utils/media-buy-status.mjs +0 -6
  848. package/dist/lib/utils/media-buy-status.mjs.map +1 -1
  849. package/dist/lib/utils/pagination.mjs +0 -6
  850. package/dist/lib/utils/pagination.mjs.map +1 -1
  851. package/dist/lib/utils/preview-creative-builders.mjs +0 -6
  852. package/dist/lib/utils/preview-creative-builders.mjs.map +1 -1
  853. package/dist/lib/utils/preview-normalizer.mjs +0 -6
  854. package/dist/lib/utils/preview-normalizer.mjs.map +1 -1
  855. package/dist/lib/utils/preview-utils.mjs +0 -6
  856. package/dist/lib/utils/preview-utils.mjs.map +1 -1
  857. package/dist/lib/utils/pricing-adapter.mjs +0 -6
  858. package/dist/lib/utils/pricing-adapter.mjs.map +1 -1
  859. package/dist/lib/utils/probe-policy.mjs +0 -6
  860. package/dist/lib/utils/probe-policy.mjs.map +1 -1
  861. package/dist/lib/utils/protocol-detection.mjs +0 -6
  862. package/dist/lib/utils/protocol-detection.mjs.map +1 -1
  863. package/dist/lib/utils/redact-secrets.mjs +0 -6
  864. package/dist/lib/utils/redact-secrets.mjs.map +1 -1
  865. package/dist/lib/utils/redis-default-prefix-warn.mjs +0 -6
  866. package/dist/lib/utils/redis-default-prefix-warn.mjs.map +1 -1
  867. package/dist/lib/utils/render-builders.mjs +0 -6
  868. package/dist/lib/utils/render-builders.mjs.map +1 -1
  869. package/dist/lib/utils/request-normalizer.mjs +0 -6
  870. package/dist/lib/utils/request-normalizer.mjs.map +1 -1
  871. package/dist/lib/utils/response-schemas.mjs +0 -6
  872. package/dist/lib/utils/response-schemas.mjs.map +1 -1
  873. package/dist/lib/utils/response-unwrapper.mjs +0 -6
  874. package/dist/lib/utils/response-unwrapper.mjs.map +1 -1
  875. package/dist/lib/utils/retry.mjs +0 -6
  876. package/dist/lib/utils/retry.mjs.map +1 -1
  877. package/dist/lib/utils/signal-discovery-helpers.mjs +0 -6
  878. package/dist/lib/utils/signal-discovery-helpers.mjs.map +1 -1
  879. package/dist/lib/utils/signal-id-builders.mjs +0 -6
  880. package/dist/lib/utils/signal-id-builders.mjs.map +1 -1
  881. package/dist/lib/utils/sync-creatives-adapter.mjs +0 -6
  882. package/dist/lib/utils/sync-creatives-adapter.mjs.map +1 -1
  883. package/dist/lib/utils/task-state.mjs +0 -6
  884. package/dist/lib/utils/task-state.mjs.map +1 -1
  885. package/dist/lib/utils/tool-request-schemas.mjs +0 -6
  886. package/dist/lib/utils/tool-request-schemas.mjs.map +1 -1
  887. package/dist/lib/utils/typeGuards.mjs +0 -6
  888. package/dist/lib/utils/typeGuards.mjs.map +1 -1
  889. package/dist/lib/utils/union-errors.mjs +0 -6
  890. package/dist/lib/utils/union-errors.mjs.map +1 -1
  891. package/dist/lib/utils/validate-user-agent.mjs +0 -6
  892. package/dist/lib/utils/validate-user-agent.mjs.map +1 -1
  893. package/dist/lib/v2/format-schema/fetch.mjs +0 -6
  894. package/dist/lib/v2/format-schema/fetch.mjs.map +1 -1
  895. package/dist/lib/v2/format-schema/index.mjs +0 -6
  896. package/dist/lib/v2/format-schema/index.mjs.map +1 -1
  897. package/dist/lib/v2/format-schema/regex-safety.mjs +0 -6
  898. package/dist/lib/v2/format-schema/regex-safety.mjs.map +1 -1
  899. package/dist/lib/v2/format-schema/resolver.mjs +7 -8
  900. package/dist/lib/v2/format-schema/resolver.mjs.map +1 -1
  901. package/dist/lib/v2/format-schema/sandbox-refs.mjs +0 -6
  902. package/dist/lib/v2/format-schema/sandbox-refs.mjs.map +1 -1
  903. package/dist/lib/v2/projection/augment-response.mjs +0 -6
  904. package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
  905. package/dist/lib/v2/projection/builders.mjs +0 -6
  906. package/dist/lib/v2/projection/builders.mjs.map +1 -1
  907. package/dist/lib/v2/projection/cache-versions.mjs +0 -6
  908. package/dist/lib/v2/projection/cache-versions.mjs.map +1 -1
  909. package/dist/lib/v2/projection/canonical-properties.mjs +5 -6
  910. package/dist/lib/v2/projection/canonical-properties.mjs.map +1 -1
  911. package/dist/lib/v2/projection/catalog.mjs +5 -6
  912. package/dist/lib/v2/projection/catalog.mjs.map +1 -1
  913. package/dist/lib/v2/projection/constants.mjs +0 -6
  914. package/dist/lib/v2/projection/constants.mjs.map +1 -1
  915. package/dist/lib/v2/projection/index.mjs +0 -6
  916. package/dist/lib/v2/projection/index.mjs.map +1 -1
  917. package/dist/lib/v2/projection/registry.mjs +5 -6
  918. package/dist/lib/v2/projection/registry.mjs.map +1 -1
  919. package/dist/lib/v2/projection/types.mjs +0 -6
  920. package/dist/lib/v2/projection/v1-to-v2.mjs +0 -6
  921. package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
  922. package/dist/lib/v2/projection/v2-to-v1.mjs +0 -6
  923. package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
  924. package/dist/lib/v2/projection/write-side.mjs +0 -6
  925. package/dist/lib/v2/projection/write-side.mjs.map +1 -1
  926. package/dist/lib/v2/publisher-catalog/formats.mjs +0 -6
  927. package/dist/lib/v2/publisher-catalog/formats.mjs.map +1 -1
  928. package/dist/lib/v2/publisher-catalog/index.mjs +0 -6
  929. package/dist/lib/v2/publisher-catalog/index.mjs.map +1 -1
  930. package/dist/lib/validation/client-hooks.mjs +0 -6
  931. package/dist/lib/validation/client-hooks.mjs.map +1 -1
  932. package/dist/lib/validation/hints.mjs +0 -6
  933. package/dist/lib/validation/hints.mjs.map +1 -1
  934. package/dist/lib/validation/index.mjs +0 -6
  935. package/dist/lib/validation/index.mjs.map +1 -1
  936. package/dist/lib/validation/schema-errors.mjs +0 -6
  937. package/dist/lib/validation/schema-errors.mjs.map +1 -1
  938. package/dist/lib/validation/schema-loader.mjs +5 -6
  939. package/dist/lib/validation/schema-loader.mjs.map +1 -1
  940. package/dist/lib/validation/schema-validator.mjs +0 -6
  941. package/dist/lib/validation/schema-validator.mjs.map +1 -1
  942. package/dist/lib/validation/sync-creatives.mjs +0 -6
  943. package/dist/lib/validation/sync-creatives.mjs.map +1 -1
  944. package/dist/lib/version.d.mts +3 -3
  945. package/dist/lib/version.d.ts +3 -3
  946. package/dist/lib/version.js +3 -3
  947. package/dist/lib/version.js.map +1 -1
  948. package/dist/lib/version.mjs +3 -9
  949. package/dist/lib/version.mjs.map +1 -1
  950. package/dist/lib/webhooks/index.mjs +0 -6
  951. package/dist/lib/webhooks/index.mjs.map +1 -1
  952. package/dist/lib/wholesale-feed-sync/index.mjs +0 -6
  953. package/dist/lib/wholesale-feed-sync/index.mjs.map +1 -1
  954. package/dist/lib/wholesale-feed-sync/sync.mjs +0 -6
  955. package/dist/lib/wholesale-feed-sync/sync.mjs.map +1 -1
  956. package/dist/lib/wholesale-feed-sync/types.mjs +0 -6
  957. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs +0 -6
  958. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs.map +1 -1
  959. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/testing/formatter.ts"],"sourcesContent":["/**\n * Test result formatting for AdCP Agent E2E Testing\n */\n\nimport type { TestResult } from './types';\n\n/**\n * Format test results for display in Slack/chat\n */\nexport function formatTestResults(result: TestResult): string {\n const statusEmoji = result.overall_passed ? '✅' : '❌';\n let output = `## ${statusEmoji} Agent Test Results\\n\\n`;\n output += `**Agent:** ${result.agent_url}\\n`;\n output += `**Scenario:** ${result.scenario}\\n`;\n output += `**Duration:** ${result.total_duration_ms}ms\\n`;\n output += `**Result:** ${result.summary}\\n\\n`;\n\n // Show agent profile if discovered\n if (result.agent_profile) {\n output += `### Agent Capabilities\\n`;\n output += `- **Name:** ${result.agent_profile.name}\\n`;\n output += `- **Tools:** ${result.agent_profile.tools.length}\\n`;\n if (result.agent_profile.channels?.length) {\n output += `- **Channels:** ${result.agent_profile.channels.join(', ')}\\n`;\n }\n if (result.agent_profile.pricing_models?.length) {\n output += `- **Pricing Models:** ${result.agent_profile.pricing_models.join(', ')}\\n`;\n }\n if (result.agent_profile.supported_formats?.length) {\n output += `- **Creative Formats:** ${result.agent_profile.supported_formats.length}\\n`;\n }\n if (result.agent_profile.supported_signals?.length) {\n output += `- **Signals:** ${result.agent_profile.supported_signals.length}\\n`;\n }\n output += '\\n';\n }\n\n output += `### Test Steps\\n\\n`;\n\n for (const step of result.steps ?? []) {\n const stepEmoji = step.passed ? '✅' : '❌';\n output += `${stepEmoji} **${step.step}**`;\n if (step.task) {\n output += ` (\\`${step.task}\\`)`;\n }\n output += ` - ${step.duration_ms}ms\\n`;\n\n if (step.details) {\n output += ` ${step.details}\\n`;\n }\n\n if (step.warnings && step.warnings.length > 0) {\n for (const warning of step.warnings) {\n output += ` ${warning}\\n`;\n }\n }\n\n if (step.error) {\n output += ` ⚠️ Error: ${step.error}\\n`;\n }\n\n if (step.response_preview && !step.error) {\n output += ` \\`\\`\\`json\\n ${step.response_preview.split('\\n').join('\\n ')}\\n \\`\\`\\`\\n`;\n }\n\n output += '\\n';\n }\n\n if (!result.overall_passed) {\n output += `---\\n\\n`;\n output += `💡 **Need help?** Ask me about specific errors or check the [AdCP documentation](https://adcontextprotocol.org/docs).\\n`;\n }\n\n return output;\n}\n\n/**\n * Format test results as JSON for programmatic use\n */\nexport function formatTestResultsJSON(result: TestResult): string {\n return JSON.stringify(result, null, 2);\n}\n\n/**\n * Format test results as a compact summary\n */\nexport function formatTestResultsSummary(result: TestResult): string {\n const statusEmoji = result.overall_passed ? '✅' : '❌';\n const steps = result.steps ?? [];\n const passedCount = steps.filter(s => s.passed).length;\n const failedCount = steps.filter(s => !s.passed).length;\n const warningCount = steps.filter(s => s.warnings && s.warnings.length > 0).length;\n\n let summary = `${statusEmoji} ${result.scenario}: ${passedCount}/${steps.length} passed (${result.total_duration_ms}ms)`;\n if (failedCount > 0) {\n summary += ` - ${failedCount} failed`;\n }\n if (warningCount > 0) {\n summary += ` - ⚠️ ${warningCount} warning(s)`;\n }\n return summary;\n}\n"],"mappings":";;;;;;AASO,SAAS,kBAAkB,QAA4B;AAC5D,QAAM,cAAc,OAAO,iBAAiB,WAAM;AAClD,MAAI,SAAS,MAAM,WAAW;AAAA;AAAA;AAC9B,YAAU,cAAc,OAAO,SAAS;AAAA;AACxC,YAAU,iBAAiB,OAAO,QAAQ;AAAA;AAC1C,YAAU,iBAAiB,OAAO,iBAAiB;AAAA;AACnD,YAAU,eAAe,OAAO,OAAO;AAAA;AAAA;AAGvC,MAAI,OAAO,eAAe;AACxB,cAAU;AAAA;AACV,cAAU,eAAe,OAAO,cAAc,IAAI;AAAA;AAClD,cAAU,gBAAgB,OAAO,cAAc,MAAM,MAAM;AAAA;AAC3D,QAAI,OAAO,cAAc,UAAU,QAAQ;AACzC,gBAAU,mBAAmB,OAAO,cAAc,SAAS,KAAK,IAAI,CAAC;AAAA;AAAA,IACvE;AACA,QAAI,OAAO,cAAc,gBAAgB,QAAQ;AAC/C,gBAAU,yBAAyB,OAAO,cAAc,eAAe,KAAK,IAAI,CAAC;AAAA;AAAA,IACnF;AACA,QAAI,OAAO,cAAc,mBAAmB,QAAQ;AAClD,gBAAU,2BAA2B,OAAO,cAAc,kBAAkB,MAAM;AAAA;AAAA,IACpF;AACA,QAAI,OAAO,cAAc,mBAAmB,QAAQ;AAClD,gBAAU,kBAAkB,OAAO,cAAc,kBAAkB,MAAM;AAAA;AAAA,IAC3E;AACA,cAAU;AAAA,EACZ;AAEA,YAAU;AAAA;AAAA;AAEV,aAAW,QAAQ,OAAO,SAAS,CAAC,GAAG;AACrC,UAAM,YAAY,KAAK,SAAS,WAAM;AACtC,cAAU,GAAG,SAAS,MAAM,KAAK,IAAI;AACrC,QAAI,KAAK,MAAM;AACb,gBAAU,OAAO,KAAK,IAAI;AAAA,IAC5B;AACA,cAAU,MAAM,KAAK,WAAW;AAAA;AAEhC,QAAI,KAAK,SAAS;AAChB,gBAAU,MAAM,KAAK,OAAO;AAAA;AAAA,IAC9B;AAEA,QAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,iBAAW,WAAW,KAAK,UAAU;AACnC,kBAAU,MAAM,OAAO;AAAA;AAAA,MACzB;AAAA,IACF;AAEA,QAAI,KAAK,OAAO;AACd,gBAAU,0BAAgB,KAAK,KAAK;AAAA;AAAA,IACtC;AAEA,QAAI,KAAK,oBAAoB,CAAC,KAAK,OAAO;AACxC,gBAAU;AAAA,KAAqB,KAAK,iBAAiB,MAAM,IAAI,EAAE,KAAK,OAAO,CAAC;AAAA;AAAA;AAAA,IAChF;AAEA,cAAU;AAAA,EACZ;AAEA,MAAI,CAAC,OAAO,gBAAgB;AAC1B,cAAU;AAAA;AAAA;AACV,cAAU;AAAA;AAAA,EACZ;AAEA,SAAO;AACT;AAKO,SAAS,sBAAsB,QAA4B;AAChE,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC;AAKO,SAAS,yBAAyB,QAA4B;AACnE,QAAM,cAAc,OAAO,iBAAiB,WAAM;AAClD,QAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,QAAM,cAAc,MAAM,OAAO,OAAK,EAAE,MAAM,EAAE;AAChD,QAAM,cAAc,MAAM,OAAO,OAAK,CAAC,EAAE,MAAM,EAAE;AACjD,QAAM,eAAe,MAAM,OAAO,OAAK,EAAE,YAAY,EAAE,SAAS,SAAS,CAAC,EAAE;AAE5E,MAAI,UAAU,GAAG,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,MAAM,MAAM,YAAY,OAAO,iBAAiB;AACnH,MAAI,cAAc,GAAG;AACnB,eAAW,MAAM,WAAW;AAAA,EAC9B;AACA,MAAI,eAAe,GAAG;AACpB,eAAW,mBAAS,YAAY;AAAA,EAClC;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/testing/formatter.ts"],"sourcesContent":["/**\n * Test result formatting for AdCP Agent E2E Testing\n */\n\nimport type { TestResult } from './types';\n\n/**\n * Format test results for display in Slack/chat\n */\nexport function formatTestResults(result: TestResult): string {\n const statusEmoji = result.overall_passed ? '✅' : '❌';\n let output = `## ${statusEmoji} Agent Test Results\\n\\n`;\n output += `**Agent:** ${result.agent_url}\\n`;\n output += `**Scenario:** ${result.scenario}\\n`;\n output += `**Duration:** ${result.total_duration_ms}ms\\n`;\n output += `**Result:** ${result.summary}\\n\\n`;\n\n // Show agent profile if discovered\n if (result.agent_profile) {\n output += `### Agent Capabilities\\n`;\n output += `- **Name:** ${result.agent_profile.name}\\n`;\n output += `- **Tools:** ${result.agent_profile.tools.length}\\n`;\n if (result.agent_profile.channels?.length) {\n output += `- **Channels:** ${result.agent_profile.channels.join(', ')}\\n`;\n }\n if (result.agent_profile.pricing_models?.length) {\n output += `- **Pricing Models:** ${result.agent_profile.pricing_models.join(', ')}\\n`;\n }\n if (result.agent_profile.supported_formats?.length) {\n output += `- **Creative Formats:** ${result.agent_profile.supported_formats.length}\\n`;\n }\n if (result.agent_profile.supported_signals?.length) {\n output += `- **Signals:** ${result.agent_profile.supported_signals.length}\\n`;\n }\n output += '\\n';\n }\n\n output += `### Test Steps\\n\\n`;\n\n for (const step of result.steps ?? []) {\n const stepEmoji = step.passed ? '✅' : '❌';\n output += `${stepEmoji} **${step.step}**`;\n if (step.task) {\n output += ` (\\`${step.task}\\`)`;\n }\n output += ` - ${step.duration_ms}ms\\n`;\n\n if (step.details) {\n output += ` ${step.details}\\n`;\n }\n\n if (step.warnings && step.warnings.length > 0) {\n for (const warning of step.warnings) {\n output += ` ${warning}\\n`;\n }\n }\n\n if (step.error) {\n output += ` ⚠️ Error: ${step.error}\\n`;\n }\n\n if (step.response_preview && !step.error) {\n output += ` \\`\\`\\`json\\n ${step.response_preview.split('\\n').join('\\n ')}\\n \\`\\`\\`\\n`;\n }\n\n output += '\\n';\n }\n\n if (!result.overall_passed) {\n output += `---\\n\\n`;\n output += `💡 **Need help?** Ask me about specific errors or check the [AdCP documentation](https://adcontextprotocol.org/docs).\\n`;\n }\n\n return output;\n}\n\n/**\n * Format test results as JSON for programmatic use\n */\nexport function formatTestResultsJSON(result: TestResult): string {\n return JSON.stringify(result, null, 2);\n}\n\n/**\n * Format test results as a compact summary\n */\nexport function formatTestResultsSummary(result: TestResult): string {\n const statusEmoji = result.overall_passed ? '✅' : '❌';\n const steps = result.steps ?? [];\n const passedCount = steps.filter(s => s.passed).length;\n const failedCount = steps.filter(s => !s.passed).length;\n const warningCount = steps.filter(s => s.warnings && s.warnings.length > 0).length;\n\n let summary = `${statusEmoji} ${result.scenario}: ${passedCount}/${steps.length} passed (${result.total_duration_ms}ms)`;\n if (failedCount > 0) {\n summary += ` - ${failedCount} failed`;\n }\n if (warningCount > 0) {\n summary += ` - ⚠️ ${warningCount} warning(s)`;\n }\n return summary;\n}\n"],"mappings":"AASO,SAAS,kBAAkB,QAA4B;AAC5D,QAAM,cAAc,OAAO,iBAAiB,WAAM;AAClD,MAAI,SAAS,MAAM,WAAW;AAAA;AAAA;AAC9B,YAAU,cAAc,OAAO,SAAS;AAAA;AACxC,YAAU,iBAAiB,OAAO,QAAQ;AAAA;AAC1C,YAAU,iBAAiB,OAAO,iBAAiB;AAAA;AACnD,YAAU,eAAe,OAAO,OAAO;AAAA;AAAA;AAGvC,MAAI,OAAO,eAAe;AACxB,cAAU;AAAA;AACV,cAAU,eAAe,OAAO,cAAc,IAAI;AAAA;AAClD,cAAU,gBAAgB,OAAO,cAAc,MAAM,MAAM;AAAA;AAC3D,QAAI,OAAO,cAAc,UAAU,QAAQ;AACzC,gBAAU,mBAAmB,OAAO,cAAc,SAAS,KAAK,IAAI,CAAC;AAAA;AAAA,IACvE;AACA,QAAI,OAAO,cAAc,gBAAgB,QAAQ;AAC/C,gBAAU,yBAAyB,OAAO,cAAc,eAAe,KAAK,IAAI,CAAC;AAAA;AAAA,IACnF;AACA,QAAI,OAAO,cAAc,mBAAmB,QAAQ;AAClD,gBAAU,2BAA2B,OAAO,cAAc,kBAAkB,MAAM;AAAA;AAAA,IACpF;AACA,QAAI,OAAO,cAAc,mBAAmB,QAAQ;AAClD,gBAAU,kBAAkB,OAAO,cAAc,kBAAkB,MAAM;AAAA;AAAA,IAC3E;AACA,cAAU;AAAA,EACZ;AAEA,YAAU;AAAA;AAAA;AAEV,aAAW,QAAQ,OAAO,SAAS,CAAC,GAAG;AACrC,UAAM,YAAY,KAAK,SAAS,WAAM;AACtC,cAAU,GAAG,SAAS,MAAM,KAAK,IAAI;AACrC,QAAI,KAAK,MAAM;AACb,gBAAU,OAAO,KAAK,IAAI;AAAA,IAC5B;AACA,cAAU,MAAM,KAAK,WAAW;AAAA;AAEhC,QAAI,KAAK,SAAS;AAChB,gBAAU,MAAM,KAAK,OAAO;AAAA;AAAA,IAC9B;AAEA,QAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,iBAAW,WAAW,KAAK,UAAU;AACnC,kBAAU,MAAM,OAAO;AAAA;AAAA,MACzB;AAAA,IACF;AAEA,QAAI,KAAK,OAAO;AACd,gBAAU,0BAAgB,KAAK,KAAK;AAAA;AAAA,IACtC;AAEA,QAAI,KAAK,oBAAoB,CAAC,KAAK,OAAO;AACxC,gBAAU;AAAA,KAAqB,KAAK,iBAAiB,MAAM,IAAI,EAAE,KAAK,OAAO,CAAC;AAAA;AAAA;AAAA,IAChF;AAEA,cAAU;AAAA,EACZ;AAEA,MAAI,CAAC,OAAO,gBAAgB;AAC1B,cAAU;AAAA;AAAA;AACV,cAAU;AAAA;AAAA,EACZ;AAEA,SAAO;AACT;AAKO,SAAS,sBAAsB,QAA4B;AAChE,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC;AAKO,SAAS,yBAAyB,QAA4B;AACnE,QAAM,cAAc,OAAO,iBAAiB,WAAM;AAClD,QAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,QAAM,cAAc,MAAM,OAAO,OAAK,EAAE,MAAM,EAAE;AAChD,QAAM,cAAc,MAAM,OAAO,OAAK,CAAC,EAAE,MAAM,EAAE;AACjD,QAAM,eAAe,MAAM,OAAO,OAAK,EAAE,YAAY,EAAE,SAAS,SAAS,CAAC,EAAE;AAE5E,MAAI,UAAU,GAAG,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,MAAM,MAAM,YAAY,OAAO,iBAAiB;AACnH,MAAI,cAAc,GAAG;AACnB,eAAW,MAAM,WAAW;AAAA,EAC9B;AACA,MAAI,eAAe,GAAG;AACpB,eAAW,mBAAS,YAAY;AAAA,EAClC;AACA,SAAO;AACT;","names":[]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import {
8
2
  testAgent,
9
3
  testAgentA2A,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/testing/index.ts"],"sourcesContent":["// Test helpers for AdCP client library\n// Provides pre-configured test agents for examples and quick testing\n\nexport {\n // Test agents (with auth)\n testAgent,\n testAgentA2A,\n testAgentClient,\n createTestAgent,\n TEST_AGENT_TOKEN,\n TEST_AGENT_MCP_CONFIG,\n TEST_AGENT_A2A_CONFIG,\n // Test agents (without auth - for demonstrating auth requirements)\n testAgentNoAuth,\n testAgentNoAuthA2A,\n TEST_AGENT_NO_AUTH_MCP_CONFIG,\n TEST_AGENT_NO_AUTH_A2A_CONFIG,\n // Creative agents (MCP only - A2A not yet supported)\n creativeAgent,\n} from './test-helpers';\n\n// E2E Agent Testing Framework\nexport {\n testAgent as runAgentTests,\n formatTestResults,\n formatTestResultsJSON,\n formatTestResultsSummary,\n setAgentTesterLogger,\n getLogger,\n createTestClient,\n runStep,\n // Individual scenarios\n testHealthCheck,\n testDiscovery,\n testCreateMediaBuy,\n testFullSalesFlow,\n testReportingFlow,\n testCreativeSync,\n testCreativeInline,\n testCreativeFlow,\n testSignalsFlow,\n testErrorHandling,\n testValidation,\n testPricingEdgeCases,\n testTemporalValidation,\n testBehaviorAnalysis,\n testResponseConsistency,\n // v3 scenarios\n testGovernancePropertyLists,\n testGovernanceContentStandards,\n testPropertyListFilters,\n testSISessionLifecycle,\n testSIAvailability,\n testSIHandoff,\n testCapabilityDiscovery,\n testSyncAudiences,\n resolveAccountForMediaBuy,\n resolveAccountForAudiences,\n testSchemaCompliance,\n // State machine compliance\n testMediaBuyLifecycle,\n testTerminalStateEnforcement,\n testPackageLifecycle,\n // Deterministic state machine testing\n testCreativeStateMachine,\n testMediaBuyStateMachine,\n testAccountStateMachine,\n testSessionStateMachine,\n testDeliverySimulation,\n testBudgetSimulation,\n testControllerValidation,\n // Brand rights\n testBrandRightsFlow,\n hasBrandRightsTools,\n // v3 helpers\n hasGovernanceTools,\n hasSITools,\n likelySupportsV3,\n // Suite orchestrator\n testAllScenarios,\n getApplicableScenarios,\n SCENARIO_REQUIREMENTS,\n DEFAULT_SCENARIOS,\n formatSuiteResults,\n formatSuiteResultsJSON,\n // Types\n type TestScenario,\n type TestOptions,\n type OrchestratorOptions,\n type TestResult,\n type SuiteResult,\n type TestStepResult,\n type AgentProfile,\n type TaskResult,\n type TestClient,\n type Logger,\n} from './agent-tester';\n\n// Compliance assessment\nexport {\n comply,\n formatComplianceResults,\n formatComplianceResultsJSON,\n // Brief library\n SAMPLE_BRIEFS,\n getBriefById,\n getBriefsByVertical,\n // Types\n type ComplyOptions,\n type ComplianceTrack,\n type TrackResult,\n type TrackStatus,\n type ComplianceResult,\n type ComplianceSummary,\n type AdvisoryObservation,\n type ObservationSource,\n type SampleBrief,\n} from './compliance';\n\n// Test stubs for compliance testing\nexport { GovernanceAgentStub } from './stubs';\nexport type { StubCallRecord } from './stubs';\n\n// Controller response assertion helpers\nexport { expectControllerError, expectControllerSuccess } from './controller-assertions';\nexport type { ControllerErrorWithDetail } from './controller-assertions';\n\n// Seller-side comply_test_controller scaffold\nexport { createComplyController } from './comply-controller';\nexport type {\n ComplyController,\n ComplyControllerConfig,\n ComplyControllerContext,\n ComplyControllerToolDefinition,\n DirectiveAdapter,\n ForceAccountStatusParams,\n ForceAdapter,\n ForceAudienceStatusParams,\n ForceCatalogItemStatusParams,\n ForceCreateMediaBuyArmParams,\n ForceGetProductsArmParams,\n ForceGetSignalsArmParams,\n ForceCreativeStatusParams,\n ForceMediaBuyStatusParams,\n ForceSessionStatusParams,\n ForceTaskCompletionParams,\n SeedAccountParams,\n SeedAdapter,\n SeedBuyerAgentParams,\n SeedCreativeFormatParams,\n SeedCreativeParams,\n SeedMediaBuyParams,\n SeedPlanParams,\n SeedPricingOptionParams,\n SeedProductParams,\n SimulateAdapter,\n SimulateBudgetSpendParams,\n SimulateDeliveryParams,\n} from './comply-controller';\n// Re-export the full `comply_test_controller` integration surface so sellers\n// wiring their own `TestControllerStore` against typed domain state\n// (MediaBuyState, CreativeState, PlanState, …) can import everything they need\n// from a single path. See `examples/seller-test-controller.ts` for the\n// end-to-end pattern.\nexport {\n TestControllerError,\n CONTROLLER_SCENARIOS,\n DISCOVERY_ARM_SCENARIOS,\n SEED_SCENARIOS,\n SESSION_ENTRY_CAP,\n createSeedFixtureCache,\n enforceMapCap,\n registerTestController,\n} from '../server/test-controller';\nexport type {\n ControllerScenario,\n SeedFixtureCache,\n SeedScenario,\n TestControllerStore,\n TestControllerStoreFactory,\n TestControllerStoreOrFactory,\n} from '../server/test-controller';\n// Status enums every controller implementer mutates. Re-exported here so a\n// seller wiring `forceMediaBuyStatus` / `forceCreativeStatus` doesn't have to\n// reach into `@adcp/sdk` root just for the literal unions.\nexport type { AccountStatus, CreativeStatus, MediaBuyStatus } from '../types/core.generated';\n\n// Seed fixture merge helpers (permissive defaults + storyboard overlay).\nexport {\n mergeSeed,\n overlayById,\n mergeSeedProduct,\n mergeSeedPricingOption,\n mergeSeedCreative,\n mergeSeedPlan,\n mergeSeedMediaBuy,\n} from './seed-merge';\n\n// Test-controller bridge: seeded augmentation of read-side responses on sandbox\n// requests. Per-tool callbacks (`getSeededProducts`, `getSeededCreatives`,\n// `getSeededMediaBuys`, `getSeededAccounts`, `getSeededAccountFinancials`,\n// `getSeededCreativeFormats`) opt in by presence — see TestControllerBridge.\nexport {\n isSandboxRequest,\n mergeSeededProductsIntoResponse,\n filterValidSeededProducts,\n filterValidSeededCreatives,\n filterValidSeededMediaBuys,\n filterValidSeededAccounts,\n filterValidSeededAccountFinancials,\n filterValidSeededCreativeFormats,\n mergeSeededCreativesIntoResponse,\n mergeSeededMediaBuysIntoResponse,\n mergeSeededAccountsIntoResponse,\n mergeSeededCreativeFormatsIntoResponse,\n pickSeededAccountFinancialsForRequest,\n replaceAccountFinancialsIfSeeded,\n bridgeFromTestControllerStore,\n bridgeFromSessionStore,\n} from '../server/test-controller-bridge';\nexport type {\n TestControllerBridge,\n TestControllerBridgeContext,\n BridgeFromSessionStoreOptions,\n SeededCreative,\n SeededMediaBuy,\n SeededAccountFinancials,\n} from '../server/test-controller-bridge';\n\n// One-call harness for server-side agents — composes serve() +\n// seedComplianceFixtures + createWebhookReceiver + runStoryboard.\nexport { runAgainstLocalAgent } from './local-agent-runner';\nexport type { LocalAgentRunResult, PerStoryboardOverride, RunAgainstLocalAgentOptions } from './local-agent-runner';\n\n// External schema bundles for hosted compliance/certification runs.\nexport { registerExternalSchemaRoot, unregisterExternalSchemaRoot, withExternalSchemaRoot } from '../validation';\n\n// Storyboard-driven testing\nexport {\n // Runner\n runStoryboard,\n runStoryboardStep,\n applyAdcpVersionRunOptions,\n applyStoryboardVersionOptions,\n getFirstStepPreview,\n // Parser (single-file load for spec evolution)\n parseStoryboard,\n loadStoryboardFile,\n // Compliance cache: capability-driven resolution\n getComplianceCacheDir,\n loadComplianceIndex,\n listBundles,\n loadBundleStoryboards,\n listAllComplianceStoryboards,\n getComplianceStoryboardById,\n findBundleById,\n resolveBundleOrStoryboard,\n resolveStoryboardsForCapabilities,\n isComplianceVersionSupported,\n CapabilityResolutionError,\n // Task mapping\n TASK_TO_METHOD,\n executeStoryboardTask,\n // Context\n extractContext,\n injectContext,\n // Validations\n runValidations,\n resolvePath,\n // Rate-limit trip/replay observer\n RateLimitTripObserver,\n RATE_LIMIT_TRIP_CONTRACT,\n RATE_LIMIT_TRIP_DEFAULT_REPLAY_MAX_WAIT_SECONDS,\n RATE_LIMIT_TRIP_MAX_ATTEMPTS_MAX,\n RATE_LIMIT_TRIP_MAX_ATTEMPTS_MIN,\n validateRateLimitTripSpec,\n // Sandbox entities\n getSandboxEntities,\n getSandboxBrands,\n getSandboxBrand,\n isSandboxDomain,\n clearSandboxCache,\n // Assertion registry (adcontextprotocol/adcp#2639) — authors of invariant\n // modules import these from `@adcp/sdk/testing` to register cross-step\n // checks the runner will resolve from `storyboard.invariants: [...]`.\n registerAssertion,\n getAssertion,\n listAssertions,\n listDefaultAssertions,\n clearAssertionRegistry,\n resolveAssertions,\n type AssertionSpec,\n type AssertionContext,\n type AssertionResult,\n type RegisterAssertionOptions,\n // Types\n type Storyboard,\n type StoryboardInvariants,\n type StoryboardInvariantsObject,\n type StepInvariantsObject,\n type StoryboardPhase,\n type StoryboardStep,\n type RateLimitTripSpec,\n type StoryboardValidation,\n type RateLimitTripClient,\n type RateLimitTripFailureCode,\n type RateLimitTripObservation,\n type RateLimitTripObserverOptions,\n type RateLimitTripResponseSnapshot,\n type RateLimitTripStructuredResult,\n type RateLimitTripTaskOptions,\n type StoryboardContext,\n type StoryboardRunOptions,\n type ValidationResult,\n type StoryboardStepPreview,\n type StoryboardStepResult,\n type StoryboardStepHint,\n type StoryboardStepHintBase,\n type ContextValueRejectedHint,\n type ShapeDriftHint,\n type MissingRequiredFieldHint,\n type FormatMismatchHint,\n type MonotonicViolationHint,\n type ContextProvenanceEntry,\n type StoryboardPhaseResult,\n type StoryboardResult,\n type RunnerNotice,\n type NoticeCode,\n type NoticeSeverity,\n type AgentCapabilities,\n type BundleKind,\n type BundleRef,\n type CapabilityResolutionCode,\n type ComplianceIndex,\n type ComplianceIndexProtocol,\n type ComplianceIndexSpecialism,\n type ResolveOptions,\n type ResolvedBundle,\n type ResolvedStoryboards,\n type SandboxBrand,\n type SandboxAgent,\n type SandboxEntities,\n type BrandJson,\n type AdagentsJson,\n BrandJsonSchema,\n AdagentsJsonSchema,\n} from './storyboard';\n"],"mappings":";;;;;;AAGA;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AAGP;AAAA,EACe,aAAbA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAYK;AAGP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OAWK;AAGP,SAAS,2BAA2B;AAIpC,SAAS,uBAAuB,+BAA+B;AAI/D,SAAS,8BAA8B;AAoCvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAeP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAYP,SAAS,4BAA4B;AAIrC,SAAS,4BAA4B,8BAA8B,8BAA8B;AAGjG;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAsDA;AAAA,EACA;AAAA,OACK;","names":["testAgent"]}
1
+ {"version":3,"sources":["../../../src/lib/testing/index.ts"],"sourcesContent":["// Test helpers for AdCP client library\n// Provides pre-configured test agents for examples and quick testing\n\nexport {\n // Test agents (with auth)\n testAgent,\n testAgentA2A,\n testAgentClient,\n createTestAgent,\n TEST_AGENT_TOKEN,\n TEST_AGENT_MCP_CONFIG,\n TEST_AGENT_A2A_CONFIG,\n // Test agents (without auth - for demonstrating auth requirements)\n testAgentNoAuth,\n testAgentNoAuthA2A,\n TEST_AGENT_NO_AUTH_MCP_CONFIG,\n TEST_AGENT_NO_AUTH_A2A_CONFIG,\n // Creative agents (MCP only - A2A not yet supported)\n creativeAgent,\n} from './test-helpers';\n\n// E2E Agent Testing Framework\nexport {\n testAgent as runAgentTests,\n formatTestResults,\n formatTestResultsJSON,\n formatTestResultsSummary,\n setAgentTesterLogger,\n getLogger,\n createTestClient,\n runStep,\n // Individual scenarios\n testHealthCheck,\n testDiscovery,\n testCreateMediaBuy,\n testFullSalesFlow,\n testReportingFlow,\n testCreativeSync,\n testCreativeInline,\n testCreativeFlow,\n testSignalsFlow,\n testErrorHandling,\n testValidation,\n testPricingEdgeCases,\n testTemporalValidation,\n testBehaviorAnalysis,\n testResponseConsistency,\n // v3 scenarios\n testGovernancePropertyLists,\n testGovernanceContentStandards,\n testPropertyListFilters,\n testSISessionLifecycle,\n testSIAvailability,\n testSIHandoff,\n testCapabilityDiscovery,\n testSyncAudiences,\n resolveAccountForMediaBuy,\n resolveAccountForAudiences,\n testSchemaCompliance,\n // State machine compliance\n testMediaBuyLifecycle,\n testTerminalStateEnforcement,\n testPackageLifecycle,\n // Deterministic state machine testing\n testCreativeStateMachine,\n testMediaBuyStateMachine,\n testAccountStateMachine,\n testSessionStateMachine,\n testDeliverySimulation,\n testBudgetSimulation,\n testControllerValidation,\n // Brand rights\n testBrandRightsFlow,\n hasBrandRightsTools,\n // v3 helpers\n hasGovernanceTools,\n hasSITools,\n likelySupportsV3,\n // Suite orchestrator\n testAllScenarios,\n getApplicableScenarios,\n SCENARIO_REQUIREMENTS,\n DEFAULT_SCENARIOS,\n formatSuiteResults,\n formatSuiteResultsJSON,\n // Types\n type TestScenario,\n type TestOptions,\n type OrchestratorOptions,\n type TestResult,\n type SuiteResult,\n type TestStepResult,\n type AgentProfile,\n type TaskResult,\n type TestClient,\n type Logger,\n} from './agent-tester';\n\n// Compliance assessment\nexport {\n comply,\n formatComplianceResults,\n formatComplianceResultsJSON,\n // Brief library\n SAMPLE_BRIEFS,\n getBriefById,\n getBriefsByVertical,\n // Types\n type ComplyOptions,\n type ComplianceTrack,\n type TrackResult,\n type TrackStatus,\n type ComplianceResult,\n type ComplianceSummary,\n type AdvisoryObservation,\n type ObservationSource,\n type SampleBrief,\n} from './compliance';\n\n// Test stubs for compliance testing\nexport { GovernanceAgentStub } from './stubs';\nexport type { StubCallRecord } from './stubs';\n\n// Controller response assertion helpers\nexport { expectControllerError, expectControllerSuccess } from './controller-assertions';\nexport type { ControllerErrorWithDetail } from './controller-assertions';\n\n// Seller-side comply_test_controller scaffold\nexport { createComplyController } from './comply-controller';\nexport type {\n ComplyController,\n ComplyControllerConfig,\n ComplyControllerContext,\n ComplyControllerToolDefinition,\n DirectiveAdapter,\n ForceAccountStatusParams,\n ForceAdapter,\n ForceAudienceStatusParams,\n ForceCatalogItemStatusParams,\n ForceCreateMediaBuyArmParams,\n ForceGetProductsArmParams,\n ForceGetSignalsArmParams,\n ForceCreativeStatusParams,\n ForceMediaBuyStatusParams,\n ForceSessionStatusParams,\n ForceTaskCompletionParams,\n SeedAccountParams,\n SeedAdapter,\n SeedBuyerAgentParams,\n SeedCreativeFormatParams,\n SeedCreativeParams,\n SeedMediaBuyParams,\n SeedPlanParams,\n SeedPricingOptionParams,\n SeedProductParams,\n SimulateAdapter,\n SimulateBudgetSpendParams,\n SimulateDeliveryParams,\n} from './comply-controller';\n// Re-export the full `comply_test_controller` integration surface so sellers\n// wiring their own `TestControllerStore` against typed domain state\n// (MediaBuyState, CreativeState, PlanState, …) can import everything they need\n// from a single path. See `examples/seller-test-controller.ts` for the\n// end-to-end pattern.\nexport {\n TestControllerError,\n CONTROLLER_SCENARIOS,\n DISCOVERY_ARM_SCENARIOS,\n SEED_SCENARIOS,\n SESSION_ENTRY_CAP,\n createSeedFixtureCache,\n enforceMapCap,\n registerTestController,\n} from '../server/test-controller';\nexport type {\n ControllerScenario,\n SeedFixtureCache,\n SeedScenario,\n TestControllerStore,\n TestControllerStoreFactory,\n TestControllerStoreOrFactory,\n} from '../server/test-controller';\n// Status enums every controller implementer mutates. Re-exported here so a\n// seller wiring `forceMediaBuyStatus` / `forceCreativeStatus` doesn't have to\n// reach into `@adcp/sdk` root just for the literal unions.\nexport type { AccountStatus, CreativeStatus, MediaBuyStatus } from '../types/core.generated';\n\n// Seed fixture merge helpers (permissive defaults + storyboard overlay).\nexport {\n mergeSeed,\n overlayById,\n mergeSeedProduct,\n mergeSeedPricingOption,\n mergeSeedCreative,\n mergeSeedPlan,\n mergeSeedMediaBuy,\n} from './seed-merge';\n\n// Test-controller bridge: seeded augmentation of read-side responses on sandbox\n// requests. Per-tool callbacks (`getSeededProducts`, `getSeededCreatives`,\n// `getSeededMediaBuys`, `getSeededAccounts`, `getSeededAccountFinancials`,\n// `getSeededCreativeFormats`) opt in by presence — see TestControllerBridge.\nexport {\n isSandboxRequest,\n mergeSeededProductsIntoResponse,\n filterValidSeededProducts,\n filterValidSeededCreatives,\n filterValidSeededMediaBuys,\n filterValidSeededAccounts,\n filterValidSeededAccountFinancials,\n filterValidSeededCreativeFormats,\n mergeSeededCreativesIntoResponse,\n mergeSeededMediaBuysIntoResponse,\n mergeSeededAccountsIntoResponse,\n mergeSeededCreativeFormatsIntoResponse,\n pickSeededAccountFinancialsForRequest,\n replaceAccountFinancialsIfSeeded,\n bridgeFromTestControllerStore,\n bridgeFromSessionStore,\n} from '../server/test-controller-bridge';\nexport type {\n TestControllerBridge,\n TestControllerBridgeContext,\n BridgeFromSessionStoreOptions,\n SeededCreative,\n SeededMediaBuy,\n SeededAccountFinancials,\n} from '../server/test-controller-bridge';\n\n// One-call harness for server-side agents — composes serve() +\n// seedComplianceFixtures + createWebhookReceiver + runStoryboard.\nexport { runAgainstLocalAgent } from './local-agent-runner';\nexport type { LocalAgentRunResult, PerStoryboardOverride, RunAgainstLocalAgentOptions } from './local-agent-runner';\n\n// External schema bundles for hosted compliance/certification runs.\nexport { registerExternalSchemaRoot, unregisterExternalSchemaRoot, withExternalSchemaRoot } from '../validation';\n\n// Storyboard-driven testing\nexport {\n // Runner\n runStoryboard,\n runStoryboardStep,\n applyAdcpVersionRunOptions,\n applyStoryboardVersionOptions,\n getFirstStepPreview,\n // Parser (single-file load for spec evolution)\n parseStoryboard,\n loadStoryboardFile,\n // Compliance cache: capability-driven resolution\n getComplianceCacheDir,\n loadComplianceIndex,\n listBundles,\n loadBundleStoryboards,\n listAllComplianceStoryboards,\n getComplianceStoryboardById,\n findBundleById,\n resolveBundleOrStoryboard,\n resolveStoryboardsForCapabilities,\n isComplianceVersionSupported,\n CapabilityResolutionError,\n // Task mapping\n TASK_TO_METHOD,\n executeStoryboardTask,\n // Context\n extractContext,\n injectContext,\n // Validations\n runValidations,\n resolvePath,\n // Rate-limit trip/replay observer\n RateLimitTripObserver,\n RATE_LIMIT_TRIP_CONTRACT,\n RATE_LIMIT_TRIP_DEFAULT_REPLAY_MAX_WAIT_SECONDS,\n RATE_LIMIT_TRIP_MAX_ATTEMPTS_MAX,\n RATE_LIMIT_TRIP_MAX_ATTEMPTS_MIN,\n validateRateLimitTripSpec,\n // Sandbox entities\n getSandboxEntities,\n getSandboxBrands,\n getSandboxBrand,\n isSandboxDomain,\n clearSandboxCache,\n // Assertion registry (adcontextprotocol/adcp#2639) — authors of invariant\n // modules import these from `@adcp/sdk/testing` to register cross-step\n // checks the runner will resolve from `storyboard.invariants: [...]`.\n registerAssertion,\n getAssertion,\n listAssertions,\n listDefaultAssertions,\n clearAssertionRegistry,\n resolveAssertions,\n type AssertionSpec,\n type AssertionContext,\n type AssertionResult,\n type RegisterAssertionOptions,\n // Types\n type Storyboard,\n type StoryboardInvariants,\n type StoryboardInvariantsObject,\n type StepInvariantsObject,\n type StoryboardPhase,\n type StoryboardStep,\n type RateLimitTripSpec,\n type StoryboardValidation,\n type RateLimitTripClient,\n type RateLimitTripFailureCode,\n type RateLimitTripObservation,\n type RateLimitTripObserverOptions,\n type RateLimitTripResponseSnapshot,\n type RateLimitTripStructuredResult,\n type RateLimitTripTaskOptions,\n type StoryboardContext,\n type StoryboardRunOptions,\n type ValidationResult,\n type StoryboardStepPreview,\n type StoryboardStepResult,\n type StoryboardStepHint,\n type StoryboardStepHintBase,\n type ContextValueRejectedHint,\n type ShapeDriftHint,\n type MissingRequiredFieldHint,\n type FormatMismatchHint,\n type MonotonicViolationHint,\n type ContextProvenanceEntry,\n type StoryboardPhaseResult,\n type StoryboardResult,\n type RunnerNotice,\n type NoticeCode,\n type NoticeSeverity,\n type AgentCapabilities,\n type BundleKind,\n type BundleRef,\n type CapabilityResolutionCode,\n type ComplianceIndex,\n type ComplianceIndexProtocol,\n type ComplianceIndexSpecialism,\n type ResolveOptions,\n type ResolvedBundle,\n type ResolvedStoryboards,\n type SandboxBrand,\n type SandboxAgent,\n type SandboxEntities,\n type BrandJson,\n type AdagentsJson,\n BrandJsonSchema,\n AdagentsJsonSchema,\n} from './storyboard';\n"],"mappings":"AAGA;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AAGP;AAAA,EACe,aAAbA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAYK;AAGP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OAWK;AAGP,SAAS,2BAA2B;AAIpC,SAAS,uBAAuB,+BAA+B;AAI/D,SAAS,8BAA8B;AAoCvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAeP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAYP,SAAS,4BAA4B;AAIrC,SAAS,4BAA4B,8BAA8B,8BAA8B;AAGjG;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAsDA;AAAA,EACA;AAAA,OACK;","names":["testAgent"]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import { createServer as createNetProbe } from "node:net";
8
2
  import { InMemoryTaskStore } from "@modelcontextprotocol/sdk/experimental/tasks/stores/in-memory.js";
9
3
  import { ADCP_STATE_STORE } from "../server/adcp-server.mjs";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/testing/local-agent-runner.ts"],"sourcesContent":["/**\n * `runAgainstLocalAgent` — one-call compliance harness for server-side\n * AdCP agents.\n *\n * The 300-line \"spin up my Express-equivalent, seed fixtures, create a\n * webhook receiver, loop through storyboards, aggregate results\" loop\n * sellers keep hand-rolling collapses into:\n *\n * ```ts\n * const result = await runAgainstLocalAgent({\n * createAgent: () => createAdcpServer({ ...myHandlers, stateStore }),\n * capabilities: { supported_protocols: ['media-buy'], specialisms: ['sales-non-guaranteed'] },\n * });\n * ```\n *\n * What it composes:\n * - {@link serve} on an ephemeral port (real HTTP transport — MCP\n * wire-format bugs surface, unlike in-memory dispatch)\n * - {@link seedComplianceFixtures} against the `AdcpServer` (skipped\n * when the caller returns a raw `McpServer`)\n * - Optional `createTestAuthorizationServer` for closed-loop OAuth\n * - {@link runStoryboard} per applicable storyboard, with\n * `webhook_receiver: { mode: 'loopback_mock' }` wired by default so\n * the webhook-emission universal grades instead of skipping\n *\n * The caller's `createAgent` factory MUST close over a stable\n * `stateStore` so fixtures seeded once persist across requests. The\n * `serve()` contract calls the factory once per request — every call\n * needs to see the same store.\n *\n * What this helper does NOT do:\n * - Start tunnels (use the CLI's `--webhook-receiver-auto-tunnel` when\n * fronting a remote agent instead)\n * - Mint tokens per-storyboard automatically — call\n * `authorizationServer.issueToken()` in `onListening` and stash the\n * result on `runStoryboardOptions.auth` when a flow needs one\n */\n\nimport { createServer as createNetProbe, type AddressInfo } from 'node:net';\nimport { InMemoryTaskStore } from '@modelcontextprotocol/sdk/experimental/tasks/stores/in-memory.js';\nimport type { TaskStore } from '@modelcontextprotocol/sdk/experimental/tasks/interfaces.js';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Server as HttpServer } from 'node:http';\nimport type { AdcpServer } from '../server/adcp-server';\nimport { ADCP_STATE_STORE } from '../server/adcp-server';\nimport { serve, type ServeContext, type ServeOptions, type ProtectedResourceMetadata } from '../server/serve';\nimport { seedComplianceFixtures, type SeedComplianceFixturesOptions } from '../compliance-fixtures';\nimport {\n createTestAuthorizationServer,\n type TestAuthorizationServer,\n type TestAuthorizationServerOptions,\n} from '../compliance-fixtures/test-authorization-server';\nimport {\n listAllComplianceStoryboards,\n resolveBundleOrStoryboard,\n resolveStoryboardsForCapabilities,\n type AgentCapabilities,\n type ResolveOptions,\n} from './storyboard/compliance';\nimport { runStoryboard } from './storyboard/runner';\nimport type { Storyboard, StoryboardResult, StoryboardRunOptions } from './storyboard/types';\n\nexport interface RunAgainstLocalAgentOptions {\n /**\n * Factory matching {@link serve}'s contract. Receives a {@link ServeContext}\n * with a shared `taskStore` and returns either an `AdcpServer` or a raw\n * `McpServer`. Called once per HTTP request plus once ahead of time by\n * the helper to seed fixtures — the factory MUST close over a stable\n * `stateStore` so every call sees the same data.\n */\n createAgent: (ctx: ServeContext) => AdcpServer | McpServer;\n\n /**\n * Which storyboards to run:\n * - `'all'` (default): every storyboard in the compliance cache\n * - `AgentCapabilities`: capability-driven resolution (the same\n * predicate the live assessment runner uses on an agent's own\n * `get_adcp_capabilities` response)\n * - `string[]`: storyboard or bundle ids\n * - `Storyboard[]`: already-loaded storyboards\n */\n storyboards?: 'all' | AgentCapabilities | string[] | Storyboard[];\n\n /**\n * Seed {@link COMPLIANCE_FIXTURES} into the `AdcpServer`'s state store\n * before the first storyboard. Defaults to `true` when `createAgent`\n * returns an `AdcpServer`; ignored when it returns a raw `McpServer`.\n *\n * Pass an options object to customize categories / overrides.\n */\n fixtures?: boolean | SeedComplianceFixturesOptions;\n\n /**\n * Host a loopback webhook receiver per storyboard so `expect_webhook*`\n * steps grade instead of skipping. Defaults to `true`. Set `false` to\n * skip, or supply a partial config to override defaults.\n */\n webhookReceiver?: boolean | StoryboardRunOptions['webhook_receiver'];\n\n /**\n * Stand up a test authorization server and advertise it via RFC 9728\n * protected-resource metadata on the agent. Defaults to `false` — most\n * sellers don't need OAuth in local loops. When enabled:\n *\n * - Starts a {@link createTestAuthorizationServer}\n * - Passes `protectedResource: { authorization_servers: [AS.issuer] }`\n * and `publicUrl` to `serve()`\n * - Exposes `auth` on the `onListening` hook so callers can mint tokens\n */\n authorizationServer?: boolean | TestAuthorizationServerOptions;\n\n /**\n * Extra options forwarded to {@link serve}. `port`, `onListening`,\n * `publicUrl`, `taskStore`, and `protectedResource` are managed by the\n * helper and values passed here are ignored.\n */\n serveOptions?: Omit<ServeOptions, 'port' | 'onListening' | 'publicUrl' | 'protectedResource' | 'taskStore'>;\n\n /**\n * Forwarded to every `runStoryboard` call. `webhook_receiver` is set by\n * the helper — use `webhookReceiver` at the top level to override.\n *\n * `allow_http` defaults to `true` when the helper is running against its\n * own ephemeral `http://127.0.0.1:<port>/mcp` URL — the storyboard\n * runner's SSRF guard would otherwise refuse to probe the in-process\n * agent it just stood up. Pass `allow_http: false` here if you redirect\n * storyboards to an external `https://` agent via\n * `resolvePerStoryboard` and want loopback-protection back.\n */\n runStoryboardOptions?: Omit<StoryboardRunOptions, 'webhook_receiver'>;\n\n /**\n * Produce per-storyboard overrides, called once per storyboard right\n * before `runStoryboard`. Return `undefined` (or an empty object) to use\n * the defaults; otherwise:\n *\n * - `agentUrl` — redirect this storyboard to a different URL than the\n * ephemeral `http://127.0.0.1:<port>/mcp` the helper bound. Useful\n * when one storyboard needs to hit a stricter sibling route (e.g.\n * `/mcp-strict` for the `signed_requests` storyboard) while the rest\n * stay on the sandbox mount.\n * - every other `StoryboardRunOptions` field is shallow-merged on top\n * of the run-level `runStoryboardOptions`. Common uses: per-\n * storyboard `test_kit`, `brand`, or `contracts` that vary with the\n * storyboard under test. `webhook_receiver` is owned by the helper's\n * `webhookReceiver` field and is typed out of the override shape —\n * the helper re-applies it after the merge so overrides can't stomp\n * the loopback mock.\n *\n * Returning a `Promise` is supported so callers can do async work per\n * storyboard (load a test-kit YAML, mint a scoped token, fetch brand\n * metadata). The helper awaits before issuing `runStoryboard`.\n */\n resolvePerStoryboard?: (\n storyboard: Storyboard,\n defaultAgentUrl: string\n ) => PerStoryboardOverride | undefined | Promise<PerStoryboardOverride | undefined>;\n\n /** Compliance cache overrides. */\n compliance?: ResolveOptions;\n\n /**\n * Streaming callback fired after each storyboard completes. Useful for\n * CLI progress output so implementors don't wait for the full aggregate.\n */\n onStoryboardComplete?: (result: StoryboardResult, index: number, total: number) => void;\n\n /**\n * Called once the agent is bound and fixtures are seeded. Receives the\n * canonical agent URL plus (when enabled) the AS handle. Use it to mint\n * tokens and stash them on `runStoryboardOptions.auth`, or to seed\n * non-fixture state.\n */\n onListening?: (info: { agentUrl: string; auth?: TestAuthorizationServer }) => void | Promise<void>;\n\n /**\n * Stop after the first failing storyboard. Defaults to `false` — the\n * helper runs every storyboard so every failure site is visible.\n */\n bail?: boolean;\n}\n\n/**\n * Per-storyboard override returned by {@link RunAgainstLocalAgentOptions.resolvePerStoryboard}.\n *\n * `agentUrl` redirects the storyboard to a different URL. Every other\n * `StoryboardRunOptions` field is shallow-merged on top of the run-level\n * defaults. `webhook_receiver` is intentionally omitted — the helper owns\n * that field via its `webhookReceiver` option and re-applies it after the\n * merge.\n */\nexport type PerStoryboardOverride = { agentUrl?: string } & Omit<Partial<StoryboardRunOptions>, 'webhook_receiver'>;\n\nexport interface LocalAgentRunResult {\n /** True iff every storyboard passed (steps + assertions). */\n overall_passed: boolean;\n /** Canonical URL the helper mounted the agent at. */\n agent_url: string;\n /** Per-storyboard results, in run order. */\n results: StoryboardResult[];\n /** Storyboards skipped because the agent's capabilities place them out of scope. */\n not_applicable: Array<{ storyboard_id: string; storyboard_title: string; reason: string }>;\n /** Sum across all run storyboards. */\n passed_count: number;\n failed_count: number;\n skipped_count: number;\n total_duration_ms: number;\n}\n\n/**\n * True when `url` is an http:// (not https://) URL pointing at a loopback\n * host — used to decide whether the SSRF guard's HTTPS-only default can be\n * relaxed. Must be tight: a `http://` prefix alone is NOT sufficient (a\n * caller override could redirect to `http://attacker.example.com/mcp` and\n * inherit the allowance). Only `127.0.0.1`, `::1`, and `localhost` count.\n *\n * @internal\n */\nfunction isLoopbackHttpUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== 'http:') return false;\n // `URL.hostname` wraps IPv6 literals in brackets (`[::1]`); strip them\n // to match the bare forms typical in SSRF loopback checks.\n const host = parsed.hostname.replace(/^\\[|\\]$/g, '').toLowerCase();\n return host === '127.0.0.1' || host === '::1' || host === 'localhost';\n } catch {\n return false;\n }\n}\n\n/**\n * Run storyboards against an in-process AdCP agent. Handles lifecycle:\n * bind, seed, (optional) token issuance, loop, tear down.\n */\nexport async function runAgainstLocalAgent(options: RunAgainstLocalAgentOptions): Promise<LocalAgentRunResult> {\n const startedAt = Date.now();\n const mountPath = options.serveOptions?.path ?? '/mcp';\n const taskStore: TaskStore = new InMemoryTaskStore();\n // Bootstrap the factory once with a synthetic host so seeding and\n // fixture preparation run before the server ever binds. `serve()` will\n // pass the real per-request host when it calls the factory again.\n const ctx: ServeContext = { taskStore, host: '' };\n\n let auth: TestAuthorizationServer | undefined;\n let httpServer: HttpServer | undefined;\n\n try {\n if (options.authorizationServer) {\n const authOptions = typeof options.authorizationServer === 'object' ? options.authorizationServer : {};\n auth = await createTestAuthorizationServer(authOptions);\n }\n\n // Bootstrap: call the factory once ahead of time to get an AdcpServer\n // we can seed against. serve() will call the factory again for every\n // real request — the user's stateStore closure guarantees seeds persist.\n const bootstrapAgent = options.createAgent(ctx);\n const bootstrapIsAdcp = isAdcpServer(bootstrapAgent);\n if (bootstrapIsAdcp && options.fixtures !== false) {\n const seedOptions = typeof options.fixtures === 'object' ? options.fixtures : {};\n await seedComplianceFixtures(bootstrapAgent, seedOptions);\n }\n // Release the bootstrap instance so serve()'s per-request factory calls\n // produce fresh servers. Closing is idempotent.\n await bootstrapAgent.close();\n\n const protectedResource: ProtectedResourceMetadata | undefined = auth\n ? { authorization_servers: [auth.issuer] }\n : undefined;\n // For the common unauthenticated local-agent path, bind port 0 directly\n // and read the assigned port after listen. This avoids the allocate-then-\n // bind race where another parallel test can claim the probed port.\n // OAuth protected-resource metadata still needs a publicUrl before\n // serve() construction, so that path keeps the preallocated port.\n const port = protectedResource ? await allocatePort() : 0;\n const publicUrl = `http://127.0.0.1:${port}${mountPath}`;\n let agentUrl = publicUrl;\n\n httpServer = serve(options.createAgent, {\n ...options.serveOptions,\n taskStore,\n port,\n ...(protectedResource ? { protectedResource, publicUrl } : {}),\n onListening: () => {\n /* swallow the default console.log — callers can observe via onListening */\n },\n });\n\n await waitForListening(httpServer);\n if (!protectedResource) {\n const address = httpServer.address();\n if (!address || typeof address === 'string') {\n throw new Error('runAgainstLocalAgent: local HTTP server did not expose a TCP address');\n }\n agentUrl = `http://127.0.0.1:${address.port}${mountPath}`;\n }\n\n if (options.onListening) {\n await options.onListening({ agentUrl, auth });\n }\n\n const toRun = await resolveStoryboardSet(options);\n const results: StoryboardResult[] = [];\n let passed = 0;\n let failed = 0;\n let skipped = 0;\n\n const webhookConfig = resolveWebhookReceiver(options.webhookReceiver);\n const explicitAllowHttp = options.runStoryboardOptions?.allow_http;\n const baseRunOptions: Omit<StoryboardRunOptions, 'webhook_receiver' | 'allow_http'> = {\n ...(options.runStoryboardOptions ?? {}),\n };\n // `allow_http` is removed from baseRunOptions and recomputed per\n // storyboard below — inheriting `true` across storyboards would let a\n // `resolvePerStoryboard` override that redirected to a remote\n // `http://...` URL bypass the SSRF guard and silently probe an\n // attacker-controlled target with private-IP allowance.\n delete (baseRunOptions as { allow_http?: unknown }).allow_http;\n\n for (let i = 0; i < toRun.storyboards.length; i++) {\n const sb = toRun.storyboards[i]!;\n const override = (await options.resolvePerStoryboard?.(sb, agentUrl)) ?? undefined;\n const { agentUrl: overrideUrl, ...overrideRunOptions } = override ?? {};\n const storyboardUrl = overrideUrl ?? agentUrl;\n // Tighten the SSRF-guard bypass: only auto-opt-in `allow_http` when\n // THIS storyboard's URL is loopback-bound (what the helper owns).\n // An override to `http://attacker.example.com/...` must not\n // inherit the default — that would re-enable the private-IP\n // allowance against attacker-controlled infrastructure.\n const storyboardIsLoopbackHttp = isLoopbackHttpUrl(storyboardUrl);\n const effectiveAllowHttp =\n (overrideRunOptions as { allow_http?: boolean }).allow_http ?? explicitAllowHttp ?? storyboardIsLoopbackHttp;\n // webhook_receiver is helper-owned — re-applied after the merge so\n // overrides can't replace the loopback mock the helper promised.\n const storyboardOptions: StoryboardRunOptions = {\n ...baseRunOptions,\n ...overrideRunOptions,\n allow_http: effectiveAllowHttp,\n ...(webhookConfig ? { webhook_receiver: webhookConfig } : {}),\n };\n const result = await runStoryboard(storyboardUrl, sb, storyboardOptions);\n results.push(result);\n passed += result.passed_count;\n failed += result.failed_count;\n skipped += result.skipped_count;\n if (options.onStoryboardComplete) {\n options.onStoryboardComplete(result, i, toRun.storyboards.length);\n }\n if (options.bail && !result.overall_passed) break;\n }\n\n return {\n overall_passed: results.every(r => r.overall_passed),\n agent_url: agentUrl,\n results,\n not_applicable: toRun.not_applicable,\n passed_count: passed,\n failed_count: failed,\n skipped_count: skipped,\n total_duration_ms: Date.now() - startedAt,\n };\n } finally {\n await closeHttpServer(httpServer);\n if (auth) await auth.close();\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// Helpers\n// ────────────────────────────────────────────────────────────\n\nfunction isAdcpServer(candidate: unknown): candidate is AdcpServer {\n if (candidate == null || typeof candidate !== 'object') return false;\n return typeof (candidate as Record<symbol, unknown>)[ADCP_STATE_STORE] === 'object';\n}\n\nfunction resolveWebhookReceiver(\n option: RunAgainstLocalAgentOptions['webhookReceiver']\n): StoryboardRunOptions['webhook_receiver'] | undefined {\n if (option === false) return undefined;\n if (option === true || option === undefined) return { mode: 'loopback_mock' };\n return option;\n}\n\nasync function resolveStoryboardSet(options: RunAgainstLocalAgentOptions): Promise<{\n storyboards: Storyboard[];\n not_applicable: Array<{ storyboard_id: string; storyboard_title: string; reason: string }>;\n}> {\n const spec = options.storyboards ?? 'all';\n const compliance = options.compliance ?? {};\n if (spec === 'all') {\n return { storyboards: listAllComplianceStoryboards(compliance), not_applicable: [] };\n }\n if (Array.isArray(spec)) {\n if (spec.length === 0) return { storyboards: [], not_applicable: [] };\n if (typeof spec[0] === 'object' && 'phases' in (spec[0] as Storyboard)) {\n return { storyboards: spec as Storyboard[], not_applicable: [] };\n }\n const resolved: Storyboard[] = [];\n const unknown: string[] = [];\n for (const id of spec as string[]) {\n const matches = resolveBundleOrStoryboard(id, compliance);\n if (matches.length === 0) {\n unknown.push(id);\n } else {\n resolved.push(...matches);\n }\n }\n if (unknown.length > 0) {\n throw new Error(\n `runAgainstLocalAgent: unknown storyboard or bundle id(s): ${unknown.join(', ')}. ` +\n `Run \\`adcp storyboard list\\` to see available ids.`\n );\n }\n const seen = new Set<string>();\n return {\n storyboards: resolved.filter(sb => (seen.has(sb.id) ? false : (seen.add(sb.id), true))),\n not_applicable: [],\n };\n }\n const resolved = resolveStoryboardsForCapabilities(spec, compliance);\n return {\n storyboards: resolved.storyboards,\n not_applicable: resolved.not_applicable.map(n => ({\n storyboard_id: n.storyboard_id,\n storyboard_title: n.storyboard_title,\n reason: n.reason,\n })),\n };\n}\n\nfunction allocatePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const probe = createNetProbe();\n probe.unref();\n probe.on('error', reject);\n probe.listen(0, '127.0.0.1', () => {\n const { port } = probe.address() as AddressInfo;\n probe.close(err => (err ? reject(err) : resolve(port)));\n });\n });\n}\n\nfunction waitForListening(server: HttpServer): Promise<void> {\n if (server.listening) return Promise.resolve();\n return new Promise<void>((resolve, reject) => {\n const onListening = () => {\n cleanup();\n resolve();\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n const cleanup = () => {\n server.off('listening', onListening);\n server.off('error', onError);\n };\n server.on('listening', onListening);\n server.on('error', onError);\n });\n}\n\nfunction closeHttpServer(server: HttpServer | undefined): Promise<void> {\n if (!server) return Promise.resolve();\n return new Promise<void>((resolve, reject) => {\n server.closeAllConnections?.();\n server.close(err => {\n if (err && (err as NodeJS.ErrnoException).code !== 'ERR_SERVER_NOT_RUNNING') reject(err);\n else resolve();\n });\n });\n}\n"],"mappings":"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","names":["resolved"]}
1
+ {"version":3,"sources":["../../../src/lib/testing/local-agent-runner.ts"],"sourcesContent":["/**\n * `runAgainstLocalAgent` — one-call compliance harness for server-side\n * AdCP agents.\n *\n * The 300-line \"spin up my Express-equivalent, seed fixtures, create a\n * webhook receiver, loop through storyboards, aggregate results\" loop\n * sellers keep hand-rolling collapses into:\n *\n * ```ts\n * const result = await runAgainstLocalAgent({\n * createAgent: () => createAdcpServer({ ...myHandlers, stateStore }),\n * capabilities: { supported_protocols: ['media-buy'], specialisms: ['sales-non-guaranteed'] },\n * });\n * ```\n *\n * What it composes:\n * - {@link serve} on an ephemeral port (real HTTP transport — MCP\n * wire-format bugs surface, unlike in-memory dispatch)\n * - {@link seedComplianceFixtures} against the `AdcpServer` (skipped\n * when the caller returns a raw `McpServer`)\n * - Optional `createTestAuthorizationServer` for closed-loop OAuth\n * - {@link runStoryboard} per applicable storyboard, with\n * `webhook_receiver: { mode: 'loopback_mock' }` wired by default so\n * the webhook-emission universal grades instead of skipping\n *\n * The caller's `createAgent` factory MUST close over a stable\n * `stateStore` so fixtures seeded once persist across requests. The\n * `serve()` contract calls the factory once per request — every call\n * needs to see the same store.\n *\n * What this helper does NOT do:\n * - Start tunnels (use the CLI's `--webhook-receiver-auto-tunnel` when\n * fronting a remote agent instead)\n * - Mint tokens per-storyboard automatically — call\n * `authorizationServer.issueToken()` in `onListening` and stash the\n * result on `runStoryboardOptions.auth` when a flow needs one\n */\n\nimport { createServer as createNetProbe, type AddressInfo } from 'node:net';\nimport { InMemoryTaskStore } from '@modelcontextprotocol/sdk/experimental/tasks/stores/in-memory.js';\nimport type { TaskStore } from '@modelcontextprotocol/sdk/experimental/tasks/interfaces.js';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Server as HttpServer } from 'node:http';\nimport type { AdcpServer } from '../server/adcp-server';\nimport { ADCP_STATE_STORE } from '../server/adcp-server';\nimport { serve, type ServeContext, type ServeOptions, type ProtectedResourceMetadata } from '../server/serve';\nimport { seedComplianceFixtures, type SeedComplianceFixturesOptions } from '../compliance-fixtures';\nimport {\n createTestAuthorizationServer,\n type TestAuthorizationServer,\n type TestAuthorizationServerOptions,\n} from '../compliance-fixtures/test-authorization-server';\nimport {\n listAllComplianceStoryboards,\n resolveBundleOrStoryboard,\n resolveStoryboardsForCapabilities,\n type AgentCapabilities,\n type ResolveOptions,\n} from './storyboard/compliance';\nimport { runStoryboard } from './storyboard/runner';\nimport type { Storyboard, StoryboardResult, StoryboardRunOptions } from './storyboard/types';\n\nexport interface RunAgainstLocalAgentOptions {\n /**\n * Factory matching {@link serve}'s contract. Receives a {@link ServeContext}\n * with a shared `taskStore` and returns either an `AdcpServer` or a raw\n * `McpServer`. Called once per HTTP request plus once ahead of time by\n * the helper to seed fixtures — the factory MUST close over a stable\n * `stateStore` so every call sees the same data.\n */\n createAgent: (ctx: ServeContext) => AdcpServer | McpServer;\n\n /**\n * Which storyboards to run:\n * - `'all'` (default): every storyboard in the compliance cache\n * - `AgentCapabilities`: capability-driven resolution (the same\n * predicate the live assessment runner uses on an agent's own\n * `get_adcp_capabilities` response)\n * - `string[]`: storyboard or bundle ids\n * - `Storyboard[]`: already-loaded storyboards\n */\n storyboards?: 'all' | AgentCapabilities | string[] | Storyboard[];\n\n /**\n * Seed {@link COMPLIANCE_FIXTURES} into the `AdcpServer`'s state store\n * before the first storyboard. Defaults to `true` when `createAgent`\n * returns an `AdcpServer`; ignored when it returns a raw `McpServer`.\n *\n * Pass an options object to customize categories / overrides.\n */\n fixtures?: boolean | SeedComplianceFixturesOptions;\n\n /**\n * Host a loopback webhook receiver per storyboard so `expect_webhook*`\n * steps grade instead of skipping. Defaults to `true`. Set `false` to\n * skip, or supply a partial config to override defaults.\n */\n webhookReceiver?: boolean | StoryboardRunOptions['webhook_receiver'];\n\n /**\n * Stand up a test authorization server and advertise it via RFC 9728\n * protected-resource metadata on the agent. Defaults to `false` — most\n * sellers don't need OAuth in local loops. When enabled:\n *\n * - Starts a {@link createTestAuthorizationServer}\n * - Passes `protectedResource: { authorization_servers: [AS.issuer] }`\n * and `publicUrl` to `serve()`\n * - Exposes `auth` on the `onListening` hook so callers can mint tokens\n */\n authorizationServer?: boolean | TestAuthorizationServerOptions;\n\n /**\n * Extra options forwarded to {@link serve}. `port`, `onListening`,\n * `publicUrl`, `taskStore`, and `protectedResource` are managed by the\n * helper and values passed here are ignored.\n */\n serveOptions?: Omit<ServeOptions, 'port' | 'onListening' | 'publicUrl' | 'protectedResource' | 'taskStore'>;\n\n /**\n * Forwarded to every `runStoryboard` call. `webhook_receiver` is set by\n * the helper — use `webhookReceiver` at the top level to override.\n *\n * `allow_http` defaults to `true` when the helper is running against its\n * own ephemeral `http://127.0.0.1:<port>/mcp` URL — the storyboard\n * runner's SSRF guard would otherwise refuse to probe the in-process\n * agent it just stood up. Pass `allow_http: false` here if you redirect\n * storyboards to an external `https://` agent via\n * `resolvePerStoryboard` and want loopback-protection back.\n */\n runStoryboardOptions?: Omit<StoryboardRunOptions, 'webhook_receiver'>;\n\n /**\n * Produce per-storyboard overrides, called once per storyboard right\n * before `runStoryboard`. Return `undefined` (or an empty object) to use\n * the defaults; otherwise:\n *\n * - `agentUrl` — redirect this storyboard to a different URL than the\n * ephemeral `http://127.0.0.1:<port>/mcp` the helper bound. Useful\n * when one storyboard needs to hit a stricter sibling route (e.g.\n * `/mcp-strict` for the `signed_requests` storyboard) while the rest\n * stay on the sandbox mount.\n * - every other `StoryboardRunOptions` field is shallow-merged on top\n * of the run-level `runStoryboardOptions`. Common uses: per-\n * storyboard `test_kit`, `brand`, or `contracts` that vary with the\n * storyboard under test. `webhook_receiver` is owned by the helper's\n * `webhookReceiver` field and is typed out of the override shape —\n * the helper re-applies it after the merge so overrides can't stomp\n * the loopback mock.\n *\n * Returning a `Promise` is supported so callers can do async work per\n * storyboard (load a test-kit YAML, mint a scoped token, fetch brand\n * metadata). The helper awaits before issuing `runStoryboard`.\n */\n resolvePerStoryboard?: (\n storyboard: Storyboard,\n defaultAgentUrl: string\n ) => PerStoryboardOverride | undefined | Promise<PerStoryboardOverride | undefined>;\n\n /** Compliance cache overrides. */\n compliance?: ResolveOptions;\n\n /**\n * Streaming callback fired after each storyboard completes. Useful for\n * CLI progress output so implementors don't wait for the full aggregate.\n */\n onStoryboardComplete?: (result: StoryboardResult, index: number, total: number) => void;\n\n /**\n * Called once the agent is bound and fixtures are seeded. Receives the\n * canonical agent URL plus (when enabled) the AS handle. Use it to mint\n * tokens and stash them on `runStoryboardOptions.auth`, or to seed\n * non-fixture state.\n */\n onListening?: (info: { agentUrl: string; auth?: TestAuthorizationServer }) => void | Promise<void>;\n\n /**\n * Stop after the first failing storyboard. Defaults to `false` — the\n * helper runs every storyboard so every failure site is visible.\n */\n bail?: boolean;\n}\n\n/**\n * Per-storyboard override returned by {@link RunAgainstLocalAgentOptions.resolvePerStoryboard}.\n *\n * `agentUrl` redirects the storyboard to a different URL. Every other\n * `StoryboardRunOptions` field is shallow-merged on top of the run-level\n * defaults. `webhook_receiver` is intentionally omitted — the helper owns\n * that field via its `webhookReceiver` option and re-applies it after the\n * merge.\n */\nexport type PerStoryboardOverride = { agentUrl?: string } & Omit<Partial<StoryboardRunOptions>, 'webhook_receiver'>;\n\nexport interface LocalAgentRunResult {\n /** True iff every storyboard passed (steps + assertions). */\n overall_passed: boolean;\n /** Canonical URL the helper mounted the agent at. */\n agent_url: string;\n /** Per-storyboard results, in run order. */\n results: StoryboardResult[];\n /** Storyboards skipped because the agent's capabilities place them out of scope. */\n not_applicable: Array<{ storyboard_id: string; storyboard_title: string; reason: string }>;\n /** Sum across all run storyboards. */\n passed_count: number;\n failed_count: number;\n skipped_count: number;\n total_duration_ms: number;\n}\n\n/**\n * True when `url` is an http:// (not https://) URL pointing at a loopback\n * host — used to decide whether the SSRF guard's HTTPS-only default can be\n * relaxed. Must be tight: a `http://` prefix alone is NOT sufficient (a\n * caller override could redirect to `http://attacker.example.com/mcp` and\n * inherit the allowance). Only `127.0.0.1`, `::1`, and `localhost` count.\n *\n * @internal\n */\nfunction isLoopbackHttpUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== 'http:') return false;\n // `URL.hostname` wraps IPv6 literals in brackets (`[::1]`); strip them\n // to match the bare forms typical in SSRF loopback checks.\n const host = parsed.hostname.replace(/^\\[|\\]$/g, '').toLowerCase();\n return host === '127.0.0.1' || host === '::1' || host === 'localhost';\n } catch {\n return false;\n }\n}\n\n/**\n * Run storyboards against an in-process AdCP agent. Handles lifecycle:\n * bind, seed, (optional) token issuance, loop, tear down.\n */\nexport async function runAgainstLocalAgent(options: RunAgainstLocalAgentOptions): Promise<LocalAgentRunResult> {\n const startedAt = Date.now();\n const mountPath = options.serveOptions?.path ?? '/mcp';\n const taskStore: TaskStore = new InMemoryTaskStore();\n // Bootstrap the factory once with a synthetic host so seeding and\n // fixture preparation run before the server ever binds. `serve()` will\n // pass the real per-request host when it calls the factory again.\n const ctx: ServeContext = { taskStore, host: '' };\n\n let auth: TestAuthorizationServer | undefined;\n let httpServer: HttpServer | undefined;\n\n try {\n if (options.authorizationServer) {\n const authOptions = typeof options.authorizationServer === 'object' ? options.authorizationServer : {};\n auth = await createTestAuthorizationServer(authOptions);\n }\n\n // Bootstrap: call the factory once ahead of time to get an AdcpServer\n // we can seed against. serve() will call the factory again for every\n // real request — the user's stateStore closure guarantees seeds persist.\n const bootstrapAgent = options.createAgent(ctx);\n const bootstrapIsAdcp = isAdcpServer(bootstrapAgent);\n if (bootstrapIsAdcp && options.fixtures !== false) {\n const seedOptions = typeof options.fixtures === 'object' ? options.fixtures : {};\n await seedComplianceFixtures(bootstrapAgent, seedOptions);\n }\n // Release the bootstrap instance so serve()'s per-request factory calls\n // produce fresh servers. Closing is idempotent.\n await bootstrapAgent.close();\n\n const protectedResource: ProtectedResourceMetadata | undefined = auth\n ? { authorization_servers: [auth.issuer] }\n : undefined;\n // For the common unauthenticated local-agent path, bind port 0 directly\n // and read the assigned port after listen. This avoids the allocate-then-\n // bind race where another parallel test can claim the probed port.\n // OAuth protected-resource metadata still needs a publicUrl before\n // serve() construction, so that path keeps the preallocated port.\n const port = protectedResource ? await allocatePort() : 0;\n const publicUrl = `http://127.0.0.1:${port}${mountPath}`;\n let agentUrl = publicUrl;\n\n httpServer = serve(options.createAgent, {\n ...options.serveOptions,\n taskStore,\n port,\n ...(protectedResource ? { protectedResource, publicUrl } : {}),\n onListening: () => {\n /* swallow the default console.log — callers can observe via onListening */\n },\n });\n\n await waitForListening(httpServer);\n if (!protectedResource) {\n const address = httpServer.address();\n if (!address || typeof address === 'string') {\n throw new Error('runAgainstLocalAgent: local HTTP server did not expose a TCP address');\n }\n agentUrl = `http://127.0.0.1:${address.port}${mountPath}`;\n }\n\n if (options.onListening) {\n await options.onListening({ agentUrl, auth });\n }\n\n const toRun = await resolveStoryboardSet(options);\n const results: StoryboardResult[] = [];\n let passed = 0;\n let failed = 0;\n let skipped = 0;\n\n const webhookConfig = resolveWebhookReceiver(options.webhookReceiver);\n const explicitAllowHttp = options.runStoryboardOptions?.allow_http;\n const baseRunOptions: Omit<StoryboardRunOptions, 'webhook_receiver' | 'allow_http'> = {\n ...(options.runStoryboardOptions ?? {}),\n };\n // `allow_http` is removed from baseRunOptions and recomputed per\n // storyboard below — inheriting `true` across storyboards would let a\n // `resolvePerStoryboard` override that redirected to a remote\n // `http://...` URL bypass the SSRF guard and silently probe an\n // attacker-controlled target with private-IP allowance.\n delete (baseRunOptions as { allow_http?: unknown }).allow_http;\n\n for (let i = 0; i < toRun.storyboards.length; i++) {\n const sb = toRun.storyboards[i]!;\n const override = (await options.resolvePerStoryboard?.(sb, agentUrl)) ?? undefined;\n const { agentUrl: overrideUrl, ...overrideRunOptions } = override ?? {};\n const storyboardUrl = overrideUrl ?? agentUrl;\n // Tighten the SSRF-guard bypass: only auto-opt-in `allow_http` when\n // THIS storyboard's URL is loopback-bound (what the helper owns).\n // An override to `http://attacker.example.com/...` must not\n // inherit the default — that would re-enable the private-IP\n // allowance against attacker-controlled infrastructure.\n const storyboardIsLoopbackHttp = isLoopbackHttpUrl(storyboardUrl);\n const effectiveAllowHttp =\n (overrideRunOptions as { allow_http?: boolean }).allow_http ?? explicitAllowHttp ?? storyboardIsLoopbackHttp;\n // webhook_receiver is helper-owned — re-applied after the merge so\n // overrides can't replace the loopback mock the helper promised.\n const storyboardOptions: StoryboardRunOptions = {\n ...baseRunOptions,\n ...overrideRunOptions,\n allow_http: effectiveAllowHttp,\n ...(webhookConfig ? { webhook_receiver: webhookConfig } : {}),\n };\n const result = await runStoryboard(storyboardUrl, sb, storyboardOptions);\n results.push(result);\n passed += result.passed_count;\n failed += result.failed_count;\n skipped += result.skipped_count;\n if (options.onStoryboardComplete) {\n options.onStoryboardComplete(result, i, toRun.storyboards.length);\n }\n if (options.bail && !result.overall_passed) break;\n }\n\n return {\n overall_passed: results.every(r => r.overall_passed),\n agent_url: agentUrl,\n results,\n not_applicable: toRun.not_applicable,\n passed_count: passed,\n failed_count: failed,\n skipped_count: skipped,\n total_duration_ms: Date.now() - startedAt,\n };\n } finally {\n await closeHttpServer(httpServer);\n if (auth) await auth.close();\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// Helpers\n// ────────────────────────────────────────────────────────────\n\nfunction isAdcpServer(candidate: unknown): candidate is AdcpServer {\n if (candidate == null || typeof candidate !== 'object') return false;\n return typeof (candidate as Record<symbol, unknown>)[ADCP_STATE_STORE] === 'object';\n}\n\nfunction resolveWebhookReceiver(\n option: RunAgainstLocalAgentOptions['webhookReceiver']\n): StoryboardRunOptions['webhook_receiver'] | undefined {\n if (option === false) return undefined;\n if (option === true || option === undefined) return { mode: 'loopback_mock' };\n return option;\n}\n\nasync function resolveStoryboardSet(options: RunAgainstLocalAgentOptions): Promise<{\n storyboards: Storyboard[];\n not_applicable: Array<{ storyboard_id: string; storyboard_title: string; reason: string }>;\n}> {\n const spec = options.storyboards ?? 'all';\n const compliance = options.compliance ?? {};\n if (spec === 'all') {\n return { storyboards: listAllComplianceStoryboards(compliance), not_applicable: [] };\n }\n if (Array.isArray(spec)) {\n if (spec.length === 0) return { storyboards: [], not_applicable: [] };\n if (typeof spec[0] === 'object' && 'phases' in (spec[0] as Storyboard)) {\n return { storyboards: spec as Storyboard[], not_applicable: [] };\n }\n const resolved: Storyboard[] = [];\n const unknown: string[] = [];\n for (const id of spec as string[]) {\n const matches = resolveBundleOrStoryboard(id, compliance);\n if (matches.length === 0) {\n unknown.push(id);\n } else {\n resolved.push(...matches);\n }\n }\n if (unknown.length > 0) {\n throw new Error(\n `runAgainstLocalAgent: unknown storyboard or bundle id(s): ${unknown.join(', ')}. ` +\n `Run \\`adcp storyboard list\\` to see available ids.`\n );\n }\n const seen = new Set<string>();\n return {\n storyboards: resolved.filter(sb => (seen.has(sb.id) ? false : (seen.add(sb.id), true))),\n not_applicable: [],\n };\n }\n const resolved = resolveStoryboardsForCapabilities(spec, compliance);\n return {\n storyboards: resolved.storyboards,\n not_applicable: resolved.not_applicable.map(n => ({\n storyboard_id: n.storyboard_id,\n storyboard_title: n.storyboard_title,\n reason: n.reason,\n })),\n };\n}\n\nfunction allocatePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const probe = createNetProbe();\n probe.unref();\n probe.on('error', reject);\n probe.listen(0, '127.0.0.1', () => {\n const { port } = probe.address() as AddressInfo;\n probe.close(err => (err ? reject(err) : resolve(port)));\n });\n });\n}\n\nfunction waitForListening(server: HttpServer): Promise<void> {\n if (server.listening) return Promise.resolve();\n return new Promise<void>((resolve, reject) => {\n const onListening = () => {\n cleanup();\n resolve();\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n const cleanup = () => {\n server.off('listening', onListening);\n server.off('error', onError);\n };\n server.on('listening', onListening);\n server.on('error', onError);\n });\n}\n\nfunction closeHttpServer(server: HttpServer | undefined): Promise<void> {\n if (!server) return Promise.resolve();\n return new Promise<void>((resolve, reject) => {\n server.closeAllConnections?.();\n server.close(err => {\n if (err && (err as NodeJS.ErrnoException).code !== 'ERR_SERVER_NOT_RUNNING') reject(err);\n else resolve();\n });\n });\n}\n"],"mappings":"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","names":["resolved"]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import { testAgent } from "./agent-tester.mjs";
8
2
  import { getOrCreateClient, getOrDiscoverProfile } from "./client.mjs";
9
3
  const SCENARIO_REQUIREMENTS = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/testing/orchestrator.ts"],"sourcesContent":["/**\n * Test Suite Orchestrator for AdCP Agents\n *\n * Discovers agent capabilities and runs all applicable test scenarios,\n * aggregating results into a single suite report.\n */\n\nimport { testAgent } from './agent-tester';\nimport { createTestClient, discoverAgentProfile, getOrCreateClient, getOrDiscoverProfile } from './client';\nimport type { TestScenario, TestOptions, TestResult, SuiteResult } from './types';\n\n/**\n * Minimum tools required for each scenario to be applicable.\n * ALL listed tools must be present in the agent's tool list.\n * Scenarios with an empty array are always applicable.\n *\n * @deprecated Use storyboard-driven testing via `runStoryboard()` instead.\n * Storyboards define required tools per step via `requires_tool` and per\n * storyboard via `required_tools`. See `src/lib/testing/storyboard/`.\n */\nexport const SCENARIO_REQUIREMENTS: Partial<Record<TestScenario, string[]>> = {\n // Always applicable\n health_check: [],\n discovery: [],\n capability_discovery: [],\n\n // Requires media buy core tools\n create_media_buy: ['get_products', 'create_media_buy'],\n full_sales_flow: ['get_products', 'create_media_buy'],\n reporting_flow: ['get_products', 'create_media_buy', 'get_media_buy_delivery'],\n creative_inline: ['get_products', 'create_media_buy'],\n creative_reference: ['get_products', 'create_media_buy', 'build_creative', 'sync_creatives'],\n temporal_validation: ['get_products', 'create_media_buy'],\n creative_sync: ['sync_creatives'],\n\n // Requires get_products\n pricing_edge_cases: ['get_products'],\n pricing_models: ['get_products'],\n // error_handling and validation use per-tool conditional guards internally;\n // no top-level discovery tool required to run them.\n error_handling: [],\n validation: [],\n behavior_analysis: ['get_products'],\n response_consistency: ['get_products'],\n\n // Requires creative agent tools\n creative_flow: ['build_creative'],\n creative_lifecycle: ['list_creative_formats'],\n\n // Requires signals tools\n signals_flow: ['get_signals'],\n\n // Requires governance tools\n governance_property_lists: ['create_property_list'],\n governance_content_standards: ['list_content_standards'],\n property_list_filters: ['create_property_list', 'get_property_list'],\n\n // Requires campaign governance tools\n campaign_governance: ['sync_plans', 'check_governance'],\n campaign_governance_denied: ['sync_plans', 'check_governance'],\n campaign_governance_conditions: ['sync_plans', 'check_governance'],\n campaign_governance_delivery: ['check_governance'],\n\n // Requires seller tools (governance context persistence)\n seller_governance_context: ['get_products', 'create_media_buy', 'get_media_buys'],\n\n // Requires SI tools\n si_session_lifecycle: ['si_initiate_session'],\n si_availability: ['si_get_offering'],\n si_handoff: ['si_initiate_session', 'si_terminate_session'],\n\n // Requires audience management tools\n sync_audiences: ['sync_audiences'],\n\n // State machine compliance\n media_buy_lifecycle: ['get_products', 'create_media_buy', 'update_media_buy'],\n terminal_state_enforcement: ['get_products', 'create_media_buy', 'update_media_buy'],\n package_lifecycle: ['get_products', 'create_media_buy', 'update_media_buy'],\n\n // Schema compliance — applies to any agent with a primary discovery tool.\n // Internally branches on get_products vs get_signals; always applicable.\n schema_compliance: [],\n\n // Error compliance (requires create_media_buy to provoke errors)\n error_codes: ['create_media_buy'],\n error_structure: ['create_media_buy'],\n error_transport: ['create_media_buy'],\n\n // Requires brand rights tools\n brand_identity: ['get_brand_identity'],\n brand_rights_flow: ['get_rights', 'acquire_rights'],\n creative_approval: ['creative_approval'],\n\n // Deterministic state machine scenarios (require comply_test_controller)\n deterministic_creative: ['comply_test_controller', 'sync_creatives'],\n deterministic_media_buy: ['comply_test_controller', 'get_products', 'create_media_buy'],\n deterministic_account: ['comply_test_controller', 'list_accounts'],\n deterministic_session: ['comply_test_controller', 'si_initiate_session'],\n deterministic_delivery: ['comply_test_controller', 'get_products', 'create_media_buy', 'get_media_buy_delivery'],\n deterministic_budget: ['comply_test_controller', 'get_products', 'create_media_buy'],\n controller_validation: ['comply_test_controller'],\n};\n\n/**\n * Default set of scenarios the orchestrator will attempt.\n * Excludes unimplemented scenarios and deduplicates coverage\n * (pricing_models is omitted since pricing_edge_cases covers the same ground).\n *\n * Deterministic scenarios (deterministic_*, controller_validation) are excluded here —\n * they are managed by the comply engine via TRACK_DEFINITIONS and only run when the\n * seller exposes comply_test_controller.\n *\n * @deprecated Use storyboard-driven testing via `runStoryboard()` instead.\n */\nexport const DEFAULT_SCENARIOS: readonly TestScenario[] = [\n 'health_check',\n 'discovery',\n 'capability_discovery',\n 'create_media_buy',\n 'full_sales_flow',\n 'creative_sync',\n 'creative_inline',\n 'creative_reference',\n 'pricing_edge_cases',\n 'error_handling',\n 'validation',\n 'temporal_validation',\n 'behavior_analysis',\n 'response_consistency',\n 'creative_flow',\n 'creative_lifecycle',\n 'signals_flow',\n 'governance_property_lists',\n 'governance_content_standards',\n 'property_list_filters',\n 'campaign_governance',\n 'campaign_governance_denied',\n 'campaign_governance_conditions',\n 'campaign_governance_delivery',\n 'seller_governance_context',\n 'si_session_lifecycle',\n 'si_availability',\n 'si_handoff',\n 'schema_compliance',\n 'sync_audiences',\n 'media_buy_lifecycle',\n 'terminal_state_enforcement',\n 'package_lifecycle',\n 'error_codes',\n 'error_structure',\n 'error_transport',\n 'brand_identity',\n 'brand_rights_flow',\n 'creative_approval',\n] as const;\n\n/**\n * Options for testAllScenarios(), extending single-scenario TestOptions\n * with an optional scenario filter.\n */\nexport interface OrchestratorOptions extends TestOptions {\n /** Limit which scenarios to attempt (defaults to DEFAULT_SCENARIOS) */\n scenarios?: TestScenario[];\n}\n\nfunction isApplicable(scenario: TestScenario, tools: string[]): boolean {\n if (!(scenario in SCENARIO_REQUIREMENTS)) return false;\n const requirements = SCENARIO_REQUIREMENTS[scenario]!;\n return requirements.every(tool => tools.includes(tool));\n}\n\n/**\n * Return the subset of candidate scenarios that are applicable for an agent\n * with the given tool list.\n *\n * @param tools - Tool names from getAgentInfo()\n * @param filter - Scenarios to consider; defaults to DEFAULT_SCENARIOS\n */\nexport function getApplicableScenarios(tools: string[], filter?: readonly TestScenario[]): TestScenario[] {\n const candidates = filter ?? DEFAULT_SCENARIOS;\n return (candidates as TestScenario[]).filter(s => isApplicable(s, tools));\n}\n\n/**\n * Run all applicable test scenarios against an agent and return aggregated results.\n *\n * Scenarios are run sequentially. Each scenario re-uses the same TestOptions\n * (including auth, brand, etc.). The total duration includes the\n * initial capability discovery call.\n *\n * Note: testAllScenarios creates a client for capability discovery, then each\n * testAgent call creates its own client internally. This is intentional — testAgent\n * is designed as a standalone function and sharing state between scenarios could\n * cause cross-scenario interference.\n *\n * @deprecated Use `runStoryboard()` for storyboard-driven testing instead.\n * The comply() engine now uses storyboards as its primary testing surface.\n */\nexport async function testAllScenarios(agentUrl: string, options: OrchestratorOptions = {}): Promise<SuiteResult> {\n const start = Date.now();\n const { scenarios: scenarioFilter, ...testOptions } = options;\n\n const effectiveOptions: TestOptions = {\n ...testOptions,\n sandbox: testOptions.sandbox !== false,\n test_session_id: testOptions.test_session_id || `addie-suite-${Date.now()}`,\n };\n\n // Discover the agent's tools to determine which scenarios apply.\n // If discovery fails (agent unreachable or rejects the request), return early\n // rather than attempting scenarios with no tool information.\n const client = getOrCreateClient(agentUrl, effectiveOptions);\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, effectiveOptions);\n effectiveOptions._client = client;\n effectiveOptions._profile = profile;\n\n if (!profileStep.passed) {\n return {\n agent_url: agentUrl,\n agent_profile: profile,\n scenarios_run: [],\n scenarios_skipped: [],\n results: [],\n overall_passed: false,\n passed_count: 0,\n failed_count: 0,\n total_duration_ms: Date.now() - start,\n tested_at: new Date().toISOString(),\n };\n }\n\n const applicable = getApplicableScenarios(profile.tools, scenarioFilter);\n const candidates: readonly TestScenario[] = scenarioFilter ?? DEFAULT_SCENARIOS;\n const skipped = (candidates as TestScenario[]).filter(s => !applicable.includes(s));\n\n // Run each applicable scenario sequentially\n const results: TestResult[] = [];\n for (const scenario of applicable) {\n const result = await testAgent(agentUrl, scenario, effectiveOptions);\n results.push(result);\n }\n\n const passedCount = results.filter(r => r.overall_passed).length;\n const failedCount = results.filter(r => !r.overall_passed).length;\n\n return {\n agent_url: agentUrl,\n agent_profile: profile,\n scenarios_run: applicable,\n scenarios_skipped: skipped,\n results,\n overall_passed: failedCount === 0 && passedCount > 0,\n passed_count: passedCount,\n failed_count: failedCount,\n total_duration_ms: Date.now() - start,\n tested_at: new Date().toISOString(),\n };\n}\n\n/**\n * Format suite results as markdown for display in Slack/chat\n */\nexport function formatSuiteResults(suite: SuiteResult): string {\n const statusEmoji = suite.overall_passed ? '✅' : '❌';\n let output = `## ${statusEmoji} Agent Test Suite Results\\n\\n`;\n output += `**Agent:** ${suite.agent_url}\\n`;\n output += `**Agent Name:** ${suite.agent_profile.name}\\n`;\n output += `**Duration:** ${suite.total_duration_ms}ms\\n`;\n if (suite.scenarios_run.length === 0) {\n output += `**Result:** No applicable scenarios found for this agent.\\n\\n`;\n } else {\n output += `**Result:** ${suite.passed_count} passed, ${suite.failed_count} failed out of ${suite.scenarios_run.length} scenario(s)\\n\\n`;\n }\n\n if (suite.scenarios_skipped.length > 0) {\n output += `**Skipped (agent does not advertise required tools):** ${suite.scenarios_skipped.join(', ')}\\n\\n`;\n }\n\n output += `### Scenario Results\\n\\n`;\n for (const result of suite.results) {\n const emoji = result.overall_passed ? '✅' : '❌';\n output += `${emoji} **${result.scenario}**: ${result.summary} (${result.total_duration_ms}ms)\\n`;\n\n if (!result.overall_passed) {\n const failedSteps = (result.steps ?? []).filter(s => !s.passed);\n for (const step of failedSteps) {\n output += ` ❌ **${step.step}**`;\n if (step.task) {\n output += ` (\\`${step.task}\\`)`;\n }\n output += ` - ${step.duration_ms}ms\\n`;\n if (step.details) output += ` ${step.details}\\n`;\n if (step.error) output += ` ⚠️ Error: ${step.error}\\n`;\n if (step.response_preview) {\n output +=\n '\\n<details><summary>Diagnostic details</summary>\\n\\n```json\\n' +\n step.response_preview +\n '\\n```\\n\\n</details>\\n\\n';\n }\n }\n }\n }\n\n return output;\n}\n\n/**\n * Format suite results as JSON\n */\nexport function formatSuiteResultsJSON(suite: SuiteResult): string {\n return JSON.stringify(suite, null, 2);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/testing/orchestrator.ts"],"sourcesContent":["/**\n * Test Suite Orchestrator for AdCP Agents\n *\n * Discovers agent capabilities and runs all applicable test scenarios,\n * aggregating results into a single suite report.\n */\n\nimport { testAgent } from './agent-tester';\nimport { createTestClient, discoverAgentProfile, getOrCreateClient, getOrDiscoverProfile } from './client';\nimport type { TestScenario, TestOptions, TestResult, SuiteResult } from './types';\n\n/**\n * Minimum tools required for each scenario to be applicable.\n * ALL listed tools must be present in the agent's tool list.\n * Scenarios with an empty array are always applicable.\n *\n * @deprecated Use storyboard-driven testing via `runStoryboard()` instead.\n * Storyboards define required tools per step via `requires_tool` and per\n * storyboard via `required_tools`. See `src/lib/testing/storyboard/`.\n */\nexport const SCENARIO_REQUIREMENTS: Partial<Record<TestScenario, string[]>> = {\n // Always applicable\n health_check: [],\n discovery: [],\n capability_discovery: [],\n\n // Requires media buy core tools\n create_media_buy: ['get_products', 'create_media_buy'],\n full_sales_flow: ['get_products', 'create_media_buy'],\n reporting_flow: ['get_products', 'create_media_buy', 'get_media_buy_delivery'],\n creative_inline: ['get_products', 'create_media_buy'],\n creative_reference: ['get_products', 'create_media_buy', 'build_creative', 'sync_creatives'],\n temporal_validation: ['get_products', 'create_media_buy'],\n creative_sync: ['sync_creatives'],\n\n // Requires get_products\n pricing_edge_cases: ['get_products'],\n pricing_models: ['get_products'],\n // error_handling and validation use per-tool conditional guards internally;\n // no top-level discovery tool required to run them.\n error_handling: [],\n validation: [],\n behavior_analysis: ['get_products'],\n response_consistency: ['get_products'],\n\n // Requires creative agent tools\n creative_flow: ['build_creative'],\n creative_lifecycle: ['list_creative_formats'],\n\n // Requires signals tools\n signals_flow: ['get_signals'],\n\n // Requires governance tools\n governance_property_lists: ['create_property_list'],\n governance_content_standards: ['list_content_standards'],\n property_list_filters: ['create_property_list', 'get_property_list'],\n\n // Requires campaign governance tools\n campaign_governance: ['sync_plans', 'check_governance'],\n campaign_governance_denied: ['sync_plans', 'check_governance'],\n campaign_governance_conditions: ['sync_plans', 'check_governance'],\n campaign_governance_delivery: ['check_governance'],\n\n // Requires seller tools (governance context persistence)\n seller_governance_context: ['get_products', 'create_media_buy', 'get_media_buys'],\n\n // Requires SI tools\n si_session_lifecycle: ['si_initiate_session'],\n si_availability: ['si_get_offering'],\n si_handoff: ['si_initiate_session', 'si_terminate_session'],\n\n // Requires audience management tools\n sync_audiences: ['sync_audiences'],\n\n // State machine compliance\n media_buy_lifecycle: ['get_products', 'create_media_buy', 'update_media_buy'],\n terminal_state_enforcement: ['get_products', 'create_media_buy', 'update_media_buy'],\n package_lifecycle: ['get_products', 'create_media_buy', 'update_media_buy'],\n\n // Schema compliance — applies to any agent with a primary discovery tool.\n // Internally branches on get_products vs get_signals; always applicable.\n schema_compliance: [],\n\n // Error compliance (requires create_media_buy to provoke errors)\n error_codes: ['create_media_buy'],\n error_structure: ['create_media_buy'],\n error_transport: ['create_media_buy'],\n\n // Requires brand rights tools\n brand_identity: ['get_brand_identity'],\n brand_rights_flow: ['get_rights', 'acquire_rights'],\n creative_approval: ['creative_approval'],\n\n // Deterministic state machine scenarios (require comply_test_controller)\n deterministic_creative: ['comply_test_controller', 'sync_creatives'],\n deterministic_media_buy: ['comply_test_controller', 'get_products', 'create_media_buy'],\n deterministic_account: ['comply_test_controller', 'list_accounts'],\n deterministic_session: ['comply_test_controller', 'si_initiate_session'],\n deterministic_delivery: ['comply_test_controller', 'get_products', 'create_media_buy', 'get_media_buy_delivery'],\n deterministic_budget: ['comply_test_controller', 'get_products', 'create_media_buy'],\n controller_validation: ['comply_test_controller'],\n};\n\n/**\n * Default set of scenarios the orchestrator will attempt.\n * Excludes unimplemented scenarios and deduplicates coverage\n * (pricing_models is omitted since pricing_edge_cases covers the same ground).\n *\n * Deterministic scenarios (deterministic_*, controller_validation) are excluded here —\n * they are managed by the comply engine via TRACK_DEFINITIONS and only run when the\n * seller exposes comply_test_controller.\n *\n * @deprecated Use storyboard-driven testing via `runStoryboard()` instead.\n */\nexport const DEFAULT_SCENARIOS: readonly TestScenario[] = [\n 'health_check',\n 'discovery',\n 'capability_discovery',\n 'create_media_buy',\n 'full_sales_flow',\n 'creative_sync',\n 'creative_inline',\n 'creative_reference',\n 'pricing_edge_cases',\n 'error_handling',\n 'validation',\n 'temporal_validation',\n 'behavior_analysis',\n 'response_consistency',\n 'creative_flow',\n 'creative_lifecycle',\n 'signals_flow',\n 'governance_property_lists',\n 'governance_content_standards',\n 'property_list_filters',\n 'campaign_governance',\n 'campaign_governance_denied',\n 'campaign_governance_conditions',\n 'campaign_governance_delivery',\n 'seller_governance_context',\n 'si_session_lifecycle',\n 'si_availability',\n 'si_handoff',\n 'schema_compliance',\n 'sync_audiences',\n 'media_buy_lifecycle',\n 'terminal_state_enforcement',\n 'package_lifecycle',\n 'error_codes',\n 'error_structure',\n 'error_transport',\n 'brand_identity',\n 'brand_rights_flow',\n 'creative_approval',\n] as const;\n\n/**\n * Options for testAllScenarios(), extending single-scenario TestOptions\n * with an optional scenario filter.\n */\nexport interface OrchestratorOptions extends TestOptions {\n /** Limit which scenarios to attempt (defaults to DEFAULT_SCENARIOS) */\n scenarios?: TestScenario[];\n}\n\nfunction isApplicable(scenario: TestScenario, tools: string[]): boolean {\n if (!(scenario in SCENARIO_REQUIREMENTS)) return false;\n const requirements = SCENARIO_REQUIREMENTS[scenario]!;\n return requirements.every(tool => tools.includes(tool));\n}\n\n/**\n * Return the subset of candidate scenarios that are applicable for an agent\n * with the given tool list.\n *\n * @param tools - Tool names from getAgentInfo()\n * @param filter - Scenarios to consider; defaults to DEFAULT_SCENARIOS\n */\nexport function getApplicableScenarios(tools: string[], filter?: readonly TestScenario[]): TestScenario[] {\n const candidates = filter ?? DEFAULT_SCENARIOS;\n return (candidates as TestScenario[]).filter(s => isApplicable(s, tools));\n}\n\n/**\n * Run all applicable test scenarios against an agent and return aggregated results.\n *\n * Scenarios are run sequentially. Each scenario re-uses the same TestOptions\n * (including auth, brand, etc.). The total duration includes the\n * initial capability discovery call.\n *\n * Note: testAllScenarios creates a client for capability discovery, then each\n * testAgent call creates its own client internally. This is intentional — testAgent\n * is designed as a standalone function and sharing state between scenarios could\n * cause cross-scenario interference.\n *\n * @deprecated Use `runStoryboard()` for storyboard-driven testing instead.\n * The comply() engine now uses storyboards as its primary testing surface.\n */\nexport async function testAllScenarios(agentUrl: string, options: OrchestratorOptions = {}): Promise<SuiteResult> {\n const start = Date.now();\n const { scenarios: scenarioFilter, ...testOptions } = options;\n\n const effectiveOptions: TestOptions = {\n ...testOptions,\n sandbox: testOptions.sandbox !== false,\n test_session_id: testOptions.test_session_id || `addie-suite-${Date.now()}`,\n };\n\n // Discover the agent's tools to determine which scenarios apply.\n // If discovery fails (agent unreachable or rejects the request), return early\n // rather than attempting scenarios with no tool information.\n const client = getOrCreateClient(agentUrl, effectiveOptions);\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, effectiveOptions);\n effectiveOptions._client = client;\n effectiveOptions._profile = profile;\n\n if (!profileStep.passed) {\n return {\n agent_url: agentUrl,\n agent_profile: profile,\n scenarios_run: [],\n scenarios_skipped: [],\n results: [],\n overall_passed: false,\n passed_count: 0,\n failed_count: 0,\n total_duration_ms: Date.now() - start,\n tested_at: new Date().toISOString(),\n };\n }\n\n const applicable = getApplicableScenarios(profile.tools, scenarioFilter);\n const candidates: readonly TestScenario[] = scenarioFilter ?? DEFAULT_SCENARIOS;\n const skipped = (candidates as TestScenario[]).filter(s => !applicable.includes(s));\n\n // Run each applicable scenario sequentially\n const results: TestResult[] = [];\n for (const scenario of applicable) {\n const result = await testAgent(agentUrl, scenario, effectiveOptions);\n results.push(result);\n }\n\n const passedCount = results.filter(r => r.overall_passed).length;\n const failedCount = results.filter(r => !r.overall_passed).length;\n\n return {\n agent_url: agentUrl,\n agent_profile: profile,\n scenarios_run: applicable,\n scenarios_skipped: skipped,\n results,\n overall_passed: failedCount === 0 && passedCount > 0,\n passed_count: passedCount,\n failed_count: failedCount,\n total_duration_ms: Date.now() - start,\n tested_at: new Date().toISOString(),\n };\n}\n\n/**\n * Format suite results as markdown for display in Slack/chat\n */\nexport function formatSuiteResults(suite: SuiteResult): string {\n const statusEmoji = suite.overall_passed ? '✅' : '❌';\n let output = `## ${statusEmoji} Agent Test Suite Results\\n\\n`;\n output += `**Agent:** ${suite.agent_url}\\n`;\n output += `**Agent Name:** ${suite.agent_profile.name}\\n`;\n output += `**Duration:** ${suite.total_duration_ms}ms\\n`;\n if (suite.scenarios_run.length === 0) {\n output += `**Result:** No applicable scenarios found for this agent.\\n\\n`;\n } else {\n output += `**Result:** ${suite.passed_count} passed, ${suite.failed_count} failed out of ${suite.scenarios_run.length} scenario(s)\\n\\n`;\n }\n\n if (suite.scenarios_skipped.length > 0) {\n output += `**Skipped (agent does not advertise required tools):** ${suite.scenarios_skipped.join(', ')}\\n\\n`;\n }\n\n output += `### Scenario Results\\n\\n`;\n for (const result of suite.results) {\n const emoji = result.overall_passed ? '✅' : '❌';\n output += `${emoji} **${result.scenario}**: ${result.summary} (${result.total_duration_ms}ms)\\n`;\n\n if (!result.overall_passed) {\n const failedSteps = (result.steps ?? []).filter(s => !s.passed);\n for (const step of failedSteps) {\n output += ` ❌ **${step.step}**`;\n if (step.task) {\n output += ` (\\`${step.task}\\`)`;\n }\n output += ` - ${step.duration_ms}ms\\n`;\n if (step.details) output += ` ${step.details}\\n`;\n if (step.error) output += ` ⚠️ Error: ${step.error}\\n`;\n if (step.response_preview) {\n output +=\n '\\n<details><summary>Diagnostic details</summary>\\n\\n```json\\n' +\n step.response_preview +\n '\\n```\\n\\n</details>\\n\\n';\n }\n }\n }\n }\n\n return output;\n}\n\n/**\n * Format suite results as JSON\n */\nexport function formatSuiteResultsJSON(suite: SuiteResult): string {\n return JSON.stringify(suite, null, 2);\n}\n"],"mappings":"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","names":[]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  const dtcSkincareBuyer = {
8
2
  id: "dtc_skincare_buyer",
9
3
  name: "Glow Lab \u2014 DTC Skincare",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/testing/personas/index.ts"],"sourcesContent":["/**\n * Canonical buyer personas — typed, immutable test fixtures every\n * adopter would otherwise rewrite. Each persona carries enough identity\n * (brand domain, account_id, promoted_offering, brief) to drive the\n * common AdCP request shapes without surface-area surprises.\n *\n * Use when you want a deterministic buyer to drive an integration test\n * against your seller / signal / creative agent. Pair with the builder\n * helpers below to construct wire-shaped requests in one line.\n *\n * The four shipped personas span the verticals and budget classes most\n * sellers see: enterprise CTV, performance social, premium B2B, and\n * geo-targeted local. Adopters who need richer coverage extend the\n * pattern; this set intentionally stays small to keep the surface\n * stable through preview.\n *\n * Status: Preview / 6.0.\n *\n * @example\n * ```ts\n * import { dtcSkincareBuyer, buildGetProductsRequest } from '@adcp/sdk/testing/personas';\n *\n * const result = await server.dispatchTestRequest({\n * method: 'tools/call',\n * params: {\n * name: 'get_products',\n * arguments: buildGetProductsRequest(dtcSkincareBuyer),\n * },\n * });\n * ```\n *\n * @public\n */\n\nimport type { AccountReference, BrandReference, GetProductsRequest } from '../../types/tools.generated';\n\n/**\n * A canonical buyer persona — brand identity + account fixture + brief\n * + budget shape. Typed `readonly` because personas are shared\n * fixtures: tests should mutate via the builder helpers (which clone\n * before adding overrides), never the persona object itself.\n *\n * @public\n */\nexport interface BuyerPersona {\n /** Stable ID. Use this in test names + bug reports. */\n readonly id: string;\n /** Display name for test output. */\n readonly name: string;\n /** Vertical — same vocabulary as `SampleBrief.vertical`. */\n readonly vertical: string;\n /** Brand identity: domain hosts /.well-known/brand.json in real deployments. */\n readonly brand: { readonly domain: string; readonly name: string };\n /** Account ID this persona uses on the test seller. */\n readonly account_id: string;\n /** Single-line summary of what the buyer is selling — feeds `promoted_offering` on `get_products`. */\n readonly promoted_offering: string;\n /** Free-text brief — same shape as `SampleBrief.brief`, used by brief-driven sellers. */\n readonly brief: string;\n /** Total campaign budget hint. */\n readonly budget: { readonly amount: number; readonly currency: string };\n /** Channels this persona typically requests, in priority order. */\n readonly channels: readonly string[];\n}\n\n/**\n * DTC ecommerce on a tight performance budget. Social-first, Gen-Z\n * audience, $50K test budget, performance pricing models preferred.\n * Mirrors the `dtc_skincare_genZ` SampleBrief.\n *\n * @public\n */\nexport const dtcSkincareBuyer: BuyerPersona = {\n id: 'dtc_skincare_buyer',\n name: 'Glow Lab — DTC Skincare',\n vertical: 'Beauty & Personal Care',\n brand: { domain: 'glowlab.example.com', name: 'Glow Lab' },\n account_id: 'acc_glowlab',\n promoted_offering: 'Glow Lab Vitamin C Serum + first-time-buyer 20% off',\n brief:\n 'Direct-to-consumer skincare brand targeting Gen Z females (18-25). ' +\n 'Social-first campaign with UGC-style creative preferred. ' +\n 'Goal is driving trial purchases through a 20% off promo code. ' +\n 'Performance-oriented: need clear CPA/CPC pricing.',\n budget: { amount: 50_000, currency: 'USD' },\n channels: ['social', 'display'],\n};\n\n/**\n * Luxury automotive launch. High-impact video + premium display, $500K\n * Q3 flight, brand safety critical. Mirrors the `luxury_auto_ev`\n * SampleBrief.\n *\n * @public\n */\nexport const luxuryAutoBuyer: BuyerPersona = {\n id: 'luxury_auto_buyer',\n name: 'Velara Motors — EV Launch',\n vertical: 'Automotive',\n brand: { domain: 'velaramotors.example.com', name: 'Velara Motors' },\n account_id: 'acc_velara',\n promoted_offering: 'Velara V1 — luxury electric crossover SUV',\n brief:\n 'Luxury automotive brand launching a new electric crossover SUV. ' +\n 'Targeting high-income households ($150K+ HHI), ages 30-55, in major US metros. ' +\n 'Need high-impact video and premium display placements. ' +\n 'Q3 flight (July-September). Key message: \"The future of luxury driving.\" ' +\n 'Brand safety is critical — no UGC or controversial adjacency.',\n budget: { amount: 500_000, currency: 'USD' },\n channels: ['olv', 'ctv', 'display'],\n};\n\n/**\n * Enterprise B2B SaaS awareness — premium publisher placements,\n * viewability benchmarks, $200K over six weeks. Mirrors the\n * `b2b_saas_awareness` SampleBrief.\n *\n * @public\n */\nexport const b2bSaasBuyer: BuyerPersona = {\n id: 'b2b_saas_buyer',\n name: 'Threadline — Workflow Platform',\n vertical: 'Technology / B2B',\n brand: { domain: 'threadline.example.com', name: 'Threadline' },\n account_id: 'acc_threadline',\n promoted_offering: 'Threadline workflow platform — annual enterprise plan',\n brief:\n 'Enterprise SaaS company building brand awareness among IT decision-makers and C-suite executives. ' +\n 'Looking for premium editorial environments — business, technology, and finance publishers. ' +\n 'Display and native content placements preferred. CTV is acceptable if targeting is precise. ' +\n 'Viewability benchmarks are important — need 70%+ viewability guarantee.',\n budget: { amount: 200_000, currency: 'USD' },\n channels: ['display', 'ctv'],\n};\n\n/**\n * Regional QSR / restaurant chain — geo-targeted mobile + display\n * within radius, foot-traffic attribution. Mirrors the\n * `restaurant_local` SampleBrief.\n *\n * @public\n */\nexport const restaurantLocalBuyer: BuyerPersona = {\n id: 'restaurant_local_buyer',\n name: 'Anchor & Oak — Regional Chain',\n vertical: 'QSR / Restaurant',\n brand: { domain: 'anchorandoak.example.com', name: 'Anchor & Oak' },\n account_id: 'acc_anchoroak',\n promoted_offering: 'Anchor & Oak summer menu — promoted across 15 metros',\n brief:\n 'Regional restaurant chain promoting a new menu launch across 15 metro areas. ' +\n 'Need geo-targeted mobile and display ads within 5-mile radius of each location. ' +\n 'Audio/podcast ads are also interesting if available. ' +\n 'Performance tracking: need foot traffic attribution or store visit metrics.',\n budget: { amount: 75_000, currency: 'USD' },\n channels: ['display', 'audio'],\n};\n\n/**\n * All shipped personas, in stable order. Adopters iterate this array\n * to run a scenario across every canonical buyer in one loop.\n *\n * @public\n */\nexport const ALL_PERSONAS: readonly BuyerPersona[] = [\n dtcSkincareBuyer,\n luxuryAutoBuyer,\n b2bSaasBuyer,\n restaurantLocalBuyer,\n];\n\n/**\n * Look up a persona by `id`. Returns `undefined` for unknown IDs —\n * test code asserting on a specific persona should narrow with a\n * non-null check.\n *\n * @public\n */\nexport function getPersonaById(id: string): BuyerPersona | undefined {\n return ALL_PERSONAS.find(p => p.id === id);\n}\n\n// ---------------------------------------------------------------------------\n// Wire-shape builders\n// ---------------------------------------------------------------------------\n\n/**\n * Build an {@link AccountReference} pointing at the persona's account.\n * Discriminated-union narrowing concern: the wire shape allows\n * `account_id`, `brand`, or `brand + operator`. This builder always\n * returns the `account_id` arm — adopters who need the brand-arm shape\n * should compose `buildBrandReference(persona)` with their own operator.\n *\n * @public\n */\nexport function buildAccountReference(persona: BuyerPersona): AccountReference {\n return { account_id: persona.account_id };\n}\n\n/**\n * Build a {@link BrandReference} from the persona's brand identity.\n * Domain is the canonical field; name is dropped (the wire spec doesn't\n * carry it on `BrandReference` — sellers resolve via brand.json).\n *\n * @public\n */\nexport function buildBrandReference(persona: BuyerPersona): BrandReference {\n return { domain: persona.brand.domain };\n}\n\n/**\n * Build a wire-shaped {@link GetProductsRequest} keyed to this persona —\n * `buying_mode: 'brief'`, the persona's `brief` text, brand reference,\n * and account reference. Pass `overrides` to add `filters`,\n * `preferred_delivery_types`, `time_budget`, etc.\n *\n * @public\n */\nexport function buildGetProductsRequest(\n persona: BuyerPersona,\n overrides?: Partial<GetProductsRequest>\n): GetProductsRequest {\n return {\n buying_mode: 'brief',\n brief: persona.brief,\n brand: buildBrandReference(persona),\n account: buildAccountReference(persona),\n ...overrides,\n };\n}\n"],"mappings":";;;;;;AAwEO,MAAM,mBAAiC;AAAA,EAC5C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO,EAAE,QAAQ,uBAAuB,MAAM,WAAW;AAAA,EACzD,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,OACE;AAAA,EAIF,QAAQ,EAAE,QAAQ,KAAQ,UAAU,MAAM;AAAA,EAC1C,UAAU,CAAC,UAAU,SAAS;AAChC;AASO,MAAM,kBAAgC;AAAA,EAC3C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO,EAAE,QAAQ,4BAA4B,MAAM,gBAAgB;AAAA,EACnE,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,OACE;AAAA,EAKF,QAAQ,EAAE,QAAQ,KAAS,UAAU,MAAM;AAAA,EAC3C,UAAU,CAAC,OAAO,OAAO,SAAS;AACpC;AASO,MAAM,eAA6B;AAAA,EACxC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO,EAAE,QAAQ,0BAA0B,MAAM,aAAa;AAAA,EAC9D,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,OACE;AAAA,EAIF,QAAQ,EAAE,QAAQ,KAAS,UAAU,MAAM;AAAA,EAC3C,UAAU,CAAC,WAAW,KAAK;AAC7B;AASO,MAAM,uBAAqC;AAAA,EAChD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO,EAAE,QAAQ,4BAA4B,MAAM,eAAe;AAAA,EAClE,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,OACE;AAAA,EAIF,QAAQ,EAAE,QAAQ,MAAQ,UAAU,MAAM;AAAA,EAC1C,UAAU,CAAC,WAAW,OAAO;AAC/B;AAQO,MAAM,eAAwC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASO,SAAS,eAAe,IAAsC;AACnE,SAAO,aAAa,KAAK,OAAK,EAAE,OAAO,EAAE;AAC3C;AAeO,SAAS,sBAAsB,SAAyC;AAC7E,SAAO,EAAE,YAAY,QAAQ,WAAW;AAC1C;AASO,SAAS,oBAAoB,SAAuC;AACzE,SAAO,EAAE,QAAQ,QAAQ,MAAM,OAAO;AACxC;AAUO,SAAS,wBACd,SACA,WACoB;AACpB,SAAO;AAAA,IACL,aAAa;AAAA,IACb,OAAO,QAAQ;AAAA,IACf,OAAO,oBAAoB,OAAO;AAAA,IAClC,SAAS,sBAAsB,OAAO;AAAA,IACtC,GAAG;AAAA,EACL;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/testing/personas/index.ts"],"sourcesContent":["/**\n * Canonical buyer personas — typed, immutable test fixtures every\n * adopter would otherwise rewrite. Each persona carries enough identity\n * (brand domain, account_id, promoted_offering, brief) to drive the\n * common AdCP request shapes without surface-area surprises.\n *\n * Use when you want a deterministic buyer to drive an integration test\n * against your seller / signal / creative agent. Pair with the builder\n * helpers below to construct wire-shaped requests in one line.\n *\n * The four shipped personas span the verticals and budget classes most\n * sellers see: enterprise CTV, performance social, premium B2B, and\n * geo-targeted local. Adopters who need richer coverage extend the\n * pattern; this set intentionally stays small to keep the surface\n * stable through preview.\n *\n * Status: Preview / 6.0.\n *\n * @example\n * ```ts\n * import { dtcSkincareBuyer, buildGetProductsRequest } from '@adcp/sdk/testing/personas';\n *\n * const result = await server.dispatchTestRequest({\n * method: 'tools/call',\n * params: {\n * name: 'get_products',\n * arguments: buildGetProductsRequest(dtcSkincareBuyer),\n * },\n * });\n * ```\n *\n * @public\n */\n\nimport type { AccountReference, BrandReference, GetProductsRequest } from '../../types/tools.generated';\n\n/**\n * A canonical buyer persona — brand identity + account fixture + brief\n * + budget shape. Typed `readonly` because personas are shared\n * fixtures: tests should mutate via the builder helpers (which clone\n * before adding overrides), never the persona object itself.\n *\n * @public\n */\nexport interface BuyerPersona {\n /** Stable ID. Use this in test names + bug reports. */\n readonly id: string;\n /** Display name for test output. */\n readonly name: string;\n /** Vertical — same vocabulary as `SampleBrief.vertical`. */\n readonly vertical: string;\n /** Brand identity: domain hosts /.well-known/brand.json in real deployments. */\n readonly brand: { readonly domain: string; readonly name: string };\n /** Account ID this persona uses on the test seller. */\n readonly account_id: string;\n /** Single-line summary of what the buyer is selling — feeds `promoted_offering` on `get_products`. */\n readonly promoted_offering: string;\n /** Free-text brief — same shape as `SampleBrief.brief`, used by brief-driven sellers. */\n readonly brief: string;\n /** Total campaign budget hint. */\n readonly budget: { readonly amount: number; readonly currency: string };\n /** Channels this persona typically requests, in priority order. */\n readonly channels: readonly string[];\n}\n\n/**\n * DTC ecommerce on a tight performance budget. Social-first, Gen-Z\n * audience, $50K test budget, performance pricing models preferred.\n * Mirrors the `dtc_skincare_genZ` SampleBrief.\n *\n * @public\n */\nexport const dtcSkincareBuyer: BuyerPersona = {\n id: 'dtc_skincare_buyer',\n name: 'Glow Lab — DTC Skincare',\n vertical: 'Beauty & Personal Care',\n brand: { domain: 'glowlab.example.com', name: 'Glow Lab' },\n account_id: 'acc_glowlab',\n promoted_offering: 'Glow Lab Vitamin C Serum + first-time-buyer 20% off',\n brief:\n 'Direct-to-consumer skincare brand targeting Gen Z females (18-25). ' +\n 'Social-first campaign with UGC-style creative preferred. ' +\n 'Goal is driving trial purchases through a 20% off promo code. ' +\n 'Performance-oriented: need clear CPA/CPC pricing.',\n budget: { amount: 50_000, currency: 'USD' },\n channels: ['social', 'display'],\n};\n\n/**\n * Luxury automotive launch. High-impact video + premium display, $500K\n * Q3 flight, brand safety critical. Mirrors the `luxury_auto_ev`\n * SampleBrief.\n *\n * @public\n */\nexport const luxuryAutoBuyer: BuyerPersona = {\n id: 'luxury_auto_buyer',\n name: 'Velara Motors — EV Launch',\n vertical: 'Automotive',\n brand: { domain: 'velaramotors.example.com', name: 'Velara Motors' },\n account_id: 'acc_velara',\n promoted_offering: 'Velara V1 — luxury electric crossover SUV',\n brief:\n 'Luxury automotive brand launching a new electric crossover SUV. ' +\n 'Targeting high-income households ($150K+ HHI), ages 30-55, in major US metros. ' +\n 'Need high-impact video and premium display placements. ' +\n 'Q3 flight (July-September). Key message: \"The future of luxury driving.\" ' +\n 'Brand safety is critical — no UGC or controversial adjacency.',\n budget: { amount: 500_000, currency: 'USD' },\n channels: ['olv', 'ctv', 'display'],\n};\n\n/**\n * Enterprise B2B SaaS awareness — premium publisher placements,\n * viewability benchmarks, $200K over six weeks. Mirrors the\n * `b2b_saas_awareness` SampleBrief.\n *\n * @public\n */\nexport const b2bSaasBuyer: BuyerPersona = {\n id: 'b2b_saas_buyer',\n name: 'Threadline — Workflow Platform',\n vertical: 'Technology / B2B',\n brand: { domain: 'threadline.example.com', name: 'Threadline' },\n account_id: 'acc_threadline',\n promoted_offering: 'Threadline workflow platform — annual enterprise plan',\n brief:\n 'Enterprise SaaS company building brand awareness among IT decision-makers and C-suite executives. ' +\n 'Looking for premium editorial environments — business, technology, and finance publishers. ' +\n 'Display and native content placements preferred. CTV is acceptable if targeting is precise. ' +\n 'Viewability benchmarks are important — need 70%+ viewability guarantee.',\n budget: { amount: 200_000, currency: 'USD' },\n channels: ['display', 'ctv'],\n};\n\n/**\n * Regional QSR / restaurant chain — geo-targeted mobile + display\n * within radius, foot-traffic attribution. Mirrors the\n * `restaurant_local` SampleBrief.\n *\n * @public\n */\nexport const restaurantLocalBuyer: BuyerPersona = {\n id: 'restaurant_local_buyer',\n name: 'Anchor & Oak — Regional Chain',\n vertical: 'QSR / Restaurant',\n brand: { domain: 'anchorandoak.example.com', name: 'Anchor & Oak' },\n account_id: 'acc_anchoroak',\n promoted_offering: 'Anchor & Oak summer menu — promoted across 15 metros',\n brief:\n 'Regional restaurant chain promoting a new menu launch across 15 metro areas. ' +\n 'Need geo-targeted mobile and display ads within 5-mile radius of each location. ' +\n 'Audio/podcast ads are also interesting if available. ' +\n 'Performance tracking: need foot traffic attribution or store visit metrics.',\n budget: { amount: 75_000, currency: 'USD' },\n channels: ['display', 'audio'],\n};\n\n/**\n * All shipped personas, in stable order. Adopters iterate this array\n * to run a scenario across every canonical buyer in one loop.\n *\n * @public\n */\nexport const ALL_PERSONAS: readonly BuyerPersona[] = [\n dtcSkincareBuyer,\n luxuryAutoBuyer,\n b2bSaasBuyer,\n restaurantLocalBuyer,\n];\n\n/**\n * Look up a persona by `id`. Returns `undefined` for unknown IDs —\n * test code asserting on a specific persona should narrow with a\n * non-null check.\n *\n * @public\n */\nexport function getPersonaById(id: string): BuyerPersona | undefined {\n return ALL_PERSONAS.find(p => p.id === id);\n}\n\n// ---------------------------------------------------------------------------\n// Wire-shape builders\n// ---------------------------------------------------------------------------\n\n/**\n * Build an {@link AccountReference} pointing at the persona's account.\n * Discriminated-union narrowing concern: the wire shape allows\n * `account_id`, `brand`, or `brand + operator`. This builder always\n * returns the `account_id` arm — adopters who need the brand-arm shape\n * should compose `buildBrandReference(persona)` with their own operator.\n *\n * @public\n */\nexport function buildAccountReference(persona: BuyerPersona): AccountReference {\n return { account_id: persona.account_id };\n}\n\n/**\n * Build a {@link BrandReference} from the persona's brand identity.\n * Domain is the canonical field; name is dropped (the wire spec doesn't\n * carry it on `BrandReference` — sellers resolve via brand.json).\n *\n * @public\n */\nexport function buildBrandReference(persona: BuyerPersona): BrandReference {\n return { domain: persona.brand.domain };\n}\n\n/**\n * Build a wire-shaped {@link GetProductsRequest} keyed to this persona —\n * `buying_mode: 'brief'`, the persona's `brief` text, brand reference,\n * and account reference. Pass `overrides` to add `filters`,\n * `preferred_delivery_types`, `time_budget`, etc.\n *\n * @public\n */\nexport function buildGetProductsRequest(\n persona: BuyerPersona,\n overrides?: Partial<GetProductsRequest>\n): GetProductsRequest {\n return {\n buying_mode: 'brief',\n brief: persona.brief,\n brand: buildBrandReference(persona),\n account: buildAccountReference(persona),\n ...overrides,\n };\n}\n"],"mappings":"AAwEO,MAAM,mBAAiC;AAAA,EAC5C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO,EAAE,QAAQ,uBAAuB,MAAM,WAAW;AAAA,EACzD,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,OACE;AAAA,EAIF,QAAQ,EAAE,QAAQ,KAAQ,UAAU,MAAM;AAAA,EAC1C,UAAU,CAAC,UAAU,SAAS;AAChC;AASO,MAAM,kBAAgC;AAAA,EAC3C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO,EAAE,QAAQ,4BAA4B,MAAM,gBAAgB;AAAA,EACnE,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,OACE;AAAA,EAKF,QAAQ,EAAE,QAAQ,KAAS,UAAU,MAAM;AAAA,EAC3C,UAAU,CAAC,OAAO,OAAO,SAAS;AACpC;AASO,MAAM,eAA6B;AAAA,EACxC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO,EAAE,QAAQ,0BAA0B,MAAM,aAAa;AAAA,EAC9D,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,OACE;AAAA,EAIF,QAAQ,EAAE,QAAQ,KAAS,UAAU,MAAM;AAAA,EAC3C,UAAU,CAAC,WAAW,KAAK;AAC7B;AASO,MAAM,uBAAqC;AAAA,EAChD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO,EAAE,QAAQ,4BAA4B,MAAM,eAAe;AAAA,EAClE,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,OACE;AAAA,EAIF,QAAQ,EAAE,QAAQ,MAAQ,UAAU,MAAM;AAAA,EAC1C,UAAU,CAAC,WAAW,OAAO;AAC/B;AAQO,MAAM,eAAwC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASO,SAAS,eAAe,IAAsC;AACnE,SAAO,aAAa,KAAK,OAAK,EAAE,OAAO,EAAE;AAC3C;AAeO,SAAS,sBAAsB,SAAyC;AAC7E,SAAO,EAAE,YAAY,QAAQ,WAAW;AAC1C;AASO,SAAS,oBAAoB,SAAuC;AACzE,SAAO,EAAE,QAAQ,QAAQ,MAAM,OAAO;AACxC;AAUO,SAAS,wBACd,SACA,WACoB;AACpB,SAAO;AAAA,IACL,aAAa;AAAA,IACb,OAAO,QAAQ;AAAA,IACf,OAAO,oBAAoB,OAAO;AAAA,IAClC,SAAS,sBAAsB,OAAO;AAAA,IACtC,GAAG;AAAA,EACL;AACF;","names":[]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import { getOrCreateClient, runStep, getOrDiscoverProfile } from "../client.mjs";
8
2
  import { BRAND_RIGHTS_TOOLS } from "../../utils/capabilities.mjs";
9
3
  async function testBrandRightsFlow(agentUrl, options) {
@@ -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.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,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import { getOrCreateClient, runStep, getOrDiscoverProfile } from "../client.mjs";
8
2
  import {
9
3
  buildSyntheticCapabilities,