@adcp/sdk 12.0.0 → 12.0.1

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 (942) 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.mjs +0 -6
  174. package/dist/lib/index.mjs.map +1 -1
  175. package/dist/lib/media-buy/available-actions.mjs +0 -6
  176. package/dist/lib/media-buy/available-actions.mjs.map +1 -1
  177. package/dist/lib/media-buy/index.mjs +0 -6
  178. package/dist/lib/media-buy/index.mjs.map +1 -1
  179. package/dist/lib/media-buy/preflight.mjs +0 -6
  180. package/dist/lib/media-buy/preflight.mjs.map +1 -1
  181. package/dist/lib/media-buy/property-policy.mjs +0 -6
  182. package/dist/lib/media-buy/property-policy.mjs.map +1 -1
  183. package/dist/lib/media-buy/types.mjs +0 -6
  184. package/dist/lib/media-buy/types.mjs.map +1 -1
  185. package/dist/lib/media-buy/update-fields.generated.mjs +0 -6
  186. package/dist/lib/media-buy/update-fields.generated.mjs.map +1 -1
  187. package/dist/lib/mock-server/creative-ad-server/seed-data.mjs +0 -6
  188. package/dist/lib/mock-server/creative-ad-server/seed-data.mjs.map +1 -1
  189. package/dist/lib/mock-server/creative-ad-server/server.mjs +0 -6
  190. package/dist/lib/mock-server/creative-ad-server/server.mjs.map +1 -1
  191. package/dist/lib/mock-server/creative-template/seed-data.mjs +0 -6
  192. package/dist/lib/mock-server/creative-template/seed-data.mjs.map +1 -1
  193. package/dist/lib/mock-server/creative-template/server.mjs +0 -6
  194. package/dist/lib/mock-server/creative-template/server.mjs.map +1 -1
  195. package/dist/lib/mock-server/index.mjs +0 -6
  196. package/dist/lib/mock-server/index.mjs.map +1 -1
  197. package/dist/lib/mock-server/sales-guaranteed/recipe.mjs +0 -6
  198. package/dist/lib/mock-server/sales-guaranteed/recipe.mjs.map +1 -1
  199. package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs +0 -6
  200. package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs.map +1 -1
  201. package/dist/lib/mock-server/sales-guaranteed/server.mjs +0 -6
  202. package/dist/lib/mock-server/sales-guaranteed/server.mjs.map +1 -1
  203. package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs +0 -6
  204. package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs.map +1 -1
  205. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs +0 -6
  206. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs.map +1 -1
  207. package/dist/lib/mock-server/sales-non-guaranteed/server.mjs +0 -6
  208. package/dist/lib/mock-server/sales-non-guaranteed/server.mjs.map +1 -1
  209. package/dist/lib/mock-server/sales-social/seed-data.mjs +0 -6
  210. package/dist/lib/mock-server/sales-social/seed-data.mjs.map +1 -1
  211. package/dist/lib/mock-server/sales-social/server.mjs +0 -6
  212. package/dist/lib/mock-server/sales-social/server.mjs.map +1 -1
  213. package/dist/lib/mock-server/scenario.mjs +0 -6
  214. package/dist/lib/mock-server/scenario.mjs.map +1 -1
  215. package/dist/lib/mock-server/signal-marketplace/seed-data.mjs +0 -6
  216. package/dist/lib/mock-server/signal-marketplace/seed-data.mjs.map +1 -1
  217. package/dist/lib/mock-server/signal-marketplace/server.mjs +0 -6
  218. package/dist/lib/mock-server/signal-marketplace/server.mjs.map +1 -1
  219. package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs +0 -6
  220. package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs.map +1 -1
  221. package/dist/lib/mock-server/sponsored-intelligence/server.mjs +0 -6
  222. package/dist/lib/mock-server/sponsored-intelligence/server.mjs.map +1 -1
  223. package/dist/lib/net/address-guards.mjs +0 -6
  224. package/dist/lib/net/address-guards.mjs.map +1 -1
  225. package/dist/lib/net/index.mjs +0 -6
  226. package/dist/lib/net/index.mjs.map +1 -1
  227. package/dist/lib/net/ssrf-fetch.mjs +0 -6
  228. package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
  229. package/dist/lib/observability/index.mjs +0 -6
  230. package/dist/lib/observability/index.mjs.map +1 -1
  231. package/dist/lib/observability/tracing.mjs +6 -7
  232. package/dist/lib/observability/tracing.mjs.map +1 -1
  233. package/dist/lib/protocols/a2a.mjs +0 -6
  234. package/dist/lib/protocols/a2a.mjs.map +1 -1
  235. package/dist/lib/protocols/abort.mjs +0 -6
  236. package/dist/lib/protocols/abort.mjs.map +1 -1
  237. package/dist/lib/protocols/index.mjs +0 -6
  238. package/dist/lib/protocols/index.mjs.map +1 -1
  239. package/dist/lib/protocols/mcp-modern.mjs +0 -6
  240. package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
  241. package/dist/lib/protocols/mcp-tasks.mjs +0 -6
  242. package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
  243. package/dist/lib/protocols/mcp.mjs +0 -6
  244. package/dist/lib/protocols/mcp.mjs.map +1 -1
  245. package/dist/lib/protocols/rawResponseCapture.mjs +0 -6
  246. package/dist/lib/protocols/rawResponseCapture.mjs.map +1 -1
  247. package/dist/lib/protocols/responseSizeLimit.mjs +0 -6
  248. package/dist/lib/protocols/responseSizeLimit.mjs.map +1 -1
  249. package/dist/lib/protocols/transportDiagnostics.mjs +0 -6
  250. package/dist/lib/protocols/transportDiagnostics.mjs.map +1 -1
  251. package/dist/lib/registry/cursor-store.mjs +0 -6
  252. package/dist/lib/registry/cursor-store.mjs.map +1 -1
  253. package/dist/lib/registry/feed-stream.mjs +0 -6
  254. package/dist/lib/registry/feed-stream.mjs.map +1 -1
  255. package/dist/lib/registry/index.mjs +0 -6
  256. package/dist/lib/registry/index.mjs.map +1 -1
  257. package/dist/lib/registry/property-registry.mjs +0 -6
  258. package/dist/lib/registry/property-registry.mjs.map +1 -1
  259. package/dist/lib/registry/sync.mjs +0 -6
  260. package/dist/lib/registry/sync.mjs.map +1 -1
  261. package/dist/lib/registry/types.generated.mjs +0 -6
  262. package/dist/lib/registry/types.mjs +0 -6
  263. package/dist/lib/schemas/index.mjs +0 -6
  264. package/dist/lib/schemas/index.mjs.map +1 -1
  265. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  266. package/dist/lib/server/a2a-adapter.mjs +0 -6
  267. package/dist/lib/server/a2a-adapter.mjs.map +1 -1
  268. package/dist/lib/server/account-mode.mjs +0 -6
  269. package/dist/lib/server/account-mode.mjs.map +1 -1
  270. package/dist/lib/server/adcp-server.mjs +0 -6
  271. package/dist/lib/server/adcp-server.mjs.map +1 -1
  272. package/dist/lib/server/auth-introspection.mjs +0 -6
  273. package/dist/lib/server/auth-introspection.mjs.map +1 -1
  274. package/dist/lib/server/auth-signature.mjs +0 -6
  275. package/dist/lib/server/auth-signature.mjs.map +1 -1
  276. package/dist/lib/server/auth.mjs +0 -6
  277. package/dist/lib/server/auth.mjs.map +1 -1
  278. package/dist/lib/server/create-adcp-server.mjs +0 -6
  279. package/dist/lib/server/create-adcp-server.mjs.map +1 -1
  280. package/dist/lib/server/credential-policy.mjs +0 -6
  281. package/dist/lib/server/credential-policy.mjs.map +1 -1
  282. package/dist/lib/server/ctx-metadata/backends/memory.mjs +0 -6
  283. package/dist/lib/server/ctx-metadata/backends/memory.mjs.map +1 -1
  284. package/dist/lib/server/ctx-metadata/backends/pg.mjs +0 -6
  285. package/dist/lib/server/ctx-metadata/backends/pg.mjs.map +1 -1
  286. package/dist/lib/server/ctx-metadata/backends/redis.mjs +0 -6
  287. package/dist/lib/server/ctx-metadata/backends/redis.mjs.map +1 -1
  288. package/dist/lib/server/ctx-metadata/index.mjs +0 -6
  289. package/dist/lib/server/ctx-metadata/index.mjs.map +1 -1
  290. package/dist/lib/server/ctx-metadata/store.mjs +0 -6
  291. package/dist/lib/server/ctx-metadata/store.mjs.map +1 -1
  292. package/dist/lib/server/ctx-metadata/wire-shape.mjs +0 -6
  293. package/dist/lib/server/ctx-metadata/wire-shape.mjs.map +1 -1
  294. package/dist/lib/server/decisioning/account.mjs +0 -6
  295. package/dist/lib/server/decisioning/account.mjs.map +1 -1
  296. package/dist/lib/server/decisioning/admin-router.mjs +0 -6
  297. package/dist/lib/server/decisioning/admin-router.mjs.map +1 -1
  298. package/dist/lib/server/decisioning/assembly-helpers.mjs +0 -6
  299. package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
  300. package/dist/lib/server/decisioning/async-outcome.mjs +0 -6
  301. package/dist/lib/server/decisioning/async-outcome.mjs.map +1 -1
  302. package/dist/lib/server/decisioning/buyer-agent.mjs +0 -6
  303. package/dist/lib/server/decisioning/buyer-agent.mjs.map +1 -1
  304. package/dist/lib/server/decisioning/capabilities.mjs +0 -6
  305. package/dist/lib/server/decisioning/capabilities.mjs.map +1 -1
  306. package/dist/lib/server/decisioning/compose.mjs +0 -6
  307. package/dist/lib/server/decisioning/compose.mjs.map +1 -1
  308. package/dist/lib/server/decisioning/context.mjs +0 -6
  309. package/dist/lib/server/decisioning/errors-typed.mjs +0 -6
  310. package/dist/lib/server/decisioning/errors-typed.mjs.map +1 -1
  311. package/dist/lib/server/decisioning/helpers.mjs +0 -6
  312. package/dist/lib/server/decisioning/helpers.mjs.map +1 -1
  313. package/dist/lib/server/decisioning/index.mjs +0 -6
  314. package/dist/lib/server/decisioning/index.mjs.map +1 -1
  315. package/dist/lib/server/decisioning/list-helpers.mjs +0 -6
  316. package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
  317. package/dist/lib/server/decisioning/manifest-helpers.mjs +0 -6
  318. package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
  319. package/dist/lib/server/decisioning/pagination.mjs +0 -6
  320. package/dist/lib/server/decisioning/platform-helpers.mjs +0 -6
  321. package/dist/lib/server/decisioning/platform-helpers.mjs.map +1 -1
  322. package/dist/lib/server/decisioning/platform.mjs +0 -6
  323. package/dist/lib/server/decisioning/proposal/dispatch.mjs +0 -6
  324. package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
  325. package/dist/lib/server/decisioning/proposal/index.mjs +0 -6
  326. package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
  327. package/dist/lib/server/decisioning/proposal/lifecycle.mjs +0 -6
  328. package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
  329. package/dist/lib/server/decisioning/proposal/mock-manager.mjs +0 -6
  330. package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
  331. package/dist/lib/server/decisioning/proposal/store.mjs +0 -6
  332. package/dist/lib/server/decisioning/proposal/store.mjs.map +1 -1
  333. package/dist/lib/server/decisioning/proposal/types.mjs +0 -6
  334. package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
  335. package/dist/lib/server/decisioning/resolve-presets.mjs +0 -6
  336. package/dist/lib/server/decisioning/resolve-presets.mjs.map +1 -1
  337. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs +0 -6
  338. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
  339. package/dist/lib/server/decisioning/runtime/from-platform.mjs +0 -6
  340. package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
  341. package/dist/lib/server/decisioning/runtime/observed-modes.mjs +0 -6
  342. package/dist/lib/server/decisioning/runtime/observed-modes.mjs.map +1 -1
  343. package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs +0 -6
  344. package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs.map +1 -1
  345. package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs +0 -6
  346. package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs.map +1 -1
  347. package/dist/lib/server/decisioning/runtime/task-registry.mjs +0 -6
  348. package/dist/lib/server/decisioning/runtime/task-registry.mjs.map +1 -1
  349. package/dist/lib/server/decisioning/runtime/to-context.mjs +0 -6
  350. package/dist/lib/server/decisioning/runtime/to-context.mjs.map +1 -1
  351. package/dist/lib/server/decisioning/runtime/validate-platform.mjs +0 -6
  352. package/dist/lib/server/decisioning/runtime/validate-platform.mjs.map +1 -1
  353. package/dist/lib/server/decisioning/specialisms/audiences.mjs +0 -6
  354. package/dist/lib/server/decisioning/specialisms/brand-rights.mjs +0 -6
  355. package/dist/lib/server/decisioning/specialisms/campaign-governance.mjs +0 -6
  356. package/dist/lib/server/decisioning/specialisms/content-standards.mjs +0 -6
  357. package/dist/lib/server/decisioning/specialisms/creative-ad-server.mjs +0 -6
  358. package/dist/lib/server/decisioning/specialisms/creative.mjs +0 -6
  359. package/dist/lib/server/decisioning/specialisms/lists.mjs +0 -6
  360. package/dist/lib/server/decisioning/specialisms/sales.mjs +0 -6
  361. package/dist/lib/server/decisioning/specialisms/signals.mjs +0 -6
  362. package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.mjs +0 -6
  363. package/dist/lib/server/decisioning/start-time.mjs +0 -6
  364. package/dist/lib/server/decisioning/start-time.mjs.map +1 -1
  365. package/dist/lib/server/decisioning/status-changes.mjs +0 -6
  366. package/dist/lib/server/decisioning/status-changes.mjs.map +1 -1
  367. package/dist/lib/server/decisioning/status-mappers.mjs +0 -6
  368. package/dist/lib/server/decisioning/status-mappers.mjs.map +1 -1
  369. package/dist/lib/server/decisioning/tenant-registry.mjs +0 -6
  370. package/dist/lib/server/decisioning/tenant-registry.mjs.map +1 -1
  371. package/dist/lib/server/decisioning/tenant-store.mjs +0 -6
  372. package/dist/lib/server/decisioning/tenant-store.mjs.map +1 -1
  373. package/dist/lib/server/decisioning/validate-specialisms.mjs +0 -6
  374. package/dist/lib/server/decisioning/validate-specialisms.mjs.map +1 -1
  375. package/dist/lib/server/dynamic-registry.mjs +0 -6
  376. package/dist/lib/server/dynamic-registry.mjs.map +1 -1
  377. package/dist/lib/server/envelope-allowlist.mjs +0 -6
  378. package/dist/lib/server/envelope-allowlist.mjs.map +1 -1
  379. package/dist/lib/server/error-arm-tools.mjs +5 -6
  380. package/dist/lib/server/error-arm-tools.mjs.map +1 -1
  381. package/dist/lib/server/errors.mjs +0 -6
  382. package/dist/lib/server/errors.mjs.map +1 -1
  383. package/dist/lib/server/example-tld-guard.mjs +0 -6
  384. package/dist/lib/server/example-tld-guard.mjs.map +1 -1
  385. package/dist/lib/server/express-adapter.mjs +0 -6
  386. package/dist/lib/server/express-adapter.mjs.map +1 -1
  387. package/dist/lib/server/governance.mjs +0 -6
  388. package/dist/lib/server/governance.mjs.map +1 -1
  389. package/dist/lib/server/idempotency/backends/lazy.mjs +0 -6
  390. package/dist/lib/server/idempotency/backends/lazy.mjs.map +1 -1
  391. package/dist/lib/server/idempotency/backends/memory.mjs +0 -6
  392. package/dist/lib/server/idempotency/backends/memory.mjs.map +1 -1
  393. package/dist/lib/server/idempotency/backends/pg.mjs +0 -6
  394. package/dist/lib/server/idempotency/backends/pg.mjs.map +1 -1
  395. package/dist/lib/server/idempotency/backends/redis.mjs +0 -6
  396. package/dist/lib/server/idempotency/backends/redis.mjs.map +1 -1
  397. package/dist/lib/server/idempotency/index.mjs +0 -6
  398. package/dist/lib/server/idempotency/index.mjs.map +1 -1
  399. package/dist/lib/server/idempotency/store.mjs +0 -6
  400. package/dist/lib/server/idempotency/store.mjs.map +1 -1
  401. package/dist/lib/server/index.mjs +0 -6
  402. package/dist/lib/server/index.mjs.map +1 -1
  403. package/dist/lib/server/legacy/v5/index.mjs +0 -6
  404. package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
  405. package/dist/lib/server/mcp-modern-server.mjs +0 -6
  406. package/dist/lib/server/mcp-modern-server.mjs.map +1 -1
  407. package/dist/lib/server/media-buy-actions.mjs +0 -6
  408. package/dist/lib/server/media-buy-actions.mjs.map +1 -1
  409. package/dist/lib/server/media-buy-helpers.mjs +0 -6
  410. package/dist/lib/server/media-buy-helpers.mjs.map +1 -1
  411. package/dist/lib/server/media-buy-store.mjs +0 -6
  412. package/dist/lib/server/media-buy-store.mjs.map +1 -1
  413. package/dist/lib/server/normalize-errors.mjs +0 -6
  414. package/dist/lib/server/normalize-errors.mjs.map +1 -1
  415. package/dist/lib/server/operational-platform.mjs +0 -6
  416. package/dist/lib/server/operational-platform.mjs.map +1 -1
  417. package/dist/lib/server/pick-safe-details.mjs +0 -6
  418. package/dist/lib/server/pick-safe-details.mjs.map +1 -1
  419. package/dist/lib/server/pin-and-bind-fetch.mjs +0 -6
  420. package/dist/lib/server/pin-and-bind-fetch.mjs.map +1 -1
  421. package/dist/lib/server/postgres-state-store.mjs +0 -6
  422. package/dist/lib/server/postgres-state-store.mjs.map +1 -1
  423. package/dist/lib/server/postgres-task-store.mjs +0 -6
  424. package/dist/lib/server/postgres-task-store.mjs.map +1 -1
  425. package/dist/lib/server/product-defaults.mjs +0 -6
  426. package/dist/lib/server/product-defaults.mjs.map +1 -1
  427. package/dist/lib/server/redact.mjs +0 -6
  428. package/dist/lib/server/redact.mjs.map +1 -1
  429. package/dist/lib/server/responses.mjs +0 -6
  430. package/dist/lib/server/responses.mjs.map +1 -1
  431. package/dist/lib/server/serve.mjs +0 -6
  432. package/dist/lib/server/serve.mjs.map +1 -1
  433. package/dist/lib/server/socket-mode/conformance-client.mjs +0 -6
  434. package/dist/lib/server/socket-mode/conformance-client.mjs.map +1 -1
  435. package/dist/lib/server/socket-mode/index.mjs +0 -6
  436. package/dist/lib/server/socket-mode/index.mjs.map +1 -1
  437. package/dist/lib/server/socket-mode/ws-transport.mjs +0 -6
  438. package/dist/lib/server/socket-mode/ws-transport.mjs.map +1 -1
  439. package/dist/lib/server/state-machine.mjs +0 -6
  440. package/dist/lib/server/state-machine.mjs.map +1 -1
  441. package/dist/lib/server/state-store.mjs +0 -6
  442. package/dist/lib/server/state-store.mjs.map +1 -1
  443. package/dist/lib/server/structured-serialize.mjs +0 -6
  444. package/dist/lib/server/structured-serialize.mjs.map +1 -1
  445. package/dist/lib/server/targeting-helpers.mjs +0 -6
  446. package/dist/lib/server/targeting-helpers.mjs.map +1 -1
  447. package/dist/lib/server/tasks.mjs +0 -6
  448. package/dist/lib/server/tasks.mjs.map +1 -1
  449. package/dist/lib/server/test-controller-bridge.mjs +0 -6
  450. package/dist/lib/server/test-controller-bridge.mjs.map +1 -1
  451. package/dist/lib/server/test-controller.mjs +0 -6
  452. package/dist/lib/server/test-controller.mjs.map +1 -1
  453. package/dist/lib/server/upstream-helpers.mjs +0 -6
  454. package/dist/lib/server/upstream-helpers.mjs.map +1 -1
  455. package/dist/lib/server/webhook-emitter.mjs +0 -6
  456. package/dist/lib/server/webhook-emitter.mjs.map +1 -1
  457. package/dist/lib/server/wire-safe.mjs +0 -6
  458. package/dist/lib/server/wire-safe.mjs.map +1 -1
  459. package/dist/lib/server/wire-spec-fields.generated.mjs +0 -6
  460. package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
  461. package/dist/lib/server/wrap-envelope.mjs +0 -6
  462. package/dist/lib/server/wrap-envelope.mjs.map +1 -1
  463. package/dist/lib/signing/agent-context.mjs +0 -6
  464. package/dist/lib/signing/agent-context.mjs.map +1 -1
  465. package/dist/lib/signing/agent-fetch.mjs +0 -6
  466. package/dist/lib/signing/agent-fetch.mjs.map +1 -1
  467. package/dist/lib/signing/agent-resolver/canonicalize.mjs +0 -6
  468. package/dist/lib/signing/agent-resolver/canonicalize.mjs.map +1 -1
  469. package/dist/lib/signing/agent-resolver/capabilities-types.mjs +0 -6
  470. package/dist/lib/signing/agent-resolver/capabilities-types.mjs.map +1 -1
  471. package/dist/lib/signing/agent-resolver/consistency.mjs +0 -6
  472. package/dist/lib/signing/agent-resolver/consistency.mjs.map +1 -1
  473. package/dist/lib/signing/agent-resolver/errors.mjs +0 -6
  474. package/dist/lib/signing/agent-resolver/errors.mjs.map +1 -1
  475. package/dist/lib/signing/agent-resolver/etld.mjs +0 -6
  476. package/dist/lib/signing/agent-resolver/etld.mjs.map +1 -1
  477. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs +0 -6
  478. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs.map +1 -1
  479. package/dist/lib/signing/agent-resolver/index.mjs +0 -6
  480. package/dist/lib/signing/agent-resolver/index.mjs.map +1 -1
  481. package/dist/lib/signing/agent-resolver/jwks-set.mjs +0 -6
  482. package/dist/lib/signing/agent-resolver/jwks-set.mjs.map +1 -1
  483. package/dist/lib/signing/agent-resolver/resolve-agent.mjs +0 -6
  484. package/dist/lib/signing/agent-resolver/resolve-agent.mjs.map +1 -1
  485. package/dist/lib/signing/agent-resolver/select-agent.mjs +0 -6
  486. package/dist/lib/signing/agent-resolver/select-agent.mjs.map +1 -1
  487. package/dist/lib/signing/agent-resolver/strict-json.mjs +0 -6
  488. package/dist/lib/signing/agent-resolver/strict-json.mjs.map +1 -1
  489. package/dist/lib/signing/brand-jwks.mjs +0 -6
  490. package/dist/lib/signing/brand-jwks.mjs.map +1 -1
  491. package/dist/lib/signing/canonicalize.mjs +0 -6
  492. package/dist/lib/signing/canonicalize.mjs.map +1 -1
  493. package/dist/lib/signing/capability-cache.mjs +0 -6
  494. package/dist/lib/signing/capability-cache.mjs.map +1 -1
  495. package/dist/lib/signing/capability-priming.mjs +0 -6
  496. package/dist/lib/signing/capability-priming.mjs.map +1 -1
  497. package/dist/lib/signing/client.mjs +0 -6
  498. package/dist/lib/signing/client.mjs.map +1 -1
  499. package/dist/lib/signing/content-digest.mjs +0 -6
  500. package/dist/lib/signing/content-digest.mjs.map +1 -1
  501. package/dist/lib/signing/crypto.mjs +0 -6
  502. package/dist/lib/signing/crypto.mjs.map +1 -1
  503. package/dist/lib/signing/ecdsa-encoding.mjs +0 -6
  504. package/dist/lib/signing/ecdsa-encoding.mjs.map +1 -1
  505. package/dist/lib/signing/errors.mjs +0 -6
  506. package/dist/lib/signing/errors.mjs.map +1 -1
  507. package/dist/lib/signing/fetch-async.mjs +0 -6
  508. package/dist/lib/signing/fetch-async.mjs.map +1 -1
  509. package/dist/lib/signing/fetch.mjs +0 -6
  510. package/dist/lib/signing/fetch.mjs.map +1 -1
  511. package/dist/lib/signing/index.mjs +0 -6
  512. package/dist/lib/signing/index.mjs.map +1 -1
  513. package/dist/lib/signing/jwks-helpers.mjs +0 -6
  514. package/dist/lib/signing/jwks-helpers.mjs.map +1 -1
  515. package/dist/lib/signing/jwks-https.mjs +0 -6
  516. package/dist/lib/signing/jwks-https.mjs.map +1 -1
  517. package/dist/lib/signing/jwks.mjs +0 -6
  518. package/dist/lib/signing/jwks.mjs.map +1 -1
  519. package/dist/lib/signing/middleware.mjs +0 -6
  520. package/dist/lib/signing/middleware.mjs.map +1 -1
  521. package/dist/lib/signing/parser.mjs +0 -6
  522. package/dist/lib/signing/parser.mjs.map +1 -1
  523. package/dist/lib/signing/postgres-replay-store.mjs +0 -6
  524. package/dist/lib/signing/postgres-replay-store.mjs.map +1 -1
  525. package/dist/lib/signing/protocol-response.mjs +0 -6
  526. package/dist/lib/signing/protocol-response.mjs.map +1 -1
  527. package/dist/lib/signing/provider.mjs +0 -6
  528. package/dist/lib/signing/redis-replay-store.mjs +0 -6
  529. package/dist/lib/signing/redis-replay-store.mjs.map +1 -1
  530. package/dist/lib/signing/replay.mjs +0 -6
  531. package/dist/lib/signing/replay.mjs.map +1 -1
  532. package/dist/lib/signing/request-context.mjs +0 -6
  533. package/dist/lib/signing/request-context.mjs.map +1 -1
  534. package/dist/lib/signing/revocation-https.mjs +0 -6
  535. package/dist/lib/signing/revocation-https.mjs.map +1 -1
  536. package/dist/lib/signing/revocation.mjs +0 -6
  537. package/dist/lib/signing/revocation.mjs.map +1 -1
  538. package/dist/lib/signing/server.mjs +0 -6
  539. package/dist/lib/signing/server.mjs.map +1 -1
  540. package/dist/lib/signing/signer-async.mjs +0 -6
  541. package/dist/lib/signing/signer-async.mjs.map +1 -1
  542. package/dist/lib/signing/signer.mjs +0 -6
  543. package/dist/lib/signing/signer.mjs.map +1 -1
  544. package/dist/lib/signing/testing.mjs +0 -6
  545. package/dist/lib/signing/testing.mjs.map +1 -1
  546. package/dist/lib/signing/types.mjs +0 -6
  547. package/dist/lib/signing/types.mjs.map +1 -1
  548. package/dist/lib/signing/verifier.mjs +0 -6
  549. package/dist/lib/signing/verifier.mjs.map +1 -1
  550. package/dist/lib/signing/webhook-auth-detection.mjs +0 -6
  551. package/dist/lib/signing/webhook-auth-detection.mjs.map +1 -1
  552. package/dist/lib/signing/webhook-verifier.mjs +0 -6
  553. package/dist/lib/signing/webhook-verifier.mjs.map +1 -1
  554. package/dist/lib/storage/MemoryStorage.mjs +0 -6
  555. package/dist/lib/storage/MemoryStorage.mjs.map +1 -1
  556. package/dist/lib/storage/interfaces.mjs +0 -6
  557. package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs +0 -6
  558. package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs.map +1 -1
  559. package/dist/lib/substitution/encoder/index.mjs +0 -6
  560. package/dist/lib/substitution/encoder/index.mjs.map +1 -1
  561. package/dist/lib/substitution/index.mjs +0 -6
  562. package/dist/lib/substitution/index.mjs.map +1 -1
  563. package/dist/lib/substitution/observer/SubstitutionObserver.mjs +0 -6
  564. package/dist/lib/substitution/observer/SubstitutionObserver.mjs.map +1 -1
  565. package/dist/lib/substitution/observer/alignment.mjs +0 -6
  566. package/dist/lib/substitution/observer/alignment.mjs.map +1 -1
  567. package/dist/lib/substitution/observer/assertions.mjs +0 -6
  568. package/dist/lib/substitution/observer/assertions.mjs.map +1 -1
  569. package/dist/lib/substitution/observer/html-parser.mjs +0 -6
  570. package/dist/lib/substitution/observer/html-parser.mjs.map +1 -1
  571. package/dist/lib/substitution/observer/index.mjs +0 -6
  572. package/dist/lib/substitution/observer/index.mjs.map +1 -1
  573. package/dist/lib/substitution/observer/ssrf.mjs +0 -6
  574. package/dist/lib/substitution/observer/ssrf.mjs.map +1 -1
  575. package/dist/lib/substitution/rfc3986.mjs +0 -6
  576. package/dist/lib/substitution/rfc3986.mjs.map +1 -1
  577. package/dist/lib/substitution/translate.mjs +0 -6
  578. package/dist/lib/substitution/translate.mjs.map +1 -1
  579. package/dist/lib/substitution/types.mjs +0 -6
  580. package/dist/lib/substitution/vectors.mjs +0 -6
  581. package/dist/lib/substitution/vectors.mjs.map +1 -1
  582. package/dist/lib/testing/agent-tester.mjs +0 -6
  583. package/dist/lib/testing/agent-tester.mjs.map +1 -1
  584. package/dist/lib/testing/client.mjs +0 -6
  585. package/dist/lib/testing/client.mjs.map +1 -1
  586. package/dist/lib/testing/compliance/briefs.mjs +0 -6
  587. package/dist/lib/testing/compliance/briefs.mjs.map +1 -1
  588. package/dist/lib/testing/compliance/comply.mjs +0 -6
  589. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  590. package/dist/lib/testing/compliance/index.mjs +0 -6
  591. package/dist/lib/testing/compliance/index.mjs.map +1 -1
  592. package/dist/lib/testing/compliance/spec-conformance.mjs +0 -6
  593. package/dist/lib/testing/compliance/spec-conformance.mjs.map +1 -1
  594. package/dist/lib/testing/compliance/storyboard-tracks.mjs +0 -6
  595. package/dist/lib/testing/compliance/storyboard-tracks.mjs.map +1 -1
  596. package/dist/lib/testing/compliance/summary.mjs +0 -6
  597. package/dist/lib/testing/compliance/summary.mjs.map +1 -1
  598. package/dist/lib/testing/compliance/types.mjs +0 -6
  599. package/dist/lib/testing/comply-controller.mjs +0 -6
  600. package/dist/lib/testing/comply-controller.mjs.map +1 -1
  601. package/dist/lib/testing/controller-assertions.mjs +0 -6
  602. package/dist/lib/testing/controller-assertions.mjs.map +1 -1
  603. package/dist/lib/testing/formatter.mjs +0 -6
  604. package/dist/lib/testing/formatter.mjs.map +1 -1
  605. package/dist/lib/testing/index.mjs +0 -6
  606. package/dist/lib/testing/index.mjs.map +1 -1
  607. package/dist/lib/testing/local-agent-runner.mjs +0 -6
  608. package/dist/lib/testing/local-agent-runner.mjs.map +1 -1
  609. package/dist/lib/testing/orchestrator.mjs +0 -6
  610. package/dist/lib/testing/orchestrator.mjs.map +1 -1
  611. package/dist/lib/testing/personas/index.mjs +0 -6
  612. package/dist/lib/testing/personas/index.mjs.map +1 -1
  613. package/dist/lib/testing/scenarios/brand-rights.mjs +0 -6
  614. package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
  615. package/dist/lib/testing/scenarios/capabilities.mjs +0 -6
  616. package/dist/lib/testing/scenarios/capabilities.mjs.map +1 -1
  617. package/dist/lib/testing/scenarios/creative.mjs +0 -6
  618. package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
  619. package/dist/lib/testing/scenarios/deterministic.mjs +0 -6
  620. package/dist/lib/testing/scenarios/deterministic.mjs.map +1 -1
  621. package/dist/lib/testing/scenarios/discovery.mjs +0 -6
  622. package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
  623. package/dist/lib/testing/scenarios/edge-cases.mjs +0 -6
  624. package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
  625. package/dist/lib/testing/scenarios/error-compliance.mjs +0 -6
  626. package/dist/lib/testing/scenarios/error-compliance.mjs.map +1 -1
  627. package/dist/lib/testing/scenarios/governance.mjs +0 -6
  628. package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
  629. package/dist/lib/testing/scenarios/health.mjs +0 -6
  630. package/dist/lib/testing/scenarios/health.mjs.map +1 -1
  631. package/dist/lib/testing/scenarios/index.mjs +0 -6
  632. package/dist/lib/testing/scenarios/index.mjs.map +1 -1
  633. package/dist/lib/testing/scenarios/media-buy.mjs +0 -6
  634. package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
  635. package/dist/lib/testing/scenarios/schema-compliance.mjs +0 -6
  636. package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
  637. package/dist/lib/testing/scenarios/signals.mjs +0 -6
  638. package/dist/lib/testing/scenarios/signals.mjs.map +1 -1
  639. package/dist/lib/testing/scenarios/sponsored-intelligence.mjs +0 -6
  640. package/dist/lib/testing/scenarios/sponsored-intelligence.mjs.map +1 -1
  641. package/dist/lib/testing/scenarios/trusted-match.mjs +0 -6
  642. package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
  643. package/dist/lib/testing/seed-merge.mjs +0 -6
  644. package/dist/lib/testing/seed-merge.mjs.map +1 -1
  645. package/dist/lib/testing/storyboard/agent-routing.mjs +0 -6
  646. package/dist/lib/testing/storyboard/agent-routing.mjs.map +1 -1
  647. package/dist/lib/testing/storyboard/assertions.mjs +0 -6
  648. package/dist/lib/testing/storyboard/assertions.mjs.map +1 -1
  649. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +0 -6
  650. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs.map +1 -1
  651. package/dist/lib/testing/storyboard/compliance.mjs +5 -6
  652. package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
  653. package/dist/lib/testing/storyboard/context.mjs +0 -6
  654. package/dist/lib/testing/storyboard/context.mjs.map +1 -1
  655. package/dist/lib/testing/storyboard/default-invariants.mjs +0 -6
  656. package/dist/lib/testing/storyboard/default-invariants.mjs.map +1 -1
  657. package/dist/lib/testing/storyboard/index.mjs +0 -6
  658. package/dist/lib/testing/storyboard/index.mjs.map +1 -1
  659. package/dist/lib/testing/storyboard/junit.mjs +0 -6
  660. package/dist/lib/testing/storyboard/junit.mjs.map +1 -1
  661. package/dist/lib/testing/storyboard/loader.mjs +0 -6
  662. package/dist/lib/testing/storyboard/loader.mjs.map +1 -1
  663. package/dist/lib/testing/storyboard/parallel-dispatch.mjs +0 -6
  664. package/dist/lib/testing/storyboard/parallel-dispatch.mjs.map +1 -1
  665. package/dist/lib/testing/storyboard/path.mjs +0 -6
  666. package/dist/lib/testing/storyboard/path.mjs.map +1 -1
  667. package/dist/lib/testing/storyboard/probes.mjs +0 -6
  668. package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
  669. package/dist/lib/testing/storyboard/rate-limit-trip.mjs +0 -6
  670. package/dist/lib/testing/storyboard/rate-limit-trip.mjs.map +1 -1
  671. package/dist/lib/testing/storyboard/rejection-hints.mjs +0 -6
  672. package/dist/lib/testing/storyboard/rejection-hints.mjs.map +1 -1
  673. package/dist/lib/testing/storyboard/request-builder.mjs +0 -6
  674. package/dist/lib/testing/storyboard/request-builder.mjs.map +1 -1
  675. package/dist/lib/testing/storyboard/request-signing/builder.mjs +0 -6
  676. package/dist/lib/testing/storyboard/request-signing/builder.mjs.map +1 -1
  677. package/dist/lib/testing/storyboard/request-signing/grader.mjs +0 -6
  678. package/dist/lib/testing/storyboard/request-signing/grader.mjs.map +1 -1
  679. package/dist/lib/testing/storyboard/request-signing/index.mjs +0 -6
  680. package/dist/lib/testing/storyboard/request-signing/index.mjs.map +1 -1
  681. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +0 -6
  682. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs.map +1 -1
  683. package/dist/lib/testing/storyboard/request-signing/probe.mjs +0 -6
  684. package/dist/lib/testing/storyboard/request-signing/probe.mjs.map +1 -1
  685. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs +0 -6
  686. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs.map +1 -1
  687. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs +0 -6
  688. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs.map +1 -1
  689. package/dist/lib/testing/storyboard/request-signing/types.mjs +0 -6
  690. package/dist/lib/testing/storyboard/request-signing/types.mjs.map +1 -1
  691. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +0 -6
  692. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
  693. package/dist/lib/testing/storyboard/runner.mjs +0 -6
  694. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  695. package/dist/lib/testing/storyboard/sandbox-entities.mjs +0 -6
  696. package/dist/lib/testing/storyboard/sandbox-entities.mjs.map +1 -1
  697. package/dist/lib/testing/storyboard/seeding.mjs +0 -6
  698. package/dist/lib/testing/storyboard/seeding.mjs.map +1 -1
  699. package/dist/lib/testing/storyboard/shape-drift-hints.mjs +0 -6
  700. package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
  701. package/dist/lib/testing/storyboard/signer-grader/grader.mjs +0 -6
  702. package/dist/lib/testing/storyboard/signer-grader/grader.mjs.map +1 -1
  703. package/dist/lib/testing/storyboard/signer-grader/index.mjs +0 -6
  704. package/dist/lib/testing/storyboard/signer-grader/index.mjs.map +1 -1
  705. package/dist/lib/testing/storyboard/signer-grader/types.mjs +0 -6
  706. package/dist/lib/testing/storyboard/strict-validation-hints.mjs +0 -6
  707. package/dist/lib/testing/storyboard/strict-validation-hints.mjs.map +1 -1
  708. package/dist/lib/testing/storyboard/task-map.mjs +0 -6
  709. package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
  710. package/dist/lib/testing/storyboard/test-kit.mjs +0 -6
  711. package/dist/lib/testing/storyboard/test-kit.mjs.map +1 -1
  712. package/dist/lib/testing/storyboard/types.mjs +0 -6
  713. package/dist/lib/testing/storyboard/types.mjs.map +1 -1
  714. package/dist/lib/testing/storyboard/validations.mjs +0 -6
  715. package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
  716. package/dist/lib/testing/storyboard/webhook-assertions.mjs +0 -6
  717. package/dist/lib/testing/storyboard/webhook-assertions.mjs.map +1 -1
  718. package/dist/lib/testing/storyboard/webhook-receiver.mjs +0 -6
  719. package/dist/lib/testing/storyboard/webhook-receiver.mjs.map +1 -1
  720. package/dist/lib/testing/stubs/governance-agent-stub.mjs +0 -6
  721. package/dist/lib/testing/stubs/governance-agent-stub.mjs.map +1 -1
  722. package/dist/lib/testing/stubs/index.mjs +0 -6
  723. package/dist/lib/testing/stubs/index.mjs.map +1 -1
  724. package/dist/lib/testing/test-controller.mjs +0 -6
  725. package/dist/lib/testing/test-controller.mjs.map +1 -1
  726. package/dist/lib/testing/test-helpers.mjs +0 -6
  727. package/dist/lib/testing/test-helpers.mjs.map +1 -1
  728. package/dist/lib/testing/types.mjs +0 -6
  729. package/dist/lib/types/adcp.mjs +0 -6
  730. package/dist/lib/types/adcp.mjs.map +1 -1
  731. package/dist/lib/types/asset-instances.mjs +0 -6
  732. package/dist/lib/types/compat.mjs +0 -6
  733. package/dist/lib/types/compat.mjs.map +1 -1
  734. package/dist/lib/types/core.generated.mjs +0 -6
  735. package/dist/lib/types/enums.generated.mjs +0 -6
  736. package/dist/lib/types/enums.generated.mjs.map +1 -1
  737. package/dist/lib/types/error-codes.mjs +0 -6
  738. package/dist/lib/types/error-codes.mjs.map +1 -1
  739. package/dist/lib/types/error-details.aliases.mjs +0 -6
  740. package/dist/lib/types/error-details.aliases.mjs.map +1 -1
  741. package/dist/lib/types/format-asset-slots.mjs +0 -6
  742. package/dist/lib/types/forward-compat-error-codes.mjs +0 -6
  743. package/dist/lib/types/forward-compat-error-codes.mjs.map +1 -1
  744. package/dist/lib/types/index.mjs +0 -6
  745. package/dist/lib/types/index.mjs.map +1 -1
  746. package/dist/lib/types/inline-enums.aliases.mjs +0 -6
  747. package/dist/lib/types/inline-enums.aliases.mjs.map +1 -1
  748. package/dist/lib/types/inline-enums.generated.mjs +0 -6
  749. package/dist/lib/types/inline-enums.generated.mjs.map +1 -1
  750. package/dist/lib/types/manifest.generated.mjs +0 -6
  751. package/dist/lib/types/manifest.generated.mjs.map +1 -1
  752. package/dist/lib/types/schemas.generated.mjs +0 -6
  753. package/dist/lib/types/schemas.generated.mjs.map +1 -1
  754. package/dist/lib/types/server-payload-aliases.mjs +0 -6
  755. package/dist/lib/types/server-payload.mjs +0 -6
  756. package/dist/lib/types/sync-rows.mjs +0 -6
  757. package/dist/lib/types/tools.generated.mjs +0 -6
  758. package/dist/lib/types/v2-5/index.mjs +0 -6
  759. package/dist/lib/types/v2-5/index.mjs.map +1 -1
  760. package/dist/lib/types/v2-5/tools.generated.mjs +0 -6
  761. package/dist/lib/types/v3-1-beta/index.mjs +0 -6
  762. package/dist/lib/types/v3-1-beta/index.mjs.map +1 -1
  763. package/dist/lib/types/v3-1-beta/tools.generated.mjs +0 -6
  764. package/dist/lib/types/wellknown-schemas.generated.mjs +0 -6
  765. package/dist/lib/types/wellknown-schemas.generated.mjs.map +1 -1
  766. package/dist/lib/upstream-recorder/constants.mjs +0 -6
  767. package/dist/lib/upstream-recorder/constants.mjs.map +1 -1
  768. package/dist/lib/upstream-recorder/index.mjs +0 -6
  769. package/dist/lib/upstream-recorder/index.mjs.map +1 -1
  770. package/dist/lib/upstream-recorder/recorder.mjs +0 -6
  771. package/dist/lib/upstream-recorder/recorder.mjs.map +1 -1
  772. package/dist/lib/upstream-recorder/types.mjs +0 -6
  773. package/dist/lib/upstream-recorder/types.mjs.map +1 -1
  774. package/dist/lib/utils/a2a-artifacts.mjs +0 -6
  775. package/dist/lib/utils/a2a-artifacts.mjs.map +1 -1
  776. package/dist/lib/utils/a2a-discovery.mjs +0 -6
  777. package/dist/lib/utils/a2a-discovery.mjs.map +1 -1
  778. package/dist/lib/utils/activation-key-builders.mjs +0 -6
  779. package/dist/lib/utils/activation-key-builders.mjs.map +1 -1
  780. package/dist/lib/utils/adcp-version-config.mjs +0 -6
  781. package/dist/lib/utils/adcp-version-config.mjs.map +1 -1
  782. package/dist/lib/utils/asset-builders.mjs +0 -6
  783. package/dist/lib/utils/asset-builders.mjs.map +1 -1
  784. package/dist/lib/utils/build-creative-return-builders.mjs +0 -6
  785. package/dist/lib/utils/build-creative-return-builders.mjs.map +1 -1
  786. package/dist/lib/utils/buyer-retry-policy.mjs +0 -6
  787. package/dist/lib/utils/buyer-retry-policy.mjs.map +1 -1
  788. package/dist/lib/utils/capabilities.mjs +0 -6
  789. package/dist/lib/utils/capabilities.mjs.map +1 -1
  790. package/dist/lib/utils/capability-rollups.mjs +0 -6
  791. package/dist/lib/utils/capability-rollups.mjs.map +1 -1
  792. package/dist/lib/utils/creative-adapter.mjs +0 -6
  793. package/dist/lib/utils/creative-adapter.mjs.map +1 -1
  794. package/dist/lib/utils/creative-delivery.mjs +0 -6
  795. package/dist/lib/utils/creative-delivery.mjs.map +1 -1
  796. package/dist/lib/utils/deprecation.mjs +0 -6
  797. package/dist/lib/utils/deprecation.mjs.map +1 -1
  798. package/dist/lib/utils/envelope-status-compat.mjs +0 -6
  799. package/dist/lib/utils/envelope-status-compat.mjs.map +1 -1
  800. package/dist/lib/utils/error-extraction.mjs +0 -6
  801. package/dist/lib/utils/error-extraction.mjs.map +1 -1
  802. package/dist/lib/utils/extract-result.mjs +0 -6
  803. package/dist/lib/utils/extract-result.mjs.map +1 -1
  804. package/dist/lib/utils/format-asset-slot-builders.mjs +0 -6
  805. package/dist/lib/utils/format-asset-slot-builders.mjs.map +1 -1
  806. package/dist/lib/utils/format-assets.mjs +0 -6
  807. package/dist/lib/utils/format-assets.mjs.map +1 -1
  808. package/dist/lib/utils/format-render-builders.mjs +0 -6
  809. package/dist/lib/utils/format-render-builders.mjs.map +1 -1
  810. package/dist/lib/utils/format-renders.mjs +0 -6
  811. package/dist/lib/utils/format-renders.mjs.map +1 -1
  812. package/dist/lib/utils/get-products-cache-scope.mjs +0 -6
  813. package/dist/lib/utils/get-products-cache-scope.mjs.map +1 -1
  814. package/dist/lib/utils/glob.mjs +0 -6
  815. package/dist/lib/utils/glob.mjs.map +1 -1
  816. package/dist/lib/utils/global-async-local-storage.mjs +0 -6
  817. package/dist/lib/utils/global-async-local-storage.mjs.map +1 -1
  818. package/dist/lib/utils/idempotency.mjs +0 -6
  819. package/dist/lib/utils/idempotency.mjs.map +1 -1
  820. package/dist/lib/utils/index.mjs +0 -6
  821. package/dist/lib/utils/index.mjs.map +1 -1
  822. package/dist/lib/utils/jcs.mjs +0 -6
  823. package/dist/lib/utils/jcs.mjs.map +1 -1
  824. package/dist/lib/utils/json-depth.mjs +0 -6
  825. package/dist/lib/utils/json-depth.mjs.map +1 -1
  826. package/dist/lib/utils/logger.mjs +0 -6
  827. package/dist/lib/utils/logger.mjs.map +1 -1
  828. package/dist/lib/utils/media-buy-delivery-notification-builders.mjs +0 -6
  829. package/dist/lib/utils/media-buy-delivery-notification-builders.mjs.map +1 -1
  830. package/dist/lib/utils/media-buy-status.mjs +0 -6
  831. package/dist/lib/utils/media-buy-status.mjs.map +1 -1
  832. package/dist/lib/utils/pagination.mjs +0 -6
  833. package/dist/lib/utils/pagination.mjs.map +1 -1
  834. package/dist/lib/utils/preview-creative-builders.mjs +0 -6
  835. package/dist/lib/utils/preview-creative-builders.mjs.map +1 -1
  836. package/dist/lib/utils/preview-normalizer.mjs +0 -6
  837. package/dist/lib/utils/preview-normalizer.mjs.map +1 -1
  838. package/dist/lib/utils/preview-utils.mjs +0 -6
  839. package/dist/lib/utils/preview-utils.mjs.map +1 -1
  840. package/dist/lib/utils/pricing-adapter.mjs +0 -6
  841. package/dist/lib/utils/pricing-adapter.mjs.map +1 -1
  842. package/dist/lib/utils/probe-policy.mjs +0 -6
  843. package/dist/lib/utils/probe-policy.mjs.map +1 -1
  844. package/dist/lib/utils/protocol-detection.mjs +0 -6
  845. package/dist/lib/utils/protocol-detection.mjs.map +1 -1
  846. package/dist/lib/utils/redact-secrets.mjs +0 -6
  847. package/dist/lib/utils/redact-secrets.mjs.map +1 -1
  848. package/dist/lib/utils/redis-default-prefix-warn.mjs +0 -6
  849. package/dist/lib/utils/redis-default-prefix-warn.mjs.map +1 -1
  850. package/dist/lib/utils/render-builders.mjs +0 -6
  851. package/dist/lib/utils/render-builders.mjs.map +1 -1
  852. package/dist/lib/utils/request-normalizer.mjs +0 -6
  853. package/dist/lib/utils/request-normalizer.mjs.map +1 -1
  854. package/dist/lib/utils/response-schemas.mjs +0 -6
  855. package/dist/lib/utils/response-schemas.mjs.map +1 -1
  856. package/dist/lib/utils/response-unwrapper.mjs +0 -6
  857. package/dist/lib/utils/response-unwrapper.mjs.map +1 -1
  858. package/dist/lib/utils/retry.mjs +0 -6
  859. package/dist/lib/utils/retry.mjs.map +1 -1
  860. package/dist/lib/utils/signal-discovery-helpers.mjs +0 -6
  861. package/dist/lib/utils/signal-discovery-helpers.mjs.map +1 -1
  862. package/dist/lib/utils/signal-id-builders.mjs +0 -6
  863. package/dist/lib/utils/signal-id-builders.mjs.map +1 -1
  864. package/dist/lib/utils/sync-creatives-adapter.mjs +0 -6
  865. package/dist/lib/utils/sync-creatives-adapter.mjs.map +1 -1
  866. package/dist/lib/utils/task-state.mjs +0 -6
  867. package/dist/lib/utils/task-state.mjs.map +1 -1
  868. package/dist/lib/utils/tool-request-schemas.mjs +0 -6
  869. package/dist/lib/utils/tool-request-schemas.mjs.map +1 -1
  870. package/dist/lib/utils/typeGuards.mjs +0 -6
  871. package/dist/lib/utils/typeGuards.mjs.map +1 -1
  872. package/dist/lib/utils/union-errors.mjs +0 -6
  873. package/dist/lib/utils/union-errors.mjs.map +1 -1
  874. package/dist/lib/utils/validate-user-agent.mjs +0 -6
  875. package/dist/lib/utils/validate-user-agent.mjs.map +1 -1
  876. package/dist/lib/v2/format-schema/fetch.mjs +0 -6
  877. package/dist/lib/v2/format-schema/fetch.mjs.map +1 -1
  878. package/dist/lib/v2/format-schema/index.mjs +0 -6
  879. package/dist/lib/v2/format-schema/index.mjs.map +1 -1
  880. package/dist/lib/v2/format-schema/regex-safety.mjs +0 -6
  881. package/dist/lib/v2/format-schema/regex-safety.mjs.map +1 -1
  882. package/dist/lib/v2/format-schema/resolver.mjs +7 -8
  883. package/dist/lib/v2/format-schema/resolver.mjs.map +1 -1
  884. package/dist/lib/v2/format-schema/sandbox-refs.mjs +0 -6
  885. package/dist/lib/v2/format-schema/sandbox-refs.mjs.map +1 -1
  886. package/dist/lib/v2/projection/augment-response.mjs +0 -6
  887. package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
  888. package/dist/lib/v2/projection/builders.mjs +0 -6
  889. package/dist/lib/v2/projection/builders.mjs.map +1 -1
  890. package/dist/lib/v2/projection/cache-versions.mjs +0 -6
  891. package/dist/lib/v2/projection/cache-versions.mjs.map +1 -1
  892. package/dist/lib/v2/projection/canonical-properties.mjs +5 -6
  893. package/dist/lib/v2/projection/canonical-properties.mjs.map +1 -1
  894. package/dist/lib/v2/projection/catalog.mjs +5 -6
  895. package/dist/lib/v2/projection/catalog.mjs.map +1 -1
  896. package/dist/lib/v2/projection/constants.mjs +0 -6
  897. package/dist/lib/v2/projection/constants.mjs.map +1 -1
  898. package/dist/lib/v2/projection/index.mjs +0 -6
  899. package/dist/lib/v2/projection/index.mjs.map +1 -1
  900. package/dist/lib/v2/projection/registry.mjs +5 -6
  901. package/dist/lib/v2/projection/registry.mjs.map +1 -1
  902. package/dist/lib/v2/projection/types.mjs +0 -6
  903. package/dist/lib/v2/projection/v1-to-v2.mjs +0 -6
  904. package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
  905. package/dist/lib/v2/projection/v2-to-v1.mjs +0 -6
  906. package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
  907. package/dist/lib/v2/projection/write-side.mjs +0 -6
  908. package/dist/lib/v2/projection/write-side.mjs.map +1 -1
  909. package/dist/lib/v2/publisher-catalog/formats.mjs +0 -6
  910. package/dist/lib/v2/publisher-catalog/formats.mjs.map +1 -1
  911. package/dist/lib/v2/publisher-catalog/index.mjs +0 -6
  912. package/dist/lib/v2/publisher-catalog/index.mjs.map +1 -1
  913. package/dist/lib/validation/client-hooks.mjs +0 -6
  914. package/dist/lib/validation/client-hooks.mjs.map +1 -1
  915. package/dist/lib/validation/hints.mjs +0 -6
  916. package/dist/lib/validation/hints.mjs.map +1 -1
  917. package/dist/lib/validation/index.mjs +0 -6
  918. package/dist/lib/validation/index.mjs.map +1 -1
  919. package/dist/lib/validation/schema-errors.mjs +0 -6
  920. package/dist/lib/validation/schema-errors.mjs.map +1 -1
  921. package/dist/lib/validation/schema-loader.mjs +5 -6
  922. package/dist/lib/validation/schema-loader.mjs.map +1 -1
  923. package/dist/lib/validation/schema-validator.mjs +0 -6
  924. package/dist/lib/validation/schema-validator.mjs.map +1 -1
  925. package/dist/lib/validation/sync-creatives.mjs +0 -6
  926. package/dist/lib/validation/sync-creatives.mjs.map +1 -1
  927. package/dist/lib/version.d.mts +3 -3
  928. package/dist/lib/version.d.ts +3 -3
  929. package/dist/lib/version.js +3 -3
  930. package/dist/lib/version.js.map +1 -1
  931. package/dist/lib/version.mjs +3 -9
  932. package/dist/lib/version.mjs.map +1 -1
  933. package/dist/lib/webhooks/index.mjs +0 -6
  934. package/dist/lib/webhooks/index.mjs.map +1 -1
  935. package/dist/lib/wholesale-feed-sync/index.mjs +0 -6
  936. package/dist/lib/wholesale-feed-sync/index.mjs.map +1 -1
  937. package/dist/lib/wholesale-feed-sync/sync.mjs +0 -6
  938. package/dist/lib/wholesale-feed-sync/sync.mjs.map +1 -1
  939. package/dist/lib/wholesale-feed-sync/types.mjs +0 -6
  940. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs +0 -6
  941. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs.map +1 -1
  942. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/mock-server/creative-template/seed-data.ts"],"sourcesContent":["export interface MockTemplate {\n template_id: string;\n name: string;\n description: string;\n channel: 'display' | 'video' | 'audio' | 'ctv' | 'native';\n dimensions?: { width: number; height: number };\n duration_seconds?: { min: number; max: number };\n output_kind: 'html_tag' | 'javascript_tag' | 'vast_xml' | 'audio_url';\n slots: MockTemplateSlot[];\n sample_inputs?: Record<string, unknown>;\n}\n\nexport interface MockTemplateSlot {\n slot_id: string;\n asset_type: 'image' | 'video' | 'audio' | 'text' | 'click_url';\n required: boolean;\n constraints?: Record<string, unknown>;\n}\n\nexport interface MockWorkspace {\n workspace_id: string;\n display_name: string;\n /** AdCP-side identifier the adapter uses to map principal → workspace.\n * The adapter receives this value via the AdCP request (e.g.,\n * `account.advertiser` or principal lookup) and must translate it to\n * `workspace_id` for outbound URL composition. */\n adcp_advertiser: string;\n visible_template_ids: string[];\n}\n\n/**\n * Templates seeded across both workspaces. Each represents a common creative\n * shape (display medium rectangle, leaderboard, mobile banner, video\n * preroll). The slot definitions intentionally use upstream vocabulary\n * (`slot_id`) rather than AdCP's `asset_role` so the adapter has to\n * translate during list_creative_formats projection.\n */\nexport const TEMPLATES: MockTemplate[] = [\n {\n template_id: 'tpl_celtra_display_medrec_v2',\n name: 'Display Medium Rectangle (300x250)',\n description: 'Standard IAB medium rectangle with brand-aware text overlay and CTA.',\n channel: 'display',\n dimensions: { width: 300, height: 250 },\n output_kind: 'html_tag',\n slots: [\n {\n slot_id: 'image',\n asset_type: 'image',\n required: true,\n constraints: { width: 300, height: 250, mime_types: ['image/jpeg', 'image/png', 'image/webp'] },\n },\n {\n slot_id: 'headline',\n asset_type: 'text',\n required: true,\n constraints: { max_chars: 40 },\n },\n {\n slot_id: 'cta',\n asset_type: 'text',\n required: true,\n constraints: { max_chars: 20 },\n },\n {\n slot_id: 'click_through',\n asset_type: 'click_url',\n required: true,\n },\n ],\n sample_inputs: {\n image_url: 'https://test-assets.adcontextprotocol.org/acme-outdoor/hero-300x250.jpg',\n headline: 'Built for the trail.',\n cta: 'Shop Gear',\n },\n },\n {\n template_id: 'tpl_celtra_display_leaderboard_v2',\n name: 'Display Leaderboard (728x90)',\n description:\n 'Standard IAB leaderboard with brand-aware text overlay and CTA. JS tag output (carries impression macros, viewability shims, MRAID/SafeFrame hooks per IAB OpenRTB 2.6 §3.2.4).',\n channel: 'display',\n dimensions: { width: 728, height: 90 },\n output_kind: 'javascript_tag',\n slots: [\n {\n slot_id: 'image',\n asset_type: 'image',\n required: true,\n constraints: { width: 728, height: 90, mime_types: ['image/jpeg', 'image/png', 'image/webp'] },\n },\n {\n slot_id: 'headline',\n asset_type: 'text',\n required: true,\n constraints: { max_chars: 60 },\n },\n {\n slot_id: 'cta',\n asset_type: 'text',\n required: true,\n constraints: { max_chars: 20 },\n },\n {\n slot_id: 'click_through',\n asset_type: 'click_url',\n required: true,\n },\n ],\n },\n {\n template_id: 'tpl_celtra_mobile_banner_v2',\n name: 'Mobile Banner (320x50)',\n description: 'Standard IAB mobile banner. JS tag output for in-app/MRAID compatibility.',\n channel: 'display',\n dimensions: { width: 320, height: 50 },\n output_kind: 'javascript_tag',\n slots: [\n {\n slot_id: 'image',\n asset_type: 'image',\n required: true,\n constraints: { width: 320, height: 50, mime_types: ['image/jpeg', 'image/png', 'image/webp'] },\n },\n {\n slot_id: 'cta',\n asset_type: 'text',\n required: true,\n constraints: { max_chars: 16 },\n },\n {\n slot_id: 'click_through',\n asset_type: 'click_url',\n required: true,\n },\n ],\n },\n {\n template_id: 'tpl_celtra_video_preroll_v1',\n name: 'Video Preroll (15s)',\n description: 'In-stream video preroll with 15-second cap and end card.',\n channel: 'video',\n duration_seconds: { min: 6, max: 15 },\n output_kind: 'vast_xml',\n slots: [\n {\n slot_id: 'video',\n asset_type: 'video',\n required: true,\n constraints: { duration_max_seconds: 15, mime_types: ['video/mp4', 'video/webm'] },\n },\n {\n slot_id: 'click_through',\n asset_type: 'click_url',\n required: true,\n },\n ],\n },\n // Audio template — TTS / mix / master pattern. Mirrors AudioStack /\n // ElevenLabs / Resemble shape: text script in, audio file out.\n // No dimensions (audio has no width/height); the renderer's queued →\n // running → complete state machine simulates the multi-minute TTS\n // pipeline production audio platforms run.\n {\n template_id: 'tpl_audiostack_spot_30s_v1',\n name: 'Audio Spot (30s, voiceover + music bed)',\n description:\n 'Text-to-speech voiceover mixed with a music bed and mastered to 30-second spot. No visual dimensions.',\n channel: 'audio',\n duration_seconds: { min: 15, max: 30 },\n output_kind: 'audio_url',\n slots: [\n {\n slot_id: 'script',\n asset_type: 'text',\n required: true,\n constraints: { max_chars: 600 },\n },\n {\n slot_id: 'voice',\n asset_type: 'text',\n required: false,\n // Mock-internal hint listing valid voice ids. Not a spec'd\n // text-asset-requirements field (text-asset-requirements.json defines\n // min_length/max_length/min_lines/max_lines/character_pattern/\n // prohibited_terms only). Adopters surfacing voice pickers should\n // either map this server-side or wait on a spec extension —\n // tracked separately.\n constraints: { _voice_ids_hint: ['narrator-warm', 'narrator-energetic', 'announcer-classic'] },\n },\n {\n slot_id: 'music_bed',\n asset_type: 'audio',\n required: false,\n // Spec uses `formats: ['mp3','aac','wav','ogg','flac']` per\n // audio-asset-requirements.json:18-31, not MIME types. Mock-internal\n // hint left here for the synthesizeOutput renderer; the adapter's\n // projectSlot doesn't pass audio constraints through to the format\n // (see hello_creative_adapter_template.ts § FormatAsset.audio).\n constraints: { formats: ['mp3', 'wav'] },\n },\n {\n slot_id: 'click_through',\n asset_type: 'click_url',\n required: false,\n },\n ],\n sample_inputs: {\n script: 'Built for the trail. Acme Outdoor — premium gear for every adventure.',\n voice: 'narrator-warm',\n },\n },\n];\n\nexport const WORKSPACES: MockWorkspace[] = [\n {\n workspace_id: 'ws_acme_studio',\n display_name: 'Acme Outdoor Creative Studio',\n adcp_advertiser: 'acmeoutdoor.example',\n visible_template_ids: TEMPLATES.map(t => t.template_id),\n },\n {\n workspace_id: 'ws_summit_studio',\n display_name: 'Summit Media Creative Studio',\n adcp_advertiser: 'summit-media.example',\n // Summit's workspace doesn't have video access — only display templates.\n visible_template_ids: TEMPLATES.filter(t => t.channel === 'display').map(t => t.template_id),\n },\n];\n\n/** Default static API key. Override via `--api-key` at boot. */\nexport const DEFAULT_API_KEY = 'mock_creative_template_key_do_not_use_in_prod';\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/mock-server/creative-template/seed-data.ts"],"sourcesContent":["export interface MockTemplate {\n template_id: string;\n name: string;\n description: string;\n channel: 'display' | 'video' | 'audio' | 'ctv' | 'native';\n dimensions?: { width: number; height: number };\n duration_seconds?: { min: number; max: number };\n output_kind: 'html_tag' | 'javascript_tag' | 'vast_xml' | 'audio_url';\n slots: MockTemplateSlot[];\n sample_inputs?: Record<string, unknown>;\n}\n\nexport interface MockTemplateSlot {\n slot_id: string;\n asset_type: 'image' | 'video' | 'audio' | 'text' | 'click_url';\n required: boolean;\n constraints?: Record<string, unknown>;\n}\n\nexport interface MockWorkspace {\n workspace_id: string;\n display_name: string;\n /** AdCP-side identifier the adapter uses to map principal → workspace.\n * The adapter receives this value via the AdCP request (e.g.,\n * `account.advertiser` or principal lookup) and must translate it to\n * `workspace_id` for outbound URL composition. */\n adcp_advertiser: string;\n visible_template_ids: string[];\n}\n\n/**\n * Templates seeded across both workspaces. Each represents a common creative\n * shape (display medium rectangle, leaderboard, mobile banner, video\n * preroll). The slot definitions intentionally use upstream vocabulary\n * (`slot_id`) rather than AdCP's `asset_role` so the adapter has to\n * translate during list_creative_formats projection.\n */\nexport const TEMPLATES: MockTemplate[] = [\n {\n template_id: 'tpl_celtra_display_medrec_v2',\n name: 'Display Medium Rectangle (300x250)',\n description: 'Standard IAB medium rectangle with brand-aware text overlay and CTA.',\n channel: 'display',\n dimensions: { width: 300, height: 250 },\n output_kind: 'html_tag',\n slots: [\n {\n slot_id: 'image',\n asset_type: 'image',\n required: true,\n constraints: { width: 300, height: 250, mime_types: ['image/jpeg', 'image/png', 'image/webp'] },\n },\n {\n slot_id: 'headline',\n asset_type: 'text',\n required: true,\n constraints: { max_chars: 40 },\n },\n {\n slot_id: 'cta',\n asset_type: 'text',\n required: true,\n constraints: { max_chars: 20 },\n },\n {\n slot_id: 'click_through',\n asset_type: 'click_url',\n required: true,\n },\n ],\n sample_inputs: {\n image_url: 'https://test-assets.adcontextprotocol.org/acme-outdoor/hero-300x250.jpg',\n headline: 'Built for the trail.',\n cta: 'Shop Gear',\n },\n },\n {\n template_id: 'tpl_celtra_display_leaderboard_v2',\n name: 'Display Leaderboard (728x90)',\n description:\n 'Standard IAB leaderboard with brand-aware text overlay and CTA. JS tag output (carries impression macros, viewability shims, MRAID/SafeFrame hooks per IAB OpenRTB 2.6 §3.2.4).',\n channel: 'display',\n dimensions: { width: 728, height: 90 },\n output_kind: 'javascript_tag',\n slots: [\n {\n slot_id: 'image',\n asset_type: 'image',\n required: true,\n constraints: { width: 728, height: 90, mime_types: ['image/jpeg', 'image/png', 'image/webp'] },\n },\n {\n slot_id: 'headline',\n asset_type: 'text',\n required: true,\n constraints: { max_chars: 60 },\n },\n {\n slot_id: 'cta',\n asset_type: 'text',\n required: true,\n constraints: { max_chars: 20 },\n },\n {\n slot_id: 'click_through',\n asset_type: 'click_url',\n required: true,\n },\n ],\n },\n {\n template_id: 'tpl_celtra_mobile_banner_v2',\n name: 'Mobile Banner (320x50)',\n description: 'Standard IAB mobile banner. JS tag output for in-app/MRAID compatibility.',\n channel: 'display',\n dimensions: { width: 320, height: 50 },\n output_kind: 'javascript_tag',\n slots: [\n {\n slot_id: 'image',\n asset_type: 'image',\n required: true,\n constraints: { width: 320, height: 50, mime_types: ['image/jpeg', 'image/png', 'image/webp'] },\n },\n {\n slot_id: 'cta',\n asset_type: 'text',\n required: true,\n constraints: { max_chars: 16 },\n },\n {\n slot_id: 'click_through',\n asset_type: 'click_url',\n required: true,\n },\n ],\n },\n {\n template_id: 'tpl_celtra_video_preroll_v1',\n name: 'Video Preroll (15s)',\n description: 'In-stream video preroll with 15-second cap and end card.',\n channel: 'video',\n duration_seconds: { min: 6, max: 15 },\n output_kind: 'vast_xml',\n slots: [\n {\n slot_id: 'video',\n asset_type: 'video',\n required: true,\n constraints: { duration_max_seconds: 15, mime_types: ['video/mp4', 'video/webm'] },\n },\n {\n slot_id: 'click_through',\n asset_type: 'click_url',\n required: true,\n },\n ],\n },\n // Audio template — TTS / mix / master pattern. Mirrors AudioStack /\n // ElevenLabs / Resemble shape: text script in, audio file out.\n // No dimensions (audio has no width/height); the renderer's queued →\n // running → complete state machine simulates the multi-minute TTS\n // pipeline production audio platforms run.\n {\n template_id: 'tpl_audiostack_spot_30s_v1',\n name: 'Audio Spot (30s, voiceover + music bed)',\n description:\n 'Text-to-speech voiceover mixed with a music bed and mastered to 30-second spot. No visual dimensions.',\n channel: 'audio',\n duration_seconds: { min: 15, max: 30 },\n output_kind: 'audio_url',\n slots: [\n {\n slot_id: 'script',\n asset_type: 'text',\n required: true,\n constraints: { max_chars: 600 },\n },\n {\n slot_id: 'voice',\n asset_type: 'text',\n required: false,\n // Mock-internal hint listing valid voice ids. Not a spec'd\n // text-asset-requirements field (text-asset-requirements.json defines\n // min_length/max_length/min_lines/max_lines/character_pattern/\n // prohibited_terms only). Adopters surfacing voice pickers should\n // either map this server-side or wait on a spec extension —\n // tracked separately.\n constraints: { _voice_ids_hint: ['narrator-warm', 'narrator-energetic', 'announcer-classic'] },\n },\n {\n slot_id: 'music_bed',\n asset_type: 'audio',\n required: false,\n // Spec uses `formats: ['mp3','aac','wav','ogg','flac']` per\n // audio-asset-requirements.json:18-31, not MIME types. Mock-internal\n // hint left here for the synthesizeOutput renderer; the adapter's\n // projectSlot doesn't pass audio constraints through to the format\n // (see hello_creative_adapter_template.ts § FormatAsset.audio).\n constraints: { formats: ['mp3', 'wav'] },\n },\n {\n slot_id: 'click_through',\n asset_type: 'click_url',\n required: false,\n },\n ],\n sample_inputs: {\n script: 'Built for the trail. Acme Outdoor — premium gear for every adventure.',\n voice: 'narrator-warm',\n },\n },\n];\n\nexport const WORKSPACES: MockWorkspace[] = [\n {\n workspace_id: 'ws_acme_studio',\n display_name: 'Acme Outdoor Creative Studio',\n adcp_advertiser: 'acmeoutdoor.example',\n visible_template_ids: TEMPLATES.map(t => t.template_id),\n },\n {\n workspace_id: 'ws_summit_studio',\n display_name: 'Summit Media Creative Studio',\n adcp_advertiser: 'summit-media.example',\n // Summit's workspace doesn't have video access — only display templates.\n visible_template_ids: TEMPLATES.filter(t => t.channel === 'display').map(t => t.template_id),\n },\n];\n\n/** Default static API key. Override via `--api-key` at boot. */\nexport const DEFAULT_API_KEY = 'mock_creative_template_key_do_not_use_in_prod';\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 { createServer } from "node:http";
8
2
  import { randomUUID } from "node:crypto";
9
3
  import { DEFAULT_API_KEY, TEMPLATES, WORKSPACES } from "./seed-data.mjs";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/mock-server/creative-template/server.ts"],"sourcesContent":["import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { randomUUID } from 'node:crypto';\nimport { DEFAULT_API_KEY, TEMPLATES, WORKSPACES, type MockTemplate, type MockWorkspace } from './seed-data';\nimport {\n createMockScenarioController,\n idempotencyKeyFromBody,\n stableFingerprint,\n writeCachedResponse,\n type MockScenarioHandle,\n} from '../scenario';\n\nexport interface BootOptions {\n port: number;\n apiKey?: string;\n templates?: MockTemplate[];\n workspaces?: MockWorkspace[];\n}\n\nexport interface BootResult {\n url: string;\n close: () => Promise<void>;\n scenario: MockScenarioHandle;\n}\n\ninterface MockRender {\n render_id: string;\n workspace_id: string;\n status: 'queued' | 'running' | 'complete' | 'failed';\n template_id: string;\n mode: 'preview' | 'build';\n /** Body fingerprint used for idempotency body-equivalence checks. */\n body_fingerprint: string;\n output?: {\n tag_html?: string;\n tag_javascript?: string;\n vast_xml?: string;\n audio_url?: string;\n preview_url?: string;\n assets?: Array<Record<string, unknown>>;\n };\n error?: { code: string; message: string };\n created_at: string;\n updated_at: string;\n}\n\nexport async function bootCreativeTemplate(options: BootOptions): Promise<BootResult> {\n const apiKey = options.apiKey ?? DEFAULT_API_KEY;\n const templates = options.templates ?? TEMPLATES;\n const workspaces = options.workspaces ?? WORKSPACES;\n\n const renders = new Map<string, MockRender>();\n // client_request_id idempotency table — keyed by `<workspace_id>::<key>`.\n const idempotency = new Map<string, string>();\n\n // Traffic counters keyed by `<METHOD> <route-template>`. Harness queries\n // `GET /_debug/traffic` after the storyboard run and asserts headline\n // routes were hit ≥1. Façade adapters that skip the upstream produce zero\n // counters and fail the assertion. adcontextprotocol/adcp-client#1225.\n const traffic = new Map<string, number>();\n const bump = (routeTemplate: string): void => {\n traffic.set(routeTemplate, (traffic.get(routeTemplate) ?? 0) + 1);\n };\n const scenario = createMockScenarioController({\n specialism: 'creative-template',\n snapshot: () => ({\n renders: renders.size,\n idempotency: idempotency.size,\n traffic: Object.fromEntries(traffic),\n }),\n reset: () => {\n renders.clear();\n idempotency.clear();\n traffic.clear();\n },\n });\n\n const server = createServer((req, res) => {\n handleRequest(req, res, { apiKey, templates, workspaces, renders, idempotency, traffic, bump, scenario }).catch(\n err => {\n const requestId = (req.headers['x-request-id'] as string | undefined) ?? randomUUID();\n writeJson(res, 500, {\n code: 'internal_error',\n message: err?.message ?? 'unexpected error',\n request_id: requestId,\n });\n }\n );\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(options.port, '127.0.0.1', () => {\n server.removeListener('error', reject);\n resolve();\n });\n });\n\n const addr = server.address();\n const boundPort = typeof addr === 'object' && addr ? addr.port : options.port;\n const url = `http://127.0.0.1:${boundPort}`;\n\n return {\n url,\n scenario: scenario.handle,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close(err => (err ? reject(err) : resolve()));\n }),\n };\n}\n\ninterface HandlerCtx {\n apiKey: string;\n templates: MockTemplate[];\n workspaces: MockWorkspace[];\n renders: Map<string, MockRender>;\n idempotency: Map<string, string>;\n traffic: Map<string, number>;\n bump: (routeTemplate: string) => void;\n scenario: ReturnType<typeof createMockScenarioController>;\n}\n\nasync function handleRequest(req: IncomingMessage, res: ServerResponse, ctx: HandlerCtx): Promise<void> {\n const url = new URL(req.url ?? '/', `http://127.0.0.1`);\n const path = url.pathname;\n const method = req.method ?? 'GET';\n\n if (await ctx.scenario.handleControlRequest(req, res, method, path)) return;\n\n // Façade-detection traffic dump — harness-only, no auth required.\n if (method === 'GET' && path === '/_debug/traffic') {\n writeJson(res, 200, { traffic: Object.fromEntries(ctx.traffic) });\n return;\n }\n\n // Discovery endpoint — replaces the hardcoded principal-mapping table the\n // harness used to inline into Claude's prompt. Adapters resolve at runtime\n // by querying with the AdCP-side identifier they receive from buyers\n // (`account.advertiser`, `account.brand.domain`). No auth required —\n // discovery happens before the agent has any workspace context. Issue #1225.\n if (method === 'GET' && path === '/_lookup/workspace') {\n ctx.bump('GET /_lookup/workspace');\n const adcpAdvertiser = url.searchParams.get('adcp_advertiser');\n if (!adcpAdvertiser) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'adcp_advertiser query parameter is required.',\n });\n return;\n }\n const match = ctx.workspaces.find(w => w.adcp_advertiser === adcpAdvertiser);\n if (!match) {\n writeJson(res, 404, {\n code: 'workspace_not_found',\n message: `No upstream workspace registered for adcp_advertiser=${adcpAdvertiser}.`,\n });\n return;\n }\n writeJson(res, 200, {\n adcp_advertiser: match.adcp_advertiser,\n workspace_id: match.workspace_id,\n display_name: match.display_name,\n });\n return;\n }\n\n // Authentication.\n const auth = req.headers['authorization'];\n if (!auth || !auth.startsWith('Bearer ') || auth.slice(7) !== ctx.apiKey) {\n writeJson(res, 401, { code: 'unauthorized', message: 'Missing or invalid bearer credential.' });\n return;\n }\n\n // Path-based workspace scoping. Matches /v3/workspaces/{ws}/...\n const wsMatch = path.match(/^\\/v3\\/workspaces\\/([^/]+)(\\/.*)?$/);\n if (!wsMatch || !wsMatch[1]) {\n writeJson(res, 404, { code: 'not_found', message: `No route for ${method} ${path}` });\n return;\n }\n const workspaceId = decodeURIComponent(wsMatch[1]);\n const subPath = wsMatch[2] ?? '/';\n const workspace = ctx.workspaces.find(w => w.workspace_id === workspaceId);\n if (!workspace) {\n writeJson(res, 404, { code: 'workspace_not_found', message: `Workspace ${workspaceId} not found.` });\n return;\n }\n\n if (await ctx.scenario.handleScriptedResponse(res, method, path, (m, p) => ctx.bump(`${m} ${p}`))) return;\n\n // Bump traffic counters on each real-route hit so /_debug/traffic can later\n // report which endpoints the adapter actually exercised.\n if (method === 'GET' && subPath === '/templates') {\n ctx.bump('GET /v3/workspaces/{ws}/templates');\n return handleListTemplates(url, ctx, workspace, res);\n }\n const tplMatch = subPath.match(/^\\/templates\\/([^/]+)$/);\n if (method === 'GET' && tplMatch && tplMatch[1]) {\n ctx.bump('GET /v3/workspaces/{ws}/templates/{id}');\n return handleGetTemplate(decodeURIComponent(tplMatch[1]), ctx, workspace, res);\n }\n if (method === 'POST' && subPath === '/renders') {\n ctx.bump('POST /v3/workspaces/{ws}/renders');\n return handleCreateRender(req, ctx, workspace, res);\n }\n const rMatch = subPath.match(/^\\/renders\\/([^/]+)$/);\n if (method === 'GET' && rMatch && rMatch[1]) {\n ctx.bump('GET /v3/workspaces/{ws}/renders/{id}');\n return handleGetRender(decodeURIComponent(rMatch[1]), ctx, workspace, res);\n }\n\n writeJson(res, 404, { code: 'not_found', message: `No route for ${method} ${path}` });\n}\n\nfunction handleListTemplates(url: URL, ctx: HandlerCtx, ws: MockWorkspace, res: ServerResponse): void {\n const visible = ctx.templates.filter(t => ws.visible_template_ids.includes(t.template_id));\n const channel = url.searchParams.get('channel');\n const filtered = channel ? visible.filter(t => t.channel === channel) : visible;\n writeJson(res, 200, { templates: filtered });\n}\n\nfunction handleGetTemplate(templateId: string, ctx: HandlerCtx, ws: MockWorkspace, res: ServerResponse): void {\n const template = ctx.templates.find(t => t.template_id === templateId);\n if (!template) {\n writeJson(res, 404, { code: 'template_not_found', message: `Template ${templateId} not found.` });\n return;\n }\n if (!ws.visible_template_ids.includes(templateId)) {\n writeJson(res, 404, {\n code: 'template_not_visible',\n message: `Template ${templateId} is not visible to workspace ${ws.workspace_id}.`,\n });\n return;\n }\n writeJson(res, 200, template);\n}\n\nasync function handleCreateRender(\n req: IncomingMessage,\n ctx: HandlerCtx,\n ws: MockWorkspace,\n res: ServerResponse\n): Promise<void> {\n let body: unknown;\n try {\n body = await readJson(req);\n } catch {\n writeJson(res, 400, { code: 'invalid_json', message: 'Request body must be valid JSON.' });\n return;\n }\n if (!isObject(body)) {\n writeJson(res, 400, { code: 'invalid_request', message: 'Body must be an object.' });\n return;\n }\n const exactReplay = ctx.scenario.idempotency.check(\n `${ws.workspace_id}::render`,\n idempotencyKeyFromBody(body),\n stableFingerprint(body)\n );\n if (exactReplay.kind === 'replay' || exactReplay.kind === 'conflict') {\n writeCachedResponse(res, exactReplay.response);\n return;\n }\n const { template_id, inputs, mode, client_request_id } = body as Record<string, unknown>;\n if (typeof template_id !== 'string' || !Array.isArray(inputs) || (mode !== 'preview' && mode !== 'build')) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'template_id (string), inputs (array), and mode (\"preview\" or \"build\") are required.',\n });\n return;\n }\n const template = ctx.templates.find(t => t.template_id === template_id);\n if (!template || !ws.visible_template_ids.includes(template_id)) {\n writeJson(res, 404, {\n code: template ? 'template_not_visible' : 'template_not_found',\n message: `Template ${template_id} ${template ? 'not visible' : 'not found'}.`,\n });\n return;\n }\n\n const fingerprint = fingerprintBody(template_id, inputs, mode);\n\n // Idempotency replay (same body) / conflict (mismatched body).\n if (typeof client_request_id === 'string' && client_request_id.length > 0) {\n const idemKey = `${ws.workspace_id}::${client_request_id}`;\n const existing = ctx.idempotency.get(idemKey);\n if (existing) {\n const render = ctx.renders.get(existing);\n if (render) {\n if (render.body_fingerprint !== fingerprint) {\n writeJson(res, 409, {\n code: 'idempotency_conflict',\n message: `client_request_id ${client_request_id} was previously used with a different body. Use a fresh idempotency key for distinct requests.`,\n });\n return;\n }\n writeJson(res, 200, serializeRender(render));\n return;\n }\n }\n }\n\n const renderId = `rnd_${randomUUID().replace(/-/g, '').slice(0, 16)}`;\n const now = new Date();\n const render: MockRender = {\n render_id: renderId,\n workspace_id: ws.workspace_id,\n status: 'queued',\n template_id,\n mode,\n body_fingerprint: fingerprint,\n created_at: now.toISOString(),\n updated_at: now.toISOString(),\n };\n ctx.renders.set(renderId, render);\n if (typeof client_request_id === 'string' && client_request_id.length > 0) {\n ctx.idempotency.set(`${ws.workspace_id}::${client_request_id}`, renderId);\n }\n\n const responseBody = serializeRender(render);\n if (exactReplay.kind === 'fresh') exactReplay.record({ status: 202, body: responseBody });\n writeJson(res, 202, responseBody);\n}\n\nfunction handleGetRender(renderId: string, ctx: HandlerCtx, ws: MockWorkspace, res: ServerResponse): void {\n const render = ctx.renders.get(renderId);\n if (!render) {\n writeJson(res, 404, { code: 'render_not_found', message: `Render ${renderId} not found.` });\n return;\n }\n if (render.workspace_id !== ws.workspace_id) {\n writeJson(res, 404, {\n code: 'render_not_in_workspace',\n message: `Render ${renderId} not found in workspace ${ws.workspace_id}.`,\n });\n return;\n }\n\n // Auto-promote queued → running on first poll, running → complete on second.\n // Real platforms render in seconds-to-minutes; the mock simulates a fast\n // async with two state transitions to exercise polling without making the\n // matrix run drag. The `else if` chain means a `complete` render is a\n // terminal state — subsequent polls return the same complete render\n // without further mutation. Callers serializing polls (one GET at a time)\n // observe each transition exactly once; concurrent polls in flight will\n // both see the post-transition state, which is fine for a fixture but\n // means the matrix harness should not race polls against itself.\n const template = ctx.templates.find(t => t.template_id === render.template_id);\n if (render.status === 'queued') {\n render.status = 'running';\n render.updated_at = new Date().toISOString();\n } else if (render.status === 'running') {\n render.status = 'complete';\n render.updated_at = new Date().toISOString();\n render.output = synthesizeOutput(render, template);\n }\n\n writeJson(res, 200, serializeRender(render));\n}\n\nfunction synthesizeOutput(render: MockRender, template: MockTemplate | undefined): MockRender['output'] {\n // Fixture output. Real platforms return real ad tags / VAST XML / etc; the\n // mock returns plausible-looking synthetic output so adapters can pattern-\n // match without rendering anything real. The kind is driven by the\n // template's output_kind so the adapter has to read it and project to AdCP\n // creative_manifest correctly.\n const previewBase = `https://mock-creative-template.example/preview/${render.render_id}`;\n if (!template) {\n return { preview_url: previewBase };\n }\n if (template.output_kind === 'vast_xml') {\n return {\n vast_xml: `<?xml version=\"1.0\"?><VAST version=\"4.2\"><Ad id=\"${render.render_id}\"><InLine><AdSystem>MockCreativeTemplate</AdSystem><AdTitle>${template.name}</AdTitle></InLine></Ad></VAST>`,\n preview_url: previewBase,\n assets: [{ kind: 'video_tag', mime_type: 'application/xml+vast' }],\n };\n }\n if (template.output_kind === 'javascript_tag') {\n return {\n tag_javascript: `(function(){var d=document;var img=d.createElement('img');img.src='${previewBase}.png';d.write(img.outerHTML);})();`,\n preview_url: previewBase,\n assets: [{ kind: 'js_tag', mime_type: 'application/javascript' }],\n };\n }\n if (template.output_kind === 'audio_url') {\n // Audio templates render to a hosted MP3. Real platforms (AudioStack,\n // ElevenLabs, Resemble) return signed URLs against their CDN with TTL;\n // the mock returns a stable preview-base URL. The queued → running →\n // complete state machine already simulates the multi-minute TTS / mix /\n // master pipeline production audio platforms run.\n return {\n audio_url: `${previewBase}.mp3`,\n preview_url: previewBase,\n assets: [{ kind: 'audio_url', mime_type: 'audio/mpeg' }],\n };\n }\n // default html_tag\n return {\n tag_html: `<a href=\"https://example.com/click\"><img src=\"${previewBase}.png\" width=\"${template.dimensions?.width ?? 300}\" height=\"${template.dimensions?.height ?? 250}\" alt=\"${template.name}\" /></a>`,\n preview_url: previewBase,\n assets: [{ kind: 'html_tag', mime_type: 'text/html' }],\n };\n}\n\nfunction serializeRender(r: MockRender): Record<string, unknown> {\n // workspace_id / body_fingerprint are internal book-keeping — strip from public payload.\n const { workspace_id, body_fingerprint, ...rest } = r;\n return rest;\n}\n\nfunction fingerprintBody(templateId: string, inputs: unknown[], mode: string): string {\n // Stable JSON canonicalization for body equivalence. Serializing a sorted-\n // key copy gives whitespace/order independence without pulling in a\n // dependency. Inputs are array-position-significant (slot order matters\n // for some upstream renders), so we don't sort the array itself.\n return JSON.stringify({ template_id: templateId, inputs, mode });\n}\n\nfunction readJson(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', c => chunks.push(c));\n req.on('error', reject);\n req.on('end', () => {\n const raw = Buffer.concat(chunks).toString('utf8');\n if (!raw) {\n resolve({});\n return;\n }\n try {\n resolve(JSON.parse(raw));\n } catch (err) {\n reject(err);\n }\n });\n });\n}\n\nfunction writeJson(res: ServerResponse, status: number, body: unknown): void {\n const json = JSON.stringify(body);\n res.writeHead(status, {\n 'content-type': 'application/json; charset=utf-8',\n 'content-length': Buffer.byteLength(json),\n });\n res.end(json);\n}\n\nfunction isObject(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n"],"mappings":"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","names":["render"]}
1
+ {"version":3,"sources":["../../../../src/lib/mock-server/creative-template/server.ts"],"sourcesContent":["import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { randomUUID } from 'node:crypto';\nimport { DEFAULT_API_KEY, TEMPLATES, WORKSPACES, type MockTemplate, type MockWorkspace } from './seed-data';\nimport {\n createMockScenarioController,\n idempotencyKeyFromBody,\n stableFingerprint,\n writeCachedResponse,\n type MockScenarioHandle,\n} from '../scenario';\n\nexport interface BootOptions {\n port: number;\n apiKey?: string;\n templates?: MockTemplate[];\n workspaces?: MockWorkspace[];\n}\n\nexport interface BootResult {\n url: string;\n close: () => Promise<void>;\n scenario: MockScenarioHandle;\n}\n\ninterface MockRender {\n render_id: string;\n workspace_id: string;\n status: 'queued' | 'running' | 'complete' | 'failed';\n template_id: string;\n mode: 'preview' | 'build';\n /** Body fingerprint used for idempotency body-equivalence checks. */\n body_fingerprint: string;\n output?: {\n tag_html?: string;\n tag_javascript?: string;\n vast_xml?: string;\n audio_url?: string;\n preview_url?: string;\n assets?: Array<Record<string, unknown>>;\n };\n error?: { code: string; message: string };\n created_at: string;\n updated_at: string;\n}\n\nexport async function bootCreativeTemplate(options: BootOptions): Promise<BootResult> {\n const apiKey = options.apiKey ?? DEFAULT_API_KEY;\n const templates = options.templates ?? TEMPLATES;\n const workspaces = options.workspaces ?? WORKSPACES;\n\n const renders = new Map<string, MockRender>();\n // client_request_id idempotency table — keyed by `<workspace_id>::<key>`.\n const idempotency = new Map<string, string>();\n\n // Traffic counters keyed by `<METHOD> <route-template>`. Harness queries\n // `GET /_debug/traffic` after the storyboard run and asserts headline\n // routes were hit ≥1. Façade adapters that skip the upstream produce zero\n // counters and fail the assertion. adcontextprotocol/adcp-client#1225.\n const traffic = new Map<string, number>();\n const bump = (routeTemplate: string): void => {\n traffic.set(routeTemplate, (traffic.get(routeTemplate) ?? 0) + 1);\n };\n const scenario = createMockScenarioController({\n specialism: 'creative-template',\n snapshot: () => ({\n renders: renders.size,\n idempotency: idempotency.size,\n traffic: Object.fromEntries(traffic),\n }),\n reset: () => {\n renders.clear();\n idempotency.clear();\n traffic.clear();\n },\n });\n\n const server = createServer((req, res) => {\n handleRequest(req, res, { apiKey, templates, workspaces, renders, idempotency, traffic, bump, scenario }).catch(\n err => {\n const requestId = (req.headers['x-request-id'] as string | undefined) ?? randomUUID();\n writeJson(res, 500, {\n code: 'internal_error',\n message: err?.message ?? 'unexpected error',\n request_id: requestId,\n });\n }\n );\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(options.port, '127.0.0.1', () => {\n server.removeListener('error', reject);\n resolve();\n });\n });\n\n const addr = server.address();\n const boundPort = typeof addr === 'object' && addr ? addr.port : options.port;\n const url = `http://127.0.0.1:${boundPort}`;\n\n return {\n url,\n scenario: scenario.handle,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close(err => (err ? reject(err) : resolve()));\n }),\n };\n}\n\ninterface HandlerCtx {\n apiKey: string;\n templates: MockTemplate[];\n workspaces: MockWorkspace[];\n renders: Map<string, MockRender>;\n idempotency: Map<string, string>;\n traffic: Map<string, number>;\n bump: (routeTemplate: string) => void;\n scenario: ReturnType<typeof createMockScenarioController>;\n}\n\nasync function handleRequest(req: IncomingMessage, res: ServerResponse, ctx: HandlerCtx): Promise<void> {\n const url = new URL(req.url ?? '/', `http://127.0.0.1`);\n const path = url.pathname;\n const method = req.method ?? 'GET';\n\n if (await ctx.scenario.handleControlRequest(req, res, method, path)) return;\n\n // Façade-detection traffic dump — harness-only, no auth required.\n if (method === 'GET' && path === '/_debug/traffic') {\n writeJson(res, 200, { traffic: Object.fromEntries(ctx.traffic) });\n return;\n }\n\n // Discovery endpoint — replaces the hardcoded principal-mapping table the\n // harness used to inline into Claude's prompt. Adapters resolve at runtime\n // by querying with the AdCP-side identifier they receive from buyers\n // (`account.advertiser`, `account.brand.domain`). No auth required —\n // discovery happens before the agent has any workspace context. Issue #1225.\n if (method === 'GET' && path === '/_lookup/workspace') {\n ctx.bump('GET /_lookup/workspace');\n const adcpAdvertiser = url.searchParams.get('adcp_advertiser');\n if (!adcpAdvertiser) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'adcp_advertiser query parameter is required.',\n });\n return;\n }\n const match = ctx.workspaces.find(w => w.adcp_advertiser === adcpAdvertiser);\n if (!match) {\n writeJson(res, 404, {\n code: 'workspace_not_found',\n message: `No upstream workspace registered for adcp_advertiser=${adcpAdvertiser}.`,\n });\n return;\n }\n writeJson(res, 200, {\n adcp_advertiser: match.adcp_advertiser,\n workspace_id: match.workspace_id,\n display_name: match.display_name,\n });\n return;\n }\n\n // Authentication.\n const auth = req.headers['authorization'];\n if (!auth || !auth.startsWith('Bearer ') || auth.slice(7) !== ctx.apiKey) {\n writeJson(res, 401, { code: 'unauthorized', message: 'Missing or invalid bearer credential.' });\n return;\n }\n\n // Path-based workspace scoping. Matches /v3/workspaces/{ws}/...\n const wsMatch = path.match(/^\\/v3\\/workspaces\\/([^/]+)(\\/.*)?$/);\n if (!wsMatch || !wsMatch[1]) {\n writeJson(res, 404, { code: 'not_found', message: `No route for ${method} ${path}` });\n return;\n }\n const workspaceId = decodeURIComponent(wsMatch[1]);\n const subPath = wsMatch[2] ?? '/';\n const workspace = ctx.workspaces.find(w => w.workspace_id === workspaceId);\n if (!workspace) {\n writeJson(res, 404, { code: 'workspace_not_found', message: `Workspace ${workspaceId} not found.` });\n return;\n }\n\n if (await ctx.scenario.handleScriptedResponse(res, method, path, (m, p) => ctx.bump(`${m} ${p}`))) return;\n\n // Bump traffic counters on each real-route hit so /_debug/traffic can later\n // report which endpoints the adapter actually exercised.\n if (method === 'GET' && subPath === '/templates') {\n ctx.bump('GET /v3/workspaces/{ws}/templates');\n return handleListTemplates(url, ctx, workspace, res);\n }\n const tplMatch = subPath.match(/^\\/templates\\/([^/]+)$/);\n if (method === 'GET' && tplMatch && tplMatch[1]) {\n ctx.bump('GET /v3/workspaces/{ws}/templates/{id}');\n return handleGetTemplate(decodeURIComponent(tplMatch[1]), ctx, workspace, res);\n }\n if (method === 'POST' && subPath === '/renders') {\n ctx.bump('POST /v3/workspaces/{ws}/renders');\n return handleCreateRender(req, ctx, workspace, res);\n }\n const rMatch = subPath.match(/^\\/renders\\/([^/]+)$/);\n if (method === 'GET' && rMatch && rMatch[1]) {\n ctx.bump('GET /v3/workspaces/{ws}/renders/{id}');\n return handleGetRender(decodeURIComponent(rMatch[1]), ctx, workspace, res);\n }\n\n writeJson(res, 404, { code: 'not_found', message: `No route for ${method} ${path}` });\n}\n\nfunction handleListTemplates(url: URL, ctx: HandlerCtx, ws: MockWorkspace, res: ServerResponse): void {\n const visible = ctx.templates.filter(t => ws.visible_template_ids.includes(t.template_id));\n const channel = url.searchParams.get('channel');\n const filtered = channel ? visible.filter(t => t.channel === channel) : visible;\n writeJson(res, 200, { templates: filtered });\n}\n\nfunction handleGetTemplate(templateId: string, ctx: HandlerCtx, ws: MockWorkspace, res: ServerResponse): void {\n const template = ctx.templates.find(t => t.template_id === templateId);\n if (!template) {\n writeJson(res, 404, { code: 'template_not_found', message: `Template ${templateId} not found.` });\n return;\n }\n if (!ws.visible_template_ids.includes(templateId)) {\n writeJson(res, 404, {\n code: 'template_not_visible',\n message: `Template ${templateId} is not visible to workspace ${ws.workspace_id}.`,\n });\n return;\n }\n writeJson(res, 200, template);\n}\n\nasync function handleCreateRender(\n req: IncomingMessage,\n ctx: HandlerCtx,\n ws: MockWorkspace,\n res: ServerResponse\n): Promise<void> {\n let body: unknown;\n try {\n body = await readJson(req);\n } catch {\n writeJson(res, 400, { code: 'invalid_json', message: 'Request body must be valid JSON.' });\n return;\n }\n if (!isObject(body)) {\n writeJson(res, 400, { code: 'invalid_request', message: 'Body must be an object.' });\n return;\n }\n const exactReplay = ctx.scenario.idempotency.check(\n `${ws.workspace_id}::render`,\n idempotencyKeyFromBody(body),\n stableFingerprint(body)\n );\n if (exactReplay.kind === 'replay' || exactReplay.kind === 'conflict') {\n writeCachedResponse(res, exactReplay.response);\n return;\n }\n const { template_id, inputs, mode, client_request_id } = body as Record<string, unknown>;\n if (typeof template_id !== 'string' || !Array.isArray(inputs) || (mode !== 'preview' && mode !== 'build')) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'template_id (string), inputs (array), and mode (\"preview\" or \"build\") are required.',\n });\n return;\n }\n const template = ctx.templates.find(t => t.template_id === template_id);\n if (!template || !ws.visible_template_ids.includes(template_id)) {\n writeJson(res, 404, {\n code: template ? 'template_not_visible' : 'template_not_found',\n message: `Template ${template_id} ${template ? 'not visible' : 'not found'}.`,\n });\n return;\n }\n\n const fingerprint = fingerprintBody(template_id, inputs, mode);\n\n // Idempotency replay (same body) / conflict (mismatched body).\n if (typeof client_request_id === 'string' && client_request_id.length > 0) {\n const idemKey = `${ws.workspace_id}::${client_request_id}`;\n const existing = ctx.idempotency.get(idemKey);\n if (existing) {\n const render = ctx.renders.get(existing);\n if (render) {\n if (render.body_fingerprint !== fingerprint) {\n writeJson(res, 409, {\n code: 'idempotency_conflict',\n message: `client_request_id ${client_request_id} was previously used with a different body. Use a fresh idempotency key for distinct requests.`,\n });\n return;\n }\n writeJson(res, 200, serializeRender(render));\n return;\n }\n }\n }\n\n const renderId = `rnd_${randomUUID().replace(/-/g, '').slice(0, 16)}`;\n const now = new Date();\n const render: MockRender = {\n render_id: renderId,\n workspace_id: ws.workspace_id,\n status: 'queued',\n template_id,\n mode,\n body_fingerprint: fingerprint,\n created_at: now.toISOString(),\n updated_at: now.toISOString(),\n };\n ctx.renders.set(renderId, render);\n if (typeof client_request_id === 'string' && client_request_id.length > 0) {\n ctx.idempotency.set(`${ws.workspace_id}::${client_request_id}`, renderId);\n }\n\n const responseBody = serializeRender(render);\n if (exactReplay.kind === 'fresh') exactReplay.record({ status: 202, body: responseBody });\n writeJson(res, 202, responseBody);\n}\n\nfunction handleGetRender(renderId: string, ctx: HandlerCtx, ws: MockWorkspace, res: ServerResponse): void {\n const render = ctx.renders.get(renderId);\n if (!render) {\n writeJson(res, 404, { code: 'render_not_found', message: `Render ${renderId} not found.` });\n return;\n }\n if (render.workspace_id !== ws.workspace_id) {\n writeJson(res, 404, {\n code: 'render_not_in_workspace',\n message: `Render ${renderId} not found in workspace ${ws.workspace_id}.`,\n });\n return;\n }\n\n // Auto-promote queued → running on first poll, running → complete on second.\n // Real platforms render in seconds-to-minutes; the mock simulates a fast\n // async with two state transitions to exercise polling without making the\n // matrix run drag. The `else if` chain means a `complete` render is a\n // terminal state — subsequent polls return the same complete render\n // without further mutation. Callers serializing polls (one GET at a time)\n // observe each transition exactly once; concurrent polls in flight will\n // both see the post-transition state, which is fine for a fixture but\n // means the matrix harness should not race polls against itself.\n const template = ctx.templates.find(t => t.template_id === render.template_id);\n if (render.status === 'queued') {\n render.status = 'running';\n render.updated_at = new Date().toISOString();\n } else if (render.status === 'running') {\n render.status = 'complete';\n render.updated_at = new Date().toISOString();\n render.output = synthesizeOutput(render, template);\n }\n\n writeJson(res, 200, serializeRender(render));\n}\n\nfunction synthesizeOutput(render: MockRender, template: MockTemplate | undefined): MockRender['output'] {\n // Fixture output. Real platforms return real ad tags / VAST XML / etc; the\n // mock returns plausible-looking synthetic output so adapters can pattern-\n // match without rendering anything real. The kind is driven by the\n // template's output_kind so the adapter has to read it and project to AdCP\n // creative_manifest correctly.\n const previewBase = `https://mock-creative-template.example/preview/${render.render_id}`;\n if (!template) {\n return { preview_url: previewBase };\n }\n if (template.output_kind === 'vast_xml') {\n return {\n vast_xml: `<?xml version=\"1.0\"?><VAST version=\"4.2\"><Ad id=\"${render.render_id}\"><InLine><AdSystem>MockCreativeTemplate</AdSystem><AdTitle>${template.name}</AdTitle></InLine></Ad></VAST>`,\n preview_url: previewBase,\n assets: [{ kind: 'video_tag', mime_type: 'application/xml+vast' }],\n };\n }\n if (template.output_kind === 'javascript_tag') {\n return {\n tag_javascript: `(function(){var d=document;var img=d.createElement('img');img.src='${previewBase}.png';d.write(img.outerHTML);})();`,\n preview_url: previewBase,\n assets: [{ kind: 'js_tag', mime_type: 'application/javascript' }],\n };\n }\n if (template.output_kind === 'audio_url') {\n // Audio templates render to a hosted MP3. Real platforms (AudioStack,\n // ElevenLabs, Resemble) return signed URLs against their CDN with TTL;\n // the mock returns a stable preview-base URL. The queued → running →\n // complete state machine already simulates the multi-minute TTS / mix /\n // master pipeline production audio platforms run.\n return {\n audio_url: `${previewBase}.mp3`,\n preview_url: previewBase,\n assets: [{ kind: 'audio_url', mime_type: 'audio/mpeg' }],\n };\n }\n // default html_tag\n return {\n tag_html: `<a href=\"https://example.com/click\"><img src=\"${previewBase}.png\" width=\"${template.dimensions?.width ?? 300}\" height=\"${template.dimensions?.height ?? 250}\" alt=\"${template.name}\" /></a>`,\n preview_url: previewBase,\n assets: [{ kind: 'html_tag', mime_type: 'text/html' }],\n };\n}\n\nfunction serializeRender(r: MockRender): Record<string, unknown> {\n // workspace_id / body_fingerprint are internal book-keeping — strip from public payload.\n const { workspace_id, body_fingerprint, ...rest } = r;\n return rest;\n}\n\nfunction fingerprintBody(templateId: string, inputs: unknown[], mode: string): string {\n // Stable JSON canonicalization for body equivalence. Serializing a sorted-\n // key copy gives whitespace/order independence without pulling in a\n // dependency. Inputs are array-position-significant (slot order matters\n // for some upstream renders), so we don't sort the array itself.\n return JSON.stringify({ template_id: templateId, inputs, mode });\n}\n\nfunction readJson(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', c => chunks.push(c));\n req.on('error', reject);\n req.on('end', () => {\n const raw = Buffer.concat(chunks).toString('utf8');\n if (!raw) {\n resolve({});\n return;\n }\n try {\n resolve(JSON.parse(raw));\n } catch (err) {\n reject(err);\n }\n });\n });\n}\n\nfunction writeJson(res: ServerResponse, status: number, body: unknown): void {\n const json = JSON.stringify(body);\n res.writeHead(status, {\n 'content-type': 'application/json; charset=utf-8',\n 'content-length': Buffer.byteLength(json),\n });\n res.end(json);\n}\n\nfunction isObject(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n"],"mappings":"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","names":["render"]}
@@ -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 { bootCreativeAdServer } from "./creative-ad-server/server.mjs";
8
2
  import {
9
3
  DEFAULT_API_KEY as CREATIVE_AD_SERVER_DEFAULT_API_KEY,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/mock-server/index.ts"],"sourcesContent":["import { bootCreativeAdServer } from './creative-ad-server/server';\nimport {\n DEFAULT_API_KEY as CREATIVE_AD_SERVER_DEFAULT_API_KEY,\n NETWORKS as CREATIVE_AD_SERVER_NETWORKS,\n} from './creative-ad-server/seed-data';\nimport { bootCreativeTemplate } from './creative-template/server';\nimport { DEFAULT_API_KEY as CREATIVE_TEMPLATE_DEFAULT_API_KEY, WORKSPACES } from './creative-template/seed-data';\nimport { bootSalesGuaranteed } from './sales-guaranteed/server';\nimport {\n DEFAULT_API_KEY as SALES_GUARANTEED_DEFAULT_API_KEY,\n NETWORKS as SALES_GUARANTEED_NETWORKS,\n} from './sales-guaranteed/seed-data';\nimport { bootSalesNonGuaranteed } from './sales-non-guaranteed/server';\nimport {\n DEFAULT_API_KEY as SALES_NON_GUARANTEED_DEFAULT_API_KEY,\n NETWORKS as SALES_NON_GUARANTEED_NETWORKS,\n} from './sales-non-guaranteed/seed-data';\nimport { bootSalesSocial } from './sales-social/server';\nimport { ADVERTISERS, OAUTH_CLIENTS } from './sales-social/seed-data';\nimport { bootSignalMarketplace } from './signal-marketplace/server';\nimport { DEFAULT_API_KEY as SIGNAL_MARKETPLACE_DEFAULT_API_KEY, OPERATORS } from './signal-marketplace/seed-data';\nimport { bootSponsoredIntelligence } from './sponsored-intelligence/server';\nimport { BRANDS as SI_BRANDS, DEFAULT_API_KEY as SI_DEFAULT_API_KEY } from './sponsored-intelligence/seed-data';\nimport type { MockScenarioHandle } from './scenario';\n\n// Canonical Recipe shapes per specialism — adopters wrapping these\n// upstream mocks build their hello-agent's `Product.implementation_config`\n// from these helpers. The recipe is the typed contract between the\n// adapter's ProposalManager and DecisioningPlatform; exporting the\n// canonical shapes from here means hello agents and storyboard fixtures\n// share one definition.\nexport { buildGAMLikeRecipe, GAM_LIKE_OVERLAP, type GAMLikeRecipe } from './sales-guaranteed/recipe';\nexport { buildAuctionLikeRecipe, AUCTION_LIKE_OVERLAP, type AuctionLikeRecipe } from './sales-non-guaranteed/recipe';\nexport {\n MockIdempotencyReplayStore,\n createMockScenarioController,\n idempotencyKeyFromBody,\n stableFingerprint,\n writeCachedResponse,\n type CachedIdempotentResponse,\n type MockScenarioHandle,\n type MockScenarioScriptInput,\n type MockScenarioState,\n type MockScenarioWebhookAttempt,\n} from './scenario';\n\nexport interface MockServerOptions {\n specialism: string;\n port: number;\n apiKey?: string;\n}\n\n/**\n * How an adapter authenticates with the upstream mock. Specialism mocks\n * advertise one of these so the matrix harness can build the right\n * adapter-prompt section.\n */\nexport type MockServerAuth =\n | {\n kind: 'static_bearer';\n /** Bearer token attached on every API call. */\n apiKey: string;\n }\n | {\n kind: 'oauth_client_credentials';\n /** OAuth `client_id` for the `client_credentials` grant. */\n clientId: string;\n /** OAuth `client_secret` paired with `clientId`. */\n clientSecret: string;\n /** Path to the OAuth token endpoint relative to the mock URL,\n * e.g. `/oauth/token`. Adapters POST `grant_type=client_credentials`\n * with the client_id/secret to receive an access_token, then attach\n * it as Bearer on subsequent API calls. Token expires after\n * `expires_in` seconds (mock returns this in the token response);\n * adapters refresh via the same endpoint with `grant_type=refresh_token`. */\n tokenPath: string;\n };\n\nexport interface MockServerHandle {\n url: string;\n /** Auth shape this mock requires. The matrix harness branches on\n * `auth.kind` when building the adapter prompt — different shapes\n * produce different adapter-side wiring. */\n auth: MockServerAuth;\n close: () => Promise<void>;\n /** Adopter-friendly summary for boot-log printing. */\n summary: () => string;\n /** Specialism-agnostic principal-mapping table the matrix harness inlines\n * into the build prompt so Claude can wire AdCP-side identity to upstream\n * tenant/workspace ids without re-deriving them per specialism. */\n principalMapping: PrincipalMappingEntry[];\n /** Human-prose description of how the upstream gates per-tenant scope —\n * e.g. \"via X-Operator-Id header\" or \"via path /v3/workspaces/{id}/...\".\n * Surfaces in the harness prompt to make the auth-translation requirement\n * explicit. */\n principalScope: string;\n /** Scenario controller for storyboards and fault-injection harnesses.\n * Booted handles always include this; optional for structural test doubles.\n * Also exposed over HTTP at `/_scenario/*` on every mock-server. */\n scenario?: MockScenarioHandle;\n}\n\nexport type BootedMockServerHandle = MockServerHandle & { scenario: MockScenarioHandle };\n\nexport interface PrincipalMappingEntry {\n adcpField: string;\n adcpValue: string;\n upstreamField: string;\n upstreamValue: string;\n}\n\n/**\n * Boot a mock upstream platform for the given specialism. Returns a handle\n * the caller (CLI or matrix harness) uses to read connection details and\n * shut down cleanly.\n *\n * Adding a new specialism means adding the upstream-shape OpenAPI + seed\n * data + boot function under `src/lib/mock-server/<specialism>/` and a\n * switch case here.\n */\nexport async function bootMockServer(options: MockServerOptions): Promise<BootedMockServerHandle> {\n switch (options.specialism) {\n case 'signal-marketplace': {\n const { url, close, scenario } = await bootSignalMarketplace({\n port: options.port,\n apiKey: options.apiKey,\n });\n const apiKey = options.apiKey ?? SIGNAL_MARKETPLACE_DEFAULT_API_KEY;\n return {\n url,\n auth: { kind: 'static_bearer', apiKey },\n close,\n scenario,\n summary: () => formatSignalMarketplaceSummary(url, apiKey),\n principalScope: 'X-Operator-Id header (required on every request)',\n principalMapping: OPERATORS.map(op => ({\n adcpField: 'account.operator',\n adcpValue: op.adcp_operator,\n upstreamField: 'X-Operator-Id',\n upstreamValue: op.operator_id,\n })),\n };\n }\n case 'creative-ad-server': {\n const { url, close, scenario } = await bootCreativeAdServer({\n port: options.port,\n apiKey: options.apiKey,\n });\n const apiKey = options.apiKey ?? CREATIVE_AD_SERVER_DEFAULT_API_KEY;\n return {\n url,\n auth: { kind: 'static_bearer', apiKey },\n close,\n scenario,\n summary: () => formatCreativeAdServerSummary(url, apiKey),\n principalScope: 'X-Network-Code header (required on every request)',\n principalMapping: CREATIVE_AD_SERVER_NETWORKS.map(net => ({\n adcpField: 'account.publisher',\n adcpValue: net.adcp_publisher,\n upstreamField: 'X-Network-Code',\n upstreamValue: net.network_code,\n })),\n };\n }\n case 'creative-template': {\n const { url, close, scenario } = await bootCreativeTemplate({\n port: options.port,\n apiKey: options.apiKey,\n });\n const apiKey = options.apiKey ?? CREATIVE_TEMPLATE_DEFAULT_API_KEY;\n return {\n url,\n auth: { kind: 'static_bearer', apiKey },\n close,\n scenario,\n summary: () => formatCreativeTemplateSummary(url, apiKey),\n principalScope: 'URL path segment /v3/workspaces/{workspace_id}/...',\n principalMapping: WORKSPACES.map(ws => ({\n adcpField: 'account.advertiser',\n adcpValue: ws.adcp_advertiser,\n upstreamField: 'path /v3/workspaces/{workspace_id}/',\n upstreamValue: ws.workspace_id,\n })),\n };\n }\n case 'sales-social': {\n const { url, close, scenario } = await bootSalesSocial({ port: options.port });\n const client = OAUTH_CLIENTS[0];\n if (!client) throw new Error('sales-social: no OAuth clients seeded');\n return {\n url,\n auth: {\n kind: 'oauth_client_credentials',\n clientId: client.client_id,\n clientSecret: client.client_secret,\n tokenPath: '/oauth/token',\n },\n close,\n scenario,\n summary: () => formatSalesSocialSummary(url, client),\n principalScope: 'URL path segment /v1.3/advertiser/{advertiser_id}/...',\n principalMapping: ADVERTISERS.map(adv => ({\n adcpField: 'account.advertiser',\n adcpValue: adv.adcp_advertiser,\n upstreamField: 'path /v1.3/advertiser/{advertiser_id}/',\n upstreamValue: adv.advertiser_id,\n })),\n };\n }\n case 'sales-guaranteed': {\n const { url, close, scenario } = await bootSalesGuaranteed({\n port: options.port,\n apiKey: options.apiKey,\n });\n const apiKey = options.apiKey ?? SALES_GUARANTEED_DEFAULT_API_KEY;\n return {\n url,\n auth: { kind: 'static_bearer', apiKey },\n close,\n scenario,\n summary: () => formatSalesGuaranteedSummary(url, apiKey),\n principalScope: 'X-Network-Code header (required on every request)',\n principalMapping: SALES_GUARANTEED_NETWORKS.map(net => ({\n adcpField: 'account.publisher',\n adcpValue: net.adcp_publisher,\n upstreamField: 'X-Network-Code',\n upstreamValue: net.network_code,\n })),\n };\n }\n case 'sponsored-intelligence': {\n const { url, close, scenario } = await bootSponsoredIntelligence({\n port: options.port,\n apiKey: options.apiKey,\n });\n const apiKey = options.apiKey ?? SI_DEFAULT_API_KEY;\n return {\n url,\n auth: { kind: 'static_bearer', apiKey },\n close,\n scenario,\n summary: () => formatSponsoredIntelligenceSummary(url, apiKey),\n principalScope: 'URL path segment /v1/brands/{brand_id}/...',\n principalMapping: SI_BRANDS.map(b => ({\n adcpField: 'account.brand',\n adcpValue: b.adcp_brand,\n upstreamField: 'path /v1/brands/{brand_id}/',\n upstreamValue: b.brand_id,\n })),\n };\n }\n case 'sales-non-guaranteed': {\n const { url, close, scenario } = await bootSalesNonGuaranteed({\n port: options.port,\n apiKey: options.apiKey,\n });\n const apiKey = options.apiKey ?? SALES_NON_GUARANTEED_DEFAULT_API_KEY;\n return {\n url,\n auth: { kind: 'static_bearer', apiKey },\n close,\n scenario,\n summary: () => formatSalesNonGuaranteedSummary(url, apiKey),\n principalScope: 'X-Network-Code header (required on every request)',\n principalMapping: SALES_NON_GUARANTEED_NETWORKS.map(net => ({\n adcpField: 'account.publisher',\n adcpValue: net.adcp_publisher,\n upstreamField: 'X-Network-Code',\n upstreamValue: net.network_code,\n })),\n };\n }\n default:\n throw new Error(\n `Unknown mock-server specialism: \"${options.specialism}\". Supported: signal-marketplace, creative-ad-server, creative-template, sales-social, sales-guaranteed, sales-non-guaranteed, sponsored-intelligence.`\n );\n }\n}\n\nfunction formatSignalMarketplaceSummary(url: string, apiKey: string): string {\n const operatorLines = OPERATORS.map(\n op =>\n ` ${op.operator_id} → AdCP account.operator: \"${op.adcp_operator}\" (visible cohorts: ${op.visible_cohort_ids.length})`\n ).join('\\n');\n return [\n `Mock signal marketplace running at ${url}`,\n ``,\n `Auth:`,\n ` Authorization: Bearer ${apiKey}`,\n ` X-Operator-Id: <operator_id> (required on every call)`,\n ``,\n `Operator mapping:`,\n operatorLines,\n ``,\n scenarioControlLine(url),\n ``,\n `OpenAPI spec: src/lib/mock-server/signal-marketplace/openapi.yaml`,\n `Routes:`,\n ` GET ${url}/v2/cohorts`,\n ` GET ${url}/v2/cohorts/{cohort_id}`,\n ` GET ${url}/v2/destinations`,\n ` POST ${url}/v2/activations`,\n ` GET ${url}/v2/activations/{activation_id}`,\n ].join('\\n');\n}\n\nfunction formatCreativeTemplateSummary(url: string, apiKey: string): string {\n const workspaceLines = WORKSPACES.map(\n ws =>\n ` ${ws.workspace_id} → AdCP account.advertiser: \"${ws.adcp_advertiser}\" (visible templates: ${ws.visible_template_ids.length})`\n ).join('\\n');\n return [\n `Mock creative-template platform running at ${url}`,\n ``,\n `Auth:`,\n ` Authorization: Bearer ${apiKey}`,\n ` Workspace scoping via URL path: /v3/workspaces/{workspace_id}/...`,\n ``,\n `Workspace mapping:`,\n workspaceLines,\n ``,\n scenarioControlLine(url),\n ``,\n `OpenAPI spec: src/lib/mock-server/creative-template/openapi.yaml`,\n `Routes:`,\n ` GET ${url}/v3/workspaces/{ws}/templates`,\n ` GET ${url}/v3/workspaces/{ws}/templates/{template_id}`,\n ` POST ${url}/v3/workspaces/{ws}/renders`,\n ` GET ${url}/v3/workspaces/{ws}/renders/{render_id}`,\n ``,\n `Renders are async: POST returns 202 with status=\"queued\", then progresses`,\n `through \"running\" → \"complete\" on subsequent GETs (or \"failed\" on error).`,\n ].join('\\n');\n}\n\nfunction formatSalesSocialSummary(url: string, client: { client_id: string; client_secret: string }): string {\n return [\n `Mock social platform (TikTok-flavored) running at ${url}`,\n ``,\n `Auth (OAuth 2.0 client_credentials):`,\n ` Token endpoint: POST ${url}/oauth/token`,\n ` client_id: ${client.client_id}`,\n ` client_secret: ${client.client_secret}`,\n ` Then attach the issued access_token as Authorization: Bearer <token>`,\n ` Refresh via same endpoint with grant_type=refresh_token (token rotation on use).`,\n ``,\n `Path-scoped multi-tenancy: /v1.3/advertiser/{advertiser_id}/...`,\n `Resolve {advertiser_id} from AdCP-side identifier at runtime via:`,\n ` GET ${url}/_lookup/advertiser?adcp_advertiser=<adcp-side-value>`,\n `(Specific advertiser values are not exposed to adapters — see issue #1225.)`,\n ``,\n scenarioControlLine(url),\n ``,\n `OpenAPI spec: src/lib/mock-server/sales-social/openapi.yaml`,\n `Key routes:`,\n ` POST ${url}/oauth/token (no auth)`,\n ` GET ${url}/_lookup/advertiser?adcp_advertiser=<value> (no auth)`,\n ` GET ${url}/_debug/traffic (no auth)`,\n ` GET ${url}/v1.3/advertiser/{advertiser_id}/info`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/custom_audience/create`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/custom_audience/upload (hashed PII)`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/catalog/create`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/catalog/upload`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/creative/create`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/pixel/create`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/event/track (CAPI)`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/delivery_estimate (forward + reverse forecast)`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/audience_reach_estimate`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/audience/{aud}/lookalike`,\n ].join('\\n');\n}\n\nfunction formatSponsoredIntelligenceSummary(url: string, apiKey: string): string {\n const brandLines = SI_BRANDS.map(\n b =>\n ` ${b.brand_id} → AdCP account.brand: \"${b.adcp_brand}\" (offerings: ${b.visible_offering_ids.length}, session_ttl: ${b.session_ttl_seconds}s)`\n ).join('\\n');\n return [\n `Mock sponsored-intelligence brand-agent platform running at ${url}`,\n ``,\n `Auth:`,\n ` Authorization: Bearer ${apiKey}`,\n ` Brand scoping via URL path: /v1/brands/{brand_id}/...`,\n ``,\n `Brand mapping:`,\n brandLines,\n ``,\n scenarioControlLine(url),\n ``,\n `OpenAPI spec: src/lib/mock-server/sponsored-intelligence/openapi.yaml`,\n `Routes:`,\n ` GET ${url}/_lookup/brand?adcp_brand=<value> (no auth)`,\n ` GET ${url}/_debug/traffic (no auth)`,\n ` GET ${url}/v1/brands/{brand}/offerings/{offering_id} # si_get_offering`,\n ` POST ${url}/v1/brands/{brand}/conversations # si_initiate_session`,\n ` GET ${url}/v1/brands/{brand}/conversations/{conv_id} # read state`,\n ` POST ${url}/v1/brands/{brand}/conversations/{conv_id}/turns # si_send_message`,\n ` POST ${url}/v1/brands/{brand}/conversations/{conv_id}/close # si_terminate_session`,\n ``,\n `Conversation lifecycle: active → closed (terminal). Re-closing returns the`,\n `same payload — naturally idempotent on conversation_id, mirroring AdCP's`,\n `decision to omit idempotency_key on si_terminate_session. POST /conversations`,\n `and POST /turns each accept client_request_id for at-most-once execution.`,\n `Brand \"agent\" routes user messages by keyword (buy/checkout → transaction`,\n `handoff hint, thanks/bye → complete hint) — deterministic for fixtures.`,\n ].join('\\n');\n}\n\nfunction formatSalesGuaranteedSummary(url: string, apiKey: string): string {\n const networkLines = SALES_GUARANTEED_NETWORKS.map(\n net => ` ${net.network_code} → AdCP account.publisher: \"${net.adcp_publisher}\"`\n ).join('\\n');\n return [\n `Mock guaranteed-sales platform (GAM-flavored) running at ${url}`,\n ``,\n `Auth:`,\n ` Authorization: Bearer ${apiKey}`,\n ` X-Network-Code: <network_code> (required on every call)`,\n ``,\n `Network mapping:`,\n networkLines,\n ``,\n scenarioControlLine(url),\n ``,\n `OpenAPI spec: src/lib/mock-server/sales-guaranteed/openapi.yaml`,\n `Key routes:`,\n ` GET ${url}/v1/inventory # ad units`,\n ` GET ${url}/v1/products # productized inventory`,\n ` GET ${url}/v1/products?targeting=…&flight_start=…&budget=… # products with per-query forecast`,\n ` POST ${url}/v1/forecast # GAM-style getDeliveryForecast`,\n ` POST ${url}/v1/availability # multi-item availability dry-run`,\n ` POST ${url}/v1/proposals # create draft proposal from brief`,\n ` GET ${url}/v1/proposals/{proposal_id} # read state`,\n ` POST ${url}/v1/proposals/{proposal_id}/refine # mutate allocations (draft only)`,\n ` POST ${url}/v1/proposals/{proposal_id}/finalize # lock pricing + reserve inventory`,\n ` GET ${url}/v1/orders # list orders`,\n ` POST ${url}/v1/orders # create (returns pending_approval + task_id)`,\n ` GET ${url}/v1/orders/{order_id} # poll order status`,\n ` POST ${url}/v1/orders/{order_id}/lineitems # add line items`,\n ` POST ${url}/v1/orders/{order_id}/lineitems/{li}/creative-attach # attach creative`,\n ` GET ${url}/v1/orders/{order_id}/delivery # delivery reporting`,\n ` POST ${url}/v1/orders/{order_id}/conversions # CAPI delivery validation`,\n ` GET ${url}/v1/tasks/{task_id} # poll approval task`,\n ` GET ${url}/v1/creatives # list creatives`,\n ` POST ${url}/v1/creatives # upload creative`,\n ``,\n `Order state machine: draft → pending_approval → approved → delivering → completed`,\n `Approval is async: POST /orders returns pending_approval + approval_task_id;`,\n `poll /tasks/{id} (mock auto-promotes submitted → working → completed after 2 polls)`,\n `or poll /orders/{id} directly to detect transition.`,\n ].join('\\n');\n}\n\nfunction formatCreativeAdServerSummary(url: string, apiKey: string): string {\n const networkLines = CREATIVE_AD_SERVER_NETWORKS.map(\n net => ` ${net.network_code} → AdCP account.publisher: \"${net.adcp_publisher}\"`\n ).join('\\n');\n return [\n `Mock creative ad server (stateful library + tag generation) running at ${url}`,\n ``,\n `Auth:`,\n ` Authorization: Bearer ${apiKey}`,\n ` X-Network-Code: <network_code> (required on every /v1 call)`,\n ``,\n `Network mapping:`,\n networkLines,\n ``,\n scenarioControlLine(url),\n ``,\n `Key routes:`,\n ` GET ${url}/v1/formats # format catalog`,\n ` GET ${url}/v1/creatives # list (filter: advertiser_id, format_id, status, created_after, creative_ids; cursor pagination)`,\n ` POST ${url}/v1/creatives # write to library; format auto-detect from upload_mime if format_id omitted`,\n ` GET ${url}/v1/creatives/{id} # single fetch`,\n ` PATCH ${url}/v1/creatives/{id} # update snippet/status/click_url/name`,\n ` POST ${url}/v1/creatives/{id}/render # tag generation; macro substitution; returns tag_html + tag_url`,\n ` GET ${url}/v1/creatives/{id}/delivery?start=&end= # synth impressions/clicks; CTR baselines per format`,\n ` GET ${url}/serve/{id}?ctx=<json> # real iframe-embeddable HTML (no auth — capability-by-id)`,\n ``,\n `Macros substituted at render time: {click_url}, {impression_pixel}, {cb},`,\n `{advertiser_id}, {creative_id}, {asset_url}, {width}, {height}, {duration_seconds}.`,\n `CTR baselines: display ~0.10%, video ~1.5%, ctv ~3%, audio ~0.5%.`,\n ].join('\\n');\n}\n\nfunction formatSalesNonGuaranteedSummary(url: string, apiKey: string): string {\n const networkLines = SALES_NON_GUARANTEED_NETWORKS.map(\n net => ` ${net.network_code} → AdCP account.publisher: \"${net.adcp_publisher}\"`\n ).join('\\n');\n return [\n `Mock non-guaranteed-sales platform (programmatic remnant) running at ${url}`,\n ``,\n `Auth:`,\n ` Authorization: Bearer ${apiKey}`,\n ` X-Network-Code: <network_code> (required on every call)`,\n ``,\n `Network mapping:`,\n networkLines,\n ``,\n scenarioControlLine(url),\n ``,\n `Key routes:`,\n ` GET ${url}/v1/inventory # ad units`,\n ` GET ${url}/v1/products # productized inventory (floor pricing)`,\n ` GET ${url}/v1/products?targeting=…&flight_start=…&budget=… # products with per-query forecast`,\n ` POST ${url}/v1/forecast # spend-only forecast (auction-clearing)`,\n ` GET ${url}/v1/orders # list orders`,\n ` POST ${url}/v1/orders # create (sync confirmed — no HITL)`,\n ` GET ${url}/v1/orders/{order_id} # read order`,\n ` PATCH ${url}/v1/orders/{order_id} # update budget / pacing / status`,\n ` POST ${url}/v1/orders/{order_id}/lineitems # add line items`,\n ` GET ${url}/v1/orders/{order_id}/delivery # delivery (budget × pacing curve)`,\n ` GET ${url}/v1/creatives # list creatives`,\n ` POST ${url}/v1/creatives # upload creative`,\n ``,\n `Order state machine: confirmed → delivering → completed (no approval task).`,\n `Pricing: per-product min_cpm (floor); effective_cpm scales with budget,`,\n `saturating toward 2× floor at high budgets (auction pressure model).`,\n `Pacing: 'even' (linear), 'asap' (3× front-load), 'front_loaded' (sqrt curve).`,\n `Delivery synthesis: (budget × elapsed_pct × pacing_curve) → impressions / clicks.`,\n ].join('\\n');\n}\n\nfunction scenarioControlLine(url: string): string {\n return `Scenario controls: ${url}/_scenario/* (requires X-Mock-Control-Token from handle.scenario.controlToken)`;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/mock-server/index.ts"],"sourcesContent":["import { bootCreativeAdServer } from './creative-ad-server/server';\nimport {\n DEFAULT_API_KEY as CREATIVE_AD_SERVER_DEFAULT_API_KEY,\n NETWORKS as CREATIVE_AD_SERVER_NETWORKS,\n} from './creative-ad-server/seed-data';\nimport { bootCreativeTemplate } from './creative-template/server';\nimport { DEFAULT_API_KEY as CREATIVE_TEMPLATE_DEFAULT_API_KEY, WORKSPACES } from './creative-template/seed-data';\nimport { bootSalesGuaranteed } from './sales-guaranteed/server';\nimport {\n DEFAULT_API_KEY as SALES_GUARANTEED_DEFAULT_API_KEY,\n NETWORKS as SALES_GUARANTEED_NETWORKS,\n} from './sales-guaranteed/seed-data';\nimport { bootSalesNonGuaranteed } from './sales-non-guaranteed/server';\nimport {\n DEFAULT_API_KEY as SALES_NON_GUARANTEED_DEFAULT_API_KEY,\n NETWORKS as SALES_NON_GUARANTEED_NETWORKS,\n} from './sales-non-guaranteed/seed-data';\nimport { bootSalesSocial } from './sales-social/server';\nimport { ADVERTISERS, OAUTH_CLIENTS } from './sales-social/seed-data';\nimport { bootSignalMarketplace } from './signal-marketplace/server';\nimport { DEFAULT_API_KEY as SIGNAL_MARKETPLACE_DEFAULT_API_KEY, OPERATORS } from './signal-marketplace/seed-data';\nimport { bootSponsoredIntelligence } from './sponsored-intelligence/server';\nimport { BRANDS as SI_BRANDS, DEFAULT_API_KEY as SI_DEFAULT_API_KEY } from './sponsored-intelligence/seed-data';\nimport type { MockScenarioHandle } from './scenario';\n\n// Canonical Recipe shapes per specialism — adopters wrapping these\n// upstream mocks build their hello-agent's `Product.implementation_config`\n// from these helpers. The recipe is the typed contract between the\n// adapter's ProposalManager and DecisioningPlatform; exporting the\n// canonical shapes from here means hello agents and storyboard fixtures\n// share one definition.\nexport { buildGAMLikeRecipe, GAM_LIKE_OVERLAP, type GAMLikeRecipe } from './sales-guaranteed/recipe';\nexport { buildAuctionLikeRecipe, AUCTION_LIKE_OVERLAP, type AuctionLikeRecipe } from './sales-non-guaranteed/recipe';\nexport {\n MockIdempotencyReplayStore,\n createMockScenarioController,\n idempotencyKeyFromBody,\n stableFingerprint,\n writeCachedResponse,\n type CachedIdempotentResponse,\n type MockScenarioHandle,\n type MockScenarioScriptInput,\n type MockScenarioState,\n type MockScenarioWebhookAttempt,\n} from './scenario';\n\nexport interface MockServerOptions {\n specialism: string;\n port: number;\n apiKey?: string;\n}\n\n/**\n * How an adapter authenticates with the upstream mock. Specialism mocks\n * advertise one of these so the matrix harness can build the right\n * adapter-prompt section.\n */\nexport type MockServerAuth =\n | {\n kind: 'static_bearer';\n /** Bearer token attached on every API call. */\n apiKey: string;\n }\n | {\n kind: 'oauth_client_credentials';\n /** OAuth `client_id` for the `client_credentials` grant. */\n clientId: string;\n /** OAuth `client_secret` paired with `clientId`. */\n clientSecret: string;\n /** Path to the OAuth token endpoint relative to the mock URL,\n * e.g. `/oauth/token`. Adapters POST `grant_type=client_credentials`\n * with the client_id/secret to receive an access_token, then attach\n * it as Bearer on subsequent API calls. Token expires after\n * `expires_in` seconds (mock returns this in the token response);\n * adapters refresh via the same endpoint with `grant_type=refresh_token`. */\n tokenPath: string;\n };\n\nexport interface MockServerHandle {\n url: string;\n /** Auth shape this mock requires. The matrix harness branches on\n * `auth.kind` when building the adapter prompt — different shapes\n * produce different adapter-side wiring. */\n auth: MockServerAuth;\n close: () => Promise<void>;\n /** Adopter-friendly summary for boot-log printing. */\n summary: () => string;\n /** Specialism-agnostic principal-mapping table the matrix harness inlines\n * into the build prompt so Claude can wire AdCP-side identity to upstream\n * tenant/workspace ids without re-deriving them per specialism. */\n principalMapping: PrincipalMappingEntry[];\n /** Human-prose description of how the upstream gates per-tenant scope —\n * e.g. \"via X-Operator-Id header\" or \"via path /v3/workspaces/{id}/...\".\n * Surfaces in the harness prompt to make the auth-translation requirement\n * explicit. */\n principalScope: string;\n /** Scenario controller for storyboards and fault-injection harnesses.\n * Booted handles always include this; optional for structural test doubles.\n * Also exposed over HTTP at `/_scenario/*` on every mock-server. */\n scenario?: MockScenarioHandle;\n}\n\nexport type BootedMockServerHandle = MockServerHandle & { scenario: MockScenarioHandle };\n\nexport interface PrincipalMappingEntry {\n adcpField: string;\n adcpValue: string;\n upstreamField: string;\n upstreamValue: string;\n}\n\n/**\n * Boot a mock upstream platform for the given specialism. Returns a handle\n * the caller (CLI or matrix harness) uses to read connection details and\n * shut down cleanly.\n *\n * Adding a new specialism means adding the upstream-shape OpenAPI + seed\n * data + boot function under `src/lib/mock-server/<specialism>/` and a\n * switch case here.\n */\nexport async function bootMockServer(options: MockServerOptions): Promise<BootedMockServerHandle> {\n switch (options.specialism) {\n case 'signal-marketplace': {\n const { url, close, scenario } = await bootSignalMarketplace({\n port: options.port,\n apiKey: options.apiKey,\n });\n const apiKey = options.apiKey ?? SIGNAL_MARKETPLACE_DEFAULT_API_KEY;\n return {\n url,\n auth: { kind: 'static_bearer', apiKey },\n close,\n scenario,\n summary: () => formatSignalMarketplaceSummary(url, apiKey),\n principalScope: 'X-Operator-Id header (required on every request)',\n principalMapping: OPERATORS.map(op => ({\n adcpField: 'account.operator',\n adcpValue: op.adcp_operator,\n upstreamField: 'X-Operator-Id',\n upstreamValue: op.operator_id,\n })),\n };\n }\n case 'creative-ad-server': {\n const { url, close, scenario } = await bootCreativeAdServer({\n port: options.port,\n apiKey: options.apiKey,\n });\n const apiKey = options.apiKey ?? CREATIVE_AD_SERVER_DEFAULT_API_KEY;\n return {\n url,\n auth: { kind: 'static_bearer', apiKey },\n close,\n scenario,\n summary: () => formatCreativeAdServerSummary(url, apiKey),\n principalScope: 'X-Network-Code header (required on every request)',\n principalMapping: CREATIVE_AD_SERVER_NETWORKS.map(net => ({\n adcpField: 'account.publisher',\n adcpValue: net.adcp_publisher,\n upstreamField: 'X-Network-Code',\n upstreamValue: net.network_code,\n })),\n };\n }\n case 'creative-template': {\n const { url, close, scenario } = await bootCreativeTemplate({\n port: options.port,\n apiKey: options.apiKey,\n });\n const apiKey = options.apiKey ?? CREATIVE_TEMPLATE_DEFAULT_API_KEY;\n return {\n url,\n auth: { kind: 'static_bearer', apiKey },\n close,\n scenario,\n summary: () => formatCreativeTemplateSummary(url, apiKey),\n principalScope: 'URL path segment /v3/workspaces/{workspace_id}/...',\n principalMapping: WORKSPACES.map(ws => ({\n adcpField: 'account.advertiser',\n adcpValue: ws.adcp_advertiser,\n upstreamField: 'path /v3/workspaces/{workspace_id}/',\n upstreamValue: ws.workspace_id,\n })),\n };\n }\n case 'sales-social': {\n const { url, close, scenario } = await bootSalesSocial({ port: options.port });\n const client = OAUTH_CLIENTS[0];\n if (!client) throw new Error('sales-social: no OAuth clients seeded');\n return {\n url,\n auth: {\n kind: 'oauth_client_credentials',\n clientId: client.client_id,\n clientSecret: client.client_secret,\n tokenPath: '/oauth/token',\n },\n close,\n scenario,\n summary: () => formatSalesSocialSummary(url, client),\n principalScope: 'URL path segment /v1.3/advertiser/{advertiser_id}/...',\n principalMapping: ADVERTISERS.map(adv => ({\n adcpField: 'account.advertiser',\n adcpValue: adv.adcp_advertiser,\n upstreamField: 'path /v1.3/advertiser/{advertiser_id}/',\n upstreamValue: adv.advertiser_id,\n })),\n };\n }\n case 'sales-guaranteed': {\n const { url, close, scenario } = await bootSalesGuaranteed({\n port: options.port,\n apiKey: options.apiKey,\n });\n const apiKey = options.apiKey ?? SALES_GUARANTEED_DEFAULT_API_KEY;\n return {\n url,\n auth: { kind: 'static_bearer', apiKey },\n close,\n scenario,\n summary: () => formatSalesGuaranteedSummary(url, apiKey),\n principalScope: 'X-Network-Code header (required on every request)',\n principalMapping: SALES_GUARANTEED_NETWORKS.map(net => ({\n adcpField: 'account.publisher',\n adcpValue: net.adcp_publisher,\n upstreamField: 'X-Network-Code',\n upstreamValue: net.network_code,\n })),\n };\n }\n case 'sponsored-intelligence': {\n const { url, close, scenario } = await bootSponsoredIntelligence({\n port: options.port,\n apiKey: options.apiKey,\n });\n const apiKey = options.apiKey ?? SI_DEFAULT_API_KEY;\n return {\n url,\n auth: { kind: 'static_bearer', apiKey },\n close,\n scenario,\n summary: () => formatSponsoredIntelligenceSummary(url, apiKey),\n principalScope: 'URL path segment /v1/brands/{brand_id}/...',\n principalMapping: SI_BRANDS.map(b => ({\n adcpField: 'account.brand',\n adcpValue: b.adcp_brand,\n upstreamField: 'path /v1/brands/{brand_id}/',\n upstreamValue: b.brand_id,\n })),\n };\n }\n case 'sales-non-guaranteed': {\n const { url, close, scenario } = await bootSalesNonGuaranteed({\n port: options.port,\n apiKey: options.apiKey,\n });\n const apiKey = options.apiKey ?? SALES_NON_GUARANTEED_DEFAULT_API_KEY;\n return {\n url,\n auth: { kind: 'static_bearer', apiKey },\n close,\n scenario,\n summary: () => formatSalesNonGuaranteedSummary(url, apiKey),\n principalScope: 'X-Network-Code header (required on every request)',\n principalMapping: SALES_NON_GUARANTEED_NETWORKS.map(net => ({\n adcpField: 'account.publisher',\n adcpValue: net.adcp_publisher,\n upstreamField: 'X-Network-Code',\n upstreamValue: net.network_code,\n })),\n };\n }\n default:\n throw new Error(\n `Unknown mock-server specialism: \"${options.specialism}\". Supported: signal-marketplace, creative-ad-server, creative-template, sales-social, sales-guaranteed, sales-non-guaranteed, sponsored-intelligence.`\n );\n }\n}\n\nfunction formatSignalMarketplaceSummary(url: string, apiKey: string): string {\n const operatorLines = OPERATORS.map(\n op =>\n ` ${op.operator_id} → AdCP account.operator: \"${op.adcp_operator}\" (visible cohorts: ${op.visible_cohort_ids.length})`\n ).join('\\n');\n return [\n `Mock signal marketplace running at ${url}`,\n ``,\n `Auth:`,\n ` Authorization: Bearer ${apiKey}`,\n ` X-Operator-Id: <operator_id> (required on every call)`,\n ``,\n `Operator mapping:`,\n operatorLines,\n ``,\n scenarioControlLine(url),\n ``,\n `OpenAPI spec: src/lib/mock-server/signal-marketplace/openapi.yaml`,\n `Routes:`,\n ` GET ${url}/v2/cohorts`,\n ` GET ${url}/v2/cohorts/{cohort_id}`,\n ` GET ${url}/v2/destinations`,\n ` POST ${url}/v2/activations`,\n ` GET ${url}/v2/activations/{activation_id}`,\n ].join('\\n');\n}\n\nfunction formatCreativeTemplateSummary(url: string, apiKey: string): string {\n const workspaceLines = WORKSPACES.map(\n ws =>\n ` ${ws.workspace_id} → AdCP account.advertiser: \"${ws.adcp_advertiser}\" (visible templates: ${ws.visible_template_ids.length})`\n ).join('\\n');\n return [\n `Mock creative-template platform running at ${url}`,\n ``,\n `Auth:`,\n ` Authorization: Bearer ${apiKey}`,\n ` Workspace scoping via URL path: /v3/workspaces/{workspace_id}/...`,\n ``,\n `Workspace mapping:`,\n workspaceLines,\n ``,\n scenarioControlLine(url),\n ``,\n `OpenAPI spec: src/lib/mock-server/creative-template/openapi.yaml`,\n `Routes:`,\n ` GET ${url}/v3/workspaces/{ws}/templates`,\n ` GET ${url}/v3/workspaces/{ws}/templates/{template_id}`,\n ` POST ${url}/v3/workspaces/{ws}/renders`,\n ` GET ${url}/v3/workspaces/{ws}/renders/{render_id}`,\n ``,\n `Renders are async: POST returns 202 with status=\"queued\", then progresses`,\n `through \"running\" → \"complete\" on subsequent GETs (or \"failed\" on error).`,\n ].join('\\n');\n}\n\nfunction formatSalesSocialSummary(url: string, client: { client_id: string; client_secret: string }): string {\n return [\n `Mock social platform (TikTok-flavored) running at ${url}`,\n ``,\n `Auth (OAuth 2.0 client_credentials):`,\n ` Token endpoint: POST ${url}/oauth/token`,\n ` client_id: ${client.client_id}`,\n ` client_secret: ${client.client_secret}`,\n ` Then attach the issued access_token as Authorization: Bearer <token>`,\n ` Refresh via same endpoint with grant_type=refresh_token (token rotation on use).`,\n ``,\n `Path-scoped multi-tenancy: /v1.3/advertiser/{advertiser_id}/...`,\n `Resolve {advertiser_id} from AdCP-side identifier at runtime via:`,\n ` GET ${url}/_lookup/advertiser?adcp_advertiser=<adcp-side-value>`,\n `(Specific advertiser values are not exposed to adapters — see issue #1225.)`,\n ``,\n scenarioControlLine(url),\n ``,\n `OpenAPI spec: src/lib/mock-server/sales-social/openapi.yaml`,\n `Key routes:`,\n ` POST ${url}/oauth/token (no auth)`,\n ` GET ${url}/_lookup/advertiser?adcp_advertiser=<value> (no auth)`,\n ` GET ${url}/_debug/traffic (no auth)`,\n ` GET ${url}/v1.3/advertiser/{advertiser_id}/info`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/custom_audience/create`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/custom_audience/upload (hashed PII)`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/catalog/create`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/catalog/upload`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/creative/create`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/pixel/create`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/event/track (CAPI)`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/delivery_estimate (forward + reverse forecast)`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/audience_reach_estimate`,\n ` POST ${url}/v1.3/advertiser/{advertiser_id}/audience/{aud}/lookalike`,\n ].join('\\n');\n}\n\nfunction formatSponsoredIntelligenceSummary(url: string, apiKey: string): string {\n const brandLines = SI_BRANDS.map(\n b =>\n ` ${b.brand_id} → AdCP account.brand: \"${b.adcp_brand}\" (offerings: ${b.visible_offering_ids.length}, session_ttl: ${b.session_ttl_seconds}s)`\n ).join('\\n');\n return [\n `Mock sponsored-intelligence brand-agent platform running at ${url}`,\n ``,\n `Auth:`,\n ` Authorization: Bearer ${apiKey}`,\n ` Brand scoping via URL path: /v1/brands/{brand_id}/...`,\n ``,\n `Brand mapping:`,\n brandLines,\n ``,\n scenarioControlLine(url),\n ``,\n `OpenAPI spec: src/lib/mock-server/sponsored-intelligence/openapi.yaml`,\n `Routes:`,\n ` GET ${url}/_lookup/brand?adcp_brand=<value> (no auth)`,\n ` GET ${url}/_debug/traffic (no auth)`,\n ` GET ${url}/v1/brands/{brand}/offerings/{offering_id} # si_get_offering`,\n ` POST ${url}/v1/brands/{brand}/conversations # si_initiate_session`,\n ` GET ${url}/v1/brands/{brand}/conversations/{conv_id} # read state`,\n ` POST ${url}/v1/brands/{brand}/conversations/{conv_id}/turns # si_send_message`,\n ` POST ${url}/v1/brands/{brand}/conversations/{conv_id}/close # si_terminate_session`,\n ``,\n `Conversation lifecycle: active → closed (terminal). Re-closing returns the`,\n `same payload — naturally idempotent on conversation_id, mirroring AdCP's`,\n `decision to omit idempotency_key on si_terminate_session. POST /conversations`,\n `and POST /turns each accept client_request_id for at-most-once execution.`,\n `Brand \"agent\" routes user messages by keyword (buy/checkout → transaction`,\n `handoff hint, thanks/bye → complete hint) — deterministic for fixtures.`,\n ].join('\\n');\n}\n\nfunction formatSalesGuaranteedSummary(url: string, apiKey: string): string {\n const networkLines = SALES_GUARANTEED_NETWORKS.map(\n net => ` ${net.network_code} → AdCP account.publisher: \"${net.adcp_publisher}\"`\n ).join('\\n');\n return [\n `Mock guaranteed-sales platform (GAM-flavored) running at ${url}`,\n ``,\n `Auth:`,\n ` Authorization: Bearer ${apiKey}`,\n ` X-Network-Code: <network_code> (required on every call)`,\n ``,\n `Network mapping:`,\n networkLines,\n ``,\n scenarioControlLine(url),\n ``,\n `OpenAPI spec: src/lib/mock-server/sales-guaranteed/openapi.yaml`,\n `Key routes:`,\n ` GET ${url}/v1/inventory # ad units`,\n ` GET ${url}/v1/products # productized inventory`,\n ` GET ${url}/v1/products?targeting=…&flight_start=…&budget=… # products with per-query forecast`,\n ` POST ${url}/v1/forecast # GAM-style getDeliveryForecast`,\n ` POST ${url}/v1/availability # multi-item availability dry-run`,\n ` POST ${url}/v1/proposals # create draft proposal from brief`,\n ` GET ${url}/v1/proposals/{proposal_id} # read state`,\n ` POST ${url}/v1/proposals/{proposal_id}/refine # mutate allocations (draft only)`,\n ` POST ${url}/v1/proposals/{proposal_id}/finalize # lock pricing + reserve inventory`,\n ` GET ${url}/v1/orders # list orders`,\n ` POST ${url}/v1/orders # create (returns pending_approval + task_id)`,\n ` GET ${url}/v1/orders/{order_id} # poll order status`,\n ` POST ${url}/v1/orders/{order_id}/lineitems # add line items`,\n ` POST ${url}/v1/orders/{order_id}/lineitems/{li}/creative-attach # attach creative`,\n ` GET ${url}/v1/orders/{order_id}/delivery # delivery reporting`,\n ` POST ${url}/v1/orders/{order_id}/conversions # CAPI delivery validation`,\n ` GET ${url}/v1/tasks/{task_id} # poll approval task`,\n ` GET ${url}/v1/creatives # list creatives`,\n ` POST ${url}/v1/creatives # upload creative`,\n ``,\n `Order state machine: draft → pending_approval → approved → delivering → completed`,\n `Approval is async: POST /orders returns pending_approval + approval_task_id;`,\n `poll /tasks/{id} (mock auto-promotes submitted → working → completed after 2 polls)`,\n `or poll /orders/{id} directly to detect transition.`,\n ].join('\\n');\n}\n\nfunction formatCreativeAdServerSummary(url: string, apiKey: string): string {\n const networkLines = CREATIVE_AD_SERVER_NETWORKS.map(\n net => ` ${net.network_code} → AdCP account.publisher: \"${net.adcp_publisher}\"`\n ).join('\\n');\n return [\n `Mock creative ad server (stateful library + tag generation) running at ${url}`,\n ``,\n `Auth:`,\n ` Authorization: Bearer ${apiKey}`,\n ` X-Network-Code: <network_code> (required on every /v1 call)`,\n ``,\n `Network mapping:`,\n networkLines,\n ``,\n scenarioControlLine(url),\n ``,\n `Key routes:`,\n ` GET ${url}/v1/formats # format catalog`,\n ` GET ${url}/v1/creatives # list (filter: advertiser_id, format_id, status, created_after, creative_ids; cursor pagination)`,\n ` POST ${url}/v1/creatives # write to library; format auto-detect from upload_mime if format_id omitted`,\n ` GET ${url}/v1/creatives/{id} # single fetch`,\n ` PATCH ${url}/v1/creatives/{id} # update snippet/status/click_url/name`,\n ` POST ${url}/v1/creatives/{id}/render # tag generation; macro substitution; returns tag_html + tag_url`,\n ` GET ${url}/v1/creatives/{id}/delivery?start=&end= # synth impressions/clicks; CTR baselines per format`,\n ` GET ${url}/serve/{id}?ctx=<json> # real iframe-embeddable HTML (no auth — capability-by-id)`,\n ``,\n `Macros substituted at render time: {click_url}, {impression_pixel}, {cb},`,\n `{advertiser_id}, {creative_id}, {asset_url}, {width}, {height}, {duration_seconds}.`,\n `CTR baselines: display ~0.10%, video ~1.5%, ctv ~3%, audio ~0.5%.`,\n ].join('\\n');\n}\n\nfunction formatSalesNonGuaranteedSummary(url: string, apiKey: string): string {\n const networkLines = SALES_NON_GUARANTEED_NETWORKS.map(\n net => ` ${net.network_code} → AdCP account.publisher: \"${net.adcp_publisher}\"`\n ).join('\\n');\n return [\n `Mock non-guaranteed-sales platform (programmatic remnant) running at ${url}`,\n ``,\n `Auth:`,\n ` Authorization: Bearer ${apiKey}`,\n ` X-Network-Code: <network_code> (required on every call)`,\n ``,\n `Network mapping:`,\n networkLines,\n ``,\n scenarioControlLine(url),\n ``,\n `Key routes:`,\n ` GET ${url}/v1/inventory # ad units`,\n ` GET ${url}/v1/products # productized inventory (floor pricing)`,\n ` GET ${url}/v1/products?targeting=…&flight_start=…&budget=… # products with per-query forecast`,\n ` POST ${url}/v1/forecast # spend-only forecast (auction-clearing)`,\n ` GET ${url}/v1/orders # list orders`,\n ` POST ${url}/v1/orders # create (sync confirmed — no HITL)`,\n ` GET ${url}/v1/orders/{order_id} # read order`,\n ` PATCH ${url}/v1/orders/{order_id} # update budget / pacing / status`,\n ` POST ${url}/v1/orders/{order_id}/lineitems # add line items`,\n ` GET ${url}/v1/orders/{order_id}/delivery # delivery (budget × pacing curve)`,\n ` GET ${url}/v1/creatives # list creatives`,\n ` POST ${url}/v1/creatives # upload creative`,\n ``,\n `Order state machine: confirmed → delivering → completed (no approval task).`,\n `Pricing: per-product min_cpm (floor); effective_cpm scales with budget,`,\n `saturating toward 2× floor at high budgets (auction pressure model).`,\n `Pacing: 'even' (linear), 'asap' (3× front-load), 'front_loaded' (sqrt curve).`,\n `Delivery synthesis: (budget × elapsed_pct × pacing_curve) → impressions / clicks.`,\n ].join('\\n');\n}\n\nfunction scenarioControlLine(url: string): string {\n return `Scenario controls: ${url}/_scenario/* (requires X-Mock-Control-Token from handle.scenario.controlToken)`;\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 GAM_LIKE_OVERLAP = {
8
2
  pricingModels: /* @__PURE__ */ new Set(["cpm", "cpv", "cpcv"]),
9
3
  deliveryTypes: /* @__PURE__ */ new Set(["guaranteed", "non_guaranteed"]),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/mock-server/sales-guaranteed/recipe.ts"],"sourcesContent":["/**\n * `GAMLikeRecipe` — canonical {@link Recipe} shape for hello adapters\n * wrapping the `sales-guaranteed` mock-server upstream.\n *\n * The recipe is the contract between the {@link ProposalManager} and the\n * {@link DecisioningPlatform}: the manager emits products with this\n * recipe attached to `Product.implementation_config`; the framework\n * persists the recipe through the proposal lifecycle; at\n * `create_media_buy` time, `ctx.recipes` carries the recipe back to the\n * adapter's `sales` methods, where it drives the upstream line-item\n * creation call.\n *\n * **Why \"GAM-like\"?** This shape mirrors the canonical fields a Google\n * Ad Manager-style upstream needs: ad units to target, line-item\n * priority, frequency capping, fixed pricing. Adopters wrapping GAM,\n * FreeWheel, Operative, Xandr Monetize, or any direct-sold guaranteed\n * inventory platform map their native fields onto this shape with\n * minimal translation. Adopters wrapping a different platform family\n * declare their own `recipe_kind` literal; the multi-decisioning\n * framework dispatches by `recipe_kind`.\n *\n * **The recipe is NOT on the buyer's wire surface.** It rides inside\n * `Product.implementation_config` (an opaque-to-buyer dict). Buyers\n * treat it as a black box.\n *\n * @public\n * @packageDocumentation\n */\n\nimport type { CapabilityOverlap, Recipe } from '../../server/decisioning/proposal';\nimport type { MockProduct } from './seed-data';\n\n/**\n * Canonical recipe for hello adapters wrapping a GAM-style guaranteed\n * sales upstream. Adopters subclass / extend this if their backend\n * needs additional fields (e.g. `roadblock_settings`, `creative_rotation_mode`).\n *\n * @public\n */\nexport interface GAMLikeRecipe extends Recipe {\n recipe_kind: 'gam';\n\n /** Upstream tenant — the publisher's GAM network code. */\n network_code: string;\n\n /**\n * Ad units this product targets in the upstream. Mirrors GAM\n * `LineItem.targeting.inventoryTargeting.targetedAdUnitIds`.\n */\n ad_unit_ids: readonly string[];\n\n /**\n * Line-item priority in the upstream's auction graph. GAM convention:\n *\n * - `4`–`6`: sponsorship / unsold-house\n * - `7`–`9`: standard guaranteed (default for `'guaranteed'` delivery)\n * - `10`–`12`: standard non-guaranteed / network\n * - `13`–`16`: bulk / price-priority\n *\n * Hello adapter defaults: `8` for guaranteed, `12` for non-guaranteed.\n */\n line_item_priority: number;\n\n /**\n * Pricing the upstream will book at. Adopter's `finalizeProposal`\n * locks these values; pre-finalize they're indicative. Lowercase\n * values match the AdCP wire `pricing_model` enum so the framework's\n * `overlap ⊆ wire` validation accepts the recipe.\n */\n pricing: {\n pricing_model: 'cpm' | 'cpv' | 'cpcv' | 'cpc';\n rate: number;\n currency: string;\n };\n\n delivery_type: 'guaranteed' | 'non_guaranteed';\n\n /**\n * Inventory hold window the upstream reserved at finalize time. Empty\n * pre-finalize (draft proposals don't reserve inventory).\n */\n availability_window?: {\n start_date: string;\n end_date: string;\n /** Reserved impressions count from the upstream's getAvailabilityForecast. */\n reserved_impressions?: number;\n };\n\n /** Optional minimum spend threshold the upstream enforces. */\n min_spend?: number;\n\n /**\n * Native upstream identifiers populated post-finalize. Empty pre-\n * finalize (the upstream allocates these on commit).\n */\n upstream_ids?: {\n /** Upstream proposal id (the seller's bookable plan). */\n proposal_id?: string;\n /** Per-package line-item template id; the adapter uses this to\n * create the bookable line item at `create_media_buy` time. */\n line_item_template_id?: string;\n };\n\n /**\n * Adopter-extension slot for upstream-specific fields the canonical\n * shape doesn't enumerate — `creative_placeholders` (size + companion\n * bundles), `custom_targeting` (key-values, dayparting), GAM\n * `roadblock_settings`, FreeWheel `placement_types`, Operative\n * `revenue_type`, etc. Adopters carrying richer payloads use this\n * slot rather than forking `recipe_kind: 'gam'` into N variants.\n * Opaque to the framework; sharper-typed adopters can declare a\n * subtype literal `recipe_kind: 'gam-myco'` with a typed `extensions`.\n *\n * **MUST NOT carry credentials** (service-account JSON, OAuth refresh\n * tokens, HMAC secrets). The framework strips the entire\n * `implementation_config` envelope from buyer-facing wire responses,\n * so credentials here are protected *by coincidence of strip*, not by\n * a credential scan. Re-derive credentials per request from\n * `ctx.authInfo` + your token cache; embed only non-secret upstream\n * identifiers here. Same hazard class as `ctx_metadata` and `ext` —\n * see `docs/guides/CTX-METADATA-SAFETY.md`.\n */\n extensions?: Record<string, unknown>;\n}\n\n/**\n * Maximum capability set a GAM-style upstream supports across its\n * product mix. Per-product `capability_overlap` is derived from this\n * intersected with the product's actual offering — see\n * {@link buildGAMLikeRecipe}'s overlap computation. Use this constant\n * directly only when you know the product accepts every axis.\n *\n * @public\n */\nexport const GAM_LIKE_OVERLAP: CapabilityOverlap = {\n pricingModels: new Set(['cpm', 'cpv', 'cpcv']),\n deliveryTypes: new Set(['guaranteed', 'non_guaranteed']),\n targetingDimensions: new Set(['geo', 'device_type', 'language', 'placement', 'audience']),\n};\n\n/**\n * Build a {@link GAMLikeRecipe} from a {@link MockProduct} returned by\n * the `sales-guaranteed` mock-server's `/v1/products` endpoint.\n *\n * Hello adapters call this inside `proposalManager.getProducts` to\n * project the upstream's native shape onto the recipe contract. The\n * recipe rides on `Product.implementation_config`; the framework\n * persists it; the adapter's `sales.createMediaBuy` later reads it from\n * `ctx.recipes`.\n *\n * @public\n */\nexport function buildGAMLikeRecipe(\n product: MockProduct,\n options: {\n /**\n * Override the line-item priority. Defaults to `8` for guaranteed,\n * `12` for non-guaranteed (GAM's standard tiers).\n */\n line_item_priority?: number;\n /**\n * When set, projects to the recipe's `availability_window`. Hello\n * adapters compute this from the buyer's brief OR from the\n * upstream's availability response after finalize.\n */\n availability_window?: GAMLikeRecipe['availability_window'];\n /**\n * Set post-finalize. Empty pre-finalize.\n */\n upstream_ids?: GAMLikeRecipe['upstream_ids'];\n /** Adopter-supplied extension blob. */\n extensions?: Record<string, unknown>;\n } = {}\n): GAMLikeRecipe {\n const priority = options.line_item_priority ?? (product.delivery_type === 'guaranteed' ? 8 : 12);\n // Per-product overlap: intersect the platform's full capability set\n // with what THIS product actually advertises on the wire. Catches\n // adopter drift where the recipe claims capabilities the product\n // doesn't expose. Mirrors the AdCP wire pricing_model values\n // (lowercase) so `validateOverlapSubsetOfWire` accepts the recipe.\n const productPricingModels = new Set([product.pricing.model]);\n const productDeliveryTypes = new Set([product.delivery_type]);\n const recipe: GAMLikeRecipe = {\n recipe_kind: 'gam',\n network_code: product.network_code,\n ad_unit_ids: product.ad_unit_ids,\n line_item_priority: priority,\n pricing: {\n pricing_model: product.pricing.model === 'cpm' ? 'cpm' : 'cpv',\n rate: product.pricing.cpm,\n currency: product.pricing.currency,\n },\n delivery_type: product.delivery_type,\n capability_overlap: {\n pricingModels: productPricingModels,\n deliveryTypes: productDeliveryTypes,\n // Targeting dimensions are platform-wide (every product accepts\n // them); leave the wide set since validateOverlapSubsetOfWire\n // doesn't check targeting against per-product wire shape.\n targetingDimensions: GAM_LIKE_OVERLAP.targetingDimensions,\n },\n };\n if (options.availability_window) recipe.availability_window = options.availability_window;\n else if (product.availability?.start_date && product.availability?.end_date) {\n recipe.availability_window = {\n start_date: product.availability.start_date,\n end_date: product.availability.end_date,\n ...(product.availability.available_impressions !== undefined && {\n reserved_impressions: product.availability.available_impressions,\n }),\n };\n }\n if (product.pricing.min_spend !== undefined) recipe.min_spend = product.pricing.min_spend;\n if (options.upstream_ids) recipe.upstream_ids = options.upstream_ids;\n if (options.extensions) recipe.extensions = options.extensions;\n return recipe;\n}\n"],"mappings":";;;;;;AAsIO,MAAM,mBAAsC;AAAA,EACjD,eAAe,oBAAI,IAAI,CAAC,OAAO,OAAO,MAAM,CAAC;AAAA,EAC7C,eAAe,oBAAI,IAAI,CAAC,cAAc,gBAAgB,CAAC;AAAA,EACvD,qBAAqB,oBAAI,IAAI,CAAC,OAAO,eAAe,YAAY,aAAa,UAAU,CAAC;AAC1F;AAcO,SAAS,mBACd,SACA,UAkBI,CAAC,GACU;AACf,QAAM,WAAW,QAAQ,uBAAuB,QAAQ,kBAAkB,eAAe,IAAI;AAM7F,QAAM,uBAAuB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,KAAK,CAAC;AAC5D,QAAM,uBAAuB,oBAAI,IAAI,CAAC,QAAQ,aAAa,CAAC;AAC5D,QAAM,SAAwB;AAAA,IAC5B,aAAa;AAAA,IACb,cAAc,QAAQ;AAAA,IACtB,aAAa,QAAQ;AAAA,IACrB,oBAAoB;AAAA,IACpB,SAAS;AAAA,MACP,eAAe,QAAQ,QAAQ,UAAU,QAAQ,QAAQ;AAAA,MACzD,MAAM,QAAQ,QAAQ;AAAA,MACtB,UAAU,QAAQ,QAAQ;AAAA,IAC5B;AAAA,IACA,eAAe,QAAQ;AAAA,IACvB,oBAAoB;AAAA,MAClB,eAAe;AAAA,MACf,eAAe;AAAA;AAAA;AAAA;AAAA,MAIf,qBAAqB,iBAAiB;AAAA,IACxC;AAAA,EACF;AACA,MAAI,QAAQ,oBAAqB,QAAO,sBAAsB,QAAQ;AAAA,WAC7D,QAAQ,cAAc,cAAc,QAAQ,cAAc,UAAU;AAC3E,WAAO,sBAAsB;AAAA,MAC3B,YAAY,QAAQ,aAAa;AAAA,MACjC,UAAU,QAAQ,aAAa;AAAA,MAC/B,GAAI,QAAQ,aAAa,0BAA0B,UAAa;AAAA,QAC9D,sBAAsB,QAAQ,aAAa;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,QAAQ,cAAc,OAAW,QAAO,YAAY,QAAQ,QAAQ;AAChF,MAAI,QAAQ,aAAc,QAAO,eAAe,QAAQ;AACxD,MAAI,QAAQ,WAAY,QAAO,aAAa,QAAQ;AACpD,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/mock-server/sales-guaranteed/recipe.ts"],"sourcesContent":["/**\n * `GAMLikeRecipe` — canonical {@link Recipe} shape for hello adapters\n * wrapping the `sales-guaranteed` mock-server upstream.\n *\n * The recipe is the contract between the {@link ProposalManager} and the\n * {@link DecisioningPlatform}: the manager emits products with this\n * recipe attached to `Product.implementation_config`; the framework\n * persists the recipe through the proposal lifecycle; at\n * `create_media_buy` time, `ctx.recipes` carries the recipe back to the\n * adapter's `sales` methods, where it drives the upstream line-item\n * creation call.\n *\n * **Why \"GAM-like\"?** This shape mirrors the canonical fields a Google\n * Ad Manager-style upstream needs: ad units to target, line-item\n * priority, frequency capping, fixed pricing. Adopters wrapping GAM,\n * FreeWheel, Operative, Xandr Monetize, or any direct-sold guaranteed\n * inventory platform map their native fields onto this shape with\n * minimal translation. Adopters wrapping a different platform family\n * declare their own `recipe_kind` literal; the multi-decisioning\n * framework dispatches by `recipe_kind`.\n *\n * **The recipe is NOT on the buyer's wire surface.** It rides inside\n * `Product.implementation_config` (an opaque-to-buyer dict). Buyers\n * treat it as a black box.\n *\n * @public\n * @packageDocumentation\n */\n\nimport type { CapabilityOverlap, Recipe } from '../../server/decisioning/proposal';\nimport type { MockProduct } from './seed-data';\n\n/**\n * Canonical recipe for hello adapters wrapping a GAM-style guaranteed\n * sales upstream. Adopters subclass / extend this if their backend\n * needs additional fields (e.g. `roadblock_settings`, `creative_rotation_mode`).\n *\n * @public\n */\nexport interface GAMLikeRecipe extends Recipe {\n recipe_kind: 'gam';\n\n /** Upstream tenant — the publisher's GAM network code. */\n network_code: string;\n\n /**\n * Ad units this product targets in the upstream. Mirrors GAM\n * `LineItem.targeting.inventoryTargeting.targetedAdUnitIds`.\n */\n ad_unit_ids: readonly string[];\n\n /**\n * Line-item priority in the upstream's auction graph. GAM convention:\n *\n * - `4`–`6`: sponsorship / unsold-house\n * - `7`–`9`: standard guaranteed (default for `'guaranteed'` delivery)\n * - `10`–`12`: standard non-guaranteed / network\n * - `13`–`16`: bulk / price-priority\n *\n * Hello adapter defaults: `8` for guaranteed, `12` for non-guaranteed.\n */\n line_item_priority: number;\n\n /**\n * Pricing the upstream will book at. Adopter's `finalizeProposal`\n * locks these values; pre-finalize they're indicative. Lowercase\n * values match the AdCP wire `pricing_model` enum so the framework's\n * `overlap ⊆ wire` validation accepts the recipe.\n */\n pricing: {\n pricing_model: 'cpm' | 'cpv' | 'cpcv' | 'cpc';\n rate: number;\n currency: string;\n };\n\n delivery_type: 'guaranteed' | 'non_guaranteed';\n\n /**\n * Inventory hold window the upstream reserved at finalize time. Empty\n * pre-finalize (draft proposals don't reserve inventory).\n */\n availability_window?: {\n start_date: string;\n end_date: string;\n /** Reserved impressions count from the upstream's getAvailabilityForecast. */\n reserved_impressions?: number;\n };\n\n /** Optional minimum spend threshold the upstream enforces. */\n min_spend?: number;\n\n /**\n * Native upstream identifiers populated post-finalize. Empty pre-\n * finalize (the upstream allocates these on commit).\n */\n upstream_ids?: {\n /** Upstream proposal id (the seller's bookable plan). */\n proposal_id?: string;\n /** Per-package line-item template id; the adapter uses this to\n * create the bookable line item at `create_media_buy` time. */\n line_item_template_id?: string;\n };\n\n /**\n * Adopter-extension slot for upstream-specific fields the canonical\n * shape doesn't enumerate — `creative_placeholders` (size + companion\n * bundles), `custom_targeting` (key-values, dayparting), GAM\n * `roadblock_settings`, FreeWheel `placement_types`, Operative\n * `revenue_type`, etc. Adopters carrying richer payloads use this\n * slot rather than forking `recipe_kind: 'gam'` into N variants.\n * Opaque to the framework; sharper-typed adopters can declare a\n * subtype literal `recipe_kind: 'gam-myco'` with a typed `extensions`.\n *\n * **MUST NOT carry credentials** (service-account JSON, OAuth refresh\n * tokens, HMAC secrets). The framework strips the entire\n * `implementation_config` envelope from buyer-facing wire responses,\n * so credentials here are protected *by coincidence of strip*, not by\n * a credential scan. Re-derive credentials per request from\n * `ctx.authInfo` + your token cache; embed only non-secret upstream\n * identifiers here. Same hazard class as `ctx_metadata` and `ext` —\n * see `docs/guides/CTX-METADATA-SAFETY.md`.\n */\n extensions?: Record<string, unknown>;\n}\n\n/**\n * Maximum capability set a GAM-style upstream supports across its\n * product mix. Per-product `capability_overlap` is derived from this\n * intersected with the product's actual offering — see\n * {@link buildGAMLikeRecipe}'s overlap computation. Use this constant\n * directly only when you know the product accepts every axis.\n *\n * @public\n */\nexport const GAM_LIKE_OVERLAP: CapabilityOverlap = {\n pricingModels: new Set(['cpm', 'cpv', 'cpcv']),\n deliveryTypes: new Set(['guaranteed', 'non_guaranteed']),\n targetingDimensions: new Set(['geo', 'device_type', 'language', 'placement', 'audience']),\n};\n\n/**\n * Build a {@link GAMLikeRecipe} from a {@link MockProduct} returned by\n * the `sales-guaranteed` mock-server's `/v1/products` endpoint.\n *\n * Hello adapters call this inside `proposalManager.getProducts` to\n * project the upstream's native shape onto the recipe contract. The\n * recipe rides on `Product.implementation_config`; the framework\n * persists it; the adapter's `sales.createMediaBuy` later reads it from\n * `ctx.recipes`.\n *\n * @public\n */\nexport function buildGAMLikeRecipe(\n product: MockProduct,\n options: {\n /**\n * Override the line-item priority. Defaults to `8` for guaranteed,\n * `12` for non-guaranteed (GAM's standard tiers).\n */\n line_item_priority?: number;\n /**\n * When set, projects to the recipe's `availability_window`. Hello\n * adapters compute this from the buyer's brief OR from the\n * upstream's availability response after finalize.\n */\n availability_window?: GAMLikeRecipe['availability_window'];\n /**\n * Set post-finalize. Empty pre-finalize.\n */\n upstream_ids?: GAMLikeRecipe['upstream_ids'];\n /** Adopter-supplied extension blob. */\n extensions?: Record<string, unknown>;\n } = {}\n): GAMLikeRecipe {\n const priority = options.line_item_priority ?? (product.delivery_type === 'guaranteed' ? 8 : 12);\n // Per-product overlap: intersect the platform's full capability set\n // with what THIS product actually advertises on the wire. Catches\n // adopter drift where the recipe claims capabilities the product\n // doesn't expose. Mirrors the AdCP wire pricing_model values\n // (lowercase) so `validateOverlapSubsetOfWire` accepts the recipe.\n const productPricingModels = new Set([product.pricing.model]);\n const productDeliveryTypes = new Set([product.delivery_type]);\n const recipe: GAMLikeRecipe = {\n recipe_kind: 'gam',\n network_code: product.network_code,\n ad_unit_ids: product.ad_unit_ids,\n line_item_priority: priority,\n pricing: {\n pricing_model: product.pricing.model === 'cpm' ? 'cpm' : 'cpv',\n rate: product.pricing.cpm,\n currency: product.pricing.currency,\n },\n delivery_type: product.delivery_type,\n capability_overlap: {\n pricingModels: productPricingModels,\n deliveryTypes: productDeliveryTypes,\n // Targeting dimensions are platform-wide (every product accepts\n // them); leave the wide set since validateOverlapSubsetOfWire\n // doesn't check targeting against per-product wire shape.\n targetingDimensions: GAM_LIKE_OVERLAP.targetingDimensions,\n },\n };\n if (options.availability_window) recipe.availability_window = options.availability_window;\n else if (product.availability?.start_date && product.availability?.end_date) {\n recipe.availability_window = {\n start_date: product.availability.start_date,\n end_date: product.availability.end_date,\n ...(product.availability.available_impressions !== undefined && {\n reserved_impressions: product.availability.available_impressions,\n }),\n };\n }\n if (product.pricing.min_spend !== undefined) recipe.min_spend = product.pricing.min_spend;\n if (options.upstream_ids) recipe.upstream_ids = options.upstream_ids;\n if (options.extensions) recipe.extensions = options.extensions;\n return recipe;\n}\n"],"mappings":"AAsIO,MAAM,mBAAsC;AAAA,EACjD,eAAe,oBAAI,IAAI,CAAC,OAAO,OAAO,MAAM,CAAC;AAAA,EAC7C,eAAe,oBAAI,IAAI,CAAC,cAAc,gBAAgB,CAAC;AAAA,EACvD,qBAAqB,oBAAI,IAAI,CAAC,OAAO,eAAe,YAAY,aAAa,UAAU,CAAC;AAC1F;AAcO,SAAS,mBACd,SACA,UAkBI,CAAC,GACU;AACf,QAAM,WAAW,QAAQ,uBAAuB,QAAQ,kBAAkB,eAAe,IAAI;AAM7F,QAAM,uBAAuB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,KAAK,CAAC;AAC5D,QAAM,uBAAuB,oBAAI,IAAI,CAAC,QAAQ,aAAa,CAAC;AAC5D,QAAM,SAAwB;AAAA,IAC5B,aAAa;AAAA,IACb,cAAc,QAAQ;AAAA,IACtB,aAAa,QAAQ;AAAA,IACrB,oBAAoB;AAAA,IACpB,SAAS;AAAA,MACP,eAAe,QAAQ,QAAQ,UAAU,QAAQ,QAAQ;AAAA,MACzD,MAAM,QAAQ,QAAQ;AAAA,MACtB,UAAU,QAAQ,QAAQ;AAAA,IAC5B;AAAA,IACA,eAAe,QAAQ;AAAA,IACvB,oBAAoB;AAAA,MAClB,eAAe;AAAA,MACf,eAAe;AAAA;AAAA;AAAA;AAAA,MAIf,qBAAqB,iBAAiB;AAAA,IACxC;AAAA,EACF;AACA,MAAI,QAAQ,oBAAqB,QAAO,sBAAsB,QAAQ;AAAA,WAC7D,QAAQ,cAAc,cAAc,QAAQ,cAAc,UAAU;AAC3E,WAAO,sBAAsB;AAAA,MAC3B,YAAY,QAAQ,aAAa;AAAA,MACjC,UAAU,QAAQ,aAAa;AAAA,MAC/B,GAAI,QAAQ,aAAa,0BAA0B,UAAa;AAAA,QAC9D,sBAAsB,QAAQ,aAAa;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,QAAQ,cAAc,OAAW,QAAO,YAAY,QAAQ,QAAQ;AAChF,MAAI,QAAQ,aAAc,QAAO,eAAe,QAAQ;AACxD,MAAI,QAAQ,WAAY,QAAO,aAAa,QAAQ;AACpD,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
  const NETWORKS = [
8
2
  {
9
3
  network_code: "net_premium_us",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/mock-server/sales-guaranteed/seed-data.ts"],"sourcesContent":["export interface MockNetwork {\n network_code: string;\n display_name: string;\n /** AdCP-side identifier the adapter receives (typically `account.publisher`). */\n adcp_publisher: string;\n}\n\nexport interface MockAdUnit {\n ad_unit_id: string;\n name: string;\n path: string;\n network_code: string;\n sizes: Array<{ width: number; height: number }>;\n environment: 'web' | 'mobile_app' | 'ctv' | 'audio';\n targetable: boolean;\n}\n\nexport interface MockProduct {\n product_id: string;\n name: string;\n network_code: string;\n delivery_type: 'guaranteed' | 'non_guaranteed';\n channel: 'video' | 'ctv' | 'display' | 'audio';\n format_ids: string[];\n ad_unit_ids: string[];\n pricing: {\n model: 'cpm' | 'cpv';\n cpm: number;\n currency: string;\n min_spend?: number;\n };\n availability?: {\n start_date?: string;\n end_date?: string;\n available_impressions?: number;\n };\n}\n\nexport const NETWORKS: MockNetwork[] = [\n {\n network_code: 'net_premium_us',\n display_name: 'Premium Sports Network — US',\n adcp_publisher: 'premium-sports.example',\n },\n {\n network_code: 'net_premium_uk',\n display_name: 'Premium Sports Network — UK',\n adcp_publisher: 'premium-sports.uk',\n },\n // Storyboard-fixture-aligned entries — the `sales_guaranteed` storyboard\n // sends payloads with these publisher domains. Without them, every\n // `_lookup/network` returns 404 and a blind agent has to invent a fallback\n // that contradicts the skill's \"fail closed on 404\" advice. Issue\n // adcontextprotocol/adcp#3821. Until the storyboard runner exposes a\n // setup phase that primes the upstream, we seed the fixture domains\n // here so blind agents can pass the traffic gate without contradiction.\n {\n network_code: 'net_acmeoutdoor',\n display_name: 'Acme Outdoor Media',\n adcp_publisher: 'acmeoutdoor.example',\n },\n {\n network_code: 'net_pinnacle',\n display_name: 'Pinnacle Agency',\n adcp_publisher: 'pinnacle-agency.example',\n },\n];\n\nexport const AD_UNITS: MockAdUnit[] = [\n {\n ad_unit_id: 'au_us_video_preroll',\n name: 'US Sports Preroll',\n path: '/premium/us/sports/preroll',\n network_code: 'net_premium_us',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_us_ctv_30s',\n name: 'US CTV 30s Spot',\n path: '/premium/us/ctv/30s',\n network_code: 'net_premium_us',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'ctv',\n targetable: true,\n },\n {\n ad_unit_id: 'au_us_display_300x250',\n name: 'US Display Medrec',\n path: '/premium/us/display/medrec',\n network_code: 'net_premium_us',\n sizes: [{ width: 300, height: 250 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_uk_video_preroll',\n name: 'UK Sports Preroll',\n path: '/premium/uk/sports/preroll',\n network_code: 'net_premium_uk',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'web',\n targetable: true,\n },\n // Storyboard-fixture-aligned ad units (see NETWORKS comment + adcp#3821).\n {\n ad_unit_id: 'au_acmeoutdoor_billboards',\n name: 'Acme Outdoor — Programmatic DOOH Billboards',\n path: '/acme/outdoor/billboards',\n network_code: 'net_acmeoutdoor',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_pinnacle_video_preroll',\n name: 'Pinnacle Premium Video Preroll',\n path: '/pinnacle/video/preroll',\n network_code: 'net_pinnacle',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'web',\n targetable: true,\n },\n];\n\nexport const PRODUCTS: MockProduct[] = [\n {\n product_id: 'sports_preroll_q2_guaranteed',\n name: 'Sports Preroll Q2 — Guaranteed',\n network_code: 'net_premium_us',\n delivery_type: 'guaranteed',\n channel: 'video',\n format_ids: ['video_30s', 'video_15s'],\n ad_unit_ids: ['au_us_video_preroll'],\n pricing: { model: 'cpm', cpm: 35.0, currency: 'USD', min_spend: 25_000 },\n availability: {\n start_date: '2026-04-01',\n end_date: '2026-06-30',\n available_impressions: 50_000_000,\n },\n },\n {\n product_id: 'outdoor_ctv_q2_guaranteed',\n name: 'CTV Outdoor Q2 — Guaranteed',\n network_code: 'net_premium_us',\n delivery_type: 'guaranteed',\n channel: 'ctv',\n format_ids: ['video_30s'],\n ad_unit_ids: ['au_us_ctv_30s'],\n pricing: { model: 'cpm', cpm: 60.0, currency: 'USD', min_spend: 50_000 },\n availability: {\n start_date: '2026-04-01',\n end_date: '2026-06-30',\n available_impressions: 20_000_000,\n },\n },\n {\n product_id: 'display_medrec_run_of_site',\n name: 'Display Medrec — Run of Site',\n network_code: 'net_premium_us',\n delivery_type: 'non_guaranteed',\n channel: 'display',\n format_ids: ['display_300x250'],\n ad_unit_ids: ['au_us_display_300x250'],\n pricing: { model: 'cpm', cpm: 4.5, currency: 'USD' },\n },\n // Storyboard-fixture-aligned products (see NETWORKS comment + adcp#3821).\n {\n product_id: 'acme_dooh_billboards_q2',\n name: 'Acme Outdoor — DOOH Billboards Q2',\n network_code: 'net_acmeoutdoor',\n delivery_type: 'guaranteed',\n channel: 'video',\n format_ids: ['video_30s'],\n ad_unit_ids: ['au_acmeoutdoor_billboards'],\n pricing: { model: 'cpm', cpm: 28.0, currency: 'USD', min_spend: 15_000 },\n availability: {\n start_date: '2026-04-01',\n end_date: '2026-06-30',\n available_impressions: 30_000_000,\n },\n },\n {\n product_id: 'acme_ctv_trail_series_q2',\n name: 'Acme Outdoor — CTV Trail Series Q2',\n network_code: 'net_acmeoutdoor',\n delivery_type: 'guaranteed',\n channel: 'ctv',\n format_ids: ['video_30s'],\n ad_unit_ids: ['au_acmeoutdoor_billboards'],\n pricing: { model: 'cpm', cpm: 38.0, currency: 'USD', min_spend: 20_000 },\n availability: {\n start_date: '2026-04-01',\n end_date: '2026-06-30',\n available_impressions: 18_000_000,\n },\n },\n {\n product_id: 'acme_sports_preroll_q2',\n name: 'Acme Outdoor — Sports Preroll Q2',\n network_code: 'net_acmeoutdoor',\n delivery_type: 'guaranteed',\n channel: 'video',\n format_ids: ['video_30s', 'video_15s'],\n ad_unit_ids: ['au_acmeoutdoor_billboards'],\n pricing: { model: 'cpm', cpm: 32.0, currency: 'USD', min_spend: 18_000 },\n availability: {\n start_date: '2026-04-01',\n end_date: '2026-06-30',\n available_impressions: 24_000_000,\n },\n },\n {\n product_id: 'pinnacle_video_preroll_q2',\n name: 'Pinnacle Premium Video Preroll Q2',\n network_code: 'net_pinnacle',\n delivery_type: 'guaranteed',\n channel: 'video',\n format_ids: ['video_30s', 'video_15s'],\n ad_unit_ids: ['au_pinnacle_video_preroll'],\n pricing: { model: 'cpm', cpm: 42.0, currency: 'USD', min_spend: 30_000 },\n availability: {\n start_date: '2026-04-01',\n end_date: '2026-06-30',\n available_impressions: 25_000_000,\n },\n },\n];\n\n/** Default static API key (Bearer). Real GAM-style platforms use OAuth or\n * service accounts; we use static Bearer here to vary the test surface\n * (sales-social already exercises OAuth). */\nexport const DEFAULT_API_KEY = 'mock_sales_guaranteed_key_do_not_use_in_prod';\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/mock-server/sales-guaranteed/seed-data.ts"],"sourcesContent":["export interface MockNetwork {\n network_code: string;\n display_name: string;\n /** AdCP-side identifier the adapter receives (typically `account.publisher`). */\n adcp_publisher: string;\n}\n\nexport interface MockAdUnit {\n ad_unit_id: string;\n name: string;\n path: string;\n network_code: string;\n sizes: Array<{ width: number; height: number }>;\n environment: 'web' | 'mobile_app' | 'ctv' | 'audio';\n targetable: boolean;\n}\n\nexport interface MockProduct {\n product_id: string;\n name: string;\n network_code: string;\n delivery_type: 'guaranteed' | 'non_guaranteed';\n channel: 'video' | 'ctv' | 'display' | 'audio';\n format_ids: string[];\n ad_unit_ids: string[];\n pricing: {\n model: 'cpm' | 'cpv';\n cpm: number;\n currency: string;\n min_spend?: number;\n };\n availability?: {\n start_date?: string;\n end_date?: string;\n available_impressions?: number;\n };\n}\n\nexport const NETWORKS: MockNetwork[] = [\n {\n network_code: 'net_premium_us',\n display_name: 'Premium Sports Network — US',\n adcp_publisher: 'premium-sports.example',\n },\n {\n network_code: 'net_premium_uk',\n display_name: 'Premium Sports Network — UK',\n adcp_publisher: 'premium-sports.uk',\n },\n // Storyboard-fixture-aligned entries — the `sales_guaranteed` storyboard\n // sends payloads with these publisher domains. Without them, every\n // `_lookup/network` returns 404 and a blind agent has to invent a fallback\n // that contradicts the skill's \"fail closed on 404\" advice. Issue\n // adcontextprotocol/adcp#3821. Until the storyboard runner exposes a\n // setup phase that primes the upstream, we seed the fixture domains\n // here so blind agents can pass the traffic gate without contradiction.\n {\n network_code: 'net_acmeoutdoor',\n display_name: 'Acme Outdoor Media',\n adcp_publisher: 'acmeoutdoor.example',\n },\n {\n network_code: 'net_pinnacle',\n display_name: 'Pinnacle Agency',\n adcp_publisher: 'pinnacle-agency.example',\n },\n];\n\nexport const AD_UNITS: MockAdUnit[] = [\n {\n ad_unit_id: 'au_us_video_preroll',\n name: 'US Sports Preroll',\n path: '/premium/us/sports/preroll',\n network_code: 'net_premium_us',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_us_ctv_30s',\n name: 'US CTV 30s Spot',\n path: '/premium/us/ctv/30s',\n network_code: 'net_premium_us',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'ctv',\n targetable: true,\n },\n {\n ad_unit_id: 'au_us_display_300x250',\n name: 'US Display Medrec',\n path: '/premium/us/display/medrec',\n network_code: 'net_premium_us',\n sizes: [{ width: 300, height: 250 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_uk_video_preroll',\n name: 'UK Sports Preroll',\n path: '/premium/uk/sports/preroll',\n network_code: 'net_premium_uk',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'web',\n targetable: true,\n },\n // Storyboard-fixture-aligned ad units (see NETWORKS comment + adcp#3821).\n {\n ad_unit_id: 'au_acmeoutdoor_billboards',\n name: 'Acme Outdoor — Programmatic DOOH Billboards',\n path: '/acme/outdoor/billboards',\n network_code: 'net_acmeoutdoor',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_pinnacle_video_preroll',\n name: 'Pinnacle Premium Video Preroll',\n path: '/pinnacle/video/preroll',\n network_code: 'net_pinnacle',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'web',\n targetable: true,\n },\n];\n\nexport const PRODUCTS: MockProduct[] = [\n {\n product_id: 'sports_preroll_q2_guaranteed',\n name: 'Sports Preroll Q2 — Guaranteed',\n network_code: 'net_premium_us',\n delivery_type: 'guaranteed',\n channel: 'video',\n format_ids: ['video_30s', 'video_15s'],\n ad_unit_ids: ['au_us_video_preroll'],\n pricing: { model: 'cpm', cpm: 35.0, currency: 'USD', min_spend: 25_000 },\n availability: {\n start_date: '2026-04-01',\n end_date: '2026-06-30',\n available_impressions: 50_000_000,\n },\n },\n {\n product_id: 'outdoor_ctv_q2_guaranteed',\n name: 'CTV Outdoor Q2 — Guaranteed',\n network_code: 'net_premium_us',\n delivery_type: 'guaranteed',\n channel: 'ctv',\n format_ids: ['video_30s'],\n ad_unit_ids: ['au_us_ctv_30s'],\n pricing: { model: 'cpm', cpm: 60.0, currency: 'USD', min_spend: 50_000 },\n availability: {\n start_date: '2026-04-01',\n end_date: '2026-06-30',\n available_impressions: 20_000_000,\n },\n },\n {\n product_id: 'display_medrec_run_of_site',\n name: 'Display Medrec — Run of Site',\n network_code: 'net_premium_us',\n delivery_type: 'non_guaranteed',\n channel: 'display',\n format_ids: ['display_300x250'],\n ad_unit_ids: ['au_us_display_300x250'],\n pricing: { model: 'cpm', cpm: 4.5, currency: 'USD' },\n },\n // Storyboard-fixture-aligned products (see NETWORKS comment + adcp#3821).\n {\n product_id: 'acme_dooh_billboards_q2',\n name: 'Acme Outdoor — DOOH Billboards Q2',\n network_code: 'net_acmeoutdoor',\n delivery_type: 'guaranteed',\n channel: 'video',\n format_ids: ['video_30s'],\n ad_unit_ids: ['au_acmeoutdoor_billboards'],\n pricing: { model: 'cpm', cpm: 28.0, currency: 'USD', min_spend: 15_000 },\n availability: {\n start_date: '2026-04-01',\n end_date: '2026-06-30',\n available_impressions: 30_000_000,\n },\n },\n {\n product_id: 'acme_ctv_trail_series_q2',\n name: 'Acme Outdoor — CTV Trail Series Q2',\n network_code: 'net_acmeoutdoor',\n delivery_type: 'guaranteed',\n channel: 'ctv',\n format_ids: ['video_30s'],\n ad_unit_ids: ['au_acmeoutdoor_billboards'],\n pricing: { model: 'cpm', cpm: 38.0, currency: 'USD', min_spend: 20_000 },\n availability: {\n start_date: '2026-04-01',\n end_date: '2026-06-30',\n available_impressions: 18_000_000,\n },\n },\n {\n product_id: 'acme_sports_preroll_q2',\n name: 'Acme Outdoor — Sports Preroll Q2',\n network_code: 'net_acmeoutdoor',\n delivery_type: 'guaranteed',\n channel: 'video',\n format_ids: ['video_30s', 'video_15s'],\n ad_unit_ids: ['au_acmeoutdoor_billboards'],\n pricing: { model: 'cpm', cpm: 32.0, currency: 'USD', min_spend: 18_000 },\n availability: {\n start_date: '2026-04-01',\n end_date: '2026-06-30',\n available_impressions: 24_000_000,\n },\n },\n {\n product_id: 'pinnacle_video_preroll_q2',\n name: 'Pinnacle Premium Video Preroll Q2',\n network_code: 'net_pinnacle',\n delivery_type: 'guaranteed',\n channel: 'video',\n format_ids: ['video_30s', 'video_15s'],\n ad_unit_ids: ['au_pinnacle_video_preroll'],\n pricing: { model: 'cpm', cpm: 42.0, currency: 'USD', min_spend: 30_000 },\n availability: {\n start_date: '2026-04-01',\n end_date: '2026-06-30',\n available_impressions: 25_000_000,\n },\n },\n];\n\n/** Default static API key (Bearer). Real GAM-style platforms use OAuth or\n * service accounts; we use static Bearer here to vary the test surface\n * (sales-social already exercises OAuth). */\nexport const DEFAULT_API_KEY = 'mock_sales_guaranteed_key_do_not_use_in_prod';\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 { createServer } from "node:http";
8
2
  import { createHash, randomUUID } from "node:crypto";
9
3
  import {