@adcp/sdk 12.0.0 → 12.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (959) hide show
  1. package/dist/lib/adapters/content-standards-adapter.mjs +0 -6
  2. package/dist/lib/adapters/content-standards-adapter.mjs.map +1 -1
  3. package/dist/lib/adapters/derived-account-store.mjs +0 -6
  4. package/dist/lib/adapters/derived-account-store.mjs.map +1 -1
  5. package/dist/lib/adapters/governance-adapter.mjs +0 -6
  6. package/dist/lib/adapters/governance-adapter.mjs.map +1 -1
  7. package/dist/lib/adapters/implicit-account-store.mjs +0 -6
  8. package/dist/lib/adapters/implicit-account-store.mjs.map +1 -1
  9. package/dist/lib/adapters/index.mjs +0 -6
  10. package/dist/lib/adapters/index.mjs.map +1 -1
  11. package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs +0 -6
  12. package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs.map +1 -1
  13. package/dist/lib/adapters/legacy/v2-5/get_products.mjs +0 -6
  14. package/dist/lib/adapters/legacy/v2-5/get_products.mjs.map +1 -1
  15. package/dist/lib/adapters/legacy/v2-5/index.mjs +0 -6
  16. package/dist/lib/adapters/legacy/v2-5/index.mjs.map +1 -1
  17. package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs +0 -6
  18. package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs.map +1 -1
  19. package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs +0 -6
  20. package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs.map +1 -1
  21. package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs +0 -6
  22. package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs.map +1 -1
  23. package/dist/lib/adapters/legacy/v2-5/types.mjs +0 -6
  24. package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs +0 -6
  25. package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs.map +1 -1
  26. package/dist/lib/adapters/oauth-passthrough-resolver.mjs +0 -6
  27. package/dist/lib/adapters/oauth-passthrough-resolver.mjs.map +1 -1
  28. package/dist/lib/adapters/property-list-adapter.mjs +0 -6
  29. package/dist/lib/adapters/property-list-adapter.mjs.map +1 -1
  30. package/dist/lib/adapters/roster-account-store.mjs +0 -6
  31. package/dist/lib/adapters/roster-account-store.mjs.map +1 -1
  32. package/dist/lib/adapters/si-session-manager.mjs +0 -6
  33. package/dist/lib/adapters/si-session-manager.mjs.map +1 -1
  34. package/dist/lib/adapters/version/3.0/brand-fields.mjs +0 -6
  35. package/dist/lib/adapters/version/3.0/brand-fields.mjs.map +1 -1
  36. package/dist/lib/adapters/version/3.0/get-products.mjs +0 -6
  37. package/dist/lib/adapters/version/3.0/get-products.mjs.map +1 -1
  38. package/dist/lib/adapters/version/3.0/index.mjs +0 -6
  39. package/dist/lib/adapters/version/3.0/index.mjs.map +1 -1
  40. package/dist/lib/adapters/version/3.0/sync-accounts.mjs +0 -6
  41. package/dist/lib/adapters/version/3.0/sync-accounts.mjs.map +1 -1
  42. package/dist/lib/adapters/version/index.mjs +0 -6
  43. package/dist/lib/adapters/version/index.mjs.map +1 -1
  44. package/dist/lib/adapters/version/types.mjs +0 -6
  45. package/dist/lib/advanced.mjs +0 -6
  46. package/dist/lib/advanced.mjs.map +1 -1
  47. package/dist/lib/agents/index.generated.mjs +0 -6
  48. package/dist/lib/agents/index.generated.mjs.map +1 -1
  49. package/dist/lib/auth/index.mjs +0 -6
  50. package/dist/lib/auth/index.mjs.map +1 -1
  51. package/dist/lib/auth/oauth/CLIFlowHandler.mjs +0 -6
  52. package/dist/lib/auth/oauth/CLIFlowHandler.mjs.map +1 -1
  53. package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs +0 -6
  54. package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs.map +1 -1
  55. package/dist/lib/auth/oauth/MCPOAuthProvider.mjs +0 -6
  56. package/dist/lib/auth/oauth/MCPOAuthProvider.mjs.map +1 -1
  57. package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs +0 -6
  58. package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs.map +1 -1
  59. package/dist/lib/auth/oauth/authorization-required.mjs +0 -6
  60. package/dist/lib/auth/oauth/authorization-required.mjs.map +1 -1
  61. package/dist/lib/auth/oauth/diagnose.mjs +0 -6
  62. package/dist/lib/auth/oauth/diagnose.mjs.map +1 -1
  63. package/dist/lib/auth/oauth/diagnostics.mjs +0 -6
  64. package/dist/lib/auth/oauth/diagnostics.mjs.map +1 -1
  65. package/dist/lib/auth/oauth/discovery.mjs +0 -6
  66. package/dist/lib/auth/oauth/discovery.mjs.map +1 -1
  67. package/dist/lib/auth/oauth/file-storage.mjs +0 -6
  68. package/dist/lib/auth/oauth/file-storage.mjs.map +1 -1
  69. package/dist/lib/auth/oauth/index.mjs +0 -6
  70. package/dist/lib/auth/oauth/index.mjs.map +1 -1
  71. package/dist/lib/auth/oauth/secret-resolver.mjs +0 -6
  72. package/dist/lib/auth/oauth/secret-resolver.mjs.map +1 -1
  73. package/dist/lib/auth/oauth/storage-registry.mjs +0 -6
  74. package/dist/lib/auth/oauth/storage-registry.mjs.map +1 -1
  75. package/dist/lib/auth/oauth/types.mjs +0 -6
  76. package/dist/lib/auth/oauth/types.mjs.map +1 -1
  77. package/dist/lib/auth/oauth/web-flow.mjs +0 -6
  78. package/dist/lib/auth/oauth/web-flow.mjs.map +1 -1
  79. package/dist/lib/brand/index.mjs +0 -6
  80. package/dist/lib/brand/index.mjs.map +1 -1
  81. package/dist/lib/canonical-references/index.mjs +6 -7
  82. package/dist/lib/canonical-references/index.mjs.map +1 -1
  83. package/dist/lib/client/index.mjs +0 -6
  84. package/dist/lib/client/index.mjs.map +1 -1
  85. package/dist/lib/compliance/index.mjs +0 -6
  86. package/dist/lib/compliance/index.mjs.map +1 -1
  87. package/dist/lib/compliance-fixtures/index.mjs +0 -6
  88. package/dist/lib/compliance-fixtures/index.mjs.map +1 -1
  89. package/dist/lib/compliance-fixtures/test-authorization-server.mjs +0 -6
  90. package/dist/lib/compliance-fixtures/test-authorization-server.mjs.map +1 -1
  91. package/dist/lib/conformance/index.mjs +0 -6
  92. package/dist/lib/conformance/index.mjs.map +1 -1
  93. package/dist/lib/conformance/invariants/uniformError.mjs +0 -6
  94. package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
  95. package/dist/lib/conformance/invariants/uniformErrorComparator.mjs +0 -6
  96. package/dist/lib/conformance/invariants/uniformErrorComparator.mjs.map +1 -1
  97. package/dist/lib/conformance/oracle.mjs +0 -6
  98. package/dist/lib/conformance/oracle.mjs.map +1 -1
  99. package/dist/lib/conformance/runConformance.mjs +0 -6
  100. package/dist/lib/conformance/runConformance.mjs.map +1 -1
  101. package/dist/lib/conformance/runners.mjs +0 -6
  102. package/dist/lib/conformance/runners.mjs.map +1 -1
  103. package/dist/lib/conformance/schemaArbitrary.mjs +0 -6
  104. package/dist/lib/conformance/schemaArbitrary.mjs.map +1 -1
  105. package/dist/lib/conformance/schemaLoader.mjs +5 -6
  106. package/dist/lib/conformance/schemaLoader.mjs.map +1 -1
  107. package/dist/lib/conformance/seeder.mjs +0 -6
  108. package/dist/lib/conformance/seeder.mjs.map +1 -1
  109. package/dist/lib/conformance/types.mjs +0 -6
  110. package/dist/lib/conformance/types.mjs.map +1 -1
  111. package/dist/lib/conformance/webhook.mjs +0 -6
  112. package/dist/lib/conformance/webhook.mjs.map +1 -1
  113. package/dist/lib/core/ADCPMultiAgentClient.mjs +0 -6
  114. package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
  115. package/dist/lib/core/AgentClient.mjs +0 -6
  116. package/dist/lib/core/AgentClient.mjs.map +1 -1
  117. package/dist/lib/core/AsyncHandler.mjs +0 -6
  118. package/dist/lib/core/AsyncHandler.mjs.map +1 -1
  119. package/dist/lib/core/ConfigurationManager.mjs +0 -6
  120. package/dist/lib/core/ConfigurationManager.mjs.map +1 -1
  121. package/dist/lib/core/ConversationTypes.mjs +0 -6
  122. package/dist/lib/core/CreativeAgentClient.mjs +0 -6
  123. package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
  124. package/dist/lib/core/GovernanceMiddleware.mjs +0 -6
  125. package/dist/lib/core/GovernanceMiddleware.mjs.map +1 -1
  126. package/dist/lib/core/GovernanceTypes.mjs +0 -6
  127. package/dist/lib/core/GovernanceTypes.mjs.map +1 -1
  128. package/dist/lib/core/ProtocolResponseParser.mjs +0 -6
  129. package/dist/lib/core/ProtocolResponseParser.mjs.map +1 -1
  130. package/dist/lib/core/ResponseValidator.mjs +0 -6
  131. package/dist/lib/core/ResponseValidator.mjs.map +1 -1
  132. package/dist/lib/core/SingleAgentClient.mjs +0 -6
  133. package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
  134. package/dist/lib/core/TaskEventTypes.mjs +0 -6
  135. package/dist/lib/core/TaskEventTypes.mjs.map +1 -1
  136. package/dist/lib/core/TaskExecutor.mjs +0 -6
  137. package/dist/lib/core/TaskExecutor.mjs.map +1 -1
  138. package/dist/lib/core/match.mjs +0 -6
  139. package/dist/lib/core/match.mjs.map +1 -1
  140. package/dist/lib/core/task-status.mjs +0 -6
  141. package/dist/lib/core/task-status.mjs.map +1 -1
  142. package/dist/lib/core/webhook-url.mjs +0 -6
  143. package/dist/lib/core/webhook-url.mjs.map +1 -1
  144. package/dist/lib/discovery/adagents-redirects.mjs +0 -6
  145. package/dist/lib/discovery/adagents-redirects.mjs.map +1 -1
  146. package/dist/lib/discovery/agent-directory.mjs +0 -6
  147. package/dist/lib/discovery/agent-directory.mjs.map +1 -1
  148. package/dist/lib/discovery/inline-publisher-properties.mjs +0 -6
  149. package/dist/lib/discovery/inline-publisher-properties.mjs.map +1 -1
  150. package/dist/lib/discovery/network-consistency-checker.mjs +0 -6
  151. package/dist/lib/discovery/network-consistency-checker.mjs.map +1 -1
  152. package/dist/lib/discovery/property-crawler.mjs +0 -6
  153. package/dist/lib/discovery/property-crawler.mjs.map +1 -1
  154. package/dist/lib/discovery/property-index.mjs +0 -6
  155. package/dist/lib/discovery/property-index.mjs.map +1 -1
  156. package/dist/lib/discovery/publisher-property-selector.mjs +0 -6
  157. package/dist/lib/discovery/publisher-property-selector.mjs.map +1 -1
  158. package/dist/lib/discovery/resolve-agent-properties.mjs +0 -6
  159. package/dist/lib/discovery/resolve-agent-properties.mjs.map +1 -1
  160. package/dist/lib/discovery/types.mjs +0 -6
  161. package/dist/lib/discovery/validate-adagents.mjs +0 -6
  162. package/dist/lib/discovery/validate-adagents.mjs.map +1 -1
  163. package/dist/lib/enums.mjs +0 -6
  164. package/dist/lib/enums.mjs.map +1 -1
  165. package/dist/lib/errors/index.mjs +0 -6
  166. package/dist/lib/errors/index.mjs.map +1 -1
  167. package/dist/lib/express-mcp/index.mjs +0 -6
  168. package/dist/lib/express-mcp/index.mjs.map +1 -1
  169. package/dist/lib/governance/index.mjs +0 -6
  170. package/dist/lib/governance/index.mjs.map +1 -1
  171. package/dist/lib/handlers/types.mjs +0 -6
  172. package/dist/lib/handlers/types.mjs.map +1 -1
  173. package/dist/lib/index.d.mts +1 -1
  174. package/dist/lib/index.d.ts +1 -1
  175. package/dist/lib/index.d.ts.map +1 -1
  176. package/dist/lib/index.js.map +1 -1
  177. package/dist/lib/index.mjs +0 -6
  178. package/dist/lib/index.mjs.map +1 -1
  179. package/dist/lib/media-buy/available-actions.mjs +0 -6
  180. package/dist/lib/media-buy/available-actions.mjs.map +1 -1
  181. package/dist/lib/media-buy/index.mjs +0 -6
  182. package/dist/lib/media-buy/index.mjs.map +1 -1
  183. package/dist/lib/media-buy/preflight.mjs +0 -6
  184. package/dist/lib/media-buy/preflight.mjs.map +1 -1
  185. package/dist/lib/media-buy/property-policy.mjs +0 -6
  186. package/dist/lib/media-buy/property-policy.mjs.map +1 -1
  187. package/dist/lib/media-buy/types.mjs +0 -6
  188. package/dist/lib/media-buy/types.mjs.map +1 -1
  189. package/dist/lib/media-buy/update-fields.generated.mjs +0 -6
  190. package/dist/lib/media-buy/update-fields.generated.mjs.map +1 -1
  191. package/dist/lib/mock-server/creative-ad-server/seed-data.mjs +0 -6
  192. package/dist/lib/mock-server/creative-ad-server/seed-data.mjs.map +1 -1
  193. package/dist/lib/mock-server/creative-ad-server/server.mjs +0 -6
  194. package/dist/lib/mock-server/creative-ad-server/server.mjs.map +1 -1
  195. package/dist/lib/mock-server/creative-template/seed-data.mjs +0 -6
  196. package/dist/lib/mock-server/creative-template/seed-data.mjs.map +1 -1
  197. package/dist/lib/mock-server/creative-template/server.mjs +0 -6
  198. package/dist/lib/mock-server/creative-template/server.mjs.map +1 -1
  199. package/dist/lib/mock-server/index.mjs +0 -6
  200. package/dist/lib/mock-server/index.mjs.map +1 -1
  201. package/dist/lib/mock-server/sales-guaranteed/recipe.mjs +0 -6
  202. package/dist/lib/mock-server/sales-guaranteed/recipe.mjs.map +1 -1
  203. package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs +0 -6
  204. package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs.map +1 -1
  205. package/dist/lib/mock-server/sales-guaranteed/server.mjs +0 -6
  206. package/dist/lib/mock-server/sales-guaranteed/server.mjs.map +1 -1
  207. package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs +0 -6
  208. package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs.map +1 -1
  209. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs +0 -6
  210. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs.map +1 -1
  211. package/dist/lib/mock-server/sales-non-guaranteed/server.mjs +0 -6
  212. package/dist/lib/mock-server/sales-non-guaranteed/server.mjs.map +1 -1
  213. package/dist/lib/mock-server/sales-social/seed-data.mjs +0 -6
  214. package/dist/lib/mock-server/sales-social/seed-data.mjs.map +1 -1
  215. package/dist/lib/mock-server/sales-social/server.mjs +0 -6
  216. package/dist/lib/mock-server/sales-social/server.mjs.map +1 -1
  217. package/dist/lib/mock-server/scenario.mjs +0 -6
  218. package/dist/lib/mock-server/scenario.mjs.map +1 -1
  219. package/dist/lib/mock-server/signal-marketplace/seed-data.mjs +0 -6
  220. package/dist/lib/mock-server/signal-marketplace/seed-data.mjs.map +1 -1
  221. package/dist/lib/mock-server/signal-marketplace/server.mjs +0 -6
  222. package/dist/lib/mock-server/signal-marketplace/server.mjs.map +1 -1
  223. package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs +0 -6
  224. package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs.map +1 -1
  225. package/dist/lib/mock-server/sponsored-intelligence/server.mjs +0 -6
  226. package/dist/lib/mock-server/sponsored-intelligence/server.mjs.map +1 -1
  227. package/dist/lib/net/address-guards.mjs +0 -6
  228. package/dist/lib/net/address-guards.mjs.map +1 -1
  229. package/dist/lib/net/index.mjs +0 -6
  230. package/dist/lib/net/index.mjs.map +1 -1
  231. package/dist/lib/net/ssrf-fetch.mjs +0 -6
  232. package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
  233. package/dist/lib/observability/index.mjs +0 -6
  234. package/dist/lib/observability/index.mjs.map +1 -1
  235. package/dist/lib/observability/tracing.mjs +6 -7
  236. package/dist/lib/observability/tracing.mjs.map +1 -1
  237. package/dist/lib/protocols/a2a.mjs +0 -6
  238. package/dist/lib/protocols/a2a.mjs.map +1 -1
  239. package/dist/lib/protocols/abort.mjs +0 -6
  240. package/dist/lib/protocols/abort.mjs.map +1 -1
  241. package/dist/lib/protocols/index.mjs +0 -6
  242. package/dist/lib/protocols/index.mjs.map +1 -1
  243. package/dist/lib/protocols/mcp-modern.mjs +0 -6
  244. package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
  245. package/dist/lib/protocols/mcp-tasks.mjs +0 -6
  246. package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
  247. package/dist/lib/protocols/mcp.mjs +0 -6
  248. package/dist/lib/protocols/mcp.mjs.map +1 -1
  249. package/dist/lib/protocols/rawResponseCapture.mjs +0 -6
  250. package/dist/lib/protocols/rawResponseCapture.mjs.map +1 -1
  251. package/dist/lib/protocols/responseSizeLimit.mjs +0 -6
  252. package/dist/lib/protocols/responseSizeLimit.mjs.map +1 -1
  253. package/dist/lib/protocols/transportDiagnostics.mjs +0 -6
  254. package/dist/lib/protocols/transportDiagnostics.mjs.map +1 -1
  255. package/dist/lib/registry/cursor-store.mjs +0 -6
  256. package/dist/lib/registry/cursor-store.mjs.map +1 -1
  257. package/dist/lib/registry/feed-stream.mjs +0 -6
  258. package/dist/lib/registry/feed-stream.mjs.map +1 -1
  259. package/dist/lib/registry/index.mjs +0 -6
  260. package/dist/lib/registry/index.mjs.map +1 -1
  261. package/dist/lib/registry/property-registry.mjs +0 -6
  262. package/dist/lib/registry/property-registry.mjs.map +1 -1
  263. package/dist/lib/registry/sync.mjs +0 -6
  264. package/dist/lib/registry/sync.mjs.map +1 -1
  265. package/dist/lib/registry/types.generated.mjs +0 -6
  266. package/dist/lib/registry/types.mjs +0 -6
  267. package/dist/lib/schemas/index.mjs +0 -6
  268. package/dist/lib/schemas/index.mjs.map +1 -1
  269. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  270. package/dist/lib/server/a2a-adapter.mjs +0 -6
  271. package/dist/lib/server/a2a-adapter.mjs.map +1 -1
  272. package/dist/lib/server/account-mode.mjs +0 -6
  273. package/dist/lib/server/account-mode.mjs.map +1 -1
  274. package/dist/lib/server/adcp-server.mjs +0 -6
  275. package/dist/lib/server/adcp-server.mjs.map +1 -1
  276. package/dist/lib/server/auth-introspection.mjs +0 -6
  277. package/dist/lib/server/auth-introspection.mjs.map +1 -1
  278. package/dist/lib/server/auth-signature.mjs +0 -6
  279. package/dist/lib/server/auth-signature.mjs.map +1 -1
  280. package/dist/lib/server/auth.mjs +0 -6
  281. package/dist/lib/server/auth.mjs.map +1 -1
  282. package/dist/lib/server/create-adcp-server.d.mts +13 -0
  283. package/dist/lib/server/create-adcp-server.d.ts +13 -0
  284. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  285. package/dist/lib/server/create-adcp-server.js +3 -2
  286. package/dist/lib/server/create-adcp-server.js.map +1 -1
  287. package/dist/lib/server/create-adcp-server.mjs +3 -8
  288. package/dist/lib/server/create-adcp-server.mjs.map +1 -1
  289. package/dist/lib/server/credential-policy.mjs +0 -6
  290. package/dist/lib/server/credential-policy.mjs.map +1 -1
  291. package/dist/lib/server/ctx-metadata/backends/memory.mjs +0 -6
  292. package/dist/lib/server/ctx-metadata/backends/memory.mjs.map +1 -1
  293. package/dist/lib/server/ctx-metadata/backends/pg.mjs +0 -6
  294. package/dist/lib/server/ctx-metadata/backends/pg.mjs.map +1 -1
  295. package/dist/lib/server/ctx-metadata/backends/redis.mjs +0 -6
  296. package/dist/lib/server/ctx-metadata/backends/redis.mjs.map +1 -1
  297. package/dist/lib/server/ctx-metadata/index.mjs +0 -6
  298. package/dist/lib/server/ctx-metadata/index.mjs.map +1 -1
  299. package/dist/lib/server/ctx-metadata/store.mjs +0 -6
  300. package/dist/lib/server/ctx-metadata/store.mjs.map +1 -1
  301. package/dist/lib/server/ctx-metadata/wire-shape.mjs +0 -6
  302. package/dist/lib/server/ctx-metadata/wire-shape.mjs.map +1 -1
  303. package/dist/lib/server/decisioning/account.mjs +0 -6
  304. package/dist/lib/server/decisioning/account.mjs.map +1 -1
  305. package/dist/lib/server/decisioning/admin-router.mjs +0 -6
  306. package/dist/lib/server/decisioning/admin-router.mjs.map +1 -1
  307. package/dist/lib/server/decisioning/assembly-helpers.mjs +0 -6
  308. package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
  309. package/dist/lib/server/decisioning/async-outcome.mjs +0 -6
  310. package/dist/lib/server/decisioning/async-outcome.mjs.map +1 -1
  311. package/dist/lib/server/decisioning/buyer-agent.mjs +0 -6
  312. package/dist/lib/server/decisioning/buyer-agent.mjs.map +1 -1
  313. package/dist/lib/server/decisioning/capabilities.mjs +0 -6
  314. package/dist/lib/server/decisioning/capabilities.mjs.map +1 -1
  315. package/dist/lib/server/decisioning/compose.mjs +0 -6
  316. package/dist/lib/server/decisioning/compose.mjs.map +1 -1
  317. package/dist/lib/server/decisioning/context.mjs +0 -6
  318. package/dist/lib/server/decisioning/errors-typed.mjs +0 -6
  319. package/dist/lib/server/decisioning/errors-typed.mjs.map +1 -1
  320. package/dist/lib/server/decisioning/helpers.mjs +0 -6
  321. package/dist/lib/server/decisioning/helpers.mjs.map +1 -1
  322. package/dist/lib/server/decisioning/index.mjs +0 -6
  323. package/dist/lib/server/decisioning/index.mjs.map +1 -1
  324. package/dist/lib/server/decisioning/list-helpers.mjs +0 -6
  325. package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
  326. package/dist/lib/server/decisioning/manifest-helpers.mjs +0 -6
  327. package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
  328. package/dist/lib/server/decisioning/pagination.mjs +0 -6
  329. package/dist/lib/server/decisioning/platform-helpers.mjs +0 -6
  330. package/dist/lib/server/decisioning/platform-helpers.mjs.map +1 -1
  331. package/dist/lib/server/decisioning/platform.mjs +0 -6
  332. package/dist/lib/server/decisioning/proposal/dispatch.mjs +0 -6
  333. package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
  334. package/dist/lib/server/decisioning/proposal/index.mjs +0 -6
  335. package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
  336. package/dist/lib/server/decisioning/proposal/lifecycle.mjs +0 -6
  337. package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
  338. package/dist/lib/server/decisioning/proposal/mock-manager.mjs +0 -6
  339. package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
  340. package/dist/lib/server/decisioning/proposal/store.mjs +0 -6
  341. package/dist/lib/server/decisioning/proposal/store.mjs.map +1 -1
  342. package/dist/lib/server/decisioning/proposal/types.mjs +0 -6
  343. package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
  344. package/dist/lib/server/decisioning/resolve-presets.mjs +0 -6
  345. package/dist/lib/server/decisioning/resolve-presets.mjs.map +1 -1
  346. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs +0 -6
  347. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
  348. package/dist/lib/server/decisioning/runtime/from-platform.mjs +0 -6
  349. package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
  350. package/dist/lib/server/decisioning/runtime/observed-modes.mjs +0 -6
  351. package/dist/lib/server/decisioning/runtime/observed-modes.mjs.map +1 -1
  352. package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs +0 -6
  353. package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs.map +1 -1
  354. package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs +0 -6
  355. package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs.map +1 -1
  356. package/dist/lib/server/decisioning/runtime/task-registry.mjs +0 -6
  357. package/dist/lib/server/decisioning/runtime/task-registry.mjs.map +1 -1
  358. package/dist/lib/server/decisioning/runtime/to-context.mjs +0 -6
  359. package/dist/lib/server/decisioning/runtime/to-context.mjs.map +1 -1
  360. package/dist/lib/server/decisioning/runtime/validate-platform.mjs +0 -6
  361. package/dist/lib/server/decisioning/runtime/validate-platform.mjs.map +1 -1
  362. package/dist/lib/server/decisioning/specialisms/audiences.mjs +0 -6
  363. package/dist/lib/server/decisioning/specialisms/brand-rights.mjs +0 -6
  364. package/dist/lib/server/decisioning/specialisms/campaign-governance.mjs +0 -6
  365. package/dist/lib/server/decisioning/specialisms/content-standards.mjs +0 -6
  366. package/dist/lib/server/decisioning/specialisms/creative-ad-server.mjs +0 -6
  367. package/dist/lib/server/decisioning/specialisms/creative.mjs +0 -6
  368. package/dist/lib/server/decisioning/specialisms/lists.mjs +0 -6
  369. package/dist/lib/server/decisioning/specialisms/sales.mjs +0 -6
  370. package/dist/lib/server/decisioning/specialisms/signals.mjs +0 -6
  371. package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.mjs +0 -6
  372. package/dist/lib/server/decisioning/start-time.mjs +0 -6
  373. package/dist/lib/server/decisioning/start-time.mjs.map +1 -1
  374. package/dist/lib/server/decisioning/status-changes.mjs +0 -6
  375. package/dist/lib/server/decisioning/status-changes.mjs.map +1 -1
  376. package/dist/lib/server/decisioning/status-mappers.mjs +0 -6
  377. package/dist/lib/server/decisioning/status-mappers.mjs.map +1 -1
  378. package/dist/lib/server/decisioning/tenant-registry.mjs +0 -6
  379. package/dist/lib/server/decisioning/tenant-registry.mjs.map +1 -1
  380. package/dist/lib/server/decisioning/tenant-store.mjs +0 -6
  381. package/dist/lib/server/decisioning/tenant-store.mjs.map +1 -1
  382. package/dist/lib/server/decisioning/validate-specialisms.mjs +0 -6
  383. package/dist/lib/server/decisioning/validate-specialisms.mjs.map +1 -1
  384. package/dist/lib/server/dynamic-registry.mjs +0 -6
  385. package/dist/lib/server/dynamic-registry.mjs.map +1 -1
  386. package/dist/lib/server/envelope-allowlist.mjs +0 -6
  387. package/dist/lib/server/envelope-allowlist.mjs.map +1 -1
  388. package/dist/lib/server/error-arm-tools.mjs +5 -6
  389. package/dist/lib/server/error-arm-tools.mjs.map +1 -1
  390. package/dist/lib/server/errors.mjs +0 -6
  391. package/dist/lib/server/errors.mjs.map +1 -1
  392. package/dist/lib/server/example-tld-guard.mjs +0 -6
  393. package/dist/lib/server/example-tld-guard.mjs.map +1 -1
  394. package/dist/lib/server/express-adapter.mjs +0 -6
  395. package/dist/lib/server/express-adapter.mjs.map +1 -1
  396. package/dist/lib/server/governance.mjs +0 -6
  397. package/dist/lib/server/governance.mjs.map +1 -1
  398. package/dist/lib/server/idempotency/backends/lazy.mjs +0 -6
  399. package/dist/lib/server/idempotency/backends/lazy.mjs.map +1 -1
  400. package/dist/lib/server/idempotency/backends/memory.mjs +0 -6
  401. package/dist/lib/server/idempotency/backends/memory.mjs.map +1 -1
  402. package/dist/lib/server/idempotency/backends/pg.mjs +0 -6
  403. package/dist/lib/server/idempotency/backends/pg.mjs.map +1 -1
  404. package/dist/lib/server/idempotency/backends/redis.mjs +0 -6
  405. package/dist/lib/server/idempotency/backends/redis.mjs.map +1 -1
  406. package/dist/lib/server/idempotency/index.mjs +0 -6
  407. package/dist/lib/server/idempotency/index.mjs.map +1 -1
  408. package/dist/lib/server/idempotency/store.mjs +0 -6
  409. package/dist/lib/server/idempotency/store.mjs.map +1 -1
  410. package/dist/lib/server/index.d.mts +1 -1
  411. package/dist/lib/server/index.d.ts +1 -1
  412. package/dist/lib/server/index.d.ts.map +1 -1
  413. package/dist/lib/server/index.js.map +1 -1
  414. package/dist/lib/server/index.mjs +0 -6
  415. package/dist/lib/server/index.mjs.map +1 -1
  416. package/dist/lib/server/legacy/v5/index.d.mts +1 -1
  417. package/dist/lib/server/legacy/v5/index.d.ts +1 -1
  418. package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
  419. package/dist/lib/server/legacy/v5/index.js.map +1 -1
  420. package/dist/lib/server/legacy/v5/index.mjs +0 -6
  421. package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
  422. package/dist/lib/server/mcp-modern-server.mjs +0 -6
  423. package/dist/lib/server/mcp-modern-server.mjs.map +1 -1
  424. package/dist/lib/server/media-buy-actions.mjs +0 -6
  425. package/dist/lib/server/media-buy-actions.mjs.map +1 -1
  426. package/dist/lib/server/media-buy-helpers.mjs +0 -6
  427. package/dist/lib/server/media-buy-helpers.mjs.map +1 -1
  428. package/dist/lib/server/media-buy-store.mjs +0 -6
  429. package/dist/lib/server/media-buy-store.mjs.map +1 -1
  430. package/dist/lib/server/normalize-errors.mjs +0 -6
  431. package/dist/lib/server/normalize-errors.mjs.map +1 -1
  432. package/dist/lib/server/operational-platform.mjs +0 -6
  433. package/dist/lib/server/operational-platform.mjs.map +1 -1
  434. package/dist/lib/server/pick-safe-details.mjs +0 -6
  435. package/dist/lib/server/pick-safe-details.mjs.map +1 -1
  436. package/dist/lib/server/pin-and-bind-fetch.mjs +0 -6
  437. package/dist/lib/server/pin-and-bind-fetch.mjs.map +1 -1
  438. package/dist/lib/server/postgres-state-store.mjs +0 -6
  439. package/dist/lib/server/postgres-state-store.mjs.map +1 -1
  440. package/dist/lib/server/postgres-task-store.mjs +0 -6
  441. package/dist/lib/server/postgres-task-store.mjs.map +1 -1
  442. package/dist/lib/server/product-defaults.mjs +0 -6
  443. package/dist/lib/server/product-defaults.mjs.map +1 -1
  444. package/dist/lib/server/redact.mjs +0 -6
  445. package/dist/lib/server/redact.mjs.map +1 -1
  446. package/dist/lib/server/responses.mjs +0 -6
  447. package/dist/lib/server/responses.mjs.map +1 -1
  448. package/dist/lib/server/serve.mjs +0 -6
  449. package/dist/lib/server/serve.mjs.map +1 -1
  450. package/dist/lib/server/socket-mode/conformance-client.mjs +0 -6
  451. package/dist/lib/server/socket-mode/conformance-client.mjs.map +1 -1
  452. package/dist/lib/server/socket-mode/index.mjs +0 -6
  453. package/dist/lib/server/socket-mode/index.mjs.map +1 -1
  454. package/dist/lib/server/socket-mode/ws-transport.mjs +0 -6
  455. package/dist/lib/server/socket-mode/ws-transport.mjs.map +1 -1
  456. package/dist/lib/server/state-machine.mjs +0 -6
  457. package/dist/lib/server/state-machine.mjs.map +1 -1
  458. package/dist/lib/server/state-store.mjs +0 -6
  459. package/dist/lib/server/state-store.mjs.map +1 -1
  460. package/dist/lib/server/structured-serialize.mjs +0 -6
  461. package/dist/lib/server/structured-serialize.mjs.map +1 -1
  462. package/dist/lib/server/targeting-helpers.mjs +0 -6
  463. package/dist/lib/server/targeting-helpers.mjs.map +1 -1
  464. package/dist/lib/server/tasks.mjs +0 -6
  465. package/dist/lib/server/tasks.mjs.map +1 -1
  466. package/dist/lib/server/test-controller-bridge.mjs +0 -6
  467. package/dist/lib/server/test-controller-bridge.mjs.map +1 -1
  468. package/dist/lib/server/test-controller.mjs +0 -6
  469. package/dist/lib/server/test-controller.mjs.map +1 -1
  470. package/dist/lib/server/upstream-helpers.mjs +0 -6
  471. package/dist/lib/server/upstream-helpers.mjs.map +1 -1
  472. package/dist/lib/server/webhook-emitter.mjs +0 -6
  473. package/dist/lib/server/webhook-emitter.mjs.map +1 -1
  474. package/dist/lib/server/wire-safe.mjs +0 -6
  475. package/dist/lib/server/wire-safe.mjs.map +1 -1
  476. package/dist/lib/server/wire-spec-fields.generated.mjs +0 -6
  477. package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
  478. package/dist/lib/server/wrap-envelope.mjs +0 -6
  479. package/dist/lib/server/wrap-envelope.mjs.map +1 -1
  480. package/dist/lib/signing/agent-context.mjs +0 -6
  481. package/dist/lib/signing/agent-context.mjs.map +1 -1
  482. package/dist/lib/signing/agent-fetch.mjs +0 -6
  483. package/dist/lib/signing/agent-fetch.mjs.map +1 -1
  484. package/dist/lib/signing/agent-resolver/canonicalize.mjs +0 -6
  485. package/dist/lib/signing/agent-resolver/canonicalize.mjs.map +1 -1
  486. package/dist/lib/signing/agent-resolver/capabilities-types.mjs +0 -6
  487. package/dist/lib/signing/agent-resolver/capabilities-types.mjs.map +1 -1
  488. package/dist/lib/signing/agent-resolver/consistency.mjs +0 -6
  489. package/dist/lib/signing/agent-resolver/consistency.mjs.map +1 -1
  490. package/dist/lib/signing/agent-resolver/errors.mjs +0 -6
  491. package/dist/lib/signing/agent-resolver/errors.mjs.map +1 -1
  492. package/dist/lib/signing/agent-resolver/etld.mjs +0 -6
  493. package/dist/lib/signing/agent-resolver/etld.mjs.map +1 -1
  494. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs +0 -6
  495. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs.map +1 -1
  496. package/dist/lib/signing/agent-resolver/index.mjs +0 -6
  497. package/dist/lib/signing/agent-resolver/index.mjs.map +1 -1
  498. package/dist/lib/signing/agent-resolver/jwks-set.mjs +0 -6
  499. package/dist/lib/signing/agent-resolver/jwks-set.mjs.map +1 -1
  500. package/dist/lib/signing/agent-resolver/resolve-agent.mjs +0 -6
  501. package/dist/lib/signing/agent-resolver/resolve-agent.mjs.map +1 -1
  502. package/dist/lib/signing/agent-resolver/select-agent.mjs +0 -6
  503. package/dist/lib/signing/agent-resolver/select-agent.mjs.map +1 -1
  504. package/dist/lib/signing/agent-resolver/strict-json.mjs +0 -6
  505. package/dist/lib/signing/agent-resolver/strict-json.mjs.map +1 -1
  506. package/dist/lib/signing/brand-jwks.mjs +0 -6
  507. package/dist/lib/signing/brand-jwks.mjs.map +1 -1
  508. package/dist/lib/signing/canonicalize.mjs +0 -6
  509. package/dist/lib/signing/canonicalize.mjs.map +1 -1
  510. package/dist/lib/signing/capability-cache.mjs +0 -6
  511. package/dist/lib/signing/capability-cache.mjs.map +1 -1
  512. package/dist/lib/signing/capability-priming.mjs +0 -6
  513. package/dist/lib/signing/capability-priming.mjs.map +1 -1
  514. package/dist/lib/signing/client.mjs +0 -6
  515. package/dist/lib/signing/client.mjs.map +1 -1
  516. package/dist/lib/signing/content-digest.mjs +0 -6
  517. package/dist/lib/signing/content-digest.mjs.map +1 -1
  518. package/dist/lib/signing/crypto.mjs +0 -6
  519. package/dist/lib/signing/crypto.mjs.map +1 -1
  520. package/dist/lib/signing/ecdsa-encoding.mjs +0 -6
  521. package/dist/lib/signing/ecdsa-encoding.mjs.map +1 -1
  522. package/dist/lib/signing/errors.mjs +0 -6
  523. package/dist/lib/signing/errors.mjs.map +1 -1
  524. package/dist/lib/signing/fetch-async.mjs +0 -6
  525. package/dist/lib/signing/fetch-async.mjs.map +1 -1
  526. package/dist/lib/signing/fetch.mjs +0 -6
  527. package/dist/lib/signing/fetch.mjs.map +1 -1
  528. package/dist/lib/signing/index.mjs +0 -6
  529. package/dist/lib/signing/index.mjs.map +1 -1
  530. package/dist/lib/signing/jwks-helpers.mjs +0 -6
  531. package/dist/lib/signing/jwks-helpers.mjs.map +1 -1
  532. package/dist/lib/signing/jwks-https.mjs +0 -6
  533. package/dist/lib/signing/jwks-https.mjs.map +1 -1
  534. package/dist/lib/signing/jwks.mjs +0 -6
  535. package/dist/lib/signing/jwks.mjs.map +1 -1
  536. package/dist/lib/signing/middleware.mjs +0 -6
  537. package/dist/lib/signing/middleware.mjs.map +1 -1
  538. package/dist/lib/signing/parser.mjs +0 -6
  539. package/dist/lib/signing/parser.mjs.map +1 -1
  540. package/dist/lib/signing/postgres-replay-store.mjs +0 -6
  541. package/dist/lib/signing/postgres-replay-store.mjs.map +1 -1
  542. package/dist/lib/signing/protocol-response.mjs +0 -6
  543. package/dist/lib/signing/protocol-response.mjs.map +1 -1
  544. package/dist/lib/signing/provider.mjs +0 -6
  545. package/dist/lib/signing/redis-replay-store.mjs +0 -6
  546. package/dist/lib/signing/redis-replay-store.mjs.map +1 -1
  547. package/dist/lib/signing/replay.mjs +0 -6
  548. package/dist/lib/signing/replay.mjs.map +1 -1
  549. package/dist/lib/signing/request-context.mjs +0 -6
  550. package/dist/lib/signing/request-context.mjs.map +1 -1
  551. package/dist/lib/signing/revocation-https.mjs +0 -6
  552. package/dist/lib/signing/revocation-https.mjs.map +1 -1
  553. package/dist/lib/signing/revocation.mjs +0 -6
  554. package/dist/lib/signing/revocation.mjs.map +1 -1
  555. package/dist/lib/signing/server.mjs +0 -6
  556. package/dist/lib/signing/server.mjs.map +1 -1
  557. package/dist/lib/signing/signer-async.mjs +0 -6
  558. package/dist/lib/signing/signer-async.mjs.map +1 -1
  559. package/dist/lib/signing/signer.mjs +0 -6
  560. package/dist/lib/signing/signer.mjs.map +1 -1
  561. package/dist/lib/signing/testing.mjs +0 -6
  562. package/dist/lib/signing/testing.mjs.map +1 -1
  563. package/dist/lib/signing/types.mjs +0 -6
  564. package/dist/lib/signing/types.mjs.map +1 -1
  565. package/dist/lib/signing/verifier.mjs +0 -6
  566. package/dist/lib/signing/verifier.mjs.map +1 -1
  567. package/dist/lib/signing/webhook-auth-detection.mjs +0 -6
  568. package/dist/lib/signing/webhook-auth-detection.mjs.map +1 -1
  569. package/dist/lib/signing/webhook-verifier.mjs +0 -6
  570. package/dist/lib/signing/webhook-verifier.mjs.map +1 -1
  571. package/dist/lib/storage/MemoryStorage.mjs +0 -6
  572. package/dist/lib/storage/MemoryStorage.mjs.map +1 -1
  573. package/dist/lib/storage/interfaces.mjs +0 -6
  574. package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs +0 -6
  575. package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs.map +1 -1
  576. package/dist/lib/substitution/encoder/index.mjs +0 -6
  577. package/dist/lib/substitution/encoder/index.mjs.map +1 -1
  578. package/dist/lib/substitution/index.mjs +0 -6
  579. package/dist/lib/substitution/index.mjs.map +1 -1
  580. package/dist/lib/substitution/observer/SubstitutionObserver.mjs +0 -6
  581. package/dist/lib/substitution/observer/SubstitutionObserver.mjs.map +1 -1
  582. package/dist/lib/substitution/observer/alignment.mjs +0 -6
  583. package/dist/lib/substitution/observer/alignment.mjs.map +1 -1
  584. package/dist/lib/substitution/observer/assertions.mjs +0 -6
  585. package/dist/lib/substitution/observer/assertions.mjs.map +1 -1
  586. package/dist/lib/substitution/observer/html-parser.mjs +0 -6
  587. package/dist/lib/substitution/observer/html-parser.mjs.map +1 -1
  588. package/dist/lib/substitution/observer/index.mjs +0 -6
  589. package/dist/lib/substitution/observer/index.mjs.map +1 -1
  590. package/dist/lib/substitution/observer/ssrf.mjs +0 -6
  591. package/dist/lib/substitution/observer/ssrf.mjs.map +1 -1
  592. package/dist/lib/substitution/rfc3986.mjs +0 -6
  593. package/dist/lib/substitution/rfc3986.mjs.map +1 -1
  594. package/dist/lib/substitution/translate.mjs +0 -6
  595. package/dist/lib/substitution/translate.mjs.map +1 -1
  596. package/dist/lib/substitution/types.mjs +0 -6
  597. package/dist/lib/substitution/vectors.mjs +0 -6
  598. package/dist/lib/substitution/vectors.mjs.map +1 -1
  599. package/dist/lib/testing/agent-tester.mjs +0 -6
  600. package/dist/lib/testing/agent-tester.mjs.map +1 -1
  601. package/dist/lib/testing/client.mjs +0 -6
  602. package/dist/lib/testing/client.mjs.map +1 -1
  603. package/dist/lib/testing/compliance/briefs.mjs +0 -6
  604. package/dist/lib/testing/compliance/briefs.mjs.map +1 -1
  605. package/dist/lib/testing/compliance/comply.mjs +0 -6
  606. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  607. package/dist/lib/testing/compliance/index.mjs +0 -6
  608. package/dist/lib/testing/compliance/index.mjs.map +1 -1
  609. package/dist/lib/testing/compliance/spec-conformance.mjs +0 -6
  610. package/dist/lib/testing/compliance/spec-conformance.mjs.map +1 -1
  611. package/dist/lib/testing/compliance/storyboard-tracks.mjs +0 -6
  612. package/dist/lib/testing/compliance/storyboard-tracks.mjs.map +1 -1
  613. package/dist/lib/testing/compliance/summary.mjs +0 -6
  614. package/dist/lib/testing/compliance/summary.mjs.map +1 -1
  615. package/dist/lib/testing/compliance/types.mjs +0 -6
  616. package/dist/lib/testing/comply-controller.mjs +0 -6
  617. package/dist/lib/testing/comply-controller.mjs.map +1 -1
  618. package/dist/lib/testing/controller-assertions.mjs +0 -6
  619. package/dist/lib/testing/controller-assertions.mjs.map +1 -1
  620. package/dist/lib/testing/formatter.mjs +0 -6
  621. package/dist/lib/testing/formatter.mjs.map +1 -1
  622. package/dist/lib/testing/index.mjs +0 -6
  623. package/dist/lib/testing/index.mjs.map +1 -1
  624. package/dist/lib/testing/local-agent-runner.mjs +0 -6
  625. package/dist/lib/testing/local-agent-runner.mjs.map +1 -1
  626. package/dist/lib/testing/orchestrator.mjs +0 -6
  627. package/dist/lib/testing/orchestrator.mjs.map +1 -1
  628. package/dist/lib/testing/personas/index.mjs +0 -6
  629. package/dist/lib/testing/personas/index.mjs.map +1 -1
  630. package/dist/lib/testing/scenarios/brand-rights.mjs +0 -6
  631. package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
  632. package/dist/lib/testing/scenarios/capabilities.mjs +0 -6
  633. package/dist/lib/testing/scenarios/capabilities.mjs.map +1 -1
  634. package/dist/lib/testing/scenarios/creative.mjs +0 -6
  635. package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
  636. package/dist/lib/testing/scenarios/deterministic.mjs +0 -6
  637. package/dist/lib/testing/scenarios/deterministic.mjs.map +1 -1
  638. package/dist/lib/testing/scenarios/discovery.mjs +0 -6
  639. package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
  640. package/dist/lib/testing/scenarios/edge-cases.mjs +0 -6
  641. package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
  642. package/dist/lib/testing/scenarios/error-compliance.mjs +0 -6
  643. package/dist/lib/testing/scenarios/error-compliance.mjs.map +1 -1
  644. package/dist/lib/testing/scenarios/governance.mjs +0 -6
  645. package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
  646. package/dist/lib/testing/scenarios/health.mjs +0 -6
  647. package/dist/lib/testing/scenarios/health.mjs.map +1 -1
  648. package/dist/lib/testing/scenarios/index.mjs +0 -6
  649. package/dist/lib/testing/scenarios/index.mjs.map +1 -1
  650. package/dist/lib/testing/scenarios/media-buy.mjs +0 -6
  651. package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
  652. package/dist/lib/testing/scenarios/schema-compliance.mjs +0 -6
  653. package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
  654. package/dist/lib/testing/scenarios/signals.mjs +0 -6
  655. package/dist/lib/testing/scenarios/signals.mjs.map +1 -1
  656. package/dist/lib/testing/scenarios/sponsored-intelligence.mjs +0 -6
  657. package/dist/lib/testing/scenarios/sponsored-intelligence.mjs.map +1 -1
  658. package/dist/lib/testing/scenarios/trusted-match.mjs +0 -6
  659. package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
  660. package/dist/lib/testing/seed-merge.mjs +0 -6
  661. package/dist/lib/testing/seed-merge.mjs.map +1 -1
  662. package/dist/lib/testing/storyboard/agent-routing.mjs +0 -6
  663. package/dist/lib/testing/storyboard/agent-routing.mjs.map +1 -1
  664. package/dist/lib/testing/storyboard/assertions.mjs +0 -6
  665. package/dist/lib/testing/storyboard/assertions.mjs.map +1 -1
  666. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +0 -6
  667. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs.map +1 -1
  668. package/dist/lib/testing/storyboard/compliance.mjs +5 -6
  669. package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
  670. package/dist/lib/testing/storyboard/context.mjs +0 -6
  671. package/dist/lib/testing/storyboard/context.mjs.map +1 -1
  672. package/dist/lib/testing/storyboard/default-invariants.mjs +0 -6
  673. package/dist/lib/testing/storyboard/default-invariants.mjs.map +1 -1
  674. package/dist/lib/testing/storyboard/index.mjs +0 -6
  675. package/dist/lib/testing/storyboard/index.mjs.map +1 -1
  676. package/dist/lib/testing/storyboard/junit.mjs +0 -6
  677. package/dist/lib/testing/storyboard/junit.mjs.map +1 -1
  678. package/dist/lib/testing/storyboard/loader.mjs +0 -6
  679. package/dist/lib/testing/storyboard/loader.mjs.map +1 -1
  680. package/dist/lib/testing/storyboard/parallel-dispatch.mjs +0 -6
  681. package/dist/lib/testing/storyboard/parallel-dispatch.mjs.map +1 -1
  682. package/dist/lib/testing/storyboard/path.mjs +0 -6
  683. package/dist/lib/testing/storyboard/path.mjs.map +1 -1
  684. package/dist/lib/testing/storyboard/probes.mjs +0 -6
  685. package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
  686. package/dist/lib/testing/storyboard/rate-limit-trip.mjs +0 -6
  687. package/dist/lib/testing/storyboard/rate-limit-trip.mjs.map +1 -1
  688. package/dist/lib/testing/storyboard/rejection-hints.mjs +0 -6
  689. package/dist/lib/testing/storyboard/rejection-hints.mjs.map +1 -1
  690. package/dist/lib/testing/storyboard/request-builder.mjs +0 -6
  691. package/dist/lib/testing/storyboard/request-builder.mjs.map +1 -1
  692. package/dist/lib/testing/storyboard/request-signing/builder.mjs +0 -6
  693. package/dist/lib/testing/storyboard/request-signing/builder.mjs.map +1 -1
  694. package/dist/lib/testing/storyboard/request-signing/grader.mjs +0 -6
  695. package/dist/lib/testing/storyboard/request-signing/grader.mjs.map +1 -1
  696. package/dist/lib/testing/storyboard/request-signing/index.mjs +0 -6
  697. package/dist/lib/testing/storyboard/request-signing/index.mjs.map +1 -1
  698. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +0 -6
  699. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs.map +1 -1
  700. package/dist/lib/testing/storyboard/request-signing/probe.mjs +0 -6
  701. package/dist/lib/testing/storyboard/request-signing/probe.mjs.map +1 -1
  702. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs +0 -6
  703. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs.map +1 -1
  704. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs +0 -6
  705. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs.map +1 -1
  706. package/dist/lib/testing/storyboard/request-signing/types.mjs +0 -6
  707. package/dist/lib/testing/storyboard/request-signing/types.mjs.map +1 -1
  708. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +0 -6
  709. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
  710. package/dist/lib/testing/storyboard/runner.mjs +0 -6
  711. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  712. package/dist/lib/testing/storyboard/sandbox-entities.mjs +0 -6
  713. package/dist/lib/testing/storyboard/sandbox-entities.mjs.map +1 -1
  714. package/dist/lib/testing/storyboard/seeding.mjs +0 -6
  715. package/dist/lib/testing/storyboard/seeding.mjs.map +1 -1
  716. package/dist/lib/testing/storyboard/shape-drift-hints.mjs +0 -6
  717. package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
  718. package/dist/lib/testing/storyboard/signer-grader/grader.mjs +0 -6
  719. package/dist/lib/testing/storyboard/signer-grader/grader.mjs.map +1 -1
  720. package/dist/lib/testing/storyboard/signer-grader/index.mjs +0 -6
  721. package/dist/lib/testing/storyboard/signer-grader/index.mjs.map +1 -1
  722. package/dist/lib/testing/storyboard/signer-grader/types.mjs +0 -6
  723. package/dist/lib/testing/storyboard/strict-validation-hints.mjs +0 -6
  724. package/dist/lib/testing/storyboard/strict-validation-hints.mjs.map +1 -1
  725. package/dist/lib/testing/storyboard/task-map.mjs +0 -6
  726. package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
  727. package/dist/lib/testing/storyboard/test-kit.mjs +0 -6
  728. package/dist/lib/testing/storyboard/test-kit.mjs.map +1 -1
  729. package/dist/lib/testing/storyboard/types.mjs +0 -6
  730. package/dist/lib/testing/storyboard/types.mjs.map +1 -1
  731. package/dist/lib/testing/storyboard/validations.mjs +0 -6
  732. package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
  733. package/dist/lib/testing/storyboard/webhook-assertions.mjs +0 -6
  734. package/dist/lib/testing/storyboard/webhook-assertions.mjs.map +1 -1
  735. package/dist/lib/testing/storyboard/webhook-receiver.mjs +0 -6
  736. package/dist/lib/testing/storyboard/webhook-receiver.mjs.map +1 -1
  737. package/dist/lib/testing/stubs/governance-agent-stub.mjs +0 -6
  738. package/dist/lib/testing/stubs/governance-agent-stub.mjs.map +1 -1
  739. package/dist/lib/testing/stubs/index.mjs +0 -6
  740. package/dist/lib/testing/stubs/index.mjs.map +1 -1
  741. package/dist/lib/testing/test-controller.mjs +0 -6
  742. package/dist/lib/testing/test-controller.mjs.map +1 -1
  743. package/dist/lib/testing/test-helpers.mjs +0 -6
  744. package/dist/lib/testing/test-helpers.mjs.map +1 -1
  745. package/dist/lib/testing/types.mjs +0 -6
  746. package/dist/lib/types/adcp.mjs +0 -6
  747. package/dist/lib/types/adcp.mjs.map +1 -1
  748. package/dist/lib/types/asset-instances.mjs +0 -6
  749. package/dist/lib/types/compat.mjs +0 -6
  750. package/dist/lib/types/compat.mjs.map +1 -1
  751. package/dist/lib/types/core.generated.mjs +0 -6
  752. package/dist/lib/types/enums.generated.mjs +0 -6
  753. package/dist/lib/types/enums.generated.mjs.map +1 -1
  754. package/dist/lib/types/error-codes.mjs +0 -6
  755. package/dist/lib/types/error-codes.mjs.map +1 -1
  756. package/dist/lib/types/error-details.aliases.mjs +0 -6
  757. package/dist/lib/types/error-details.aliases.mjs.map +1 -1
  758. package/dist/lib/types/format-asset-slots.mjs +0 -6
  759. package/dist/lib/types/forward-compat-error-codes.mjs +0 -6
  760. package/dist/lib/types/forward-compat-error-codes.mjs.map +1 -1
  761. package/dist/lib/types/index.mjs +0 -6
  762. package/dist/lib/types/index.mjs.map +1 -1
  763. package/dist/lib/types/inline-enums.aliases.mjs +0 -6
  764. package/dist/lib/types/inline-enums.aliases.mjs.map +1 -1
  765. package/dist/lib/types/inline-enums.generated.mjs +0 -6
  766. package/dist/lib/types/inline-enums.generated.mjs.map +1 -1
  767. package/dist/lib/types/manifest.generated.mjs +0 -6
  768. package/dist/lib/types/manifest.generated.mjs.map +1 -1
  769. package/dist/lib/types/schemas.generated.mjs +0 -6
  770. package/dist/lib/types/schemas.generated.mjs.map +1 -1
  771. package/dist/lib/types/server-payload-aliases.mjs +0 -6
  772. package/dist/lib/types/server-payload.mjs +0 -6
  773. package/dist/lib/types/sync-rows.mjs +0 -6
  774. package/dist/lib/types/tools.generated.mjs +0 -6
  775. package/dist/lib/types/v2-5/index.mjs +0 -6
  776. package/dist/lib/types/v2-5/index.mjs.map +1 -1
  777. package/dist/lib/types/v2-5/tools.generated.mjs +0 -6
  778. package/dist/lib/types/v3-1-beta/index.mjs +0 -6
  779. package/dist/lib/types/v3-1-beta/index.mjs.map +1 -1
  780. package/dist/lib/types/v3-1-beta/tools.generated.mjs +0 -6
  781. package/dist/lib/types/wellknown-schemas.generated.mjs +0 -6
  782. package/dist/lib/types/wellknown-schemas.generated.mjs.map +1 -1
  783. package/dist/lib/upstream-recorder/constants.mjs +0 -6
  784. package/dist/lib/upstream-recorder/constants.mjs.map +1 -1
  785. package/dist/lib/upstream-recorder/index.mjs +0 -6
  786. package/dist/lib/upstream-recorder/index.mjs.map +1 -1
  787. package/dist/lib/upstream-recorder/recorder.mjs +0 -6
  788. package/dist/lib/upstream-recorder/recorder.mjs.map +1 -1
  789. package/dist/lib/upstream-recorder/types.mjs +0 -6
  790. package/dist/lib/upstream-recorder/types.mjs.map +1 -1
  791. package/dist/lib/utils/a2a-artifacts.mjs +0 -6
  792. package/dist/lib/utils/a2a-artifacts.mjs.map +1 -1
  793. package/dist/lib/utils/a2a-discovery.mjs +0 -6
  794. package/dist/lib/utils/a2a-discovery.mjs.map +1 -1
  795. package/dist/lib/utils/activation-key-builders.mjs +0 -6
  796. package/dist/lib/utils/activation-key-builders.mjs.map +1 -1
  797. package/dist/lib/utils/adcp-version-config.mjs +0 -6
  798. package/dist/lib/utils/adcp-version-config.mjs.map +1 -1
  799. package/dist/lib/utils/asset-builders.mjs +0 -6
  800. package/dist/lib/utils/asset-builders.mjs.map +1 -1
  801. package/dist/lib/utils/build-creative-return-builders.mjs +0 -6
  802. package/dist/lib/utils/build-creative-return-builders.mjs.map +1 -1
  803. package/dist/lib/utils/buyer-retry-policy.mjs +0 -6
  804. package/dist/lib/utils/buyer-retry-policy.mjs.map +1 -1
  805. package/dist/lib/utils/capabilities.mjs +0 -6
  806. package/dist/lib/utils/capabilities.mjs.map +1 -1
  807. package/dist/lib/utils/capability-rollups.mjs +0 -6
  808. package/dist/lib/utils/capability-rollups.mjs.map +1 -1
  809. package/dist/lib/utils/creative-adapter.mjs +0 -6
  810. package/dist/lib/utils/creative-adapter.mjs.map +1 -1
  811. package/dist/lib/utils/creative-delivery.mjs +0 -6
  812. package/dist/lib/utils/creative-delivery.mjs.map +1 -1
  813. package/dist/lib/utils/deprecation.mjs +0 -6
  814. package/dist/lib/utils/deprecation.mjs.map +1 -1
  815. package/dist/lib/utils/envelope-status-compat.mjs +0 -6
  816. package/dist/lib/utils/envelope-status-compat.mjs.map +1 -1
  817. package/dist/lib/utils/error-extraction.mjs +0 -6
  818. package/dist/lib/utils/error-extraction.mjs.map +1 -1
  819. package/dist/lib/utils/extract-result.mjs +0 -6
  820. package/dist/lib/utils/extract-result.mjs.map +1 -1
  821. package/dist/lib/utils/format-asset-slot-builders.mjs +0 -6
  822. package/dist/lib/utils/format-asset-slot-builders.mjs.map +1 -1
  823. package/dist/lib/utils/format-assets.mjs +0 -6
  824. package/dist/lib/utils/format-assets.mjs.map +1 -1
  825. package/dist/lib/utils/format-render-builders.mjs +0 -6
  826. package/dist/lib/utils/format-render-builders.mjs.map +1 -1
  827. package/dist/lib/utils/format-renders.mjs +0 -6
  828. package/dist/lib/utils/format-renders.mjs.map +1 -1
  829. package/dist/lib/utils/get-products-cache-scope.mjs +0 -6
  830. package/dist/lib/utils/get-products-cache-scope.mjs.map +1 -1
  831. package/dist/lib/utils/glob.mjs +0 -6
  832. package/dist/lib/utils/glob.mjs.map +1 -1
  833. package/dist/lib/utils/global-async-local-storage.mjs +0 -6
  834. package/dist/lib/utils/global-async-local-storage.mjs.map +1 -1
  835. package/dist/lib/utils/idempotency.mjs +0 -6
  836. package/dist/lib/utils/idempotency.mjs.map +1 -1
  837. package/dist/lib/utils/index.mjs +0 -6
  838. package/dist/lib/utils/index.mjs.map +1 -1
  839. package/dist/lib/utils/jcs.mjs +0 -6
  840. package/dist/lib/utils/jcs.mjs.map +1 -1
  841. package/dist/lib/utils/json-depth.mjs +0 -6
  842. package/dist/lib/utils/json-depth.mjs.map +1 -1
  843. package/dist/lib/utils/logger.mjs +0 -6
  844. package/dist/lib/utils/logger.mjs.map +1 -1
  845. package/dist/lib/utils/media-buy-delivery-notification-builders.mjs +0 -6
  846. package/dist/lib/utils/media-buy-delivery-notification-builders.mjs.map +1 -1
  847. package/dist/lib/utils/media-buy-status.mjs +0 -6
  848. package/dist/lib/utils/media-buy-status.mjs.map +1 -1
  849. package/dist/lib/utils/pagination.mjs +0 -6
  850. package/dist/lib/utils/pagination.mjs.map +1 -1
  851. package/dist/lib/utils/preview-creative-builders.mjs +0 -6
  852. package/dist/lib/utils/preview-creative-builders.mjs.map +1 -1
  853. package/dist/lib/utils/preview-normalizer.mjs +0 -6
  854. package/dist/lib/utils/preview-normalizer.mjs.map +1 -1
  855. package/dist/lib/utils/preview-utils.mjs +0 -6
  856. package/dist/lib/utils/preview-utils.mjs.map +1 -1
  857. package/dist/lib/utils/pricing-adapter.mjs +0 -6
  858. package/dist/lib/utils/pricing-adapter.mjs.map +1 -1
  859. package/dist/lib/utils/probe-policy.mjs +0 -6
  860. package/dist/lib/utils/probe-policy.mjs.map +1 -1
  861. package/dist/lib/utils/protocol-detection.mjs +0 -6
  862. package/dist/lib/utils/protocol-detection.mjs.map +1 -1
  863. package/dist/lib/utils/redact-secrets.mjs +0 -6
  864. package/dist/lib/utils/redact-secrets.mjs.map +1 -1
  865. package/dist/lib/utils/redis-default-prefix-warn.mjs +0 -6
  866. package/dist/lib/utils/redis-default-prefix-warn.mjs.map +1 -1
  867. package/dist/lib/utils/render-builders.mjs +0 -6
  868. package/dist/lib/utils/render-builders.mjs.map +1 -1
  869. package/dist/lib/utils/request-normalizer.mjs +0 -6
  870. package/dist/lib/utils/request-normalizer.mjs.map +1 -1
  871. package/dist/lib/utils/response-schemas.mjs +0 -6
  872. package/dist/lib/utils/response-schemas.mjs.map +1 -1
  873. package/dist/lib/utils/response-unwrapper.mjs +0 -6
  874. package/dist/lib/utils/response-unwrapper.mjs.map +1 -1
  875. package/dist/lib/utils/retry.mjs +0 -6
  876. package/dist/lib/utils/retry.mjs.map +1 -1
  877. package/dist/lib/utils/signal-discovery-helpers.mjs +0 -6
  878. package/dist/lib/utils/signal-discovery-helpers.mjs.map +1 -1
  879. package/dist/lib/utils/signal-id-builders.mjs +0 -6
  880. package/dist/lib/utils/signal-id-builders.mjs.map +1 -1
  881. package/dist/lib/utils/sync-creatives-adapter.mjs +0 -6
  882. package/dist/lib/utils/sync-creatives-adapter.mjs.map +1 -1
  883. package/dist/lib/utils/task-state.mjs +0 -6
  884. package/dist/lib/utils/task-state.mjs.map +1 -1
  885. package/dist/lib/utils/tool-request-schemas.mjs +0 -6
  886. package/dist/lib/utils/tool-request-schemas.mjs.map +1 -1
  887. package/dist/lib/utils/typeGuards.mjs +0 -6
  888. package/dist/lib/utils/typeGuards.mjs.map +1 -1
  889. package/dist/lib/utils/union-errors.mjs +0 -6
  890. package/dist/lib/utils/union-errors.mjs.map +1 -1
  891. package/dist/lib/utils/validate-user-agent.mjs +0 -6
  892. package/dist/lib/utils/validate-user-agent.mjs.map +1 -1
  893. package/dist/lib/v2/format-schema/fetch.mjs +0 -6
  894. package/dist/lib/v2/format-schema/fetch.mjs.map +1 -1
  895. package/dist/lib/v2/format-schema/index.mjs +0 -6
  896. package/dist/lib/v2/format-schema/index.mjs.map +1 -1
  897. package/dist/lib/v2/format-schema/regex-safety.mjs +0 -6
  898. package/dist/lib/v2/format-schema/regex-safety.mjs.map +1 -1
  899. package/dist/lib/v2/format-schema/resolver.mjs +7 -8
  900. package/dist/lib/v2/format-schema/resolver.mjs.map +1 -1
  901. package/dist/lib/v2/format-schema/sandbox-refs.mjs +0 -6
  902. package/dist/lib/v2/format-schema/sandbox-refs.mjs.map +1 -1
  903. package/dist/lib/v2/projection/augment-response.mjs +0 -6
  904. package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
  905. package/dist/lib/v2/projection/builders.mjs +0 -6
  906. package/dist/lib/v2/projection/builders.mjs.map +1 -1
  907. package/dist/lib/v2/projection/cache-versions.mjs +0 -6
  908. package/dist/lib/v2/projection/cache-versions.mjs.map +1 -1
  909. package/dist/lib/v2/projection/canonical-properties.mjs +5 -6
  910. package/dist/lib/v2/projection/canonical-properties.mjs.map +1 -1
  911. package/dist/lib/v2/projection/catalog.mjs +5 -6
  912. package/dist/lib/v2/projection/catalog.mjs.map +1 -1
  913. package/dist/lib/v2/projection/constants.mjs +0 -6
  914. package/dist/lib/v2/projection/constants.mjs.map +1 -1
  915. package/dist/lib/v2/projection/index.mjs +0 -6
  916. package/dist/lib/v2/projection/index.mjs.map +1 -1
  917. package/dist/lib/v2/projection/registry.mjs +5 -6
  918. package/dist/lib/v2/projection/registry.mjs.map +1 -1
  919. package/dist/lib/v2/projection/types.mjs +0 -6
  920. package/dist/lib/v2/projection/v1-to-v2.mjs +0 -6
  921. package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
  922. package/dist/lib/v2/projection/v2-to-v1.mjs +0 -6
  923. package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
  924. package/dist/lib/v2/projection/write-side.mjs +0 -6
  925. package/dist/lib/v2/projection/write-side.mjs.map +1 -1
  926. package/dist/lib/v2/publisher-catalog/formats.mjs +0 -6
  927. package/dist/lib/v2/publisher-catalog/formats.mjs.map +1 -1
  928. package/dist/lib/v2/publisher-catalog/index.mjs +0 -6
  929. package/dist/lib/v2/publisher-catalog/index.mjs.map +1 -1
  930. package/dist/lib/validation/client-hooks.mjs +0 -6
  931. package/dist/lib/validation/client-hooks.mjs.map +1 -1
  932. package/dist/lib/validation/hints.mjs +0 -6
  933. package/dist/lib/validation/hints.mjs.map +1 -1
  934. package/dist/lib/validation/index.mjs +0 -6
  935. package/dist/lib/validation/index.mjs.map +1 -1
  936. package/dist/lib/validation/schema-errors.mjs +0 -6
  937. package/dist/lib/validation/schema-errors.mjs.map +1 -1
  938. package/dist/lib/validation/schema-loader.mjs +5 -6
  939. package/dist/lib/validation/schema-loader.mjs.map +1 -1
  940. package/dist/lib/validation/schema-validator.mjs +0 -6
  941. package/dist/lib/validation/schema-validator.mjs.map +1 -1
  942. package/dist/lib/validation/sync-creatives.mjs +0 -6
  943. package/dist/lib/validation/sync-creatives.mjs.map +1 -1
  944. package/dist/lib/version.d.mts +3 -3
  945. package/dist/lib/version.d.ts +3 -3
  946. package/dist/lib/version.js +3 -3
  947. package/dist/lib/version.js.map +1 -1
  948. package/dist/lib/version.mjs +3 -9
  949. package/dist/lib/version.mjs.map +1 -1
  950. package/dist/lib/webhooks/index.mjs +0 -6
  951. package/dist/lib/webhooks/index.mjs.map +1 -1
  952. package/dist/lib/wholesale-feed-sync/index.mjs +0 -6
  953. package/dist/lib/wholesale-feed-sync/index.mjs.map +1 -1
  954. package/dist/lib/wholesale-feed-sync/sync.mjs +0 -6
  955. package/dist/lib/wholesale-feed-sync/sync.mjs.map +1 -1
  956. package/dist/lib/wholesale-feed-sync/types.mjs +0 -6
  957. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs +0 -6
  958. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs.map +1 -1
  959. package/package.json +2 -1
@@ -1,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
  function adaptPackageRequestForV2(pkg, ctx) {
8
2
  const {
9
3
  optimization_goals,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils/creative-adapter.ts"],"sourcesContent":["/**\n * Creative Assignment Adapter\n *\n * Handles conversion between v2 creative_ids and v3 creative_assignments.\n * The library exposes only v3 API (creative_assignments) to clients,\n * and internally adapts requests for v2 servers.\n */\n\n/**\n * v3 creative assignment with optional weight and placement targeting\n */\nexport interface CreativeAssignment {\n /** Unique identifier for the creative */\n creative_id: string;\n /** Delivery weight (0-100) for rotation */\n weight?: number;\n /** Optional placement IDs to restrict where this creative runs */\n placement_ids?: string[];\n}\n\n/**\n * Package request with creative assignments (v3 style)\n */\nexport interface PackageRequestV3 {\n creative_assignments?: CreativeAssignment[];\n creatives?: any[]; // Full creative objects for upload\n [key: string]: unknown;\n}\n\n/**\n * Package request with creative_ids (v2 style)\n */\nexport interface PackageRequestV2 {\n creative_ids?: string[];\n creatives?: any[];\n [key: string]: unknown;\n}\n\n/**\n * Package response with creative assignments (v3 style)\n */\nexport interface PackageResponseV3 {\n creative_assignments?: CreativeAssignment[];\n [key: string]: unknown;\n}\n\n/**\n * Package response with creative_ids (v2 style)\n */\nexport interface PackageResponseV2 {\n creative_ids?: string[];\n [key: string]: unknown;\n}\n\n/**\n * Optional context for deriving a per-package `buyer_ref` when the v3 input\n * doesn't carry one. v2.5 `package-request.json` requires `buyer_ref` (the\n * `oneOf` accepts `package_id` OR `buyer_ref`; on creation no `package_id`\n * exists yet, so `buyer_ref` is the actual required identifier). v3 doesn't\n * model packages with `buyer_ref`, but `idempotency_key` carries equivalent\n * client-controlled-unique-identity semantics. The `parentBuyerRef` plus\n * `index` compose a stable per-package reference that re-derives identically\n * on replay — preserving the idempotency contract sellers depend on for\n * deduping.\n */\nexport interface PackageAdapterContext {\n /** Top-level `buyer_ref` derived from the parent v3 request. */\n parentBuyerRef?: string;\n /** Position of the package within the parent's `packages[]` array. */\n index?: number;\n}\n\n/**\n * Adapt a v3-style package request for a v2 server.\n * Converts creative_assignments to creative_ids (dropping weight and placement_ids).\n * Strips v3-only package fields (optimization_goals, catalogs).\n *\n * When `ctx` is provided and the input has no `buyer_ref`, derives one from —\n * in order — `package.context.buyer_ref`, `package.idempotency_key`, or\n * `${ctx.parentBuyerRef}-${ctx.index}` so v2.5 package-request validation\n * passes. Caller-supplied top-level `buyer_ref` always wins. The `context.buyer_ref`\n * fallback exists because v3 callers put their per-package correlation ref in\n * `context.buyer_ref` (per the 3.0 package schema); this adapter is the only\n * place that promotes it back to the top-level shape v2.5 sellers still expect.\n */\nexport function adaptPackageRequestForV2(pkg: PackageRequestV3, ctx?: PackageAdapterContext): PackageRequestV2 {\n const {\n optimization_goals,\n catalogs,\n idempotency_key: pkgIdempotencyKey,\n buyer_ref: callerBuyerRef,\n ...rest\n } = pkg as PackageRequestV3 & {\n optimization_goals?: unknown;\n catalogs?: unknown;\n idempotency_key?: unknown;\n buyer_ref?: unknown;\n };\n\n const contextBuyerRef =\n rest.context && typeof rest.context === 'object' && !Array.isArray(rest.context)\n ? (rest.context as Record<string, unknown>).buyer_ref\n : undefined;\n\n // Derive per-package buyer_ref. Caller-supplied top-level wins; then\n // context.buyer_ref (the v3 per-package correlation slot); then per-package\n // idempotency_key; then a stable composition of the parent's buyer_ref and\n // the package's array index. If none of those are available we pass through\n // without a buyer_ref and let the v2.5 validator surface the missing field\n // — better than synthesizing an unstable value that breaks dedupe on replay.\n const derivedBuyerRef =\n typeof callerBuyerRef === 'string' && callerBuyerRef.length > 0\n ? callerBuyerRef\n : typeof contextBuyerRef === 'string' && contextBuyerRef.length > 0\n ? contextBuyerRef\n : typeof pkgIdempotencyKey === 'string' && pkgIdempotencyKey.length > 0\n ? pkgIdempotencyKey\n : ctx?.parentBuyerRef !== undefined && ctx?.index !== undefined\n ? `${ctx.parentBuyerRef}-${ctx.index}`\n : undefined;\n\n const baseOut: PackageRequestV2 = rest as PackageRequestV2;\n if (!rest.creative_assignments) {\n return derivedBuyerRef === undefined ? baseOut : { ...baseOut, buyer_ref: derivedBuyerRef };\n }\n\n const { creative_assignments, ...withoutAssignments } = rest;\n\n return {\n ...withoutAssignments,\n ...(derivedBuyerRef !== undefined && { buyer_ref: derivedBuyerRef }),\n creative_ids: creative_assignments.map((a: CreativeAssignment) => a.creative_id),\n };\n}\n\n/**\n * Adapt a create_media_buy request for a v2 server.\n * Strips v3-only top-level fields, converts brand → brand_manifest, derives\n * `buyer_ref` (top-level + per-package) from `context.buyer_ref` or\n * `idempotency_key`, and adapts packages.\n *\n * v2.5 requires `buyer_ref` as the buyer's reference for THIS media buy,\n * top-level + per-package. v3 removed the top-level field and moved buyer\n * correlation into `context.buyer_ref`; `idempotency_key` carries the same\n * client-controlled-unique-identity semantics. Preferring the caller's\n * `context.buyer_ref` before falling back to `idempotency_key` preserves the\n * buyer's stable reference on the wire when they provided one, and still\n * satisfies v2.5 dedupe on replay when they did not. Caller-supplied\n * top-level `buyer_ref` (if any) always wins.\n */\nexport function adaptCreateMediaBuyRequestForV2(request: any): any {\n const {\n account,\n proposal_id,\n total_budget,\n artifact_webhook,\n brand,\n brand_manifest: inputManifest,\n adcp_major_version,\n idempotency_key,\n buyer_ref: callerBuyerRef,\n ...rest\n } = request;\n\n const contextBuyerRef =\n rest.context && typeof rest.context === 'object' && !Array.isArray(rest.context)\n ? (rest.context as Record<string, unknown>).buyer_ref\n : undefined;\n\n // Proposal mode is v3-only. If packages are also present we can still satisfy the request\n // by dropping proposal_id/total_budget and using the explicit packages.\n // Only throw when there are no packages — then there's nothing to send a v2 server.\n if (proposal_id && !rest.packages?.length) {\n throw new Error(\n 'Proposal mode (proposal_id + total_budget) requires a v3 server. ' +\n 'The connected server only supports AdCP v2. Provide an explicit packages array instead.'\n );\n }\n\n // v2 brand_manifest is a URL string. Prefer the caller's original manifest\n // (which may have been re-injected after validation), falling back to\n // deriving a URL from brand.domain.\n const callerUrl =\n typeof inputManifest === 'string'\n ? inputManifest\n : typeof inputManifest === 'object' && inputManifest?.url\n ? inputManifest.url\n : undefined;\n const brand_manifest = callerUrl || (brand?.domain ? `https://${brand.domain}` : undefined);\n\n const buyer_ref =\n typeof callerBuyerRef === 'string' && callerBuyerRef.length > 0\n ? callerBuyerRef\n : typeof contextBuyerRef === 'string' && contextBuyerRef.length > 0\n ? contextBuyerRef\n : typeof idempotency_key === 'string' && idempotency_key.length > 0\n ? idempotency_key\n : undefined;\n\n return {\n ...rest,\n ...(buyer_ref !== undefined && { buyer_ref }),\n ...(brand && !brand_manifest && { brand }),\n ...(brand_manifest !== undefined && { brand_manifest }),\n ...(rest.packages && {\n packages: rest.packages.map((pkg: PackageRequestV3, index: number) =>\n adaptPackageRequestForV2(pkg, { parentBuyerRef: buyer_ref, index })\n ),\n }),\n };\n}\n\n/**\n * Adapt an update_media_buy request for a v2 server.\n * Strips v3-only top-level fields and adapts packages.\n */\nexport function adaptUpdateMediaBuyRequestForV2(request: any): any {\n const { reporting_webhook, adcp_major_version, idempotency_key, ...rest } = request;\n\n return {\n ...rest,\n ...(rest.packages && { packages: rest.packages.map(adaptPackageRequestForV2) }),\n };\n}\n\n/**\n * Normalize a v2-style package response to v3.\n * Converts creative_ids to creative_assignments and coerces null array fields\n * to undefined so downstream consumers can safely use optional chaining.\n */\nexport function normalizePackageResponse(pkg: PackageResponseV2 | PackageResponseV3): PackageResponseV3 {\n // Coerce null array fields to undefined — some servers (e.g. Magnite) return\n // explicit nulls for optional array fields like creative_assignments,\n // creative_ids, and products. Leaving them as null causes downstream .map()\n // crashes since callers expect undefined (absent) or a real array.\n const nullArrayFields = ['creative_assignments', 'creative_ids', 'products'] as const;\n let cleaned: any = pkg;\n for (const field of nullArrayFields) {\n if (field in cleaned && cleaned[field] === null) {\n const { [field]: _removed, ...rest } = cleaned;\n cleaned = rest;\n }\n }\n\n // Already v3 format\n if (cleaned.creative_assignments) {\n return cleaned as PackageResponseV3;\n }\n\n // v2 format - convert creative_ids to creative_assignments\n if ((cleaned as PackageResponseV2).creative_ids) {\n const { creative_ids, ...rest } = cleaned as PackageResponseV2;\n return {\n ...rest,\n creative_assignments: creative_ids!.map(id => ({ creative_id: id })),\n };\n }\n\n // No creatives\n return cleaned as PackageResponseV3;\n}\n\n/**\n * Normalize a media buy response (converts all packages).\n */\nexport function normalizeMediaBuyResponse(response: any): any {\n if (!response.packages) {\n return response;\n }\n\n return {\n ...response,\n packages: response.packages.map(normalizePackageResponse),\n };\n}\n\n/**\n * Check if a package uses v2 creative_ids format\n */\nexport function usesV2CreativeIds(pkg: any): boolean {\n return Array.isArray(pkg.creative_ids) && !pkg.creative_assignments;\n}\n\n/**\n * Check if a package uses v3 creative_assignments format\n */\nexport function usesV3CreativeAssignments(pkg: any): boolean {\n return Array.isArray(pkg.creative_assignments);\n}\n\n/**\n * Get all creative IDs from a package (works with both v2 and v3 format)\n */\nexport function getCreativeIds(pkg: PackageResponseV2 | PackageResponseV3): string[] {\n if ((pkg as PackageResponseV3).creative_assignments) {\n return (pkg as PackageResponseV3).creative_assignments!.map(a => a.creative_id);\n }\n if ((pkg as PackageResponseV2).creative_ids) {\n return (pkg as PackageResponseV2).creative_ids!;\n }\n return [];\n}\n\n/**\n * Get creative assignments from a package (normalizes v2 to v3 format)\n */\nexport function getCreativeAssignments(pkg: PackageResponseV2 | PackageResponseV3): CreativeAssignment[] {\n if ((pkg as PackageResponseV3).creative_assignments) {\n return (pkg as PackageResponseV3).creative_assignments!;\n }\n if ((pkg as PackageResponseV2).creative_ids) {\n return (pkg as PackageResponseV2).creative_ids!.map(id => ({ creative_id: id }));\n }\n return [];\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/utils/creative-adapter.ts"],"sourcesContent":["/**\n * Creative Assignment Adapter\n *\n * Handles conversion between v2 creative_ids and v3 creative_assignments.\n * The library exposes only v3 API (creative_assignments) to clients,\n * and internally adapts requests for v2 servers.\n */\n\n/**\n * v3 creative assignment with optional weight and placement targeting\n */\nexport interface CreativeAssignment {\n /** Unique identifier for the creative */\n creative_id: string;\n /** Delivery weight (0-100) for rotation */\n weight?: number;\n /** Optional placement IDs to restrict where this creative runs */\n placement_ids?: string[];\n}\n\n/**\n * Package request with creative assignments (v3 style)\n */\nexport interface PackageRequestV3 {\n creative_assignments?: CreativeAssignment[];\n creatives?: any[]; // Full creative objects for upload\n [key: string]: unknown;\n}\n\n/**\n * Package request with creative_ids (v2 style)\n */\nexport interface PackageRequestV2 {\n creative_ids?: string[];\n creatives?: any[];\n [key: string]: unknown;\n}\n\n/**\n * Package response with creative assignments (v3 style)\n */\nexport interface PackageResponseV3 {\n creative_assignments?: CreativeAssignment[];\n [key: string]: unknown;\n}\n\n/**\n * Package response with creative_ids (v2 style)\n */\nexport interface PackageResponseV2 {\n creative_ids?: string[];\n [key: string]: unknown;\n}\n\n/**\n * Optional context for deriving a per-package `buyer_ref` when the v3 input\n * doesn't carry one. v2.5 `package-request.json` requires `buyer_ref` (the\n * `oneOf` accepts `package_id` OR `buyer_ref`; on creation no `package_id`\n * exists yet, so `buyer_ref` is the actual required identifier). v3 doesn't\n * model packages with `buyer_ref`, but `idempotency_key` carries equivalent\n * client-controlled-unique-identity semantics. The `parentBuyerRef` plus\n * `index` compose a stable per-package reference that re-derives identically\n * on replay — preserving the idempotency contract sellers depend on for\n * deduping.\n */\nexport interface PackageAdapterContext {\n /** Top-level `buyer_ref` derived from the parent v3 request. */\n parentBuyerRef?: string;\n /** Position of the package within the parent's `packages[]` array. */\n index?: number;\n}\n\n/**\n * Adapt a v3-style package request for a v2 server.\n * Converts creative_assignments to creative_ids (dropping weight and placement_ids).\n * Strips v3-only package fields (optimization_goals, catalogs).\n *\n * When `ctx` is provided and the input has no `buyer_ref`, derives one from —\n * in order — `package.context.buyer_ref`, `package.idempotency_key`, or\n * `${ctx.parentBuyerRef}-${ctx.index}` so v2.5 package-request validation\n * passes. Caller-supplied top-level `buyer_ref` always wins. The `context.buyer_ref`\n * fallback exists because v3 callers put their per-package correlation ref in\n * `context.buyer_ref` (per the 3.0 package schema); this adapter is the only\n * place that promotes it back to the top-level shape v2.5 sellers still expect.\n */\nexport function adaptPackageRequestForV2(pkg: PackageRequestV3, ctx?: PackageAdapterContext): PackageRequestV2 {\n const {\n optimization_goals,\n catalogs,\n idempotency_key: pkgIdempotencyKey,\n buyer_ref: callerBuyerRef,\n ...rest\n } = pkg as PackageRequestV3 & {\n optimization_goals?: unknown;\n catalogs?: unknown;\n idempotency_key?: unknown;\n buyer_ref?: unknown;\n };\n\n const contextBuyerRef =\n rest.context && typeof rest.context === 'object' && !Array.isArray(rest.context)\n ? (rest.context as Record<string, unknown>).buyer_ref\n : undefined;\n\n // Derive per-package buyer_ref. Caller-supplied top-level wins; then\n // context.buyer_ref (the v3 per-package correlation slot); then per-package\n // idempotency_key; then a stable composition of the parent's buyer_ref and\n // the package's array index. If none of those are available we pass through\n // without a buyer_ref and let the v2.5 validator surface the missing field\n // — better than synthesizing an unstable value that breaks dedupe on replay.\n const derivedBuyerRef =\n typeof callerBuyerRef === 'string' && callerBuyerRef.length > 0\n ? callerBuyerRef\n : typeof contextBuyerRef === 'string' && contextBuyerRef.length > 0\n ? contextBuyerRef\n : typeof pkgIdempotencyKey === 'string' && pkgIdempotencyKey.length > 0\n ? pkgIdempotencyKey\n : ctx?.parentBuyerRef !== undefined && ctx?.index !== undefined\n ? `${ctx.parentBuyerRef}-${ctx.index}`\n : undefined;\n\n const baseOut: PackageRequestV2 = rest as PackageRequestV2;\n if (!rest.creative_assignments) {\n return derivedBuyerRef === undefined ? baseOut : { ...baseOut, buyer_ref: derivedBuyerRef };\n }\n\n const { creative_assignments, ...withoutAssignments } = rest;\n\n return {\n ...withoutAssignments,\n ...(derivedBuyerRef !== undefined && { buyer_ref: derivedBuyerRef }),\n creative_ids: creative_assignments.map((a: CreativeAssignment) => a.creative_id),\n };\n}\n\n/**\n * Adapt a create_media_buy request for a v2 server.\n * Strips v3-only top-level fields, converts brand → brand_manifest, derives\n * `buyer_ref` (top-level + per-package) from `context.buyer_ref` or\n * `idempotency_key`, and adapts packages.\n *\n * v2.5 requires `buyer_ref` as the buyer's reference for THIS media buy,\n * top-level + per-package. v3 removed the top-level field and moved buyer\n * correlation into `context.buyer_ref`; `idempotency_key` carries the same\n * client-controlled-unique-identity semantics. Preferring the caller's\n * `context.buyer_ref` before falling back to `idempotency_key` preserves the\n * buyer's stable reference on the wire when they provided one, and still\n * satisfies v2.5 dedupe on replay when they did not. Caller-supplied\n * top-level `buyer_ref` (if any) always wins.\n */\nexport function adaptCreateMediaBuyRequestForV2(request: any): any {\n const {\n account,\n proposal_id,\n total_budget,\n artifact_webhook,\n brand,\n brand_manifest: inputManifest,\n adcp_major_version,\n idempotency_key,\n buyer_ref: callerBuyerRef,\n ...rest\n } = request;\n\n const contextBuyerRef =\n rest.context && typeof rest.context === 'object' && !Array.isArray(rest.context)\n ? (rest.context as Record<string, unknown>).buyer_ref\n : undefined;\n\n // Proposal mode is v3-only. If packages are also present we can still satisfy the request\n // by dropping proposal_id/total_budget and using the explicit packages.\n // Only throw when there are no packages — then there's nothing to send a v2 server.\n if (proposal_id && !rest.packages?.length) {\n throw new Error(\n 'Proposal mode (proposal_id + total_budget) requires a v3 server. ' +\n 'The connected server only supports AdCP v2. Provide an explicit packages array instead.'\n );\n }\n\n // v2 brand_manifest is a URL string. Prefer the caller's original manifest\n // (which may have been re-injected after validation), falling back to\n // deriving a URL from brand.domain.\n const callerUrl =\n typeof inputManifest === 'string'\n ? inputManifest\n : typeof inputManifest === 'object' && inputManifest?.url\n ? inputManifest.url\n : undefined;\n const brand_manifest = callerUrl || (brand?.domain ? `https://${brand.domain}` : undefined);\n\n const buyer_ref =\n typeof callerBuyerRef === 'string' && callerBuyerRef.length > 0\n ? callerBuyerRef\n : typeof contextBuyerRef === 'string' && contextBuyerRef.length > 0\n ? contextBuyerRef\n : typeof idempotency_key === 'string' && idempotency_key.length > 0\n ? idempotency_key\n : undefined;\n\n return {\n ...rest,\n ...(buyer_ref !== undefined && { buyer_ref }),\n ...(brand && !brand_manifest && { brand }),\n ...(brand_manifest !== undefined && { brand_manifest }),\n ...(rest.packages && {\n packages: rest.packages.map((pkg: PackageRequestV3, index: number) =>\n adaptPackageRequestForV2(pkg, { parentBuyerRef: buyer_ref, index })\n ),\n }),\n };\n}\n\n/**\n * Adapt an update_media_buy request for a v2 server.\n * Strips v3-only top-level fields and adapts packages.\n */\nexport function adaptUpdateMediaBuyRequestForV2(request: any): any {\n const { reporting_webhook, adcp_major_version, idempotency_key, ...rest } = request;\n\n return {\n ...rest,\n ...(rest.packages && { packages: rest.packages.map(adaptPackageRequestForV2) }),\n };\n}\n\n/**\n * Normalize a v2-style package response to v3.\n * Converts creative_ids to creative_assignments and coerces null array fields\n * to undefined so downstream consumers can safely use optional chaining.\n */\nexport function normalizePackageResponse(pkg: PackageResponseV2 | PackageResponseV3): PackageResponseV3 {\n // Coerce null array fields to undefined — some servers (e.g. Magnite) return\n // explicit nulls for optional array fields like creative_assignments,\n // creative_ids, and products. Leaving them as null causes downstream .map()\n // crashes since callers expect undefined (absent) or a real array.\n const nullArrayFields = ['creative_assignments', 'creative_ids', 'products'] as const;\n let cleaned: any = pkg;\n for (const field of nullArrayFields) {\n if (field in cleaned && cleaned[field] === null) {\n const { [field]: _removed, ...rest } = cleaned;\n cleaned = rest;\n }\n }\n\n // Already v3 format\n if (cleaned.creative_assignments) {\n return cleaned as PackageResponseV3;\n }\n\n // v2 format - convert creative_ids to creative_assignments\n if ((cleaned as PackageResponseV2).creative_ids) {\n const { creative_ids, ...rest } = cleaned as PackageResponseV2;\n return {\n ...rest,\n creative_assignments: creative_ids!.map(id => ({ creative_id: id })),\n };\n }\n\n // No creatives\n return cleaned as PackageResponseV3;\n}\n\n/**\n * Normalize a media buy response (converts all packages).\n */\nexport function normalizeMediaBuyResponse(response: any): any {\n if (!response.packages) {\n return response;\n }\n\n return {\n ...response,\n packages: response.packages.map(normalizePackageResponse),\n };\n}\n\n/**\n * Check if a package uses v2 creative_ids format\n */\nexport function usesV2CreativeIds(pkg: any): boolean {\n return Array.isArray(pkg.creative_ids) && !pkg.creative_assignments;\n}\n\n/**\n * Check if a package uses v3 creative_assignments format\n */\nexport function usesV3CreativeAssignments(pkg: any): boolean {\n return Array.isArray(pkg.creative_assignments);\n}\n\n/**\n * Get all creative IDs from a package (works with both v2 and v3 format)\n */\nexport function getCreativeIds(pkg: PackageResponseV2 | PackageResponseV3): string[] {\n if ((pkg as PackageResponseV3).creative_assignments) {\n return (pkg as PackageResponseV3).creative_assignments!.map(a => a.creative_id);\n }\n if ((pkg as PackageResponseV2).creative_ids) {\n return (pkg as PackageResponseV2).creative_ids!;\n }\n return [];\n}\n\n/**\n * Get creative assignments from a package (normalizes v2 to v3 format)\n */\nexport function getCreativeAssignments(pkg: PackageResponseV2 | PackageResponseV3): CreativeAssignment[] {\n if ((pkg as PackageResponseV3).creative_assignments) {\n return (pkg as PackageResponseV3).creative_assignments!;\n }\n if ((pkg as PackageResponseV2).creative_ids) {\n return (pkg as PackageResponseV2).creative_ids!.map(id => ({ creative_id: id }));\n }\n return [];\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
  function inlineCreativesForPackages(packages, creatives, options = {}) {
8
2
  const {
9
3
  assignments,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils/creative-delivery.ts"],"sourcesContent":["import type { CreativeAsset, PackageRequest } from '../types/tools.generated';\n\n/**\n * Package-like input accepted by `inlineCreativesForPackages`.\n *\n * `PackageRequest` is the create-media-buy shape. Update-media-buy package\n * patches are narrower but carry the same `package_id` + `creatives` fields,\n * so the helper accepts both without depending on AgentClient.\n */\nexport type InlineCreativePackage = Partial<PackageRequest> & {\n package_id?: string;\n buyer_ref?: string;\n context?: { buyer_ref?: string; [key: string]: unknown };\n creatives?: CreativeAsset[];\n [key: string]: unknown;\n};\n\n/**\n * Assignment shape shared with `sync_creatives.assignments[]`, plus\n * `placement_refs` for callers already authoring the structured placement\n * form accepted by inline `CreativeAsset`.\n */\nexport interface InlineCreativeAssignment {\n creative_id: string;\n package_id: string;\n weight?: number;\n placement_ids?: string[];\n placement_refs?: unknown[];\n}\n\nexport interface InlineCreativesForPackagesOptions<TPackage extends InlineCreativePackage = InlineCreativePackage> {\n /**\n * Package-scoped assignment instructions. When supplied, only creatives\n * assigned to each package are inlined unless `includeUnassignedCreatives`\n * is true.\n */\n assignments?: ReadonlyArray<InlineCreativeAssignment>;\n\n /**\n * Include compatible creatives that have no assignment entry. Defaults to\n * false when assignments are supplied and true when no assignments exist.\n */\n includeUnassignedCreatives?: boolean;\n\n /**\n * Filter creatives by package format selectors (`format_ids`,\n * `format_option_refs`, or `format_kind`). Defaults to true.\n */\n filterByFormat?: boolean;\n\n /**\n * Resolve the package identifier used to match assignment.package_id.\n * Defaults to `package_id`, then `context.buyer_ref`, then `buyer_ref`.\n */\n packageId?: (pkg: TPackage, index: number) => string | undefined;\n\n /**\n * Behavior when an assignment names a package not present in the package\n * list. Defaults to throw so package scoping mistakes do not broaden\n * delivery silently.\n */\n onUnmatchedAssignment?: 'throw' | 'ignore';\n\n /**\n * Behavior when an assignment names a creative not present in `creatives`.\n * Defaults to throw because inline payloads cannot reference library-only\n * creatives.\n */\n onMissingCreative?: 'throw' | 'ignore';\n\n /**\n * Behavior when an explicit assignment names a creative whose format cannot\n * satisfy the target package selectors. Defaults to throw so authoring\n * mistakes do not silently remove assigned delivery.\n */\n onIncompatibleAssignment?: 'throw' | 'ignore';\n}\n\nexport type InlineCreativePackagePatch<TPackage extends InlineCreativePackage = InlineCreativePackage> = TPackage & {\n creatives?: CreativeAsset[];\n};\n\n/**\n * Project library-scoped creative assets into package-scoped inline creative\n * payloads for `create_media_buy` or `update_media_buy`.\n *\n * The helper is pure: it performs no network calls, does not call\n * `sync_creatives`, and does not generate idempotency keys. Use\n * `supportsSyncCreatives(caps)` to decide whether the seller has a creative\n * library. When it does not, spread this helper's result into\n * `packages[].creatives` and use a fresh idempotency key for the enclosing\n * create/update media-buy call.\n *\n * @example\n * ```ts\n * const caps = await agent.getCapabilities();\n * if (supportsSyncCreatives(caps)) {\n * await agent.syncCreatives({ account, creatives, assignments });\n * } else if (caps.features.inlineCreativeManagement) {\n * await agent.createMediaBuy({\n * account,\n * idempotency_key: crypto.randomUUID(),\n * packages: inlineCreativesForPackages(packages, creatives, { assignments }),\n * });\n * } else {\n * throw new Error('Seller supports neither creative library sync nor inline creative uploads.');\n * }\n * ```\n */\nexport function inlineCreativesForPackages<TPackage extends InlineCreativePackage>(\n packages: ReadonlyArray<TPackage>,\n creatives: ReadonlyArray<CreativeAsset>,\n options: InlineCreativesForPackagesOptions<TPackage> = {}\n): InlineCreativePackagePatch<TPackage>[] {\n const {\n assignments,\n includeUnassignedCreatives = assignments == null || assignments.length === 0,\n filterByFormat = true,\n packageId = defaultPackageId,\n onUnmatchedAssignment = 'throw',\n onMissingCreative = 'throw',\n onIncompatibleAssignment = 'throw',\n } = options;\n\n const creativesById = new Map<string, CreativeAsset>();\n for (const creative of creatives) {\n if (typeof creative.creative_id === 'string') {\n creativesById.set(creative.creative_id, creative);\n }\n }\n\n const assignmentsByPackage = new Map<string, InlineCreativeAssignment[]>();\n const matchedPackageIds = new Set<string>();\n for (const assignment of assignments ?? []) {\n const creative = creativesById.get(assignment.creative_id);\n if (!creative) {\n if (onMissingCreative === 'throw') {\n throw new Error(\n `inlineCreativesForPackages assignment references unknown creative_id \"${assignment.creative_id}\"`\n );\n }\n continue;\n }\n const existing = assignmentsByPackage.get(assignment.package_id);\n if (existing) {\n existing.push(assignment);\n } else {\n assignmentsByPackage.set(assignment.package_id, [assignment]);\n }\n }\n\n const result = packages.map((pkg, index) => {\n const id = packageId(pkg, index);\n if (id) matchedPackageIds.add(id);\n const assigned = id ? (assignmentsByPackage.get(id) ?? []) : [];\n const assignedCreativeIds = new Set(assigned.map(a => a.creative_id));\n const inlined: CreativeAsset[] = [];\n\n for (const assignment of assigned) {\n const creative = creativesById.get(assignment.creative_id);\n if (!creative) continue;\n const compatible = !filterByFormat || creativeMatchesPackage(pkg, creative);\n if (compatible) {\n inlined.push(applyAssignmentToCreative(creative, assignment));\n } else if (onIncompatibleAssignment === 'throw') {\n throw new Error(\n `inlineCreativesForPackages assignment creative_id \"${assignment.creative_id}\" ` +\n `does not match package_id \"${assignment.package_id}\" format selectors`\n );\n }\n }\n\n if (includeUnassignedCreatives) {\n for (const creative of creatives) {\n if (typeof creative.creative_id === 'string' && assignedCreativeIds.has(creative.creative_id)) continue;\n if (!filterByFormat || creativeMatchesPackage(pkg, creative)) {\n inlined.push({ ...creative });\n }\n }\n }\n\n const next: Record<string, unknown> = { ...(pkg as Record<string, unknown>) };\n delete next.creatives;\n if (inlined.length > 0) {\n next.creatives = inlined;\n }\n return next as InlineCreativePackagePatch<TPackage>;\n });\n\n if (onUnmatchedAssignment === 'throw') {\n const unmatched = [...assignmentsByPackage.keys()].filter(package_id => !matchedPackageIds.has(package_id));\n if (unmatched.length > 0) {\n throw new Error(`inlineCreativesForPackages assignment references unknown package_id \"${unmatched[0]}\"`);\n }\n }\n\n return result;\n}\n\nfunction defaultPackageId(pkg: InlineCreativePackage): string | undefined {\n if (typeof pkg.package_id === 'string') return pkg.package_id;\n if (typeof pkg.context?.buyer_ref === 'string') return pkg.context.buyer_ref;\n if (typeof pkg.buyer_ref === 'string') return pkg.buyer_ref;\n return undefined;\n}\n\nfunction applyAssignmentToCreative(creative: CreativeAsset, assignment: InlineCreativeAssignment): CreativeAsset {\n const next: Record<string, unknown> = { ...(creative as unknown as Record<string, unknown>) };\n delete next.weight;\n delete next.placement_ids;\n delete next.placement_refs;\n\n if (assignment.weight !== undefined) next.weight = assignment.weight;\n if (assignment.placement_refs !== undefined) {\n next.placement_refs = [...assignment.placement_refs];\n } else if (assignment.placement_ids !== undefined) {\n next.placement_ids = [...assignment.placement_ids];\n }\n return next as unknown as CreativeAsset;\n}\n\nfunction creativeMatchesPackage(pkg: InlineCreativePackage, creative: CreativeAsset): boolean {\n const packageFormatIds = arrayOfObjects(pkg.format_ids);\n const packageFormatOptionRefs = arrayOfObjects(pkg.format_option_refs);\n const packageFormatKind = typeof pkg.format_kind === 'string' ? pkg.format_kind : undefined;\n const packageParams = plainObject(pkg.params);\n\n const creativeRecord = creative as unknown as Record<string, unknown>;\n const creativeFormatId = plainObject(creativeRecord.format_id);\n const creativeFormatOptionRef = plainObject(creativeRecord.format_option_ref);\n\n if (packageFormatOptionRefs.length > 0) {\n if (creativeFormatOptionRef) {\n return packageFormatOptionRefs.some(formatOptionRef => deepEqual(formatOptionRef, creativeFormatOptionRef));\n }\n if (packageFormatIds.length === 0 && packageFormatKind === undefined) return false;\n }\n\n if (packageFormatKind !== undefined) {\n return creativeRecord.format_kind === packageFormatKind && paramsMatchCreative(packageParams, creativeFormatId);\n }\n\n if (packageFormatIds.length > 0) {\n return (\n creativeFormatId !== undefined && packageFormatIds.some(formatId => formatIdMatches(formatId, creativeFormatId))\n );\n }\n\n return true;\n}\n\nfunction arrayOfObjects(value: unknown): Record<string, unknown>[] {\n return Array.isArray(value) ? value.flatMap(item => (plainObject(item) ? [item] : [])) : [];\n}\n\nfunction plainObject(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction formatIdMatches(expected: Record<string, unknown>, actual: Record<string, unknown>): boolean {\n const expectedId = expected.id;\n const actualId = actual.id;\n if (expectedId !== actualId) return false;\n\n const expectedAgentUrl = normalizeAgentUrl(expected.agent_url);\n const actualAgentUrl = normalizeAgentUrl(actual.agent_url);\n if (expectedAgentUrl !== undefined && actualAgentUrl !== undefined && expectedAgentUrl !== actualAgentUrl) {\n return false;\n }\n\n for (const key of ['width', 'height', 'duration_ms']) {\n if (expected[key] !== undefined && actual[key] !== undefined && expected[key] !== actual[key]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction paramsMatchCreative(\n packageParams: Record<string, unknown> | undefined,\n creativeFormatId: Record<string, unknown> | undefined\n): boolean {\n if (!packageParams) return true;\n\n let constrained = false;\n const actualWidth = numberValue(creativeFormatId, 'width');\n const actualHeight = numberValue(creativeFormatId, 'height');\n const actualDuration =\n numberValue(creativeFormatId, 'duration_ms') ?? numberValue(creativeFormatId, 'duration_ms_exact');\n\n const sizes = Array.isArray(packageParams.sizes)\n ? packageParams.sizes.flatMap(size => (plainObject(size) ? [size] : []))\n : [];\n if (sizes.length > 0) {\n constrained = true;\n if (\n actualWidth === undefined ||\n actualHeight === undefined ||\n !sizes.some(size => numberValue(size, 'width') === actualWidth && numberValue(size, 'height') === actualHeight)\n ) {\n return false;\n }\n }\n\n const expectedWidth = numberValue(packageParams, 'width');\n if (expectedWidth !== undefined) {\n constrained = true;\n if (actualWidth !== expectedWidth) return false;\n }\n\n const expectedHeight = numberValue(packageParams, 'height');\n if (expectedHeight !== undefined) {\n constrained = true;\n if (actualHeight !== expectedHeight) return false;\n }\n\n const minWidth = numberValue(packageParams, 'min_width');\n if (minWidth !== undefined) {\n constrained = true;\n if (actualWidth === undefined || actualWidth < minWidth) return false;\n }\n\n const maxWidth = numberValue(packageParams, 'max_width');\n if (maxWidth !== undefined) {\n constrained = true;\n if (actualWidth === undefined || actualWidth > maxWidth) return false;\n }\n\n const minHeight = numberValue(packageParams, 'min_height');\n if (minHeight !== undefined) {\n constrained = true;\n if (actualHeight === undefined || actualHeight < minHeight) return false;\n }\n\n const maxHeight = numberValue(packageParams, 'max_height');\n if (maxHeight !== undefined) {\n constrained = true;\n if (actualHeight === undefined || actualHeight > maxHeight) return false;\n }\n\n const exactDuration = numberValue(packageParams, 'duration_ms_exact') ?? numberValue(packageParams, 'duration_ms');\n if (exactDuration !== undefined) {\n constrained = true;\n if (actualDuration !== exactDuration) return false;\n }\n\n const durationRange = numberRange(packageParams.duration_ms_range);\n if (durationRange) {\n constrained = true;\n const [minDuration, maxDuration] = durationRange;\n if (actualDuration === undefined) return false;\n if (minDuration !== undefined && actualDuration < minDuration) return false;\n if (maxDuration !== undefined && actualDuration > maxDuration) return false;\n }\n\n return constrained ? creativeFormatId !== undefined : true;\n}\n\nfunction numberValue(object: Record<string, unknown> | undefined, key: string): number | undefined {\n const value = object?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction numberRange(value: unknown): [number | undefined, number | undefined] | undefined {\n if (!Array.isArray(value) || value.length !== 2) return undefined;\n const [min, max] = value;\n const minValue = min === null ? undefined : typeof min === 'number' && Number.isFinite(min) ? min : undefined;\n const maxValue = max === null ? undefined : typeof max === 'number' && Number.isFinite(max) ? max : undefined;\n return minValue === undefined && maxValue === undefined ? undefined : [minValue, maxValue];\n}\n\nfunction normalizeAgentUrl(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n let end = value.length;\n while (end > 0 && value.charCodeAt(end - 1) === 47) {\n end -= 1;\n }\n return end === value.length ? value : value.slice(0, end);\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n return JSON.stringify(sortKeys(a)) === JSON.stringify(sortKeys(b));\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n const object = plainObject(value);\n if (!object) return value;\n return Object.fromEntries(\n Object.entries(object)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => [k, sortKeys(v)])\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/utils/creative-delivery.ts"],"sourcesContent":["import type { CreativeAsset, PackageRequest } from '../types/tools.generated';\n\n/**\n * Package-like input accepted by `inlineCreativesForPackages`.\n *\n * `PackageRequest` is the create-media-buy shape. Update-media-buy package\n * patches are narrower but carry the same `package_id` + `creatives` fields,\n * so the helper accepts both without depending on AgentClient.\n */\nexport type InlineCreativePackage = Partial<PackageRequest> & {\n package_id?: string;\n buyer_ref?: string;\n context?: { buyer_ref?: string; [key: string]: unknown };\n creatives?: CreativeAsset[];\n [key: string]: unknown;\n};\n\n/**\n * Assignment shape shared with `sync_creatives.assignments[]`, plus\n * `placement_refs` for callers already authoring the structured placement\n * form accepted by inline `CreativeAsset`.\n */\nexport interface InlineCreativeAssignment {\n creative_id: string;\n package_id: string;\n weight?: number;\n placement_ids?: string[];\n placement_refs?: unknown[];\n}\n\nexport interface InlineCreativesForPackagesOptions<TPackage extends InlineCreativePackage = InlineCreativePackage> {\n /**\n * Package-scoped assignment instructions. When supplied, only creatives\n * assigned to each package are inlined unless `includeUnassignedCreatives`\n * is true.\n */\n assignments?: ReadonlyArray<InlineCreativeAssignment>;\n\n /**\n * Include compatible creatives that have no assignment entry. Defaults to\n * false when assignments are supplied and true when no assignments exist.\n */\n includeUnassignedCreatives?: boolean;\n\n /**\n * Filter creatives by package format selectors (`format_ids`,\n * `format_option_refs`, or `format_kind`). Defaults to true.\n */\n filterByFormat?: boolean;\n\n /**\n * Resolve the package identifier used to match assignment.package_id.\n * Defaults to `package_id`, then `context.buyer_ref`, then `buyer_ref`.\n */\n packageId?: (pkg: TPackage, index: number) => string | undefined;\n\n /**\n * Behavior when an assignment names a package not present in the package\n * list. Defaults to throw so package scoping mistakes do not broaden\n * delivery silently.\n */\n onUnmatchedAssignment?: 'throw' | 'ignore';\n\n /**\n * Behavior when an assignment names a creative not present in `creatives`.\n * Defaults to throw because inline payloads cannot reference library-only\n * creatives.\n */\n onMissingCreative?: 'throw' | 'ignore';\n\n /**\n * Behavior when an explicit assignment names a creative whose format cannot\n * satisfy the target package selectors. Defaults to throw so authoring\n * mistakes do not silently remove assigned delivery.\n */\n onIncompatibleAssignment?: 'throw' | 'ignore';\n}\n\nexport type InlineCreativePackagePatch<TPackage extends InlineCreativePackage = InlineCreativePackage> = TPackage & {\n creatives?: CreativeAsset[];\n};\n\n/**\n * Project library-scoped creative assets into package-scoped inline creative\n * payloads for `create_media_buy` or `update_media_buy`.\n *\n * The helper is pure: it performs no network calls, does not call\n * `sync_creatives`, and does not generate idempotency keys. Use\n * `supportsSyncCreatives(caps)` to decide whether the seller has a creative\n * library. When it does not, spread this helper's result into\n * `packages[].creatives` and use a fresh idempotency key for the enclosing\n * create/update media-buy call.\n *\n * @example\n * ```ts\n * const caps = await agent.getCapabilities();\n * if (supportsSyncCreatives(caps)) {\n * await agent.syncCreatives({ account, creatives, assignments });\n * } else if (caps.features.inlineCreativeManagement) {\n * await agent.createMediaBuy({\n * account,\n * idempotency_key: crypto.randomUUID(),\n * packages: inlineCreativesForPackages(packages, creatives, { assignments }),\n * });\n * } else {\n * throw new Error('Seller supports neither creative library sync nor inline creative uploads.');\n * }\n * ```\n */\nexport function inlineCreativesForPackages<TPackage extends InlineCreativePackage>(\n packages: ReadonlyArray<TPackage>,\n creatives: ReadonlyArray<CreativeAsset>,\n options: InlineCreativesForPackagesOptions<TPackage> = {}\n): InlineCreativePackagePatch<TPackage>[] {\n const {\n assignments,\n includeUnassignedCreatives = assignments == null || assignments.length === 0,\n filterByFormat = true,\n packageId = defaultPackageId,\n onUnmatchedAssignment = 'throw',\n onMissingCreative = 'throw',\n onIncompatibleAssignment = 'throw',\n } = options;\n\n const creativesById = new Map<string, CreativeAsset>();\n for (const creative of creatives) {\n if (typeof creative.creative_id === 'string') {\n creativesById.set(creative.creative_id, creative);\n }\n }\n\n const assignmentsByPackage = new Map<string, InlineCreativeAssignment[]>();\n const matchedPackageIds = new Set<string>();\n for (const assignment of assignments ?? []) {\n const creative = creativesById.get(assignment.creative_id);\n if (!creative) {\n if (onMissingCreative === 'throw') {\n throw new Error(\n `inlineCreativesForPackages assignment references unknown creative_id \"${assignment.creative_id}\"`\n );\n }\n continue;\n }\n const existing = assignmentsByPackage.get(assignment.package_id);\n if (existing) {\n existing.push(assignment);\n } else {\n assignmentsByPackage.set(assignment.package_id, [assignment]);\n }\n }\n\n const result = packages.map((pkg, index) => {\n const id = packageId(pkg, index);\n if (id) matchedPackageIds.add(id);\n const assigned = id ? (assignmentsByPackage.get(id) ?? []) : [];\n const assignedCreativeIds = new Set(assigned.map(a => a.creative_id));\n const inlined: CreativeAsset[] = [];\n\n for (const assignment of assigned) {\n const creative = creativesById.get(assignment.creative_id);\n if (!creative) continue;\n const compatible = !filterByFormat || creativeMatchesPackage(pkg, creative);\n if (compatible) {\n inlined.push(applyAssignmentToCreative(creative, assignment));\n } else if (onIncompatibleAssignment === 'throw') {\n throw new Error(\n `inlineCreativesForPackages assignment creative_id \"${assignment.creative_id}\" ` +\n `does not match package_id \"${assignment.package_id}\" format selectors`\n );\n }\n }\n\n if (includeUnassignedCreatives) {\n for (const creative of creatives) {\n if (typeof creative.creative_id === 'string' && assignedCreativeIds.has(creative.creative_id)) continue;\n if (!filterByFormat || creativeMatchesPackage(pkg, creative)) {\n inlined.push({ ...creative });\n }\n }\n }\n\n const next: Record<string, unknown> = { ...(pkg as Record<string, unknown>) };\n delete next.creatives;\n if (inlined.length > 0) {\n next.creatives = inlined;\n }\n return next as InlineCreativePackagePatch<TPackage>;\n });\n\n if (onUnmatchedAssignment === 'throw') {\n const unmatched = [...assignmentsByPackage.keys()].filter(package_id => !matchedPackageIds.has(package_id));\n if (unmatched.length > 0) {\n throw new Error(`inlineCreativesForPackages assignment references unknown package_id \"${unmatched[0]}\"`);\n }\n }\n\n return result;\n}\n\nfunction defaultPackageId(pkg: InlineCreativePackage): string | undefined {\n if (typeof pkg.package_id === 'string') return pkg.package_id;\n if (typeof pkg.context?.buyer_ref === 'string') return pkg.context.buyer_ref;\n if (typeof pkg.buyer_ref === 'string') return pkg.buyer_ref;\n return undefined;\n}\n\nfunction applyAssignmentToCreative(creative: CreativeAsset, assignment: InlineCreativeAssignment): CreativeAsset {\n const next: Record<string, unknown> = { ...(creative as unknown as Record<string, unknown>) };\n delete next.weight;\n delete next.placement_ids;\n delete next.placement_refs;\n\n if (assignment.weight !== undefined) next.weight = assignment.weight;\n if (assignment.placement_refs !== undefined) {\n next.placement_refs = [...assignment.placement_refs];\n } else if (assignment.placement_ids !== undefined) {\n next.placement_ids = [...assignment.placement_ids];\n }\n return next as unknown as CreativeAsset;\n}\n\nfunction creativeMatchesPackage(pkg: InlineCreativePackage, creative: CreativeAsset): boolean {\n const packageFormatIds = arrayOfObjects(pkg.format_ids);\n const packageFormatOptionRefs = arrayOfObjects(pkg.format_option_refs);\n const packageFormatKind = typeof pkg.format_kind === 'string' ? pkg.format_kind : undefined;\n const packageParams = plainObject(pkg.params);\n\n const creativeRecord = creative as unknown as Record<string, unknown>;\n const creativeFormatId = plainObject(creativeRecord.format_id);\n const creativeFormatOptionRef = plainObject(creativeRecord.format_option_ref);\n\n if (packageFormatOptionRefs.length > 0) {\n if (creativeFormatOptionRef) {\n return packageFormatOptionRefs.some(formatOptionRef => deepEqual(formatOptionRef, creativeFormatOptionRef));\n }\n if (packageFormatIds.length === 0 && packageFormatKind === undefined) return false;\n }\n\n if (packageFormatKind !== undefined) {\n return creativeRecord.format_kind === packageFormatKind && paramsMatchCreative(packageParams, creativeFormatId);\n }\n\n if (packageFormatIds.length > 0) {\n return (\n creativeFormatId !== undefined && packageFormatIds.some(formatId => formatIdMatches(formatId, creativeFormatId))\n );\n }\n\n return true;\n}\n\nfunction arrayOfObjects(value: unknown): Record<string, unknown>[] {\n return Array.isArray(value) ? value.flatMap(item => (plainObject(item) ? [item] : [])) : [];\n}\n\nfunction plainObject(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction formatIdMatches(expected: Record<string, unknown>, actual: Record<string, unknown>): boolean {\n const expectedId = expected.id;\n const actualId = actual.id;\n if (expectedId !== actualId) return false;\n\n const expectedAgentUrl = normalizeAgentUrl(expected.agent_url);\n const actualAgentUrl = normalizeAgentUrl(actual.agent_url);\n if (expectedAgentUrl !== undefined && actualAgentUrl !== undefined && expectedAgentUrl !== actualAgentUrl) {\n return false;\n }\n\n for (const key of ['width', 'height', 'duration_ms']) {\n if (expected[key] !== undefined && actual[key] !== undefined && expected[key] !== actual[key]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction paramsMatchCreative(\n packageParams: Record<string, unknown> | undefined,\n creativeFormatId: Record<string, unknown> | undefined\n): boolean {\n if (!packageParams) return true;\n\n let constrained = false;\n const actualWidth = numberValue(creativeFormatId, 'width');\n const actualHeight = numberValue(creativeFormatId, 'height');\n const actualDuration =\n numberValue(creativeFormatId, 'duration_ms') ?? numberValue(creativeFormatId, 'duration_ms_exact');\n\n const sizes = Array.isArray(packageParams.sizes)\n ? packageParams.sizes.flatMap(size => (plainObject(size) ? [size] : []))\n : [];\n if (sizes.length > 0) {\n constrained = true;\n if (\n actualWidth === undefined ||\n actualHeight === undefined ||\n !sizes.some(size => numberValue(size, 'width') === actualWidth && numberValue(size, 'height') === actualHeight)\n ) {\n return false;\n }\n }\n\n const expectedWidth = numberValue(packageParams, 'width');\n if (expectedWidth !== undefined) {\n constrained = true;\n if (actualWidth !== expectedWidth) return false;\n }\n\n const expectedHeight = numberValue(packageParams, 'height');\n if (expectedHeight !== undefined) {\n constrained = true;\n if (actualHeight !== expectedHeight) return false;\n }\n\n const minWidth = numberValue(packageParams, 'min_width');\n if (minWidth !== undefined) {\n constrained = true;\n if (actualWidth === undefined || actualWidth < minWidth) return false;\n }\n\n const maxWidth = numberValue(packageParams, 'max_width');\n if (maxWidth !== undefined) {\n constrained = true;\n if (actualWidth === undefined || actualWidth > maxWidth) return false;\n }\n\n const minHeight = numberValue(packageParams, 'min_height');\n if (minHeight !== undefined) {\n constrained = true;\n if (actualHeight === undefined || actualHeight < minHeight) return false;\n }\n\n const maxHeight = numberValue(packageParams, 'max_height');\n if (maxHeight !== undefined) {\n constrained = true;\n if (actualHeight === undefined || actualHeight > maxHeight) return false;\n }\n\n const exactDuration = numberValue(packageParams, 'duration_ms_exact') ?? numberValue(packageParams, 'duration_ms');\n if (exactDuration !== undefined) {\n constrained = true;\n if (actualDuration !== exactDuration) return false;\n }\n\n const durationRange = numberRange(packageParams.duration_ms_range);\n if (durationRange) {\n constrained = true;\n const [minDuration, maxDuration] = durationRange;\n if (actualDuration === undefined) return false;\n if (minDuration !== undefined && actualDuration < minDuration) return false;\n if (maxDuration !== undefined && actualDuration > maxDuration) return false;\n }\n\n return constrained ? creativeFormatId !== undefined : true;\n}\n\nfunction numberValue(object: Record<string, unknown> | undefined, key: string): number | undefined {\n const value = object?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction numberRange(value: unknown): [number | undefined, number | undefined] | undefined {\n if (!Array.isArray(value) || value.length !== 2) return undefined;\n const [min, max] = value;\n const minValue = min === null ? undefined : typeof min === 'number' && Number.isFinite(min) ? min : undefined;\n const maxValue = max === null ? undefined : typeof max === 'number' && Number.isFinite(max) ? max : undefined;\n return minValue === undefined && maxValue === undefined ? undefined : [minValue, maxValue];\n}\n\nfunction normalizeAgentUrl(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n let end = value.length;\n while (end > 0 && value.charCodeAt(end - 1) === 47) {\n end -= 1;\n }\n return end === value.length ? value : value.slice(0, end);\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n return JSON.stringify(sortKeys(a)) === JSON.stringify(sortKeys(b));\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n const object = plainObject(value);\n if (!object) return value;\n return Object.fromEntries(\n Object.entries(object)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => [k, sortKeys(v)])\n );\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 warned = /* @__PURE__ */ new Set();
8
2
  function warnOnce(key, message) {
9
3
  if (!warned.has(key)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils/deprecation.ts"],"sourcesContent":["/**\n * Deprecation warning utility for backward-compat shims.\n *\n * Each key is warned once per process lifetime to avoid log spam.\n */\n\nconst warned = new Set<string>();\n\nexport function warnOnce(key: string, message: string): void {\n if (!warned.has(key)) {\n warned.add(key);\n console.warn(`[@adcp/sdk] DEPRECATED: ${message}`);\n }\n}\n\n/**\n * Reset all deprecation warnings. Only useful in tests.\n */\nexport function resetWarnings(): void {\n warned.clear();\n}\n"],"mappings":";;;;;;AAMA,MAAM,SAAS,oBAAI,IAAY;AAExB,SAAS,SAAS,KAAa,SAAuB;AAC3D,MAAI,CAAC,OAAO,IAAI,GAAG,GAAG;AACpB,WAAO,IAAI,GAAG;AACd,YAAQ,KAAK,2BAA2B,OAAO,EAAE;AAAA,EACnD;AACF;AAKO,SAAS,gBAAsB;AACpC,SAAO,MAAM;AACf;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/utils/deprecation.ts"],"sourcesContent":["/**\n * Deprecation warning utility for backward-compat shims.\n *\n * Each key is warned once per process lifetime to avoid log spam.\n */\n\nconst warned = new Set<string>();\n\nexport function warnOnce(key: string, message: string): void {\n if (!warned.has(key)) {\n warned.add(key);\n console.warn(`[@adcp/sdk] DEPRECATED: ${message}`);\n }\n}\n\n/**\n * Reset all deprecation warnings. Only useful in tests.\n */\nexport function resetWarnings(): void {\n warned.clear();\n}\n"],"mappings":"AAMA,MAAM,SAAS,oBAAI,IAAY;AAExB,SAAS,SAAS,KAAa,SAAuB;AAC3D,MAAI,CAAC,OAAO,IAAI,GAAG,GAAG;AACpB,WAAO,IAAI,GAAG;AACd,YAAQ,KAAK,2BAA2B,OAAO,EAAE;AAAA,EACnD;AACF;AAKO,SAAS,gBAAsB;AACpC,SAAO,MAAM;AACf;","names":[]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import { getAuthoritativeMediaBuyStatus } from "./media-buy-status.mjs";
8
2
  const MEDIA_BUY_STATUS_RESPONSE_TOOLS = /* @__PURE__ */ new Set(["create_media_buy", "update_media_buy"]);
9
3
  function isLegacy30xPayload(payload) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils/envelope-status-compat.ts"],"sourcesContent":["/**\n * Envelope-status back-compat shim for AdCP 3.0.x peers.\n *\n * AdCP 3.1.0-beta.2 promoted envelope `status` to a REQUIRED field on every\n * response. Sellers still on 3.0.x emit responses without `status` — that is\n * spec-correct for 3.0 but trips an 8.0-beta SDK that validates against the\n * 3.1 envelope schema.\n *\n * `injectLegacyEnvelopeStatus` synthesizes a `status` field when, and only\n * when, the response declares itself as 3.0.x (or doesn't declare a version\n * at all, which legacy emitters did). For media-buy create/update responses,\n * it also translates the pre-3.1 top-level lifecycle `status` into\n * `media_buy_status` so it doesn't collide with the 3.1 task-envelope status\n * enum during validation. The same translation applies to the documented 3.1\n * deprecation window for top-level `status: MediaBuyStatus`. Other 3.1+\n * responses are returned unchanged so the strict validator still rejects a\n * peer that omits or misuses `status`.\n *\n * The leniency is a back-compat affordance, not a permanent loosening.\n */\n\nimport { getAuthoritativeMediaBuyStatus } from './media-buy-status';\n\nexport interface LegacyEnvelopeStatusOptions {\n /**\n * AdCP task name for task-specific legacy body-status normalization.\n * `create_media_buy` and `update_media_buy` historically used top-level\n * `status` for MediaBuyStatus; AdCP 3.1 also uses top-level `status` for\n * the protocol task envelope.\n */\n toolName?: string;\n}\n\nconst MEDIA_BUY_STATUS_RESPONSE_TOOLS = new Set(['create_media_buy', 'update_media_buy']);\n\n/**\n * Detect whether a response payload should be treated as 3.0.x for the\n * purposes of envelope-status leniency.\n *\n * Rules:\n * - `adcp_version === '3'` or starts with `'3.0'` → 3.0.x\n * - `adcp_version` starts with `'3.1'` (or any other `3.<n>` n>=1) → NOT 3.0.x\n * - No `adcp_version` AND `adcp_major_version === 3` → 3.0.x (legacy emitter)\n * - No version fields at all → treated as legacy (3.0.x leniency applies)\n * - `adcp_version` declares a major other than 3 → NOT 3.0.x (no leniency)\n */\nexport function isLegacy30xPayload(payload: Record<string, unknown>): boolean {\n const adcpVersion = payload.adcp_version;\n if (typeof adcpVersion === 'string') {\n if (\n adcpVersion === '3' ||\n adcpVersion === '3.0' ||\n adcpVersion.startsWith('3.0.') ||\n adcpVersion.startsWith('3.0-')\n ) {\n return true;\n }\n // Any other explicit version string (`3.1`, `3.1-beta`, `3.1.0-beta.3`,\n // `4.0`, `2.5`, …) declares NOT-3.0; no leniency.\n return false;\n }\n\n // No `adcp_version`. Legacy 3.0 emitters carry `adcp_major_version: 3`.\n const major = payload.adcp_major_version;\n if (typeof major === 'number') {\n return major === 3;\n }\n\n // No version fields at all — treat as a very-legacy emitter.\n return true;\n}\n\n/**\n * AdCP 3.1.0-beta.2 made envelope `status` REQUIRED. Pre-3.1 sellers may\n * omit it. When the response declares itself as 3.0.x (or doesn't declare a\n * version), inject a synthetic envelope status so strict validators don't\n * reject otherwise-conformant 3.0 responses.\n *\n * Never overwrites an existing task-status. Legacy media-buy lifecycle\n * statuses are moved to `media_buy_status` and replaced with the envelope\n * status `completed` when `options.toolName` is `create_media_buy` or\n * `update_media_buy`. Pure function; safe to call before validation.\n *\n * @param response - The raw wire response object.\n * @param options - Optional task context. Pass `toolName` when normalizing a\n * tool response so task-specific legacy body-status shims can run.\n * @returns A new object with `status` injected when the legacy-leniency\n * rules apply; the same reference otherwise.\n */\nexport function injectLegacyEnvelopeStatus<T extends Record<string, unknown>>(\n response: T,\n options?: LegacyEnvelopeStatusOptions\n): T {\n // Defensive: only operate on plain objects.\n if (!response || typeof response !== 'object' || Array.isArray(response)) {\n return response;\n }\n\n if (\n options?.toolName &&\n MEDIA_BUY_STATUS_RESPONSE_TOOLS.has(options.toolName) &&\n allowsDeprecatedMediaBuyStatus(response) &&\n isMediaBuySuccessStatusForCompat(response)\n ) {\n const mediaBuyStatus = response.status;\n return {\n ...response,\n status: 'completed',\n media_buy_status: response.media_buy_status ?? mediaBuyStatus,\n } as T;\n }\n\n // Don't overwrite an existing truthy `status`.\n if ('status' in response && response.status) {\n return response;\n }\n\n if (!isLegacy30xPayload(response)) {\n return response;\n }\n\n // Detect success vs failure to pick the synthetic status.\n const errors = response.errors;\n const hasErrors = Array.isArray(errors) && errors.length > 0;\n\n return {\n ...response,\n status: hasErrors ? 'failed' : 'completed',\n } as T;\n}\n\nexport function normalizeLegacyMediaBuyStatusForReturn<T extends Record<string, unknown>>(\n response: T,\n options?: LegacyEnvelopeStatusOptions\n): T {\n if (!response || typeof response !== 'object' || Array.isArray(response)) {\n return response;\n }\n if (\n !options?.toolName ||\n !MEDIA_BUY_STATUS_RESPONSE_TOOLS.has(options.toolName) ||\n !allowsDeprecatedMediaBuyStatus(response) ||\n !isMediaBuySuccessStatusForCompat(response)\n ) {\n return response;\n }\n const status = getAuthoritativeMediaBuyStatus(response);\n if (!status || response.media_buy_status === status) return response;\n return { ...response, media_buy_status: status } as T;\n}\n\nfunction isMediaBuySuccessStatusForCompat(response: Record<string, unknown>): boolean {\n const status = response.status;\n if (getAuthoritativeMediaBuyStatus(response) !== status) return false;\n if (typeof response.media_buy_status === 'string' && response.media_buy_status !== status) {\n return false;\n }\n // Submitted/working/input-required are task statuses, not media-buy states.\n // The media-buy artifact check keeps terminal task statuses like canceled or\n // rejected from being translated on error/task envelopes.\n return typeof response.media_buy_id === 'string';\n}\n\nfunction allowsDeprecatedMediaBuyStatus(payload: Record<string, unknown>): boolean {\n const adcpVersion = payload.adcp_version;\n if (typeof adcpVersion === 'string') {\n return (\n adcpVersion === '3' ||\n adcpVersion === '3.0' ||\n adcpVersion.startsWith('3.0.') ||\n adcpVersion.startsWith('3.0-') ||\n adcpVersion === '3.1' ||\n adcpVersion.startsWith('3.1.') ||\n adcpVersion.startsWith('3.1-')\n );\n }\n const major = payload.adcp_major_version;\n if (typeof major === 'number') return major === 3;\n return true;\n}\n"],"mappings":";;;;;;AAqBA,SAAS,sCAAsC;AAY/C,MAAM,kCAAkC,oBAAI,IAAI,CAAC,oBAAoB,kBAAkB,CAAC;AAajF,SAAS,mBAAmB,SAA2C;AAC5E,QAAM,cAAc,QAAQ;AAC5B,MAAI,OAAO,gBAAgB,UAAU;AACnC,QACE,gBAAgB,OAChB,gBAAgB,SAChB,YAAY,WAAW,MAAM,KAC7B,YAAY,WAAW,MAAM,GAC7B;AACA,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT;AAGA,QAAM,QAAQ,QAAQ;AACtB,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,UAAU;AAAA,EACnB;AAGA,SAAO;AACT;AAmBO,SAAS,2BACd,UACA,SACG;AAEH,MAAI,CAAC,YAAY,OAAO,aAAa,YAAY,MAAM,QAAQ,QAAQ,GAAG;AACxE,WAAO;AAAA,EACT;AAEA,MACE,SAAS,YACT,gCAAgC,IAAI,QAAQ,QAAQ,KACpD,+BAA+B,QAAQ,KACvC,iCAAiC,QAAQ,GACzC;AACA,UAAM,iBAAiB,SAAS;AAChC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,kBAAkB,SAAS,oBAAoB;AAAA,IACjD;AAAA,EACF;AAGA,MAAI,YAAY,YAAY,SAAS,QAAQ;AAC3C,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,mBAAmB,QAAQ,GAAG;AACjC,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,SAAS;AACxB,QAAM,YAAY,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS;AAE3D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,YAAY,WAAW;AAAA,EACjC;AACF;AAEO,SAAS,uCACd,UACA,SACG;AACH,MAAI,CAAC,YAAY,OAAO,aAAa,YAAY,MAAM,QAAQ,QAAQ,GAAG;AACxE,WAAO;AAAA,EACT;AACA,MACE,CAAC,SAAS,YACV,CAAC,gCAAgC,IAAI,QAAQ,QAAQ,KACrD,CAAC,+BAA+B,QAAQ,KACxC,CAAC,iCAAiC,QAAQ,GAC1C;AACA,WAAO;AAAA,EACT;AACA,QAAM,SAAS,+BAA+B,QAAQ;AACtD,MAAI,CAAC,UAAU,SAAS,qBAAqB,OAAQ,QAAO;AAC5D,SAAO,EAAE,GAAG,UAAU,kBAAkB,OAAO;AACjD;AAEA,SAAS,iCAAiC,UAA4C;AACpF,QAAM,SAAS,SAAS;AACxB,MAAI,+BAA+B,QAAQ,MAAM,OAAQ,QAAO;AAChE,MAAI,OAAO,SAAS,qBAAqB,YAAY,SAAS,qBAAqB,QAAQ;AACzF,WAAO;AAAA,EACT;AAIA,SAAO,OAAO,SAAS,iBAAiB;AAC1C;AAEA,SAAS,+BAA+B,SAA2C;AACjF,QAAM,cAAc,QAAQ;AAC5B,MAAI,OAAO,gBAAgB,UAAU;AACnC,WACE,gBAAgB,OAChB,gBAAgB,SAChB,YAAY,WAAW,MAAM,KAC7B,YAAY,WAAW,MAAM,KAC7B,gBAAgB,SAChB,YAAY,WAAW,MAAM,KAC7B,YAAY,WAAW,MAAM;AAAA,EAEjC;AACA,QAAM,QAAQ,QAAQ;AACtB,MAAI,OAAO,UAAU,SAAU,QAAO,UAAU;AAChD,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/utils/envelope-status-compat.ts"],"sourcesContent":["/**\n * Envelope-status back-compat shim for AdCP 3.0.x peers.\n *\n * AdCP 3.1.0-beta.2 promoted envelope `status` to a REQUIRED field on every\n * response. Sellers still on 3.0.x emit responses without `status` — that is\n * spec-correct for 3.0 but trips an 8.0-beta SDK that validates against the\n * 3.1 envelope schema.\n *\n * `injectLegacyEnvelopeStatus` synthesizes a `status` field when, and only\n * when, the response declares itself as 3.0.x (or doesn't declare a version\n * at all, which legacy emitters did). For media-buy create/update responses,\n * it also translates the pre-3.1 top-level lifecycle `status` into\n * `media_buy_status` so it doesn't collide with the 3.1 task-envelope status\n * enum during validation. The same translation applies to the documented 3.1\n * deprecation window for top-level `status: MediaBuyStatus`. Other 3.1+\n * responses are returned unchanged so the strict validator still rejects a\n * peer that omits or misuses `status`.\n *\n * The leniency is a back-compat affordance, not a permanent loosening.\n */\n\nimport { getAuthoritativeMediaBuyStatus } from './media-buy-status';\n\nexport interface LegacyEnvelopeStatusOptions {\n /**\n * AdCP task name for task-specific legacy body-status normalization.\n * `create_media_buy` and `update_media_buy` historically used top-level\n * `status` for MediaBuyStatus; AdCP 3.1 also uses top-level `status` for\n * the protocol task envelope.\n */\n toolName?: string;\n}\n\nconst MEDIA_BUY_STATUS_RESPONSE_TOOLS = new Set(['create_media_buy', 'update_media_buy']);\n\n/**\n * Detect whether a response payload should be treated as 3.0.x for the\n * purposes of envelope-status leniency.\n *\n * Rules:\n * - `adcp_version === '3'` or starts with `'3.0'` → 3.0.x\n * - `adcp_version` starts with `'3.1'` (or any other `3.<n>` n>=1) → NOT 3.0.x\n * - No `adcp_version` AND `adcp_major_version === 3` → 3.0.x (legacy emitter)\n * - No version fields at all → treated as legacy (3.0.x leniency applies)\n * - `adcp_version` declares a major other than 3 → NOT 3.0.x (no leniency)\n */\nexport function isLegacy30xPayload(payload: Record<string, unknown>): boolean {\n const adcpVersion = payload.adcp_version;\n if (typeof adcpVersion === 'string') {\n if (\n adcpVersion === '3' ||\n adcpVersion === '3.0' ||\n adcpVersion.startsWith('3.0.') ||\n adcpVersion.startsWith('3.0-')\n ) {\n return true;\n }\n // Any other explicit version string (`3.1`, `3.1-beta`, `3.1.0-beta.3`,\n // `4.0`, `2.5`, …) declares NOT-3.0; no leniency.\n return false;\n }\n\n // No `adcp_version`. Legacy 3.0 emitters carry `adcp_major_version: 3`.\n const major = payload.adcp_major_version;\n if (typeof major === 'number') {\n return major === 3;\n }\n\n // No version fields at all — treat as a very-legacy emitter.\n return true;\n}\n\n/**\n * AdCP 3.1.0-beta.2 made envelope `status` REQUIRED. Pre-3.1 sellers may\n * omit it. When the response declares itself as 3.0.x (or doesn't declare a\n * version), inject a synthetic envelope status so strict validators don't\n * reject otherwise-conformant 3.0 responses.\n *\n * Never overwrites an existing task-status. Legacy media-buy lifecycle\n * statuses are moved to `media_buy_status` and replaced with the envelope\n * status `completed` when `options.toolName` is `create_media_buy` or\n * `update_media_buy`. Pure function; safe to call before validation.\n *\n * @param response - The raw wire response object.\n * @param options - Optional task context. Pass `toolName` when normalizing a\n * tool response so task-specific legacy body-status shims can run.\n * @returns A new object with `status` injected when the legacy-leniency\n * rules apply; the same reference otherwise.\n */\nexport function injectLegacyEnvelopeStatus<T extends Record<string, unknown>>(\n response: T,\n options?: LegacyEnvelopeStatusOptions\n): T {\n // Defensive: only operate on plain objects.\n if (!response || typeof response !== 'object' || Array.isArray(response)) {\n return response;\n }\n\n if (\n options?.toolName &&\n MEDIA_BUY_STATUS_RESPONSE_TOOLS.has(options.toolName) &&\n allowsDeprecatedMediaBuyStatus(response) &&\n isMediaBuySuccessStatusForCompat(response)\n ) {\n const mediaBuyStatus = response.status;\n return {\n ...response,\n status: 'completed',\n media_buy_status: response.media_buy_status ?? mediaBuyStatus,\n } as T;\n }\n\n // Don't overwrite an existing truthy `status`.\n if ('status' in response && response.status) {\n return response;\n }\n\n if (!isLegacy30xPayload(response)) {\n return response;\n }\n\n // Detect success vs failure to pick the synthetic status.\n const errors = response.errors;\n const hasErrors = Array.isArray(errors) && errors.length > 0;\n\n return {\n ...response,\n status: hasErrors ? 'failed' : 'completed',\n } as T;\n}\n\nexport function normalizeLegacyMediaBuyStatusForReturn<T extends Record<string, unknown>>(\n response: T,\n options?: LegacyEnvelopeStatusOptions\n): T {\n if (!response || typeof response !== 'object' || Array.isArray(response)) {\n return response;\n }\n if (\n !options?.toolName ||\n !MEDIA_BUY_STATUS_RESPONSE_TOOLS.has(options.toolName) ||\n !allowsDeprecatedMediaBuyStatus(response) ||\n !isMediaBuySuccessStatusForCompat(response)\n ) {\n return response;\n }\n const status = getAuthoritativeMediaBuyStatus(response);\n if (!status || response.media_buy_status === status) return response;\n return { ...response, media_buy_status: status } as T;\n}\n\nfunction isMediaBuySuccessStatusForCompat(response: Record<string, unknown>): boolean {\n const status = response.status;\n if (getAuthoritativeMediaBuyStatus(response) !== status) return false;\n if (typeof response.media_buy_status === 'string' && response.media_buy_status !== status) {\n return false;\n }\n // Submitted/working/input-required are task statuses, not media-buy states.\n // The media-buy artifact check keeps terminal task statuses like canceled or\n // rejected from being translated on error/task envelopes.\n return typeof response.media_buy_id === 'string';\n}\n\nfunction allowsDeprecatedMediaBuyStatus(payload: Record<string, unknown>): boolean {\n const adcpVersion = payload.adcp_version;\n if (typeof adcpVersion === 'string') {\n return (\n adcpVersion === '3' ||\n adcpVersion === '3.0' ||\n adcpVersion.startsWith('3.0.') ||\n adcpVersion.startsWith('3.0-') ||\n adcpVersion === '3.1' ||\n adcpVersion.startsWith('3.1.') ||\n adcpVersion.startsWith('3.1-')\n );\n }\n const major = payload.adcp_major_version;\n if (typeof major === 'number') return major === 3;\n return true;\n}\n"],"mappings":"AAqBA,SAAS,sCAAsC;AAY/C,MAAM,kCAAkC,oBAAI,IAAI,CAAC,oBAAoB,kBAAkB,CAAC;AAajF,SAAS,mBAAmB,SAA2C;AAC5E,QAAM,cAAc,QAAQ;AAC5B,MAAI,OAAO,gBAAgB,UAAU;AACnC,QACE,gBAAgB,OAChB,gBAAgB,SAChB,YAAY,WAAW,MAAM,KAC7B,YAAY,WAAW,MAAM,GAC7B;AACA,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT;AAGA,QAAM,QAAQ,QAAQ;AACtB,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,UAAU;AAAA,EACnB;AAGA,SAAO;AACT;AAmBO,SAAS,2BACd,UACA,SACG;AAEH,MAAI,CAAC,YAAY,OAAO,aAAa,YAAY,MAAM,QAAQ,QAAQ,GAAG;AACxE,WAAO;AAAA,EACT;AAEA,MACE,SAAS,YACT,gCAAgC,IAAI,QAAQ,QAAQ,KACpD,+BAA+B,QAAQ,KACvC,iCAAiC,QAAQ,GACzC;AACA,UAAM,iBAAiB,SAAS;AAChC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,kBAAkB,SAAS,oBAAoB;AAAA,IACjD;AAAA,EACF;AAGA,MAAI,YAAY,YAAY,SAAS,QAAQ;AAC3C,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,mBAAmB,QAAQ,GAAG;AACjC,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,SAAS;AACxB,QAAM,YAAY,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS;AAE3D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,YAAY,WAAW;AAAA,EACjC;AACF;AAEO,SAAS,uCACd,UACA,SACG;AACH,MAAI,CAAC,YAAY,OAAO,aAAa,YAAY,MAAM,QAAQ,QAAQ,GAAG;AACxE,WAAO;AAAA,EACT;AACA,MACE,CAAC,SAAS,YACV,CAAC,gCAAgC,IAAI,QAAQ,QAAQ,KACrD,CAAC,+BAA+B,QAAQ,KACxC,CAAC,iCAAiC,QAAQ,GAC1C;AACA,WAAO;AAAA,EACT;AACA,QAAM,SAAS,+BAA+B,QAAQ;AACtD,MAAI,CAAC,UAAU,SAAS,qBAAqB,OAAQ,QAAO;AAC5D,SAAO,EAAE,GAAG,UAAU,kBAAkB,OAAO;AACjD;AAEA,SAAS,iCAAiC,UAA4C;AACpF,QAAM,SAAS,SAAS;AACxB,MAAI,+BAA+B,QAAQ,MAAM,OAAQ,QAAO;AAChE,MAAI,OAAO,SAAS,qBAAqB,YAAY,SAAS,qBAAqB,QAAQ;AACzF,WAAO;AAAA,EACT;AAIA,SAAO,OAAO,SAAS,iBAAiB;AAC1C;AAEA,SAAS,+BAA+B,SAA2C;AACjF,QAAM,cAAc,QAAQ;AAC5B,MAAI,OAAO,gBAAgB,UAAU;AACnC,WACE,gBAAgB,OAChB,gBAAgB,SAChB,YAAY,WAAW,MAAM,KAC7B,YAAY,WAAW,MAAM,KAC7B,gBAAgB,SAChB,YAAY,WAAW,MAAM,KAC7B,YAAY,WAAW,MAAM;AAAA,EAEjC;AACA,QAAM,QAAQ,QAAQ;AACtB,MAAI,OAAO,UAAU,SAAU,QAAO,UAAU;AAChD,SAAO;AACT;","names":[]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import {
8
2
  STANDARD_ERROR_CODES,
9
3
  isStandardErrorCode
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils/error-extraction.ts"],"sourcesContent":["/**\n * AdCP Error Extraction\n *\n * Extracts structured AdCP errors from MCP and A2A transport responses.\n * Implements the detection order from the transport error mapping spec.\n */\n\nimport {\n STANDARD_ERROR_CODES,\n isStandardErrorCode,\n type StandardErrorCode,\n type ErrorRecovery,\n} from '../types/error-codes';\nimport type { AdcpErrorInfo, AdcpValidationIssue } from '../core/ConversationTypes';\n\nexport interface ExtractedAdcpError {\n code: string;\n message: string;\n recovery?: ErrorRecovery;\n field?: string;\n suggestion?: string;\n retry_after?: number;\n details?: Record<string, unknown>;\n issues?: AdcpValidationIssue[];\n /** Where the error was found in the response */\n source: 'structuredContent' | 'text_json' | 'text_pattern';\n /** The compliance level this delivery achieves */\n compliance_level: 1 | 2 | 3;\n}\n\n/**\n * Extract an AdCP error from an MCP tool response.\n *\n * Detection order (per transport error mapping spec):\n * 1. structuredContent.adcp_error — source 'structuredContent', level 3\n * 2. JSON.parse(content[].text).adcp_error — source 'text_json', level 2\n * 3. Pattern matching on error text for known codes — source 'text_pattern', level 1\n *\n * Returns null if no AdCP error is detected.\n */\nexport function extractAdcpErrorFromMcp(\n response:\n | {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n structuredContent?: Record<string, unknown>;\n }\n | null\n | undefined\n): ExtractedAdcpError | null {\n if (!response) return null;\n\n // Path 1: structuredContent.adcp_error (L3) — only check error responses\n if (response.isError) {\n const structured = response.structuredContent?.adcp_error as Record<string, unknown> | undefined;\n if (structured && typeof structured.code === 'string') {\n return buildExtracted(structured, 'structuredContent', 3);\n }\n }\n\n // Path 2: JSON text fallback (L2) — only check error responses\n if (response.isError && Array.isArray(response.content)) {\n for (const item of response.content) {\n if (item?.type === 'text' && typeof item.text === 'string') {\n try {\n const parsed = JSON.parse(item.text);\n if (parsed?.adcp_error && typeof parsed.adcp_error.code === 'string') {\n return buildExtracted(parsed.adcp_error, 'text_json', 2);\n }\n } catch {\n // not JSON, continue\n }\n }\n }\n }\n\n // Path 3: Text pattern matching (L1)\n if (response.isError && Array.isArray(response.content)) {\n const allText = response.content\n .filter((item: any) => item?.type === 'text' && item.text)\n .map((item: any) => item.text)\n .join('\\n');\n\n if (allText) {\n const matchedCode = matchStandardCode(allText);\n if (matchedCode) {\n return {\n code: matchedCode,\n message: allText,\n source: 'text_pattern',\n compliance_level: 1,\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Extract an AdCP error from a JSON-RPC transport error.\n * Checks error.data.adcp_error for structured transport-level errors\n * (e.g., -32029 rate limit from infrastructure).\n */\nexport function extractAdcpErrorFromTransport(error: unknown): ExtractedAdcpError | null {\n const errorObj = error as Record<string, unknown> | null | undefined;\n const data = errorObj?.data as Record<string, unknown> | undefined;\n const adcpErr = data?.adcp_error as Record<string, unknown> | undefined;\n if (adcpErr && typeof adcpErr.code === 'string') {\n return buildExtracted(adcpErr, 'structuredContent', 3);\n }\n\n // Fall back to message pattern matching\n const message = error instanceof Error ? error.message : (errorObj?.message as string) || String(error);\n if (typeof message === 'string') {\n const matchedCode = matchStandardCode(message);\n if (matchedCode) {\n return {\n code: matchedCode,\n message,\n source: 'text_pattern',\n compliance_level: 1,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Resolve recovery classification for an error.\n * Uses explicit recovery field if present, falls back to standard code table.\n */\nexport function resolveRecovery(error: { code: string; recovery?: string }): ErrorRecovery {\n if (error.recovery === 'transient' || error.recovery === 'correctable' || error.recovery === 'terminal') {\n return error.recovery;\n }\n if (isStandardErrorCode(error.code)) {\n return STANDARD_ERROR_CODES[error.code as StandardErrorCode].recovery;\n }\n return 'terminal';\n}\n\n/**\n * Determine expected client action for a recovery classification.\n */\nexport function getExpectedAction(recovery: ErrorRecovery): 'retry' | 'fix_request' | 'escalate' {\n switch (recovery) {\n case 'transient':\n return 'retry';\n case 'correctable':\n return 'fix_request';\n case 'terminal':\n return 'escalate';\n }\n}\n\n// --- Internal helpers ---\n\n/**\n * Map a raw wire `issues[]` array to `AdcpValidationIssue[]`.\n * Returns `undefined` when input is absent, not an array, or all items are malformed\n * (missing required `pointer` / `message` / `keyword` string fields).\n */\nfunction mapValidationIssues(raw: unknown): AdcpValidationIssue[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const mapped = raw\n .filter(\n (i: any) => typeof i?.pointer === 'string' && typeof i?.message === 'string' && typeof i?.keyword === 'string'\n )\n .map((i: any) => ({\n pointer: i.pointer as string,\n message: i.message as string,\n keyword: i.keyword as string,\n ...(typeof i.schemaPath === 'string' ? { schemaPath: i.schemaPath } : {}),\n }));\n return mapped.length > 0 ? mapped : undefined;\n}\n\nfunction buildExtracted(\n obj: any,\n source: ExtractedAdcpError['source'],\n compliance_level: ExtractedAdcpError['compliance_level']\n): ExtractedAdcpError {\n const result: ExtractedAdcpError = {\n code: obj.code,\n message: obj.message || '',\n source,\n compliance_level,\n };\n if (obj.recovery === 'transient' || obj.recovery === 'correctable' || obj.recovery === 'terminal')\n result.recovery = obj.recovery;\n if (obj.field != null) result.field = obj.field;\n if (obj.suggestion != null) result.suggestion = obj.suggestion;\n if (obj.retry_after != null) result.retry_after = obj.retry_after;\n if (obj.details != null) result.details = obj.details;\n const mappedIssues = mapValidationIssues(obj.issues);\n if (mappedIssues) result.issues = mappedIssues;\n return result;\n}\n\n/** Known patterns that map to standard error codes */\nconst CODE_PATTERNS: Array<[RegExp, StandardErrorCode]> = [\n [/\\bRATE_LIMITED\\b/i, 'RATE_LIMITED'],\n [/\\brate[\\s._-]?limit/i, 'RATE_LIMITED'],\n [/\\bPRODUCT_NOT_FOUND\\b/, 'PRODUCT_NOT_FOUND'],\n [/\\bPRODUCT_UNAVAILABLE\\b/, 'PRODUCT_UNAVAILABLE'],\n [/\\bBUDGET_TOO_LOW\\b/, 'BUDGET_TOO_LOW'],\n [/\\bINVALID_REQUEST\\b/, 'INVALID_REQUEST'],\n // Order matters: more specific codes first. AUTH_MISSING/AUTH_INVALID\n // are the 3.1 split of AUTH_REQUIRED (adcp#3730) — match them before\n // the legacy code so 3.1-shaped messages route to the correct code.\n [/\\bAUTH_MISSING\\b/, 'AUTH_MISSING'],\n [/\\bAUTH_INVALID\\b/, 'AUTH_INVALID'],\n [/\\bAUTH_REQUIRED\\b/, 'AUTH_REQUIRED'],\n [/\\bSERVICE_UNAVAILABLE\\b/, 'SERVICE_UNAVAILABLE'],\n [/\\bCREATIVE_REJECTED\\b/, 'CREATIVE_REJECTED'],\n [/\\bPOLICY_VIOLATION\\b/, 'POLICY_VIOLATION'],\n [/\\bUNSUPPORTED_FEATURE\\b/, 'UNSUPPORTED_FEATURE'],\n [/\\bPROPOSAL_EXPIRED\\b/, 'PROPOSAL_EXPIRED'],\n [/\\bAUDIENCE_TOO_SMALL\\b/, 'AUDIENCE_TOO_SMALL'],\n [/\\bACCOUNT_NOT_FOUND\\b/, 'ACCOUNT_NOT_FOUND'],\n [/\\bACCOUNT_SETUP_REQUIRED\\b/, 'ACCOUNT_SETUP_REQUIRED'],\n [/\\bACCOUNT_AMBIGUOUS\\b/, 'ACCOUNT_AMBIGUOUS'],\n [/\\bACCOUNT_PAYMENT_REQUIRED\\b/, 'ACCOUNT_PAYMENT_REQUIRED'],\n [/\\bACCOUNT_SUSPENDED\\b/, 'ACCOUNT_SUSPENDED'],\n [/\\bCOMPLIANCE_UNSATISFIED\\b/, 'COMPLIANCE_UNSATISFIED'],\n [/\\bBUDGET_EXHAUSTED\\b/, 'BUDGET_EXHAUSTED'],\n [/\\bIDEMPOTENCY_CONFLICT\\b/, 'IDEMPOTENCY_CONFLICT'],\n [/\\bIDEMPOTENCY_EXPIRED\\b/, 'IDEMPOTENCY_EXPIRED'],\n // CONFLICT omitted from pattern matching — too ambiguous as a common English word\n];\n\nfunction matchStandardCode(text: string): StandardErrorCode | null {\n for (const [pattern, code] of CODE_PATTERNS) {\n if (pattern.test(text)) return code;\n }\n return null;\n}\n\n// --- TaskResult-level helpers ---\n\n/**\n * Extract normalized AdcpErrorInfo from unwrapped response data.\n * Handles both `{ adcp_error: {...} }` and `{ errors: [...] }` shapes.\n */\nexport function extractAdcpErrorInfo(data: any): AdcpErrorInfo | undefined {\n if (!data) return undefined;\n\n if (data.adcp_error && typeof data.adcp_error.code === 'string') {\n const ae = data.adcp_error;\n const info: AdcpErrorInfo = { code: ae.code, message: ae.message || ae.code };\n const recovery = resolveRecovery(ae);\n if (recovery) info.recovery = recovery;\n if (ae.field != null) info.field = ae.field;\n if (ae.suggestion != null) info.suggestion = ae.suggestion;\n if (ae.retry_after != null) {\n info.retry_after = ae.retry_after;\n info.retryAfterMs = ae.retry_after * 1000;\n }\n if (ae.details != null) info.details = ae.details;\n const mappedIssues = mapValidationIssues(ae.issues);\n if (mappedIssues) info.issues = mappedIssues;\n if (ae.synthetic) info.synthetic = true;\n return info;\n }\n\n // Legacy `{ errors: [...] }` envelope — L1 compat only. Extracts code/message/recovery\n // from errors[0]; does not forward issues[], field, suggestion, or details since this\n // path is only reached for non-standard envelopes that are unlikely to carry issues[].\n if (Array.isArray(data.errors) && data.errors.length > 0) {\n const first = data.errors[0];\n if (typeof first.code === 'string') {\n const info: AdcpErrorInfo = { code: first.code, message: first.message || '' };\n const recovery = resolveRecovery(first);\n if (recovery) info.recovery = recovery;\n return info;\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract correlation ID from response data context envelope.\n */\nexport function extractCorrelationId(data: any): string | undefined {\n return data?.context?.correlation_id || undefined;\n}\n\n/**\n * Structured details accompanying a `VERSION_UNSUPPORTED` AdCP error per spec\n * `error-details/version-unsupported.json` (AdCP 3.1, spec PR\n * `adcontextprotocol/adcp#3493`). Buyers read these from the error envelope\n * to decide whether to downgrade their pin and retry rather than failing\n * outright.\n */\nexport interface VersionUnsupportedDetails {\n /**\n * Release-precision versions the seller does support (e.g. `['3.0', '3.1']`).\n * Buyers can negotiate down to a member of this set.\n */\n supported_versions?: string[];\n /** The specific `adcp_version` value the buyer asked for, echoed back. */\n requested_version?: string;\n /** Seller's full semver build, advisory. */\n build_version?: string;\n}\n\n/**\n * Extract structured `VERSION_UNSUPPORTED` details from an AdCP error\n * envelope. Returns `undefined` when the error has no `data` block or the\n * block doesn't match the spec shape — callers should treat absence as\n * \"seller didn't tell me what they support\" and fall back to a fixed retry\n * strategy.\n *\n * Accepts either a raw `error.data` object or the full unwrapped response\n * — looks for `data` / `details` / `adcp_error.data` / `adcp_error.details`\n * variants since SDKs sometimes nest the structured payload differently.\n */\nexport function extractVersionUnsupportedDetails(input: unknown): VersionUnsupportedDetails | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const candidate = (() => {\n const obj = input as Record<string, unknown>;\n if (typeof obj.supported_versions !== 'undefined' || typeof obj.requested_version !== 'undefined') return obj;\n if (obj.data && typeof obj.data === 'object') return obj.data as Record<string, unknown>;\n if (obj.details && typeof obj.details === 'object') return obj.details as Record<string, unknown>;\n if (obj.adcp_error && typeof obj.adcp_error === 'object') {\n const ae = obj.adcp_error as Record<string, unknown>;\n if (ae.data && typeof ae.data === 'object') return ae.data as Record<string, unknown>;\n if (ae.details && typeof ae.details === 'object') return ae.details as Record<string, unknown>;\n }\n // Plural-errors envelope from `extractAdcpErrorInfo` and AdCP's legacy\n // `{ errors: [...] }` shape — read details off the first error entry.\n if (Array.isArray(obj.errors) && obj.errors.length > 0) {\n const first = obj.errors[0] as Record<string, unknown> | null | undefined;\n if (first && typeof first === 'object') {\n if (first.data && typeof first.data === 'object') return first.data as Record<string, unknown>;\n if (first.details && typeof first.details === 'object') return first.details as Record<string, unknown>;\n }\n }\n return undefined;\n })();\n if (!candidate) return undefined;\n\n const out: VersionUnsupportedDetails = {};\n if (Array.isArray(candidate.supported_versions)) {\n const versions = candidate.supported_versions.filter((v: unknown): v is string => typeof v === 'string');\n if (versions.length > 0) out.supported_versions = versions;\n }\n if (typeof candidate.requested_version === 'string') {\n out.requested_version = candidate.requested_version;\n }\n if (typeof candidate.build_version === 'string') {\n out.build_version = candidate.build_version;\n }\n // Return undefined when the envelope was structurally present but empty —\n // matches \"seller didn't actually populate the spec'd fields\" semantics.\n return Object.keys(out).length > 0 ? out : undefined;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/utils/error-extraction.ts"],"sourcesContent":["/**\n * AdCP Error Extraction\n *\n * Extracts structured AdCP errors from MCP and A2A transport responses.\n * Implements the detection order from the transport error mapping spec.\n */\n\nimport {\n STANDARD_ERROR_CODES,\n isStandardErrorCode,\n type StandardErrorCode,\n type ErrorRecovery,\n} from '../types/error-codes';\nimport type { AdcpErrorInfo, AdcpValidationIssue } from '../core/ConversationTypes';\n\nexport interface ExtractedAdcpError {\n code: string;\n message: string;\n recovery?: ErrorRecovery;\n field?: string;\n suggestion?: string;\n retry_after?: number;\n details?: Record<string, unknown>;\n issues?: AdcpValidationIssue[];\n /** Where the error was found in the response */\n source: 'structuredContent' | 'text_json' | 'text_pattern';\n /** The compliance level this delivery achieves */\n compliance_level: 1 | 2 | 3;\n}\n\n/**\n * Extract an AdCP error from an MCP tool response.\n *\n * Detection order (per transport error mapping spec):\n * 1. structuredContent.adcp_error — source 'structuredContent', level 3\n * 2. JSON.parse(content[].text).adcp_error — source 'text_json', level 2\n * 3. Pattern matching on error text for known codes — source 'text_pattern', level 1\n *\n * Returns null if no AdCP error is detected.\n */\nexport function extractAdcpErrorFromMcp(\n response:\n | {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n structuredContent?: Record<string, unknown>;\n }\n | null\n | undefined\n): ExtractedAdcpError | null {\n if (!response) return null;\n\n // Path 1: structuredContent.adcp_error (L3) — only check error responses\n if (response.isError) {\n const structured = response.structuredContent?.adcp_error as Record<string, unknown> | undefined;\n if (structured && typeof structured.code === 'string') {\n return buildExtracted(structured, 'structuredContent', 3);\n }\n }\n\n // Path 2: JSON text fallback (L2) — only check error responses\n if (response.isError && Array.isArray(response.content)) {\n for (const item of response.content) {\n if (item?.type === 'text' && typeof item.text === 'string') {\n try {\n const parsed = JSON.parse(item.text);\n if (parsed?.adcp_error && typeof parsed.adcp_error.code === 'string') {\n return buildExtracted(parsed.adcp_error, 'text_json', 2);\n }\n } catch {\n // not JSON, continue\n }\n }\n }\n }\n\n // Path 3: Text pattern matching (L1)\n if (response.isError && Array.isArray(response.content)) {\n const allText = response.content\n .filter((item: any) => item?.type === 'text' && item.text)\n .map((item: any) => item.text)\n .join('\\n');\n\n if (allText) {\n const matchedCode = matchStandardCode(allText);\n if (matchedCode) {\n return {\n code: matchedCode,\n message: allText,\n source: 'text_pattern',\n compliance_level: 1,\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Extract an AdCP error from a JSON-RPC transport error.\n * Checks error.data.adcp_error for structured transport-level errors\n * (e.g., -32029 rate limit from infrastructure).\n */\nexport function extractAdcpErrorFromTransport(error: unknown): ExtractedAdcpError | null {\n const errorObj = error as Record<string, unknown> | null | undefined;\n const data = errorObj?.data as Record<string, unknown> | undefined;\n const adcpErr = data?.adcp_error as Record<string, unknown> | undefined;\n if (adcpErr && typeof adcpErr.code === 'string') {\n return buildExtracted(adcpErr, 'structuredContent', 3);\n }\n\n // Fall back to message pattern matching\n const message = error instanceof Error ? error.message : (errorObj?.message as string) || String(error);\n if (typeof message === 'string') {\n const matchedCode = matchStandardCode(message);\n if (matchedCode) {\n return {\n code: matchedCode,\n message,\n source: 'text_pattern',\n compliance_level: 1,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Resolve recovery classification for an error.\n * Uses explicit recovery field if present, falls back to standard code table.\n */\nexport function resolveRecovery(error: { code: string; recovery?: string }): ErrorRecovery {\n if (error.recovery === 'transient' || error.recovery === 'correctable' || error.recovery === 'terminal') {\n return error.recovery;\n }\n if (isStandardErrorCode(error.code)) {\n return STANDARD_ERROR_CODES[error.code as StandardErrorCode].recovery;\n }\n return 'terminal';\n}\n\n/**\n * Determine expected client action for a recovery classification.\n */\nexport function getExpectedAction(recovery: ErrorRecovery): 'retry' | 'fix_request' | 'escalate' {\n switch (recovery) {\n case 'transient':\n return 'retry';\n case 'correctable':\n return 'fix_request';\n case 'terminal':\n return 'escalate';\n }\n}\n\n// --- Internal helpers ---\n\n/**\n * Map a raw wire `issues[]` array to `AdcpValidationIssue[]`.\n * Returns `undefined` when input is absent, not an array, or all items are malformed\n * (missing required `pointer` / `message` / `keyword` string fields).\n */\nfunction mapValidationIssues(raw: unknown): AdcpValidationIssue[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const mapped = raw\n .filter(\n (i: any) => typeof i?.pointer === 'string' && typeof i?.message === 'string' && typeof i?.keyword === 'string'\n )\n .map((i: any) => ({\n pointer: i.pointer as string,\n message: i.message as string,\n keyword: i.keyword as string,\n ...(typeof i.schemaPath === 'string' ? { schemaPath: i.schemaPath } : {}),\n }));\n return mapped.length > 0 ? mapped : undefined;\n}\n\nfunction buildExtracted(\n obj: any,\n source: ExtractedAdcpError['source'],\n compliance_level: ExtractedAdcpError['compliance_level']\n): ExtractedAdcpError {\n const result: ExtractedAdcpError = {\n code: obj.code,\n message: obj.message || '',\n source,\n compliance_level,\n };\n if (obj.recovery === 'transient' || obj.recovery === 'correctable' || obj.recovery === 'terminal')\n result.recovery = obj.recovery;\n if (obj.field != null) result.field = obj.field;\n if (obj.suggestion != null) result.suggestion = obj.suggestion;\n if (obj.retry_after != null) result.retry_after = obj.retry_after;\n if (obj.details != null) result.details = obj.details;\n const mappedIssues = mapValidationIssues(obj.issues);\n if (mappedIssues) result.issues = mappedIssues;\n return result;\n}\n\n/** Known patterns that map to standard error codes */\nconst CODE_PATTERNS: Array<[RegExp, StandardErrorCode]> = [\n [/\\bRATE_LIMITED\\b/i, 'RATE_LIMITED'],\n [/\\brate[\\s._-]?limit/i, 'RATE_LIMITED'],\n [/\\bPRODUCT_NOT_FOUND\\b/, 'PRODUCT_NOT_FOUND'],\n [/\\bPRODUCT_UNAVAILABLE\\b/, 'PRODUCT_UNAVAILABLE'],\n [/\\bBUDGET_TOO_LOW\\b/, 'BUDGET_TOO_LOW'],\n [/\\bINVALID_REQUEST\\b/, 'INVALID_REQUEST'],\n // Order matters: more specific codes first. AUTH_MISSING/AUTH_INVALID\n // are the 3.1 split of AUTH_REQUIRED (adcp#3730) — match them before\n // the legacy code so 3.1-shaped messages route to the correct code.\n [/\\bAUTH_MISSING\\b/, 'AUTH_MISSING'],\n [/\\bAUTH_INVALID\\b/, 'AUTH_INVALID'],\n [/\\bAUTH_REQUIRED\\b/, 'AUTH_REQUIRED'],\n [/\\bSERVICE_UNAVAILABLE\\b/, 'SERVICE_UNAVAILABLE'],\n [/\\bCREATIVE_REJECTED\\b/, 'CREATIVE_REJECTED'],\n [/\\bPOLICY_VIOLATION\\b/, 'POLICY_VIOLATION'],\n [/\\bUNSUPPORTED_FEATURE\\b/, 'UNSUPPORTED_FEATURE'],\n [/\\bPROPOSAL_EXPIRED\\b/, 'PROPOSAL_EXPIRED'],\n [/\\bAUDIENCE_TOO_SMALL\\b/, 'AUDIENCE_TOO_SMALL'],\n [/\\bACCOUNT_NOT_FOUND\\b/, 'ACCOUNT_NOT_FOUND'],\n [/\\bACCOUNT_SETUP_REQUIRED\\b/, 'ACCOUNT_SETUP_REQUIRED'],\n [/\\bACCOUNT_AMBIGUOUS\\b/, 'ACCOUNT_AMBIGUOUS'],\n [/\\bACCOUNT_PAYMENT_REQUIRED\\b/, 'ACCOUNT_PAYMENT_REQUIRED'],\n [/\\bACCOUNT_SUSPENDED\\b/, 'ACCOUNT_SUSPENDED'],\n [/\\bCOMPLIANCE_UNSATISFIED\\b/, 'COMPLIANCE_UNSATISFIED'],\n [/\\bBUDGET_EXHAUSTED\\b/, 'BUDGET_EXHAUSTED'],\n [/\\bIDEMPOTENCY_CONFLICT\\b/, 'IDEMPOTENCY_CONFLICT'],\n [/\\bIDEMPOTENCY_EXPIRED\\b/, 'IDEMPOTENCY_EXPIRED'],\n // CONFLICT omitted from pattern matching — too ambiguous as a common English word\n];\n\nfunction matchStandardCode(text: string): StandardErrorCode | null {\n for (const [pattern, code] of CODE_PATTERNS) {\n if (pattern.test(text)) return code;\n }\n return null;\n}\n\n// --- TaskResult-level helpers ---\n\n/**\n * Extract normalized AdcpErrorInfo from unwrapped response data.\n * Handles both `{ adcp_error: {...} }` and `{ errors: [...] }` shapes.\n */\nexport function extractAdcpErrorInfo(data: any): AdcpErrorInfo | undefined {\n if (!data) return undefined;\n\n if (data.adcp_error && typeof data.adcp_error.code === 'string') {\n const ae = data.adcp_error;\n const info: AdcpErrorInfo = { code: ae.code, message: ae.message || ae.code };\n const recovery = resolveRecovery(ae);\n if (recovery) info.recovery = recovery;\n if (ae.field != null) info.field = ae.field;\n if (ae.suggestion != null) info.suggestion = ae.suggestion;\n if (ae.retry_after != null) {\n info.retry_after = ae.retry_after;\n info.retryAfterMs = ae.retry_after * 1000;\n }\n if (ae.details != null) info.details = ae.details;\n const mappedIssues = mapValidationIssues(ae.issues);\n if (mappedIssues) info.issues = mappedIssues;\n if (ae.synthetic) info.synthetic = true;\n return info;\n }\n\n // Legacy `{ errors: [...] }` envelope — L1 compat only. Extracts code/message/recovery\n // from errors[0]; does not forward issues[], field, suggestion, or details since this\n // path is only reached for non-standard envelopes that are unlikely to carry issues[].\n if (Array.isArray(data.errors) && data.errors.length > 0) {\n const first = data.errors[0];\n if (typeof first.code === 'string') {\n const info: AdcpErrorInfo = { code: first.code, message: first.message || '' };\n const recovery = resolveRecovery(first);\n if (recovery) info.recovery = recovery;\n return info;\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract correlation ID from response data context envelope.\n */\nexport function extractCorrelationId(data: any): string | undefined {\n return data?.context?.correlation_id || undefined;\n}\n\n/**\n * Structured details accompanying a `VERSION_UNSUPPORTED` AdCP error per spec\n * `error-details/version-unsupported.json` (AdCP 3.1, spec PR\n * `adcontextprotocol/adcp#3493`). Buyers read these from the error envelope\n * to decide whether to downgrade their pin and retry rather than failing\n * outright.\n */\nexport interface VersionUnsupportedDetails {\n /**\n * Release-precision versions the seller does support (e.g. `['3.0', '3.1']`).\n * Buyers can negotiate down to a member of this set.\n */\n supported_versions?: string[];\n /** The specific `adcp_version` value the buyer asked for, echoed back. */\n requested_version?: string;\n /** Seller's full semver build, advisory. */\n build_version?: string;\n}\n\n/**\n * Extract structured `VERSION_UNSUPPORTED` details from an AdCP error\n * envelope. Returns `undefined` when the error has no `data` block or the\n * block doesn't match the spec shape — callers should treat absence as\n * \"seller didn't tell me what they support\" and fall back to a fixed retry\n * strategy.\n *\n * Accepts either a raw `error.data` object or the full unwrapped response\n * — looks for `data` / `details` / `adcp_error.data` / `adcp_error.details`\n * variants since SDKs sometimes nest the structured payload differently.\n */\nexport function extractVersionUnsupportedDetails(input: unknown): VersionUnsupportedDetails | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const candidate = (() => {\n const obj = input as Record<string, unknown>;\n if (typeof obj.supported_versions !== 'undefined' || typeof obj.requested_version !== 'undefined') return obj;\n if (obj.data && typeof obj.data === 'object') return obj.data as Record<string, unknown>;\n if (obj.details && typeof obj.details === 'object') return obj.details as Record<string, unknown>;\n if (obj.adcp_error && typeof obj.adcp_error === 'object') {\n const ae = obj.adcp_error as Record<string, unknown>;\n if (ae.data && typeof ae.data === 'object') return ae.data as Record<string, unknown>;\n if (ae.details && typeof ae.details === 'object') return ae.details as Record<string, unknown>;\n }\n // Plural-errors envelope from `extractAdcpErrorInfo` and AdCP's legacy\n // `{ errors: [...] }` shape — read details off the first error entry.\n if (Array.isArray(obj.errors) && obj.errors.length > 0) {\n const first = obj.errors[0] as Record<string, unknown> | null | undefined;\n if (first && typeof first === 'object') {\n if (first.data && typeof first.data === 'object') return first.data as Record<string, unknown>;\n if (first.details && typeof first.details === 'object') return first.details as Record<string, unknown>;\n }\n }\n return undefined;\n })();\n if (!candidate) return undefined;\n\n const out: VersionUnsupportedDetails = {};\n if (Array.isArray(candidate.supported_versions)) {\n const versions = candidate.supported_versions.filter((v: unknown): v is string => typeof v === 'string');\n if (versions.length > 0) out.supported_versions = versions;\n }\n if (typeof candidate.requested_version === 'string') {\n out.requested_version = candidate.requested_version;\n }\n if (typeof candidate.build_version === 'string') {\n out.build_version = candidate.build_version;\n }\n // Return undefined when the envelope was structurally present but empty —\n // matches \"seller didn't actually populate the spec'd fields\" semantics.\n return Object.keys(out).length > 0 ? out : undefined;\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
  function extractResult(result) {
8
2
  if (result == null || typeof result !== "object") return void 0;
9
3
  const structured = result.structuredContent;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils/extract-result.ts"],"sourcesContent":["/**\n * Extract structured data from an MCP `CallToolResult`.\n *\n * AdCP servers put the typed tool response in `structuredContent` (MCP L3);\n * `content[0].text` carries a human-readable summary (MCP L2). Prefer\n * `structuredContent` when present, fall back to JSON-parsing a text block\n * for servers that haven't adopted `structuredContent` yet.\n *\n * **Returns `undefined`** when neither surface yields usable data. This\n * is the ergonomic happy-path helper — the companion\n * `unwrapProtocolResponse` **throws** on missing/invalid payloads and\n * additionally validates against a per-tool schema, handling protocol\n * detection and extraction-path provenance. Pick based on the caller:\n *\n * - `extractResult<T>(res)` — \"I just want the payload; `undefined` if\n * there's nothing to extract.\" No throw, no validation.\n * - `unwrapProtocolResponse(res, toolName, 'mcp')` — \"Give me a\n * validated, schema-narrowed AdCP response or throw.\" Heavier, tool-aware.\n *\n * `content[]` entries that aren't text blocks (image / audio / resource\n * per the MCP `CallToolResult.content` schema) are intentionally\n * skipped — AdCP's typed payload always rides on `structuredContent`\n * or the first JSON-parseable text block.\n *\n * @example\n * ```ts\n * import { extractResult } from '@adcp/sdk';\n *\n * const res = await mcpClient.callTool({ name: 'get_products', arguments: {} });\n * const payload = extractResult<GetProductsResponse>(res);\n * if (payload && 'products' in payload) {\n * // payload is the Success arm — narrow further if it's a Success|Error union\n * }\n * ```\n */\nexport interface ToolCallResultLike {\n structuredContent?: unknown;\n content?: Array<{ type?: string; text?: string } | null | undefined>;\n isError?: boolean;\n}\n\nexport function extractResult<T = unknown>(result: ToolCallResultLike | null | undefined): T | undefined {\n if (result == null || typeof result !== 'object') return undefined;\n\n const structured = result.structuredContent;\n if (structured != null && typeof structured === 'object') {\n return structured as T;\n }\n\n if (Array.isArray(result.content)) {\n for (const block of result.content) {\n // Non-text blocks (image/audio/resource) carry no AdCP payload —\n // skip silently rather than throwing on an unknown block type.\n if (block && block.type === 'text' && typeof block.text === 'string') {\n try {\n return JSON.parse(block.text) as T;\n } catch {\n // Not JSON — keep scanning for another text block.\n }\n }\n }\n }\n\n return undefined;\n}\n"],"mappings":";;;;;;AAyCO,SAAS,cAA2B,QAA8D;AACvG,MAAI,UAAU,QAAQ,OAAO,WAAW,SAAU,QAAO;AAEzD,QAAM,aAAa,OAAO;AAC1B,MAAI,cAAc,QAAQ,OAAO,eAAe,UAAU;AACxD,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,OAAO,OAAO,GAAG;AACjC,eAAW,SAAS,OAAO,SAAS;AAGlC,UAAI,SAAS,MAAM,SAAS,UAAU,OAAO,MAAM,SAAS,UAAU;AACpE,YAAI;AACF,iBAAO,KAAK,MAAM,MAAM,IAAI;AAAA,QAC9B,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/utils/extract-result.ts"],"sourcesContent":["/**\n * Extract structured data from an MCP `CallToolResult`.\n *\n * AdCP servers put the typed tool response in `structuredContent` (MCP L3);\n * `content[0].text` carries a human-readable summary (MCP L2). Prefer\n * `structuredContent` when present, fall back to JSON-parsing a text block\n * for servers that haven't adopted `structuredContent` yet.\n *\n * **Returns `undefined`** when neither surface yields usable data. This\n * is the ergonomic happy-path helper — the companion\n * `unwrapProtocolResponse` **throws** on missing/invalid payloads and\n * additionally validates against a per-tool schema, handling protocol\n * detection and extraction-path provenance. Pick based on the caller:\n *\n * - `extractResult<T>(res)` — \"I just want the payload; `undefined` if\n * there's nothing to extract.\" No throw, no validation.\n * - `unwrapProtocolResponse(res, toolName, 'mcp')` — \"Give me a\n * validated, schema-narrowed AdCP response or throw.\" Heavier, tool-aware.\n *\n * `content[]` entries that aren't text blocks (image / audio / resource\n * per the MCP `CallToolResult.content` schema) are intentionally\n * skipped — AdCP's typed payload always rides on `structuredContent`\n * or the first JSON-parseable text block.\n *\n * @example\n * ```ts\n * import { extractResult } from '@adcp/sdk';\n *\n * const res = await mcpClient.callTool({ name: 'get_products', arguments: {} });\n * const payload = extractResult<GetProductsResponse>(res);\n * if (payload && 'products' in payload) {\n * // payload is the Success arm — narrow further if it's a Success|Error union\n * }\n * ```\n */\nexport interface ToolCallResultLike {\n structuredContent?: unknown;\n content?: Array<{ type?: string; text?: string } | null | undefined>;\n isError?: boolean;\n}\n\nexport function extractResult<T = unknown>(result: ToolCallResultLike | null | undefined): T | undefined {\n if (result == null || typeof result !== 'object') return undefined;\n\n const structured = result.structuredContent;\n if (structured != null && typeof structured === 'object') {\n return structured as T;\n }\n\n if (Array.isArray(result.content)) {\n for (const block of result.content) {\n // Non-text blocks (image/audio/resource) carry no AdCP payload —\n // skip silently rather than throwing on an unknown block type.\n if (block && block.type === 'text' && typeof block.text === 'string') {\n try {\n return JSON.parse(block.text) as T;\n } catch {\n // Not JSON — keep scanning for another text block.\n }\n }\n }\n }\n\n return undefined;\n}\n"],"mappings":"AAyCO,SAAS,cAA2B,QAA8D;AACvG,MAAI,UAAU,QAAQ,OAAO,WAAW,SAAU,QAAO;AAEzD,QAAM,aAAa,OAAO;AAC1B,MAAI,cAAc,QAAQ,OAAO,eAAe,UAAU;AACxD,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,OAAO,OAAO,GAAG;AACjC,eAAW,SAAS,OAAO,SAAS;AAGlC,UAAI,SAAS,MAAM,SAAS,UAAU,OAAO,MAAM,SAAS,UAAU;AACpE,YAAI;AACF,iBAAO,KAAK,MAAM,MAAM,IAAI;AAAA,QAC9B,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,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
  function imageAssetSlot(fields) {
8
2
  return { ...fields, item_type: "individual", asset_type: "image" };
9
3
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils/format-asset-slot-builders.ts"],"sourcesContent":["// Typed factory helpers for format asset slots. Companion to\n// `asset-builders.ts` (which builds creative INSTANCES). These build the slot\n// definitions inside `Format.assets[]` — what a publisher declares it accepts.\n//\n// Each helper injects `item_type: 'individual'` plus the per-asset-type\n// `asset_type` discriminator so callers only supply the meaningful fields.\n// The slot's `requirements` object is strictly typed per asset type — misnamed\n// fields like `file_types` or wrong units like `min_duration_seconds` become\n// compile-time errors at the authorship site.\n\nimport type {\n GroupAudioAsset,\n GroupCssAsset,\n GroupDaastAsset,\n GroupHtmlAsset,\n GroupImageAsset,\n GroupJavaScriptAsset,\n GroupMarkdownAsset,\n GroupTextAsset,\n GroupUrlAsset,\n GroupVastAsset,\n GroupVideoAsset,\n GroupWebhookAsset,\n IndividualAudioAsset,\n IndividualBriefAsset,\n IndividualCatalogAsset,\n IndividualCssAsset,\n IndividualDaastAsset,\n IndividualHtmlAsset,\n IndividualImageAsset,\n IndividualJavaScriptAsset,\n IndividualMarkdownAsset,\n IndividualTextAsset,\n IndividualUrlAsset,\n IndividualVastAsset,\n IndividualVideoAsset,\n IndividualWebhookAsset,\n RepeatableGroupAsset,\n} from '../types/tools.generated';\n\ntype IndividualFields<T> = Omit<T, 'item_type' | 'asset_type'>;\ntype GroupFields<T> = Omit<T, 'asset_type'>;\n\n// ---------- Individual asset slot builders ----------\n\nexport function imageAssetSlot(fields: IndividualFields<IndividualImageAsset>): IndividualImageAsset {\n return { ...fields, item_type: 'individual', asset_type: 'image' };\n}\n\nexport function videoAssetSlot(fields: IndividualFields<IndividualVideoAsset>): IndividualVideoAsset {\n return { ...fields, item_type: 'individual', asset_type: 'video' };\n}\n\nexport function audioAssetSlot(fields: IndividualFields<IndividualAudioAsset>): IndividualAudioAsset {\n return { ...fields, item_type: 'individual', asset_type: 'audio' };\n}\n\nexport function textAssetSlot(fields: IndividualFields<IndividualTextAsset>): IndividualTextAsset {\n return { ...fields, item_type: 'individual', asset_type: 'text' };\n}\n\nexport function markdownAssetSlot(fields: IndividualFields<IndividualMarkdownAsset>): IndividualMarkdownAsset {\n return { ...fields, item_type: 'individual', asset_type: 'markdown' };\n}\n\nexport function htmlAssetSlot(fields: IndividualFields<IndividualHtmlAsset>): IndividualHtmlAsset {\n return { ...fields, item_type: 'individual', asset_type: 'html' };\n}\n\nexport function cssAssetSlot(fields: IndividualFields<IndividualCssAsset>): IndividualCssAsset {\n return { ...fields, item_type: 'individual', asset_type: 'css' };\n}\n\nexport function javascriptAssetSlot(fields: IndividualFields<IndividualJavaScriptAsset>): IndividualJavaScriptAsset {\n return { ...fields, item_type: 'individual', asset_type: 'javascript' };\n}\n\nexport function vastAssetSlot(fields: IndividualFields<IndividualVastAsset>): IndividualVastAsset {\n return { ...fields, item_type: 'individual', asset_type: 'vast' };\n}\n\nexport function daastAssetSlot(fields: IndividualFields<IndividualDaastAsset>): IndividualDaastAsset {\n return { ...fields, item_type: 'individual', asset_type: 'daast' };\n}\n\nexport function urlAssetSlot(fields: IndividualFields<IndividualUrlAsset>): IndividualUrlAsset {\n return { ...fields, item_type: 'individual', asset_type: 'url' };\n}\n\nexport function webhookAssetSlot(fields: IndividualFields<IndividualWebhookAsset>): IndividualWebhookAsset {\n return { ...fields, item_type: 'individual', asset_type: 'webhook' };\n}\n\nexport function briefAssetSlot(fields: IndividualFields<IndividualBriefAsset>): IndividualBriefAsset {\n return { ...fields, item_type: 'individual', asset_type: 'brief' };\n}\n\nexport function catalogAssetSlot(fields: IndividualFields<IndividualCatalogAsset>): IndividualCatalogAsset {\n return { ...fields, item_type: 'individual', asset_type: 'catalog' };\n}\n\n// ---------- Group asset slot builders (for use inside repeatableGroup) ----------\n\nexport function imageGroupAsset(fields: GroupFields<GroupImageAsset>): GroupImageAsset {\n return { ...fields, asset_type: 'image' };\n}\nexport function videoGroupAsset(fields: GroupFields<GroupVideoAsset>): GroupVideoAsset {\n return { ...fields, asset_type: 'video' };\n}\nexport function audioGroupAsset(fields: GroupFields<GroupAudioAsset>): GroupAudioAsset {\n return { ...fields, asset_type: 'audio' };\n}\nexport function textGroupAsset(fields: GroupFields<GroupTextAsset>): GroupTextAsset {\n return { ...fields, asset_type: 'text' };\n}\nexport function markdownGroupAsset(fields: GroupFields<GroupMarkdownAsset>): GroupMarkdownAsset {\n return { ...fields, asset_type: 'markdown' };\n}\nexport function htmlGroupAsset(fields: GroupFields<GroupHtmlAsset>): GroupHtmlAsset {\n return { ...fields, asset_type: 'html' };\n}\nexport function cssGroupAsset(fields: GroupFields<GroupCssAsset>): GroupCssAsset {\n return { ...fields, asset_type: 'css' };\n}\nexport function javascriptGroupAsset(fields: GroupFields<GroupJavaScriptAsset>): GroupJavaScriptAsset {\n return { ...fields, asset_type: 'javascript' };\n}\nexport function vastGroupAsset(fields: GroupFields<GroupVastAsset>): GroupVastAsset {\n return { ...fields, asset_type: 'vast' };\n}\nexport function daastGroupAsset(fields: GroupFields<GroupDaastAsset>): GroupDaastAsset {\n return { ...fields, asset_type: 'daast' };\n}\nexport function urlGroupAsset(fields: GroupFields<GroupUrlAsset>): GroupUrlAsset {\n return { ...fields, asset_type: 'url' };\n}\nexport function webhookGroupAsset(fields: GroupFields<GroupWebhookAsset>): GroupWebhookAsset {\n return { ...fields, asset_type: 'webhook' };\n}\n\n// ---------- Repeatable group builder ----------\n\n/**\n * Wrap asset slots in a `repeatable_group` — the correct home for\n * `min_count` / `max_count`. Use for carousels, collections, story-pin\n * frames, product showcases. The platform repeats the inner `assets` once\n * per item; each repetition must provide all required assets within it.\n */\nexport function repeatableGroup(fields: Omit<RepeatableGroupAsset, 'item_type'>): RepeatableGroupAsset {\n return { ...fields, item_type: 'repeatable_group' };\n}\n\n/**\n * Grouped accessor for format-slot builders. `FormatAsset.image({...})`\n * reads well in format declarations. The individual named exports remain\n * the primary entry points.\n */\nexport const FormatAsset = {\n image: imageAssetSlot,\n video: videoAssetSlot,\n audio: audioAssetSlot,\n text: textAssetSlot,\n markdown: markdownAssetSlot,\n html: htmlAssetSlot,\n css: cssAssetSlot,\n javascript: javascriptAssetSlot,\n vast: vastAssetSlot,\n daast: daastAssetSlot,\n url: urlAssetSlot,\n webhook: webhookAssetSlot,\n brief: briefAssetSlot,\n catalog: catalogAssetSlot,\n group: repeatableGroup,\n groupImage: imageGroupAsset,\n groupVideo: videoGroupAsset,\n groupAudio: audioGroupAsset,\n groupText: textGroupAsset,\n groupMarkdown: markdownGroupAsset,\n groupHtml: htmlGroupAsset,\n groupCss: cssGroupAsset,\n groupJavascript: javascriptGroupAsset,\n groupVast: vastGroupAsset,\n groupDaast: daastGroupAsset,\n groupUrl: urlGroupAsset,\n groupWebhook: webhookGroupAsset,\n} as const;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/utils/format-asset-slot-builders.ts"],"sourcesContent":["// Typed factory helpers for format asset slots. Companion to\n// `asset-builders.ts` (which builds creative INSTANCES). These build the slot\n// definitions inside `Format.assets[]` — what a publisher declares it accepts.\n//\n// Each helper injects `item_type: 'individual'` plus the per-asset-type\n// `asset_type` discriminator so callers only supply the meaningful fields.\n// The slot's `requirements` object is strictly typed per asset type — misnamed\n// fields like `file_types` or wrong units like `min_duration_seconds` become\n// compile-time errors at the authorship site.\n\nimport type {\n GroupAudioAsset,\n GroupCssAsset,\n GroupDaastAsset,\n GroupHtmlAsset,\n GroupImageAsset,\n GroupJavaScriptAsset,\n GroupMarkdownAsset,\n GroupTextAsset,\n GroupUrlAsset,\n GroupVastAsset,\n GroupVideoAsset,\n GroupWebhookAsset,\n IndividualAudioAsset,\n IndividualBriefAsset,\n IndividualCatalogAsset,\n IndividualCssAsset,\n IndividualDaastAsset,\n IndividualHtmlAsset,\n IndividualImageAsset,\n IndividualJavaScriptAsset,\n IndividualMarkdownAsset,\n IndividualTextAsset,\n IndividualUrlAsset,\n IndividualVastAsset,\n IndividualVideoAsset,\n IndividualWebhookAsset,\n RepeatableGroupAsset,\n} from '../types/tools.generated';\n\ntype IndividualFields<T> = Omit<T, 'item_type' | 'asset_type'>;\ntype GroupFields<T> = Omit<T, 'asset_type'>;\n\n// ---------- Individual asset slot builders ----------\n\nexport function imageAssetSlot(fields: IndividualFields<IndividualImageAsset>): IndividualImageAsset {\n return { ...fields, item_type: 'individual', asset_type: 'image' };\n}\n\nexport function videoAssetSlot(fields: IndividualFields<IndividualVideoAsset>): IndividualVideoAsset {\n return { ...fields, item_type: 'individual', asset_type: 'video' };\n}\n\nexport function audioAssetSlot(fields: IndividualFields<IndividualAudioAsset>): IndividualAudioAsset {\n return { ...fields, item_type: 'individual', asset_type: 'audio' };\n}\n\nexport function textAssetSlot(fields: IndividualFields<IndividualTextAsset>): IndividualTextAsset {\n return { ...fields, item_type: 'individual', asset_type: 'text' };\n}\n\nexport function markdownAssetSlot(fields: IndividualFields<IndividualMarkdownAsset>): IndividualMarkdownAsset {\n return { ...fields, item_type: 'individual', asset_type: 'markdown' };\n}\n\nexport function htmlAssetSlot(fields: IndividualFields<IndividualHtmlAsset>): IndividualHtmlAsset {\n return { ...fields, item_type: 'individual', asset_type: 'html' };\n}\n\nexport function cssAssetSlot(fields: IndividualFields<IndividualCssAsset>): IndividualCssAsset {\n return { ...fields, item_type: 'individual', asset_type: 'css' };\n}\n\nexport function javascriptAssetSlot(fields: IndividualFields<IndividualJavaScriptAsset>): IndividualJavaScriptAsset {\n return { ...fields, item_type: 'individual', asset_type: 'javascript' };\n}\n\nexport function vastAssetSlot(fields: IndividualFields<IndividualVastAsset>): IndividualVastAsset {\n return { ...fields, item_type: 'individual', asset_type: 'vast' };\n}\n\nexport function daastAssetSlot(fields: IndividualFields<IndividualDaastAsset>): IndividualDaastAsset {\n return { ...fields, item_type: 'individual', asset_type: 'daast' };\n}\n\nexport function urlAssetSlot(fields: IndividualFields<IndividualUrlAsset>): IndividualUrlAsset {\n return { ...fields, item_type: 'individual', asset_type: 'url' };\n}\n\nexport function webhookAssetSlot(fields: IndividualFields<IndividualWebhookAsset>): IndividualWebhookAsset {\n return { ...fields, item_type: 'individual', asset_type: 'webhook' };\n}\n\nexport function briefAssetSlot(fields: IndividualFields<IndividualBriefAsset>): IndividualBriefAsset {\n return { ...fields, item_type: 'individual', asset_type: 'brief' };\n}\n\nexport function catalogAssetSlot(fields: IndividualFields<IndividualCatalogAsset>): IndividualCatalogAsset {\n return { ...fields, item_type: 'individual', asset_type: 'catalog' };\n}\n\n// ---------- Group asset slot builders (for use inside repeatableGroup) ----------\n\nexport function imageGroupAsset(fields: GroupFields<GroupImageAsset>): GroupImageAsset {\n return { ...fields, asset_type: 'image' };\n}\nexport function videoGroupAsset(fields: GroupFields<GroupVideoAsset>): GroupVideoAsset {\n return { ...fields, asset_type: 'video' };\n}\nexport function audioGroupAsset(fields: GroupFields<GroupAudioAsset>): GroupAudioAsset {\n return { ...fields, asset_type: 'audio' };\n}\nexport function textGroupAsset(fields: GroupFields<GroupTextAsset>): GroupTextAsset {\n return { ...fields, asset_type: 'text' };\n}\nexport function markdownGroupAsset(fields: GroupFields<GroupMarkdownAsset>): GroupMarkdownAsset {\n return { ...fields, asset_type: 'markdown' };\n}\nexport function htmlGroupAsset(fields: GroupFields<GroupHtmlAsset>): GroupHtmlAsset {\n return { ...fields, asset_type: 'html' };\n}\nexport function cssGroupAsset(fields: GroupFields<GroupCssAsset>): GroupCssAsset {\n return { ...fields, asset_type: 'css' };\n}\nexport function javascriptGroupAsset(fields: GroupFields<GroupJavaScriptAsset>): GroupJavaScriptAsset {\n return { ...fields, asset_type: 'javascript' };\n}\nexport function vastGroupAsset(fields: GroupFields<GroupVastAsset>): GroupVastAsset {\n return { ...fields, asset_type: 'vast' };\n}\nexport function daastGroupAsset(fields: GroupFields<GroupDaastAsset>): GroupDaastAsset {\n return { ...fields, asset_type: 'daast' };\n}\nexport function urlGroupAsset(fields: GroupFields<GroupUrlAsset>): GroupUrlAsset {\n return { ...fields, asset_type: 'url' };\n}\nexport function webhookGroupAsset(fields: GroupFields<GroupWebhookAsset>): GroupWebhookAsset {\n return { ...fields, asset_type: 'webhook' };\n}\n\n// ---------- Repeatable group builder ----------\n\n/**\n * Wrap asset slots in a `repeatable_group` — the correct home for\n * `min_count` / `max_count`. Use for carousels, collections, story-pin\n * frames, product showcases. The platform repeats the inner `assets` once\n * per item; each repetition must provide all required assets within it.\n */\nexport function repeatableGroup(fields: Omit<RepeatableGroupAsset, 'item_type'>): RepeatableGroupAsset {\n return { ...fields, item_type: 'repeatable_group' };\n}\n\n/**\n * Grouped accessor for format-slot builders. `FormatAsset.image({...})`\n * reads well in format declarations. The individual named exports remain\n * the primary entry points.\n */\nexport const FormatAsset = {\n image: imageAssetSlot,\n video: videoAssetSlot,\n audio: audioAssetSlot,\n text: textAssetSlot,\n markdown: markdownAssetSlot,\n html: htmlAssetSlot,\n css: cssAssetSlot,\n javascript: javascriptAssetSlot,\n vast: vastAssetSlot,\n daast: daastAssetSlot,\n url: urlAssetSlot,\n webhook: webhookAssetSlot,\n brief: briefAssetSlot,\n catalog: catalogAssetSlot,\n group: repeatableGroup,\n groupImage: imageGroupAsset,\n groupVideo: videoGroupAsset,\n groupAudio: audioGroupAsset,\n groupText: textGroupAsset,\n groupMarkdown: markdownGroupAsset,\n groupHtml: htmlGroupAsset,\n groupCss: cssGroupAsset,\n groupJavascript: javascriptGroupAsset,\n groupVast: vastGroupAsset,\n groupDaast: daastGroupAsset,\n groupUrl: urlGroupAsset,\n groupWebhook: webhookGroupAsset,\n} as const;\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
  function getFormatAssets(format) {
8
2
  if (format.assets && format.assets.length > 0) {
9
3
  return format.assets;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils/format-assets.ts"],"sourcesContent":["// Format Asset Utilities\n// Provides access to format assets from the v3 `assets` field\n\nimport type { Format } from '../types/tools.generated';\n\n// Internal types - derived from Format['assets'] since schema doesn't export standalone types\ntype FormatAsset = NonNullable<Format['assets']>[number];\ntype IndividualAsset = Extract<FormatAsset, { item_type: 'individual' }>;\ntype RepeatableAssetGroup = Extract<FormatAsset, { item_type: 'repeatable_group' }>;\n\n// Legacy support: v2 responses may still include assets_required (deprecated in v3)\n// This internal type allows runtime backward compatibility without exposing it in public API\ninterface LegacyFormat extends Format {\n assets_required?: unknown[];\n}\n\n/**\n * Get assets from a Format\n *\n * Returns the assets from the v3 `assets` field. For backward compatibility with v2 servers,\n * this function also handles the deprecated `assets_required` field if present.\n *\n * @param format - The Format object from list_creative_formats response\n * @returns Array of assets\n *\n * @example\n * ```typescript\n * const formats = await agent.listCreativeFormats({});\n * for (const format of formats.formats) {\n * const assets = getFormatAssets(format);\n * console.log(`${format.name} has ${assets.length} assets`);\n * }\n * ```\n */\nexport function getFormatAssets(format: Format): FormatAsset[] {\n // Use v3 `assets` field\n if (format.assets && format.assets.length > 0) {\n return format.assets;\n }\n\n // Runtime backward compatibility: handle v2 responses with deprecated assets_required\n const legacyFormat = format as LegacyFormat;\n if (\n legacyFormat.assets_required &&\n Array.isArray(legacyFormat.assets_required) &&\n legacyFormat.assets_required.length > 0\n ) {\n return normalizeAssetsRequired(legacyFormat.assets_required);\n }\n\n return [];\n}\n\n/**\n * Convert deprecated assets_required to new assets format (internal use)\n *\n * All assets in assets_required are required by definition (that's why they were in that array).\n * The new `assets` field has an explicit `required: boolean` to allow both required AND optional assets.\n *\n * @param assetsRequired - The deprecated assets_required array\n * @returns Normalized assets array with explicit required: true\n * @internal\n */\nfunction normalizeAssetsRequired(assetsRequired: unknown[]): FormatAsset[] {\n return assetsRequired.map(asset => ({\n ...(asset as Record<string, unknown>),\n required: true, // assets_required only contained required assets\n })) as FormatAsset[];\n}\n\n/**\n * Get only required assets from a Format\n *\n * @param format - The Format object\n * @returns Array of required assets only\n *\n * @example\n * ```typescript\n * const requiredAssets = getRequiredAssets(format);\n * console.log(`Must provide ${requiredAssets.length} assets`);\n * ```\n */\nexport function getRequiredAssets(format: Format): FormatAsset[] {\n return getFormatAssets(format).filter(asset => asset.required);\n}\n\n/**\n * Get only optional assets from a Format\n *\n * Note: When using deprecated `assets_required`, this will always return empty\n * since assets_required only contained required assets.\n *\n * @param format - The Format object\n * @returns Array of optional assets only\n *\n * @example\n * ```typescript\n * const optionalAssets = getOptionalAssets(format);\n * console.log(`Can optionally provide ${optionalAssets.length} additional assets`);\n * ```\n */\nexport function getOptionalAssets(format: Format): FormatAsset[] {\n return getFormatAssets(format).filter(asset => !asset.required);\n}\n\n/**\n * Get individual assets (not repeatable groups) from a Format\n *\n * @param format - The Format object\n * @returns Array of individual assets\n */\nexport function getIndividualAssets(format: Format): IndividualAsset[] {\n return getFormatAssets(format).filter((asset): asset is IndividualAsset => asset.item_type === 'individual');\n}\n\n/**\n * Get repeatable asset groups from a Format\n *\n * @param format - The Format object\n * @returns Array of repeatable asset groups\n */\nexport function getRepeatableGroups(format: Format): RepeatableAssetGroup[] {\n return getFormatAssets(format).filter(\n (asset): asset is RepeatableAssetGroup => asset.item_type === 'repeatable_group'\n );\n}\n\n/**\n * Check if format uses deprecated assets_required field (for migration warnings)\n *\n * @param format - The Format object\n * @returns true if using deprecated field, false if using new field or neither\n *\n * @example\n * ```typescript\n * if (usesDeprecatedAssetsField(format)) {\n * console.warn(`Format ${format.name} uses deprecated assets_required field`);\n * }\n * ```\n */\nexport function usesDeprecatedAssetsField(format: Format): boolean {\n const legacyFormat = format as LegacyFormat;\n return !format.assets && !!(legacyFormat.assets_required && Array.isArray(legacyFormat.assets_required));\n}\n\n/**\n * Get the count of assets in a format (for display purposes)\n *\n * @param format - The Format object\n * @returns Number of assets, or 0 if none defined\n */\nexport function getAssetCount(format: Format): number {\n return getFormatAssets(format).length;\n}\n\n/**\n * Check if a format has any assets defined\n *\n * @param format - The Format object\n * @returns true if format has assets, false otherwise\n */\nexport function hasAssets(format: Format): boolean {\n return getAssetCount(format) > 0;\n}\n"],"mappings":";;;;;;AAkCO,SAAS,gBAAgB,QAA+B;AAE7D,MAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;AAC7C,WAAO,OAAO;AAAA,EAChB;AAGA,QAAM,eAAe;AACrB,MACE,aAAa,mBACb,MAAM,QAAQ,aAAa,eAAe,KAC1C,aAAa,gBAAgB,SAAS,GACtC;AACA,WAAO,wBAAwB,aAAa,eAAe;AAAA,EAC7D;AAEA,SAAO,CAAC;AACV;AAYA,SAAS,wBAAwB,gBAA0C;AACzE,SAAO,eAAe,IAAI,YAAU;AAAA,IAClC,GAAI;AAAA,IACJ,UAAU;AAAA;AAAA,EACZ,EAAE;AACJ;AAcO,SAAS,kBAAkB,QAA+B;AAC/D,SAAO,gBAAgB,MAAM,EAAE,OAAO,WAAS,MAAM,QAAQ;AAC/D;AAiBO,SAAS,kBAAkB,QAA+B;AAC/D,SAAO,gBAAgB,MAAM,EAAE,OAAO,WAAS,CAAC,MAAM,QAAQ;AAChE;AAQO,SAAS,oBAAoB,QAAmC;AACrE,SAAO,gBAAgB,MAAM,EAAE,OAAO,CAAC,UAAoC,MAAM,cAAc,YAAY;AAC7G;AAQO,SAAS,oBAAoB,QAAwC;AAC1E,SAAO,gBAAgB,MAAM,EAAE;AAAA,IAC7B,CAAC,UAAyC,MAAM,cAAc;AAAA,EAChE;AACF;AAeO,SAAS,0BAA0B,QAAyB;AACjE,QAAM,eAAe;AACrB,SAAO,CAAC,OAAO,UAAU,CAAC,EAAE,aAAa,mBAAmB,MAAM,QAAQ,aAAa,eAAe;AACxG;AAQO,SAAS,cAAc,QAAwB;AACpD,SAAO,gBAAgB,MAAM,EAAE;AACjC;AAQO,SAAS,UAAU,QAAyB;AACjD,SAAO,cAAc,MAAM,IAAI;AACjC;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/utils/format-assets.ts"],"sourcesContent":["// Format Asset Utilities\n// Provides access to format assets from the v3 `assets` field\n\nimport type { Format } from '../types/tools.generated';\n\n// Internal types - derived from Format['assets'] since schema doesn't export standalone types\ntype FormatAsset = NonNullable<Format['assets']>[number];\ntype IndividualAsset = Extract<FormatAsset, { item_type: 'individual' }>;\ntype RepeatableAssetGroup = Extract<FormatAsset, { item_type: 'repeatable_group' }>;\n\n// Legacy support: v2 responses may still include assets_required (deprecated in v3)\n// This internal type allows runtime backward compatibility without exposing it in public API\ninterface LegacyFormat extends Format {\n assets_required?: unknown[];\n}\n\n/**\n * Get assets from a Format\n *\n * Returns the assets from the v3 `assets` field. For backward compatibility with v2 servers,\n * this function also handles the deprecated `assets_required` field if present.\n *\n * @param format - The Format object from list_creative_formats response\n * @returns Array of assets\n *\n * @example\n * ```typescript\n * const formats = await agent.listCreativeFormats({});\n * for (const format of formats.formats) {\n * const assets = getFormatAssets(format);\n * console.log(`${format.name} has ${assets.length} assets`);\n * }\n * ```\n */\nexport function getFormatAssets(format: Format): FormatAsset[] {\n // Use v3 `assets` field\n if (format.assets && format.assets.length > 0) {\n return format.assets;\n }\n\n // Runtime backward compatibility: handle v2 responses with deprecated assets_required\n const legacyFormat = format as LegacyFormat;\n if (\n legacyFormat.assets_required &&\n Array.isArray(legacyFormat.assets_required) &&\n legacyFormat.assets_required.length > 0\n ) {\n return normalizeAssetsRequired(legacyFormat.assets_required);\n }\n\n return [];\n}\n\n/**\n * Convert deprecated assets_required to new assets format (internal use)\n *\n * All assets in assets_required are required by definition (that's why they were in that array).\n * The new `assets` field has an explicit `required: boolean` to allow both required AND optional assets.\n *\n * @param assetsRequired - The deprecated assets_required array\n * @returns Normalized assets array with explicit required: true\n * @internal\n */\nfunction normalizeAssetsRequired(assetsRequired: unknown[]): FormatAsset[] {\n return assetsRequired.map(asset => ({\n ...(asset as Record<string, unknown>),\n required: true, // assets_required only contained required assets\n })) as FormatAsset[];\n}\n\n/**\n * Get only required assets from a Format\n *\n * @param format - The Format object\n * @returns Array of required assets only\n *\n * @example\n * ```typescript\n * const requiredAssets = getRequiredAssets(format);\n * console.log(`Must provide ${requiredAssets.length} assets`);\n * ```\n */\nexport function getRequiredAssets(format: Format): FormatAsset[] {\n return getFormatAssets(format).filter(asset => asset.required);\n}\n\n/**\n * Get only optional assets from a Format\n *\n * Note: When using deprecated `assets_required`, this will always return empty\n * since assets_required only contained required assets.\n *\n * @param format - The Format object\n * @returns Array of optional assets only\n *\n * @example\n * ```typescript\n * const optionalAssets = getOptionalAssets(format);\n * console.log(`Can optionally provide ${optionalAssets.length} additional assets`);\n * ```\n */\nexport function getOptionalAssets(format: Format): FormatAsset[] {\n return getFormatAssets(format).filter(asset => !asset.required);\n}\n\n/**\n * Get individual assets (not repeatable groups) from a Format\n *\n * @param format - The Format object\n * @returns Array of individual assets\n */\nexport function getIndividualAssets(format: Format): IndividualAsset[] {\n return getFormatAssets(format).filter((asset): asset is IndividualAsset => asset.item_type === 'individual');\n}\n\n/**\n * Get repeatable asset groups from a Format\n *\n * @param format - The Format object\n * @returns Array of repeatable asset groups\n */\nexport function getRepeatableGroups(format: Format): RepeatableAssetGroup[] {\n return getFormatAssets(format).filter(\n (asset): asset is RepeatableAssetGroup => asset.item_type === 'repeatable_group'\n );\n}\n\n/**\n * Check if format uses deprecated assets_required field (for migration warnings)\n *\n * @param format - The Format object\n * @returns true if using deprecated field, false if using new field or neither\n *\n * @example\n * ```typescript\n * if (usesDeprecatedAssetsField(format)) {\n * console.warn(`Format ${format.name} uses deprecated assets_required field`);\n * }\n * ```\n */\nexport function usesDeprecatedAssetsField(format: Format): boolean {\n const legacyFormat = format as LegacyFormat;\n return !format.assets && !!(legacyFormat.assets_required && Array.isArray(legacyFormat.assets_required));\n}\n\n/**\n * Get the count of assets in a format (for display purposes)\n *\n * @param format - The Format object\n * @returns Number of assets, or 0 if none defined\n */\nexport function getAssetCount(format: Format): number {\n return getFormatAssets(format).length;\n}\n\n/**\n * Check if a format has any assets defined\n *\n * @param format - The Format object\n * @returns true if format has assets, false otherwise\n */\nexport function hasAssets(format: Format): boolean {\n return getAssetCount(format) > 0;\n}\n"],"mappings":"AAkCO,SAAS,gBAAgB,QAA+B;AAE7D,MAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;AAC7C,WAAO,OAAO;AAAA,EAChB;AAGA,QAAM,eAAe;AACrB,MACE,aAAa,mBACb,MAAM,QAAQ,aAAa,eAAe,KAC1C,aAAa,gBAAgB,SAAS,GACtC;AACA,WAAO,wBAAwB,aAAa,eAAe;AAAA,EAC7D;AAEA,SAAO,CAAC;AACV;AAYA,SAAS,wBAAwB,gBAA0C;AACzE,SAAO,eAAe,IAAI,YAAU;AAAA,IAClC,GAAI;AAAA,IACJ,UAAU;AAAA;AAAA,EACZ,EAAE;AACJ;AAcO,SAAS,kBAAkB,QAA+B;AAC/D,SAAO,gBAAgB,MAAM,EAAE,OAAO,WAAS,MAAM,QAAQ;AAC/D;AAiBO,SAAS,kBAAkB,QAA+B;AAC/D,SAAO,gBAAgB,MAAM,EAAE,OAAO,WAAS,CAAC,MAAM,QAAQ;AAChE;AAQO,SAAS,oBAAoB,QAAmC;AACrE,SAAO,gBAAgB,MAAM,EAAE,OAAO,CAAC,UAAoC,MAAM,cAAc,YAAY;AAC7G;AAQO,SAAS,oBAAoB,QAAwC;AAC1E,SAAO,gBAAgB,MAAM,EAAE;AAAA,IAC7B,CAAC,UAAyC,MAAM,cAAc;AAAA,EAChE;AACF;AAeO,SAAS,0BAA0B,QAAyB;AACjE,QAAM,eAAe;AACrB,SAAO,CAAC,OAAO,UAAU,CAAC,EAAE,aAAa,mBAAmB,MAAM,QAAQ,aAAa,eAAe;AACxG;AAQO,SAAS,cAAc,QAAwB;AACpD,SAAO,gBAAgB,MAAM,EAAE;AACjC;AAQO,SAAS,UAAU,QAAyB;AACjD,SAAO,cAAc,MAAM,IAAI;AACjC;","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
  function displayRender(fields) {
8
2
  return { role: fields.role, dimensions: fields.dimensions };
9
3
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils/format-render-builders.ts"],"sourcesContent":["import type { DimensionUnit } from '../types/core.generated';\n\n// Typed factory helpers for `Format.renders[]` entries (format declarations\n// returned by `list_creative_formats`).\n//\n// The `Format.renders[]` item schema carries a `oneOf` on its shape:\n// - branch A: `dimensions` required, `parameters_from_format_id` forbidden\n// - branch B: `parameters_from_format_id: true` required, `dimensions` forbidden\n//\n// A render with only `{ role }` fails `oneOf` — neither branch is satisfied.\n// Audio formats in particular cannot use `{ role, duration_seconds }` as a\n// standalone render (duration_seconds isn't a recognized `renders[]` field and\n// wouldn't satisfy the oneOf anyway). Audio/template formats must declare\n// `parameters_from_format_id: true` so the format_id parameters carry\n// codec / duration / sampling-rate — which is how AdCP's template-format model\n// already works.\n//\n// These builders enforce the oneOf branch at the type level so `renders[]` can't\n// drift out of the schema when written by hand. They parallel the asset-\n// builders and preview-render-builders pattern.\n//\n// NOTE: this file targets `Format.renders[]` (format declarations). The\n// existing `render-builders.ts` targets `PreviewRender` (`preview_creative`\n// responses). The two are unrelated and use separate namespace exports\n// (`FormatRender` vs `Render`) to prevent name collision.\n\n/** Dimensions sub-object — shared between display and video formats. */\nexport interface RenderDimensions {\n width: number;\n height: number;\n /** Unit defaults to pixels. Set explicitly for non-pixel formats (e.g. DOOH physical dimensions). */\n unit?: DimensionUnit;\n}\n\n/** Fixed-dimensions render — display banners, video placements, any format with a known W×H. */\nexport interface DimensionsRender {\n role: string;\n dimensions: RenderDimensions;\n}\n\n/**\n * Parameterized render — format carries its render spec in the format_id\n * parameters. Required for audio formats (no W×H) and for template formats\n * whose dimensions/duration are caller-chosen via `accepts_parameters`.\n */\nexport interface ParameterizedRender {\n role: string;\n parameters_from_format_id: true;\n}\n\n/**\n * Build a fixed-dimensions render entry. Use for display banners, video ads,\n * and any format with a known width × height.\n *\n * @example\n * displayRender({ role: 'primary', dimensions: { width: 300, height: 250 } })\n */\nexport function displayRender(fields: { role: string; dimensions: RenderDimensions }): DimensionsRender {\n return { role: fields.role, dimensions: fields.dimensions };\n}\n\n/**\n * Build a parameterized render entry. Use for audio formats and template\n * formats whose render parameters come from `format_id.parameters`.\n * `parameters_from_format_id: true` is injected.\n *\n * Also exported as `templateRender` — the friendlier name for the same\n * factory, matching the `creative-template` specialism terminology.\n *\n * @example\n * templateRender({ role: 'primary' })\n * // → { role: 'primary', parameters_from_format_id: true }\n */\nexport function parameterizedRender(fields: { role: string }): ParameterizedRender {\n return { role: fields.role, parameters_from_format_id: true };\n}\n\n/**\n * Alias for `parameterizedRender` — matches the `creative-template`\n * specialism terminology (template formats carry render parameters in\n * `format_id.parameters`). Use either; both are exported for discoverability.\n */\nexport const templateRender = parameterizedRender;\n\n/**\n * Discriminated union of the two valid `Format.renders[]` branches. Use when\n * building a mixed `renders: RenderItem[]` array by hand (e.g. a companion\n * format that combines a display render with a parameterized audio render).\n */\nexport type RenderItem = DimensionsRender | ParameterizedRender;\n\n/**\n * Grouped namespace for `Format.renders[]` factories — one-dot autocomplete\n * when building `renders[]` by hand. Parallels `Asset.*` (creative assets)\n * and `Render.*` (preview renders) from `@adcp/sdk`.\n *\n * Note: `FormatRender` is also re-exported as a type from\n * `utils/format-renders.ts` (v3 structural interface). TypeScript keeps\n * type and value namespaces separate, so the name supports both usages:\n * const r: FormatRender = { render_id, role, dimensions }; // type\n * FormatRender.display({ role, dimensions }); // factory\n */\nexport const FormatRender = {\n display: displayRender,\n parameterized: parameterizedRender,\n template: templateRender,\n} as const;\n"],"mappings":";;;;;;AAyDO,SAAS,cAAc,QAA0E;AACtG,SAAO,EAAE,MAAM,OAAO,MAAM,YAAY,OAAO,WAAW;AAC5D;AAcO,SAAS,oBAAoB,QAA+C;AACjF,SAAO,EAAE,MAAM,OAAO,MAAM,2BAA2B,KAAK;AAC9D;AAOO,MAAM,iBAAiB;AAoBvB,MAAM,eAAe;AAAA,EAC1B,SAAS;AAAA,EACT,eAAe;AAAA,EACf,UAAU;AACZ;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/utils/format-render-builders.ts"],"sourcesContent":["import type { DimensionUnit } from '../types/core.generated';\n\n// Typed factory helpers for `Format.renders[]` entries (format declarations\n// returned by `list_creative_formats`).\n//\n// The `Format.renders[]` item schema carries a `oneOf` on its shape:\n// - branch A: `dimensions` required, `parameters_from_format_id` forbidden\n// - branch B: `parameters_from_format_id: true` required, `dimensions` forbidden\n//\n// A render with only `{ role }` fails `oneOf` — neither branch is satisfied.\n// Audio formats in particular cannot use `{ role, duration_seconds }` as a\n// standalone render (duration_seconds isn't a recognized `renders[]` field and\n// wouldn't satisfy the oneOf anyway). Audio/template formats must declare\n// `parameters_from_format_id: true` so the format_id parameters carry\n// codec / duration / sampling-rate — which is how AdCP's template-format model\n// already works.\n//\n// These builders enforce the oneOf branch at the type level so `renders[]` can't\n// drift out of the schema when written by hand. They parallel the asset-\n// builders and preview-render-builders pattern.\n//\n// NOTE: this file targets `Format.renders[]` (format declarations). The\n// existing `render-builders.ts` targets `PreviewRender` (`preview_creative`\n// responses). The two are unrelated and use separate namespace exports\n// (`FormatRender` vs `Render`) to prevent name collision.\n\n/** Dimensions sub-object — shared between display and video formats. */\nexport interface RenderDimensions {\n width: number;\n height: number;\n /** Unit defaults to pixels. Set explicitly for non-pixel formats (e.g. DOOH physical dimensions). */\n unit?: DimensionUnit;\n}\n\n/** Fixed-dimensions render — display banners, video placements, any format with a known W×H. */\nexport interface DimensionsRender {\n role: string;\n dimensions: RenderDimensions;\n}\n\n/**\n * Parameterized render — format carries its render spec in the format_id\n * parameters. Required for audio formats (no W×H) and for template formats\n * whose dimensions/duration are caller-chosen via `accepts_parameters`.\n */\nexport interface ParameterizedRender {\n role: string;\n parameters_from_format_id: true;\n}\n\n/**\n * Build a fixed-dimensions render entry. Use for display banners, video ads,\n * and any format with a known width × height.\n *\n * @example\n * displayRender({ role: 'primary', dimensions: { width: 300, height: 250 } })\n */\nexport function displayRender(fields: { role: string; dimensions: RenderDimensions }): DimensionsRender {\n return { role: fields.role, dimensions: fields.dimensions };\n}\n\n/**\n * Build a parameterized render entry. Use for audio formats and template\n * formats whose render parameters come from `format_id.parameters`.\n * `parameters_from_format_id: true` is injected.\n *\n * Also exported as `templateRender` — the friendlier name for the same\n * factory, matching the `creative-template` specialism terminology.\n *\n * @example\n * templateRender({ role: 'primary' })\n * // → { role: 'primary', parameters_from_format_id: true }\n */\nexport function parameterizedRender(fields: { role: string }): ParameterizedRender {\n return { role: fields.role, parameters_from_format_id: true };\n}\n\n/**\n * Alias for `parameterizedRender` — matches the `creative-template`\n * specialism terminology (template formats carry render parameters in\n * `format_id.parameters`). Use either; both are exported for discoverability.\n */\nexport const templateRender = parameterizedRender;\n\n/**\n * Discriminated union of the two valid `Format.renders[]` branches. Use when\n * building a mixed `renders: RenderItem[]` array by hand (e.g. a companion\n * format that combines a display render with a parameterized audio render).\n */\nexport type RenderItem = DimensionsRender | ParameterizedRender;\n\n/**\n * Grouped namespace for `Format.renders[]` factories — one-dot autocomplete\n * when building `renders[]` by hand. Parallels `Asset.*` (creative assets)\n * and `Render.*` (preview renders) from `@adcp/sdk`.\n *\n * Note: `FormatRender` is also re-exported as a type from\n * `utils/format-renders.ts` (v3 structural interface). TypeScript keeps\n * type and value namespaces separate, so the name supports both usages:\n * const r: FormatRender = { render_id, role, dimensions }; // type\n * FormatRender.display({ role, dimensions }); // factory\n */\nexport const FormatRender = {\n display: displayRender,\n parameterized: parameterizedRender,\n template: templateRender,\n} as const;\n"],"mappings":"AAyDO,SAAS,cAAc,QAA0E;AACtG,SAAO,EAAE,MAAM,OAAO,MAAM,YAAY,OAAO,WAAW;AAC5D;AAcO,SAAS,oBAAoB,QAA+C;AACjF,SAAO,EAAE,MAAM,OAAO,MAAM,2BAA2B,KAAK;AAC9D;AAOO,MAAM,iBAAiB;AAoBvB,MAAM,eAAe;AAAA,EAC1B,SAAS;AAAA,EACT,eAAe;AAAA,EACf,UAAU;AACZ;","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
  function normalizeFormatRenders(format) {
8
2
  if (format.renders && Array.isArray(format.renders)) {
9
3
  return format;